1/*
2 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26
27/*
28 * FUNCTION
29 * mlib_ImageLookUp_U8D64 - table lookup
30 * mlib_ImageLookUp_S16D64 - table lookup
31 * mlib_ImageLookUp_U16D64 - table lookup
32 * mlib_ImageLookUp_S32D64 - table lookup
33 *
34 * SYNOPSIS
35 * void mlib_ImageLookUp_U8_D64(src, slb,
36 * dst, dlb,
37 * xsize, ysize,
38 * csize, table)
39 *
40 * void mlib_ImageLookUp_S16_D64(src, slb,
41 * dst, dlb,
42 * xsize, ysize,
43 * csize, table)
44 *
45 * void mlib_ImageLookUp_U16_D64(src, slb,
46 * dst, dlb,
47 * xsize, ysize,
48 * csize, table)
49 *
50 * void mlib_ImageLookUp_S32_D64(src, slb,
51 * dst, dlb,
52 * xsize, ysize,
53 * csize, table)
54 *
55 * ARGUMENT
56 * src pointer to input image (BYTE, SHORT, USHORT, INT)
57 * slb stride of input image (in pixels)
58 * dst pointer to output image (DOUBLE)
59 * dlb stride of output image (in pixels)
60 * xsize image width
61 * ysize image height
62 * csize number of channels
63 * table lookup table
64 *
65 * DESCRIPTION
66 * dst = table[src] (c, vis version)
67 */
68
69#include "mlib_image.h"
70#include "mlib_ImageLookUp.h"
71
72/***************************************************************/
73#define MLIB_C_IMAGELOOKUP(DTYPE, STYPE, TABLE) \
74{ \
75 mlib_s32 i, j, k; \
76 \
77 if (xsize < 2) { \
78 for(j = 0; j < ysize; j++, dst += dlb, src += slb){ \
79 for(k = 0; k < csize; k++) { \
80 DTYPE *da = dst + k; \
81 const STYPE *sa = src + k; \
82 DTYPE *tab = (DTYPE*) TABLE[k]; \
83 \
84 for(i = 0; i < xsize; i++, da += csize, sa += csize) \
85 *da=tab[*sa]; \
86 } \
87 } \
88 } else { \
89 for(j = 0; j < ysize; j++, dst += dlb, src += slb) { \
90 for(k = 0; k < csize; k++) { \
91 DTYPE *da = dst + k; \
92 const STYPE *sa = src + k; \
93 DTYPE *tab = (DTYPE*) TABLE[k]; \
94 mlib_s32 s0, s1; \
95 DTYPE t0, t1; \
96 \
97 s0 = (mlib_s32)sa[0]; \
98 s1 = (mlib_s32)sa[csize]; \
99 sa += 2*csize; \
100 \
101 for(i = 0; \
102 i < xsize - 3; \
103 i+=2, da += 2*csize, sa += 2*csize) { \
104 t0 = tab[s0]; \
105 t1 = tab[s1]; \
106 s0 = (mlib_s32)sa[0]; \
107 s1 = (mlib_s32)sa[csize]; \
108 da[0] = (DTYPE)t0; \
109 da[csize] = (DTYPE)t1; \
110 } \
111 t0 = tab[s0]; \
112 t1 = tab[s1]; \
113 da[0] = (DTYPE)t0; \
114 da[csize] = (DTYPE)t1; \
115 if (xsize & 1) da[2*csize] = tab[sa[0]]; \
116 } \
117 } \
118 } \
119}
120
121/***************************************************************/
122#define MLIB_C_IMAGELOOKUPSI(DTYPE, STYPE, TABLE) \
123{ \
124 mlib_s32 i, j, k; \
125 \
126 if (xsize < 2) { \
127 for(j = 0; j < ysize; j++, dst += dlb, src += slb){ \
128 for(k = 0; k < csize; k++) { \
129 DTYPE *da = dst + k; \
130 const STYPE *sa = (void *)src; \
131 DTYPE *tab = (DTYPE*) TABLE[k]; \
132 \
133 for(i = 0; i < xsize; i++, da += csize, sa ++) \
134 *da=tab[*sa]; \
135 } \
136 } \
137 } else { \
138 for(j = 0; j < ysize; j++, dst += dlb, src += slb) { \
139 for(k = 0; k < csize; k++) { \
140 DTYPE *da = dst + k; \
141 const STYPE *sa = (void *)src; \
142 DTYPE *tab = (DTYPE*) TABLE[k]; \
143 mlib_s32 s0, s1; \
144 DTYPE t0, t1; \
145 \
146 s0 = (mlib_s32)sa[0]; \
147 s1 = (mlib_s32)sa[1]; \
148 sa += 2; \
149 \
150 for(i = 0; \
151 i < xsize - 3; \
152 i+=2, da += 2*csize, sa += 2) { \
153 t0 = tab[s0]; \
154 t1 = tab[s1]; \
155 s0 = (mlib_s32)sa[0]; \
156 s1 = (mlib_s32)sa[1]; \
157 da[0] = (DTYPE)t0; \
158 da[csize] = (DTYPE)t1; \
159 } \
160 t0 = tab[s0]; \
161 t1 = tab[s1]; \
162 da[0] = (DTYPE)t0; \
163 da[csize] = (DTYPE)t1; \
164 if (xsize & 1) da[2*csize] = tab[sa[0]]; \
165 } \
166 } \
167 } \
168}
169
170/***************************************************************/
171#ifdef _LITTLE_ENDIAN
172
173#define READ_U8_D64(table0, table1, table2, table3) \
174 t0 = *(mlib_d64*)((mlib_u8*)table0 + ((s0 << 3) & 0x7F8)); \
175 t1 = *(mlib_d64*)((mlib_u8*)table1 + ((s0 >> 5) & 0x7F8)); \
176 t2 = *(mlib_d64*)((mlib_u8*)table2 + ((s0 >> 13) & 0x7F8)); \
177 t3 = *(mlib_d64*)((mlib_u8*)table3 + ((s0 >> 21) & 0x7F8))
178
179#else
180
181#define READ_U8_D64(table0, table1, table2, table3) \
182 t0 = *(mlib_d64*)((mlib_u8*)table0 + ((s0 >> 21) & 0x7F8)); \
183 t1 = *(mlib_d64*)((mlib_u8*)table1 + ((s0 >> 13) & 0x7F8)); \
184 t2 = *(mlib_d64*)((mlib_u8*)table2 + ((s0 >> 5) & 0x7F8)); \
185 t3 = *(mlib_d64*)((mlib_u8*)table3 + ((s0 << 3) & 0x7F8))
186
187#endif /* _LITTLE_ENDIAN */
188
189/***************************************************************/
190void mlib_ImageLookUp_U8_D64(const mlib_u8 *src,
191 mlib_s32 slb,
192 mlib_d64 *dst,
193 mlib_s32 dlb,
194 mlib_s32 xsize,
195 mlib_s32 ysize,
196 mlib_s32 csize,
197 const mlib_d64 **table)
198{
199
200 if (xsize * csize < 7) {
201 MLIB_C_IMAGELOOKUP(mlib_d64, mlib_u8, table);
202 }
203 else if (csize == 1) {
204 mlib_s32 i, j;
205
206 for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
207 mlib_u32 *sa;
208 mlib_d64 *tab = (mlib_d64 *) table[0];
209 mlib_u32 s0;
210 mlib_d64 t0, t1, t2, t3;
211 mlib_s32 off;
212 mlib_s32 size = xsize;
213 mlib_d64 *dp = (mlib_d64 *) dst;
214 mlib_u8 *sp = (void *)src;
215
216 off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
217
218 for (i = 0; i < off; i++, sp++) {
219 *dp++ = tab[sp[0]];
220 size--;
221 }
222
223 sa = (mlib_u32 *) sp;
224
225 s0 = sa[0];
226 sa++;
227
228#ifdef __SUNPRO_C
229#pragma pipeloop(0)
230#endif /* __SUNPRO_C */
231 for (i = 0; i < size - 7; i += 4, dp += 4, sa++) {
232 READ_U8_D64(tab, tab, tab, tab);
233 s0 = sa[0];
234 dp[0] = t0;
235 dp[1] = t1;
236 dp[2] = t2;
237 dp[3] = t3;
238 }
239
240 READ_U8_D64(tab, tab, tab, tab);
241 dp[0] = t0;
242 dp[1] = t1;
243 dp[2] = t2;
244 dp[3] = t3;
245 dp += 4;
246 sp = (mlib_u8 *) sa;
247 i += 4;
248 for (; i < size; i++, dp++, sp++)
249 dp[0] = tab[sp[0]];
250 }
251 }
252 else if (csize == 2) {
253 mlib_s32 i, j;
254
255 for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
256 mlib_u32 *sa;
257 mlib_d64 *tab0 = (mlib_d64 *) table[0];
258 mlib_d64 *tab1 = (mlib_d64 *) table[1];
259 mlib_d64 *tab;
260 mlib_u32 s0;
261 mlib_d64 t0, t1, t2, t3;
262 mlib_s32 off;
263 mlib_s32 size = xsize * 2;
264 mlib_d64 *dp = (mlib_d64 *) dst;
265 mlib_u8 *sp = (void *)src;
266
267 off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
268
269 for (i = 0; i < off - 1; i += 2, sp += 2) {
270 *dp++ = tab0[sp[0]];
271 *dp++ = tab1[sp[1]];
272 size -= 2;
273 }
274
275 if ((off & 1) != 0) {
276 *dp++ = tab0[*sp];
277 size--;
278 sp++;
279 tab = tab0;
280 tab0 = tab1;
281 tab1 = tab;
282 }
283
284 sa = (mlib_u32 *) sp;
285
286 s0 = sa[0];
287 sa++;
288
289#ifdef __SUNPRO_C
290#pragma pipeloop(0)
291#endif /* __SUNPRO_C */
292 for (i = 0; i < size - 7; i += 4, dp += 4, sa++) {
293 READ_U8_D64(tab0, tab1, tab0, tab1);
294 s0 = sa[0];
295 dp[0] = t0;
296 dp[1] = t1;
297 dp[2] = t2;
298 dp[3] = t3;
299 }
300
301 READ_U8_D64(tab0, tab1, tab0, tab1);
302 dp[0] = t0;
303 dp[1] = t1;
304 dp[2] = t2;
305 dp[3] = t3;
306 dp += 4;
307 sp = (mlib_u8 *) sa;
308 i += 4;
309
310 for (; i < size - 1; i += 2, sp += 2) {
311 *dp++ = tab0[sp[0]];
312 *dp++ = tab1[sp[1]];
313 }
314
315 if (i < size)
316 *dp = tab0[(*sp)];
317 }
318 }
319 else if (csize == 3) {
320 mlib_s32 i, j;
321
322 for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
323 mlib_u32 *sa;
324 mlib_d64 *tab0 = (mlib_d64 *) table[0];
325 mlib_d64 *tab1 = (mlib_d64 *) table[1];
326 mlib_d64 *tab2 = (mlib_d64 *) table[2];
327 mlib_d64 *tab;
328 mlib_u32 s0;
329 mlib_d64 t0, t1, t2, t3;
330 mlib_s32 off;
331 mlib_s32 size = xsize * 3;
332 mlib_d64 *dp = (mlib_d64 *) dst;
333 mlib_u8 *sp = (void *)src;
334
335 off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
336
337 if (off == 1) {
338 *dp++ = tab0[(*sp)];
339 tab = tab0;
340 tab0 = tab1;
341 tab1 = tab2;
342 tab2 = tab;
343 size--;
344 sp++;
345 }
346 else if (off == 2) {
347 *dp++ = tab0[sp[0]];
348 *dp++ = tab1[sp[1]];
349 tab = tab2;
350 tab2 = tab1;
351 tab1 = tab0;
352 tab0 = tab;
353 size -= 2;
354 sp += 2;
355 }
356 else if (off == 3) {
357 *dp++ = tab0[sp[0]];
358 *dp++ = tab1[sp[1]];
359 *dp++ = tab2[sp[2]];
360 size -= 3;
361 sp += 3;
362 }
363
364 sa = (mlib_u32 *) sp;
365
366 s0 = sa[0];
367 sa++;
368
369#ifdef __SUNPRO_C
370#pragma pipeloop(0)
371#endif /* __SUNPRO_C */
372 for (i = 0; i < size - 7; i += 4, dp += 4, sa++) {
373 READ_U8_D64(tab0, tab1, tab2, tab0);
374 tab = tab0;
375 tab0 = tab1;
376 tab1 = tab2;
377 tab2 = tab;
378 s0 = sa[0];
379 dp[0] = t0;
380 dp[1] = t1;
381 dp[2] = t2;
382 dp[3] = t3;
383 }
384
385 READ_U8_D64(tab0, tab1, tab2, tab0);
386 dp[0] = t0;
387 dp[1] = t1;
388 dp[2] = t2;
389 dp[3] = t3;
390 dp += 4;
391 sp = (mlib_u8 *) sa;
392 i += 4;
393
394 if (i < size) {
395 *dp++ = tab1[(*sp)];
396 i++;
397 sp++;
398 }
399
400 if (i < size) {
401 *dp++ = tab2[(*sp)];
402 i++;
403 sp++;
404 }
405
406 if (i < size) {
407 *dp = tab0[(*sp)];
408 }
409 }
410 }
411 else if (csize == 4) {
412 mlib_s32 i, j;
413
414 for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
415 mlib_u32 *sa;
416 mlib_d64 *tab0 = (mlib_d64 *) table[0];
417 mlib_d64 *tab1 = (mlib_d64 *) table[1];
418 mlib_d64 *tab2 = (mlib_d64 *) table[2];
419 mlib_d64 *tab3 = (mlib_d64 *) table[3];
420 mlib_d64 *tab;
421 mlib_u32 s0;
422 mlib_d64 t0, t1, t2, t3;
423 mlib_s32 off;
424 mlib_s32 size = xsize * 4;
425 mlib_d64 *dp = (mlib_d64 *) dst;
426 mlib_u8 *sp = (void *)src;
427
428 off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
429
430 if (off == 1) {
431 *dp++ = tab0[(*sp)];
432 tab = tab0;
433 tab0 = tab1;
434 tab1 = tab2;
435 tab2 = tab3;
436 tab3 = tab;
437 size--;
438 sp++;
439 }
440 else if (off == 2) {
441 *dp++ = tab0[sp[0]];
442 *dp++ = tab1[sp[1]];
443 tab = tab0;
444 tab0 = tab2;
445 tab2 = tab;
446 tab = tab1;
447 tab1 = tab3;
448 tab3 = tab;
449 size -= 2;
450 sp += 2;
451 }
452 else if (off == 3) {
453 *dp++ = tab0[sp[0]];
454 *dp++ = tab1[sp[1]];
455 *dp++ = tab2[sp[2]];
456 tab = tab3;
457 tab3 = tab2;
458 tab2 = tab1;
459 tab1 = tab0;
460 tab0 = tab;
461 size -= 3;
462 sp += 3;
463 }
464
465 sa = (mlib_u32 *) sp;
466
467 s0 = sa[0];
468 sa++;
469
470#ifdef __SUNPRO_C
471#pragma pipeloop(0)
472#endif /* __SUNPRO_C */
473 for (i = 0; i < size - 7; i += 4, dp += 4, sa++) {
474 READ_U8_D64(tab0, tab1, tab2, tab3);
475 s0 = sa[0];
476 dp[0] = t0;
477 dp[1] = t1;
478 dp[2] = t2;
479 dp[3] = t3;
480 }
481
482 READ_U8_D64(tab0, tab1, tab2, tab3);
483 dp[0] = t0;
484 dp[1] = t1;
485 dp[2] = t2;
486 dp[3] = t3;
487 dp += 4;
488 sp = (mlib_u8 *) sa;
489 i += 4;
490
491 if (i < size) {
492 *dp++ = tab0[(*sp)];
493 i++;
494 sp++;
495 }
496
497 if (i < size) {
498 *dp++ = tab1[(*sp)];
499 i++;
500 sp++;
501 }
502
503 if (i < size) {
504 *dp = tab2[(*sp)];
505 }
506 }
507 }
508}
509
510/***************************************************************/
511void mlib_ImageLookUp_S16_D64(const mlib_s16 *src,
512 mlib_s32 slb,
513 mlib_d64 *dst,
514 mlib_s32 dlb,
515 mlib_s32 xsize,
516 mlib_s32 ysize,
517 mlib_s32 csize,
518 const mlib_d64 **table)
519{
520 const mlib_d64 *table_base[4];
521 mlib_s32 c;
522
523 for (c = 0; c < csize; c++) {
524 table_base[c] = &table[c][32768];
525 }
526
527 MLIB_C_IMAGELOOKUP(mlib_d64, mlib_s16, table_base);
528}
529
530/***************************************************************/
531void mlib_ImageLookUp_U16_D64(const mlib_u16 *src,
532 mlib_s32 slb,
533 mlib_d64 *dst,
534 mlib_s32 dlb,
535 mlib_s32 xsize,
536 mlib_s32 ysize,
537 mlib_s32 csize,
538 const mlib_d64 **table)
539{
540 const mlib_d64 *table_base[4];
541 mlib_s32 c;
542
543 for (c = 0; c < csize; c++) {
544 table_base[c] = &table[c][0];
545 }
546
547 MLIB_C_IMAGELOOKUP(mlib_d64, mlib_u16, table_base);
548}
549
550/***************************************************************/
551void mlib_ImageLookUp_S32_D64(const mlib_s32 *src,
552 mlib_s32 slb,
553 mlib_d64 *dst,
554 mlib_s32 dlb,
555 mlib_s32 xsize,
556 mlib_s32 ysize,
557 mlib_s32 csize,
558 const mlib_d64 **table)
559{
560 const mlib_d64 *table_base[4];
561 mlib_u32 shift = TABLE_SHIFT_S32;
562 mlib_s32 c;
563
564 for (c = 0; c < csize; c++) {
565 table_base[c] = &table[c][shift];
566 }
567
568 MLIB_C_IMAGELOOKUP(mlib_d64, mlib_s32, table_base);
569}
570
571/***************************************************************/
572void mlib_ImageLookUpSI_U8_D64(const mlib_u8 *src,
573 mlib_s32 slb,
574 mlib_d64 *dst,
575 mlib_s32 dlb,
576 mlib_s32 xsize,
577 mlib_s32 ysize,
578 mlib_s32 csize,
579 const mlib_d64 **table)
580{
581
582 if (xsize < 7) {
583 MLIB_C_IMAGELOOKUPSI(mlib_d64, mlib_u8, table);
584 }
585 else if (csize == 2) {
586 mlib_s32 i, j;
587
588 for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
589 mlib_u32 *sa;
590 mlib_d64 *tab0 = (mlib_d64 *) table[0];
591 mlib_d64 *tab1 = (mlib_d64 *) table[1];
592 mlib_u32 s0;
593 mlib_d64 t0, t1, t2, t3;
594 mlib_s32 off;
595 mlib_s32 size = xsize;
596 mlib_d64 *dp = (mlib_d64 *) dst;
597 mlib_u8 *sp = (void *)src;
598
599 off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
600
601 for (i = 0; i < off; i++, sp++) {
602 *dp++ = tab0[sp[0]];
603 *dp++ = tab1[sp[0]];
604 size--;
605 }
606
607 sa = (mlib_u32 *) sp;
608
609 s0 = sa[0];
610 sa++;
611
612#ifdef __SUNPRO_C
613#pragma pipeloop(0)
614#endif /* __SUNPRO_C */
615 for (i = 0; i < size - 7; i += 4, dp += 8, sa++) {
616#ifdef _LITTLE_ENDIAN
617 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
618 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
619 t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
620 t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
621#else
622 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
623 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
624 t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
625 t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
626#endif /* _LITTLE_ENDIAN */
627 dp[0] = t0;
628 dp[1] = t1;
629 dp[2] = t2;
630 dp[3] = t3;
631#ifdef _LITTLE_ENDIAN
632 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
633 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
634 t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
635 t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
636#else
637 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
638 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
639 t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
640 t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
641#endif /* _LITTLE_ENDIAN */
642 s0 = sa[0];
643 dp[4] = t0;
644 dp[5] = t1;
645 dp[6] = t2;
646 dp[7] = t3;
647 }
648
649#ifdef _LITTLE_ENDIAN
650 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
651 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
652 t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
653 t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
654#else
655 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
656 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
657 t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
658 t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
659#endif /* _LITTLE_ENDIAN */
660 dp[0] = t0;
661 dp[1] = t1;
662 dp[2] = t2;
663 dp[3] = t3;
664#ifdef _LITTLE_ENDIAN
665 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
666 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
667 t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
668 t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
669#else
670 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
671 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
672 t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
673 t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
674#endif /* _LITTLE_ENDIAN */
675 dp[4] = t0;
676 dp[5] = t1;
677 dp[6] = t2;
678 dp[7] = t3;
679 dp += 8;
680 sp = (mlib_u8 *) sa;
681 i += 4;
682
683 for (; i < size; i++, sp++) {
684 *dp++ = tab0[sp[0]];
685 *dp++ = tab1[sp[0]];
686 }
687 }
688 }
689 else if (csize == 3) {
690 mlib_s32 i, j;
691
692 for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
693 mlib_u32 *sa;
694 mlib_d64 *tab0 = (mlib_d64 *) table[0];
695 mlib_d64 *tab1 = (mlib_d64 *) table[1];
696 mlib_d64 *tab2 = (mlib_d64 *) table[2];
697 mlib_u32 s0;
698 mlib_d64 t0, t1, t2, t3, t4, t5;
699 mlib_s32 off;
700 mlib_s32 size = xsize;
701 mlib_d64 *dp = (mlib_d64 *) dst;
702 mlib_u8 *sp = (void *)src;
703
704 off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
705
706 for (i = 0; i < off; i++, sp++) {
707 *dp++ = tab0[sp[0]];
708 *dp++ = tab1[sp[0]];
709 *dp++ = tab2[sp[0]];
710 size--;
711 }
712
713 sa = (mlib_u32 *) sp;
714
715 s0 = sa[0];
716 sa++;
717
718#ifdef __SUNPRO_C
719#pragma pipeloop(0)
720#endif /* __SUNPRO_C */
721 for (i = 0; i < size - 7; i += 4, dp += 12, sa++) {
722#ifdef _LITTLE_ENDIAN
723 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
724 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
725 t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));
726 t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
727 t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
728 t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));
729#else
730 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
731 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
732 t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));
733 t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
734 t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
735 t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));
736#endif /* _LITTLE_ENDIAN */
737 dp[0] = t0;
738 dp[1] = t1;
739 dp[2] = t2;
740 dp[3] = t3;
741 dp[4] = t4;
742 dp[5] = t5;
743#ifdef _LITTLE_ENDIAN
744 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
745 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
746 t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));
747 t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
748 t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
749 t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));
750#else
751 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
752 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
753 t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));
754 t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
755 t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
756 t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));
757#endif /* _LITTLE_ENDIAN */
758 s0 = sa[0];
759 dp[6] = t0;
760 dp[7] = t1;
761 dp[8] = t2;
762 dp[9] = t3;
763 dp[10] = t4;
764 dp[11] = t5;
765 }
766
767#ifdef _LITTLE_ENDIAN
768 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
769 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
770 t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));
771 t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
772 t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
773 t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));
774#else
775 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
776 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
777 t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));
778 t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
779 t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
780 t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));
781#endif /* _LITTLE_ENDIAN */
782 dp[0] = t0;
783 dp[1] = t1;
784 dp[2] = t2;
785 dp[3] = t3;
786 dp[4] = t4;
787 dp[5] = t5;
788#ifdef _LITTLE_ENDIAN
789 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
790 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
791 t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));
792 t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
793 t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
794 t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));
795#else
796 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
797 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
798 t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));
799 t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
800 t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
801 t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));
802#endif /* _LITTLE_ENDIAN */
803 dp[6] = t0;
804 dp[7] = t1;
805 dp[8] = t2;
806 dp[9] = t3;
807 dp[10] = t4;
808 dp[11] = t5;
809 dp += 12;
810 sp = (mlib_u8 *) sa;
811 i += 4;
812
813 for (; i < size; i++, sp++) {
814 *dp++ = tab0[sp[0]];
815 *dp++ = tab1[sp[0]];
816 *dp++ = tab2[sp[0]];
817 }
818 }
819 }
820 else if (csize == 4) {
821 mlib_s32 i, j;
822
823 for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
824 mlib_u32 *sa;
825 mlib_d64 *tab0 = (mlib_d64 *) table[0];
826 mlib_d64 *tab1 = (mlib_d64 *) table[1];
827 mlib_d64 *tab2 = (mlib_d64 *) table[2];
828 mlib_d64 *tab3 = (mlib_d64 *) table[3];
829 mlib_u32 s0;
830 mlib_d64 t0, t1, t2, t3;
831 mlib_s32 off;
832 mlib_s32 size = xsize;
833 mlib_d64 *dp = (mlib_d64 *) dst;
834 mlib_u8 *sp = (void *)src;
835
836 off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
837
838 for (i = 0; i < off; i++, sp++) {
839 *dp++ = tab0[sp[0]];
840 *dp++ = tab1[sp[0]];
841 *dp++ = tab2[sp[0]];
842 *dp++ = tab3[sp[0]];
843 size--;
844 }
845
846 sa = (mlib_u32 *) sp;
847
848 s0 = sa[0];
849 sa++;
850
851#ifdef __SUNPRO_C
852#pragma pipeloop(0)
853#endif /* __SUNPRO_C */
854 for (i = 0; i < size - 7; i += 4, dp += 16, sa++) {
855#ifdef _LITTLE_ENDIAN
856 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
857 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
858 t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));
859 t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 << 3) & 0x7F8));
860#else
861 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
862 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
863 t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));
864 t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 21) & 0x7F8));
865#endif /* _LITTLE_ENDIAN */
866 dp[0] = t0;
867 dp[1] = t1;
868 dp[2] = t2;
869 dp[3] = t3;
870#ifdef _LITTLE_ENDIAN
871 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
872 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
873 t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));
874 t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 5) & 0x7F8));
875#else
876 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
877 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
878 t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));
879 t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 13) & 0x7F8));
880#endif /* _LITTLE_ENDIAN */
881 dp[4] = t0;
882 dp[5] = t1;
883 dp[6] = t2;
884 dp[7] = t3;
885#ifdef _LITTLE_ENDIAN
886 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
887 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
888 t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));
889 t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 13) & 0x7F8));
890#else
891 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
892 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
893 t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));
894 t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 5) & 0x7F8));
895#endif /* _LITTLE_ENDIAN */
896 dp[8] = t0;
897 dp[9] = t1;
898 dp[10] = t2;
899 dp[11] = t3;
900#ifdef _LITTLE_ENDIAN
901 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
902 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
903 t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));
904 t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 21) & 0x7F8));
905#else
906 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
907 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
908 t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));
909 t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 << 3) & 0x7F8));
910#endif /* _LITTLE_ENDIAN */
911 s0 = sa[0];
912 dp[12] = t0;
913 dp[13] = t1;
914 dp[14] = t2;
915 dp[15] = t3;
916 }
917
918#ifdef _LITTLE_ENDIAN
919 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
920 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
921 t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));
922 t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 << 3) & 0x7F8));
923#else
924 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
925 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
926 t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));
927 t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 21) & 0x7F8));
928#endif /* _LITTLE_ENDIAN */
929 dp[0] = t0;
930 dp[1] = t1;
931 dp[2] = t2;
932 dp[3] = t3;
933#ifdef _LITTLE_ENDIAN
934 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
935 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
936 t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));
937 t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 5) & 0x7F8));
938#else
939 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
940 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
941 t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));
942 t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 13) & 0x7F8));
943#endif /* _LITTLE_ENDIAN */
944 dp[4] = t0;
945 dp[5] = t1;
946 dp[6] = t2;
947 dp[7] = t3;
948#ifdef _LITTLE_ENDIAN
949 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
950 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
951 t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));
952 t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 13) & 0x7F8));
953#else
954 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
955 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
956 t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));
957 t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 5) & 0x7F8));
958#endif /* _LITTLE_ENDIAN */
959 dp[8] = t0;
960 dp[9] = t1;
961 dp[10] = t2;
962 dp[11] = t3;
963#ifdef _LITTLE_ENDIAN
964 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
965 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
966 t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));
967 t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 21) & 0x7F8));
968#else
969 t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
970 t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
971 t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));
972 t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 << 3) & 0x7F8));
973#endif /* _LITTLE_ENDIAN */
974 dp[12] = t0;
975 dp[13] = t1;
976 dp[14] = t2;
977 dp[15] = t3;
978 dp += 16;
979 sp = (mlib_u8 *) sa;
980 i += 4;
981
982 for (; i < size; i++, sp++) {
983 *dp++ = tab0[sp[0]];
984 *dp++ = tab1[sp[0]];
985 *dp++ = tab2[sp[0]];
986 *dp++ = tab3[sp[0]];
987 }
988 }
989 }
990}
991
992/***************************************************************/
993void mlib_ImageLookUpSI_S16_D64(const mlib_s16 *src,
994 mlib_s32 slb,
995 mlib_d64 *dst,
996 mlib_s32 dlb,
997 mlib_s32 xsize,
998 mlib_s32 ysize,
999 mlib_s32 csize,
1000 const mlib_d64 **table)
1001{
1002 const mlib_d64 *table_base[4];
1003 mlib_s32 c;
1004
1005 for (c = 0; c < csize; c++) {
1006 table_base[c] = &table[c][32768];
1007 }
1008
1009 MLIB_C_IMAGELOOKUPSI(mlib_d64, mlib_s16, table_base);
1010}
1011
1012/***************************************************************/
1013void mlib_ImageLookUpSI_U16_D64(const mlib_u16 *src,
1014 mlib_s32 slb,
1015 mlib_d64 *dst,
1016 mlib_s32 dlb,
1017 mlib_s32 xsize,
1018 mlib_s32 ysize,
1019 mlib_s32 csize,
1020 const mlib_d64 **table)
1021{
1022 const mlib_d64 *table_base[4];
1023 mlib_s32 c;
1024
1025 for (c = 0; c < csize; c++) {
1026 table_base[c] = &table[c][0];
1027 }
1028
1029 MLIB_C_IMAGELOOKUPSI(mlib_d64, mlib_u16, table_base);
1030}
1031
1032/***************************************************************/
1033void mlib_ImageLookUpSI_S32_D64(const mlib_s32 *src,
1034 mlib_s32 slb,
1035 mlib_d64 *dst,
1036 mlib_s32 dlb,
1037 mlib_s32 xsize,
1038 mlib_s32 ysize,
1039 mlib_s32 csize,
1040 const mlib_d64 **table)
1041{
1042 const mlib_d64 *table_base[4];
1043 mlib_u32 shift = TABLE_SHIFT_S32;
1044 mlib_s32 c;
1045
1046 for (c = 0; c < csize; c++) {
1047 table_base[c] = &table[c][shift];
1048 }
1049
1050 MLIB_C_IMAGELOOKUPSI(mlib_d64, mlib_s32, table_base);
1051}
1052
1053/***************************************************************/
1054