Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
3770 Serge 1
/**************************************************************************
2
 *
3
 * Copyright (C) 2011 Red Hat Inc.
4
 *
5
 * Permission is hereby granted, free of charge, to any person obtaining a
6
 * copy of this software and associated documentation files (the "Software"),
7
 * to deal in the Software without restriction, including without limitation
8
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9
 * and/or sell copies of the Software, and to permit persons to whom the
10
 * Software is furnished to do so, subject to the following conditions:
11
 *
12
 * The above copyright notice and this permission notice shall be included
13
 * in all copies or substantial portions of the Software.
14
 *
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
19
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21
 * OTHER DEALINGS IN THE SOFTWARE.
22
 *
23
 **************************************************************************/
24
 
25
#include 
26
#include "u_math.h"
27
#include "u_format.h"
28
#include "u_format_rgtc.h"
29
#include "u_format_latc.h"
30
 
31
static void u_format_unsigned_encode_rgtc_ubyte(uint8_t *blkaddr, uint8_t srccolors[4][4],
32
					       int numxpixels, int numypixels);
33
 
34
static void u_format_unsigned_fetch_texel_rgtc(unsigned srcRowStride, const uint8_t *pixdata,
35
					       unsigned i, unsigned j, uint8_t *value, unsigned comps);
36
 
37
static void u_format_signed_encode_rgtc_ubyte(int8_t *blkaddr, int8_t srccolors[4][4],
38
					     int numxpixels, int numypixels);
39
 
40
static void u_format_signed_fetch_texel_rgtc(unsigned srcRowStride, const int8_t *pixdata,
41
					       unsigned i, unsigned j, int8_t *value, unsigned comps);
42
 
43
void
44
util_format_latc1_unorm_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, unsigned i, unsigned j)
45
{
46
   /* Fix warnings here: */
47
   (void) u_format_unsigned_encode_rgtc_ubyte;
48
   (void) u_format_signed_encode_rgtc_ubyte;
49
 
50
   u_format_unsigned_fetch_texel_rgtc(0, src, i, j, dst, 1);
51
   dst[1] = dst[0];
52
   dst[2] = dst[0];
53
   dst[3] = 255;
54
}
55
 
56
void
57
util_format_latc1_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
58
{
59
   util_format_rgtc1_unorm_unpack_rgba_8unorm(dst_row, dst_stride, src_row, src_stride, width, height);
60
}
61
 
62
void
63
util_format_latc1_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row,
64
					 unsigned src_stride, unsigned width, unsigned height)
65
{
66
   util_format_rgtc1_unorm_pack_rgba_8unorm(dst_row, dst_stride, src_row, src_stride, width, height);
67
}
68
 
69
void
70
util_format_latc1_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
71
{
72
   unsigned x, y, i, j;
73
   int block_size = 8;
74
 
75
   for(y = 0; y < height; y += 4) {
76
      const uint8_t *src = src_row;
77
      for(x = 0; x < width; x += 4) {
78
         for(j = 0; j < 4; ++j) {
79
            for(i = 0; i < 4; ++i) {
80
               float *dst = dst_row + (y + j)*dst_stride/sizeof(*dst_row) + (x + i)*4;
81
               uint8_t tmp_r;
82
               u_format_unsigned_fetch_texel_rgtc(0, src, i, j, &tmp_r, 1);
83
               dst[0] =
84
               dst[1] =
85
               dst[2] = ubyte_to_float(tmp_r);
86
               dst[3] = 1.0;
87
            }
88
         }
89
         src += block_size;
90
      }
91
      src_row += src_stride;
92
   }
93
}
94
 
95
void
96
util_format_latc1_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
97
{
98
   util_format_rgtc1_unorm_pack_rgba_float(dst_row, dst_stride, src_row, src_stride, width, height);
99
}
100
 
101
void
102
util_format_latc1_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
103
{
104
   uint8_t tmp_r;
105
 
106
   u_format_unsigned_fetch_texel_rgtc(0, src, i, j, &tmp_r, 1);
107
   dst[0] =
108
   dst[1] =
109
   dst[2] = ubyte_to_float(tmp_r);
110
   dst[3] = 1.0;
111
}
112
 
113
void
114
util_format_latc1_snorm_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, unsigned i, unsigned j)
115
{
116
   fprintf(stderr,"%s\n", __func__);
117
}
118
 
119
void
120
util_format_latc1_snorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
121
{
122
   fprintf(stderr,"%s\n", __func__);
123
}
124
 
125
void
126
util_format_latc1_snorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
127
{
128
   fprintf(stderr,"%s\n", __func__);
129
}
130
 
131
void
132
util_format_latc1_snorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
133
{
134
   util_format_rgtc1_snorm_pack_rgba_float(dst_row, dst_stride, src_row, src_stride, width, height);
135
}
136
 
137
void
138
util_format_latc1_snorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
139
{
140
   unsigned x, y, i, j;
141
   int block_size = 8;
142
 
143
   for(y = 0; y < height; y += 4) {
144
      const int8_t *src = (int8_t *)src_row;
145
      for(x = 0; x < width; x += 4) {
146
         for(j = 0; j < 4; ++j) {
147
            for(i = 0; i < 4; ++i) {
148
               float *dst = dst_row + (y + j)*dst_stride/sizeof(*dst_row) + (x + i)*4;
149
               int8_t tmp_r;
150
               u_format_signed_fetch_texel_rgtc(0, src, i, j, &tmp_r, 1);
151
               dst[0] =
152
               dst[1] =
153
               dst[2] = byte_to_float_tex(tmp_r);
154
               dst[3] = 1.0;
155
            }
156
         }
157
         src += block_size;
158
      }
159
      src_row += src_stride;
160
   }
161
}
162
 
163
void
164
util_format_latc1_snorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
165
{
166
   int8_t tmp_r;
167
 
168
   u_format_signed_fetch_texel_rgtc(0, (int8_t *)src, i, j, &tmp_r, 1);
169
   dst[0] =
170
   dst[1] =
171
   dst[2] = byte_to_float_tex(tmp_r);
172
   dst[3] = 1.0;
173
}
174
 
175
 
176
void
177
util_format_latc2_unorm_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, unsigned i, unsigned j)
178
{
179
   u_format_unsigned_fetch_texel_rgtc(0, src, i, j, dst, 2);
180
   dst[1] = dst[0];
181
   dst[2] = dst[0];
182
   u_format_unsigned_fetch_texel_rgtc(0, src + 8, i, j, dst + 3, 2);
183
}
184
 
185
void
186
util_format_latc2_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
187
{
188
   util_format_rgtc2_unorm_unpack_rgba_8unorm(dst_row, dst_stride, src_row, src_stride, width, height);
189
}
190
 
191
void
192
util_format_latc2_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
193
{
194
   util_format_rgtc2_unorm_pack_rgba_8unorm(dst_row, dst_stride, src_row, src_stride, width, height);
195
}
196
 
197
void
198
util_format_latc2_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
199
{
200
   util_format_rxtc2_unorm_pack_rgba_float(dst_row, dst_stride, src_row, src_stride, width, height, 3);
201
}
202
 
203
void
204
util_format_latc2_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
205
{
206
   unsigned x, y, i, j;
207
   int block_size = 16;
208
 
209
   for(y = 0; y < height; y += 4) {
210
      const uint8_t *src = src_row;
211
      for(x = 0; x < width; x += 4) {
212
         for(j = 0; j < 4; ++j) {
213
            for(i = 0; i < 4; ++i) {
214
               float *dst = dst_row + (y + j)*dst_stride/sizeof(*dst_row) + (x + i)*4;
215
               uint8_t tmp_r, tmp_g;
216
               u_format_unsigned_fetch_texel_rgtc(0, src, i, j, &tmp_r, 2);
217
               u_format_unsigned_fetch_texel_rgtc(0, src + 8, i, j, &tmp_g, 2);
218
               dst[0] =
219
               dst[1] =
220
               dst[2] = ubyte_to_float(tmp_r);
221
               dst[3] = ubyte_to_float(tmp_g);
222
            }
223
         }
224
         src += block_size;
225
      }
226
      src_row += src_stride;
227
   }
228
}
229
 
230
void
231
util_format_latc2_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
232
{
233
   uint8_t tmp_r, tmp_g;
234
 
235
   u_format_unsigned_fetch_texel_rgtc(0, src, i, j, &tmp_r, 2);
236
   u_format_unsigned_fetch_texel_rgtc(0, src + 8, i, j, &tmp_g, 2);
237
   dst[0] =
238
   dst[1] =
239
   dst[2] = ubyte_to_float(tmp_r);
240
   dst[3] = ubyte_to_float(tmp_g);
241
}
242
 
243
 
244
void
245
util_format_latc2_snorm_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, unsigned i, unsigned j)
246
{
247
   fprintf(stderr,"%s\n", __func__);
248
}
249
 
250
void
251
util_format_latc2_snorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
252
{
253
   fprintf(stderr,"%s\n", __func__);
254
}
255
 
256
void
257
util_format_latc2_snorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
258
{
259
   fprintf(stderr,"%s\n", __func__);
260
}
261
 
262
void
263
util_format_latc2_snorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
264
{
265
   unsigned x, y, i, j;
266
   int block_size = 16;
267
 
268
   for(y = 0; y < height; y += 4) {
269
      const int8_t *src = (int8_t *)src_row;
270
      for(x = 0; x < width; x += 4) {
271
         for(j = 0; j < 4; ++j) {
272
            for(i = 0; i < 4; ++i) {
273
               float *dst = dst_row + (y + j)*dst_stride/sizeof(*dst_row) + (x + i)*4;
274
               int8_t tmp_r, tmp_g;
275
               u_format_signed_fetch_texel_rgtc(0, src, i, j, &tmp_r, 2);
276
               u_format_signed_fetch_texel_rgtc(0, src + 8, i, j, &tmp_g, 2);
277
               dst[0] =
278
               dst[1] =
279
               dst[2] = byte_to_float_tex(tmp_r);
280
               dst[3] = byte_to_float_tex(tmp_g);
281
            }
282
         }
283
         src += block_size;
284
      }
285
      src_row += src_stride;
286
   }
287
}
288
 
289
void
290
util_format_latc2_snorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
291
{
292
   util_format_rxtc2_snorm_pack_rgba_float(dst_row, dst_stride, src_row, src_stride, width, height, 3);
293
}
294
 
295
void
296
util_format_latc2_snorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
297
{
298
   int8_t tmp_r, tmp_g;
299
 
300
   u_format_signed_fetch_texel_rgtc(0, (int8_t *)src, i, j, &tmp_r, 2);
301
   u_format_signed_fetch_texel_rgtc(0, (int8_t *)src + 8, i, j, &tmp_g, 2);
302
   dst[0] =
303
   dst[1] =
304
   dst[2] = byte_to_float_tex(tmp_r);
305
   dst[3] = byte_to_float_tex(tmp_g);
306
}
307
 
308
 
309
#define TAG(x) u_format_unsigned_##x
310
#define TYPE uint8_t
311
#define T_MIN 0
312
#define T_MAX 255
313
 
314
#include "texcompress_rgtc_tmp.h"
315
 
316
#undef TYPE
317
#undef TAG
318
#undef T_MIN
319
#undef T_MAX
320
 
321
 
322
#define TAG(x) u_format_signed_##x
323
#define TYPE int8_t
324
#define T_MIN (int8_t)-128
325
#define T_MAX (int8_t)127
326
 
327
#include "texcompress_rgtc_tmp.h"
328
 
329
#undef TYPE
330
#undef TAG
331
#undef T_MIN
332
#undef T_MAX