PageRenderTime 68ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 1ms

/MRI-J/jdk/src/share/native/sun/awt/medialib/mlib_c_ImageLookUp_f.c

http://github.com/GregBowyer/ManagedRuntimeInitiative
C | 3878 lines | 3360 code | 449 blank | 69 comment | 381 complexity | 35116b010c761e573bb7faf9db7564ac MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause, LGPL-3.0

Large files files are truncated, but you can click here to view the full file

  1. /*
  2. * Copyright 2003 Sun Microsystems, Inc. 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. Sun designates this
  8. * particular file as subject to the "Classpath" exception as provided
  9. * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  22. * CA 95054 USA or visit www.sun.com if you need additional information or
  23. * have any questions.
  24. */
  25. #include "mlib_image.h"
  26. #include "mlib_ImageLookUp.h"
  27. #include "mlib_c_ImageLookUp.h"
  28. /***************************************************************/
  29. #define MLIB_C_IMAGELOOKUP(DTYPE, STYPE, TABLE) \
  30. { \
  31. mlib_s32 i, j, k; \
  32. \
  33. if (xsize < 2) { \
  34. for(j = 0; j < ysize; j++, dst += dlb, src += slb){ \
  35. for(k = 0; k < csize; k++) { \
  36. DTYPE *da = dst + k; \
  37. const STYPE *sa = src + k; \
  38. DTYPE *tab = (DTYPE*) TABLE[k]; \
  39. \
  40. for(i = 0; i < xsize; i++, da += csize, sa += csize) \
  41. *da=tab[*sa]; \
  42. } \
  43. } \
  44. } else { \
  45. for(j = 0; j < ysize; j++, dst += dlb, src += slb) { \
  46. for(k = 0; k < csize; k++) { \
  47. DTYPE *da = dst + k; \
  48. const STYPE *sa = src + k; \
  49. DTYPE *tab = (DTYPE*) TABLE[k]; \
  50. mlib_s32 s0, t0, s1, t1; \
  51. \
  52. s0 = (mlib_s32)sa[0]; \
  53. s1 = (mlib_s32)sa[csize]; \
  54. sa += 2*csize; \
  55. \
  56. for(i = 0; i < xsize - 3; i+=2, da += 2*csize, sa += 2*csize) { \
  57. t0 = (mlib_s32)tab[s0]; \
  58. t1 = (mlib_s32)tab[s1]; \
  59. s0 = (mlib_s32)sa[0]; \
  60. s1 = (mlib_s32)sa[csize]; \
  61. da[0] = (DTYPE)t0; \
  62. da[csize] = (DTYPE)t1; \
  63. } \
  64. t0 = (mlib_s32)tab[s0]; \
  65. t1 = (mlib_s32)tab[s1]; \
  66. da[0] = (DTYPE)t0; \
  67. da[csize] = (DTYPE)t1; \
  68. if (xsize & 1) da[2*csize] = tab[sa[0]]; \
  69. } \
  70. } \
  71. } \
  72. }
  73. /***************************************************************/
  74. #define MLIB_C_IMAGELOOKUPSI(DTYPE, STYPE, TABLE) \
  75. { \
  76. mlib_s32 i, j, k; \
  77. \
  78. if (xsize < 2) { \
  79. for(j = 0; j < ysize; j++, dst += dlb, src += slb){ \
  80. for(k = 0; k < csize; k++) { \
  81. DTYPE *da = dst + k; \
  82. const STYPE *sa = (void *)src; \
  83. DTYPE *tab = (DTYPE*) TABLE[k]; \
  84. \
  85. for(i = 0; i < xsize; i++, da += csize, sa ++) \
  86. *da=tab[*sa]; \
  87. } \
  88. } \
  89. } else { \
  90. for(j = 0; j < ysize; j++, dst += dlb, src += slb) { \
  91. for(k = 0; k < csize; k++) { \
  92. DTYPE *da = dst + k; \
  93. const STYPE *sa = (void *)src; \
  94. DTYPE *tab = (DTYPE*) TABLE[k]; \
  95. mlib_s32 s0, t0, s1, t1; \
  96. \
  97. s0 = (mlib_s32)sa[0]; \
  98. s1 = (mlib_s32)sa[1]; \
  99. sa += 2; \
  100. \
  101. for(i = 0; i < xsize - 3; i+=2, da += 2*csize, sa += 2) { \
  102. t0 = (mlib_s32)tab[s0]; \
  103. t1 = (mlib_s32)tab[s1]; \
  104. s0 = (mlib_s32)sa[0]; \
  105. s1 = (mlib_s32)sa[1]; \
  106. da[0] = (DTYPE)t0; \
  107. da[csize] = (DTYPE)t1; \
  108. } \
  109. t0 = (mlib_s32)tab[s0]; \
  110. t1 = (mlib_s32)tab[s1]; \
  111. da[0] = (DTYPE)t0; \
  112. da[csize] = (DTYPE)t1; \
  113. if (xsize & 1) da[2*csize] = tab[sa[0]]; \
  114. } \
  115. } \
  116. } \
  117. }
  118. #ifdef _LITTLE_ENDIAN
  119. /***************************************************************/
  120. #define READ_U8_U8_ALIGN(table0, table1, table2, table3) \
  121. t3 = table0[s0 & 0xFF]; \
  122. t2 = table1[s0>>8]; \
  123. t1 = table2[s1 & 0xFF]; \
  124. t0 = table3[s1>>8]
  125. /***************************************************************/
  126. #define READ_U8_U8_NOTALIGN(table0, table1, table2, table3) \
  127. t3 = table0[s0 >> 8]; \
  128. t2 = table1[s1 & 0xFF]; \
  129. t1 = table2[s1 >> 8]; \
  130. t0 = table3[s2 & 0xFF]
  131. /***************************************************************/
  132. #define READ_U8_S16_ALIGN(table0, table1, table2, table3) \
  133. t1 = *(mlib_u16*)((mlib_u8*)table0 + ((s0 << 1) & 0x1FE)); \
  134. t0 = *(mlib_u16*)((mlib_u8*)table1 + ((s0 >> 7) & 0x1FE)); \
  135. t3 = *(mlib_u16*)((mlib_u8*)table2 + ((s0 >> 15) & 0x1FE)); \
  136. t2 = *(mlib_u16*)((mlib_u8*)table3 + ((s0 >> 23) & 0x1FE))
  137. /***************************************************************/
  138. #define READ_U8_S16_NOTALIGN(table0, table1, table2, table3) \
  139. t1 = *(mlib_u16*)((mlib_u8*)table0 + ((s0 >> 7) & 0x1FE)); \
  140. t0 = *(mlib_u16*)((mlib_u8*)table1 + ((s0 >> 15) & 0x1FE)); \
  141. t3 = *(mlib_u16*)((mlib_u8*)table2 + ((s0 >> 23) & 0x1FE)); \
  142. t2 = *(mlib_u16*)((mlib_u8*)table3 + ((s1 << 1) & 0x1FE))
  143. /***************************************************************/
  144. #define ADD_READ_U8_S16_NOTALIGN(table0, table1, table2) \
  145. t1 = *(mlib_u16*)((mlib_u8*)table0 + ((s1 >> 7) & 0x1FE)); \
  146. t0 = *(mlib_u16*)((mlib_u8*)table1 + ((s1 >> 15) & 0x1FE)); \
  147. t2 = *(mlib_u16*)((mlib_u8*)table2 + ((s1 >> 23) & 0x1FE))
  148. /***************************************************************/
  149. #define READ_U8_S32(table0, table1, table2, table3) \
  150. t0 = *(mlib_u32*)((mlib_u8*)table0 + ((s0 << 2) & 0x3FC)); \
  151. t1 = *(mlib_u32*)((mlib_u8*)table1 + ((s0 >> 6) & 0x3FC)); \
  152. t2 = *(mlib_u32*)((mlib_u8*)table2 + ((s0 >> 14) & 0x3FC)); \
  153. t3 = *(mlib_u32*)((mlib_u8*)table3 + ((s0 >> 22) & 0x3FC))
  154. #else /* _LITTLE_ENDIAN */
  155. /***********/
  156. #define READ_U8_U8_ALIGN(table0, table1, table2, table3) \
  157. t0 = table0[s0>>8]; \
  158. t1 = table1[s0 & 0xFF]; \
  159. t2 = table2[s1>>8]; \
  160. t3 = table3[s1 & 0xFF]
  161. /***************************************************************/
  162. #define READ_U8_U8_NOTALIGN(table0, table1, table2, table3) \
  163. t0 = table0[s0 & 0xFF]; \
  164. t1 = table1[s1 >> 8]; \
  165. t2 = table2[s1 & 0xFF]; \
  166. t3 = table3[s2 >> 8]
  167. /***************************************************************/
  168. #define READ_U8_S16_ALIGN(table0, table1, table2, table3) \
  169. t0 = *(mlib_u16*)((mlib_u8*)table0 + ((s0 >> 23) & 0x1FE)); \
  170. t1 = *(mlib_u16*)((mlib_u8*)table1 + ((s0 >> 15) & 0x1FE)); \
  171. t2 = *(mlib_u16*)((mlib_u8*)table2 + ((s0 >> 7) & 0x1FE)); \
  172. t3 = *(mlib_u16*)((mlib_u8*)table3 + ((s0 << 1) & 0x1FE))
  173. /***************************************************************/
  174. #define READ_U8_S16_NOTALIGN(table0, table1, table2, table3) \
  175. t0 = *(mlib_u16*)((mlib_u8*)table0 + ((s0 >> 15) & 0x1FE)); \
  176. t1 = *(mlib_u16*)((mlib_u8*)table1 + ((s0 >> 7) & 0x1FE)); \
  177. t2 = *(mlib_u16*)((mlib_u8*)table2 + ((s0 << 1) & 0x1FE)); \
  178. t3 = *(mlib_u16*)((mlib_u8*)table3 + ((s1 >> 23) & 0x1FE))
  179. /***************************************************************/
  180. #define ADD_READ_U8_S16_NOTALIGN(table0, table1, table2) \
  181. t0 = *(mlib_u16*)((mlib_u8*)table0 + ((s1 >> 15) & 0x1FE)); \
  182. t1 = *(mlib_u16*)((mlib_u8*)table1 + ((s1 >> 7) & 0x1FE)); \
  183. t2 = *(mlib_u16*)((mlib_u8*)table2 + ((s1 << 1) & 0x1FE))
  184. /***************************************************************/
  185. #define READ_U8_S32(table0, table1, table2, table3) \
  186. t0 = *(mlib_u32*)((mlib_u8*)table0 + ((s0 >> 22) & 0x3FC)); \
  187. t1 = *(mlib_u32*)((mlib_u8*)table1 + ((s0 >> 14) & 0x3FC)); \
  188. t2 = *(mlib_u32*)((mlib_u8*)table2 + ((s0 >> 6) & 0x3FC)); \
  189. t3 = *(mlib_u32*)((mlib_u8*)table3 + ((s0 << 2) & 0x3FC))
  190. #endif /* _LITTLE_ENDIAN */
  191. /***************************************************************/
  192. void mlib_c_ImageLookUp_U8_U8(const mlib_u8 *src,
  193. mlib_s32 slb,
  194. mlib_u8 *dst,
  195. mlib_s32 dlb,
  196. mlib_s32 xsize,
  197. mlib_s32 ysize,
  198. mlib_s32 csize,
  199. const mlib_u8 **table)
  200. {
  201. if (xsize * csize < 9) {
  202. MLIB_C_IMAGELOOKUP(mlib_u8, mlib_u8, table);
  203. }
  204. else if (csize == 1) {
  205. mlib_s32 i, j;
  206. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  207. mlib_u32 *da;
  208. mlib_u16 *sa;
  209. mlib_u8 *tab = (mlib_u8 *) table[0];
  210. mlib_u32 s0, s1, s2, t0, t1, t2, t3, t;
  211. mlib_s32 off;
  212. mlib_s32 size = xsize;
  213. mlib_u8 *dp = dst, *sp = (void *)src;
  214. off = (mlib_s32) ((4 - ((mlib_addr) dst & 3)) & 3);
  215. for (i = 0; i < off; i++, sp++) {
  216. *dp++ = tab[sp[0]];
  217. size--;
  218. }
  219. da = (mlib_u32 *) dp;
  220. if (((mlib_addr) sp & 1) == 0) {
  221. sa = (mlib_u16 *) sp;
  222. s0 = sa[0];
  223. s1 = sa[1];
  224. sa += 2;
  225. #ifdef __SUNPRO_C
  226. #pragma pipeloop(0)
  227. #endif /* __SUNPRO_C */
  228. for (i = 0; i < size - 7; i += 4, da++, sa += 2) {
  229. READ_U8_U8_ALIGN(tab, tab, tab, tab);
  230. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  231. s0 = sa[0];
  232. s1 = sa[1];
  233. da[0] = t;
  234. }
  235. READ_U8_U8_ALIGN(tab, tab, tab, tab);
  236. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  237. da[0] = t;
  238. da++;
  239. dp = (mlib_u8 *) da;
  240. sp = (mlib_u8 *) sa;
  241. i += 4;
  242. for (; i < size; i++, dp++, sp++)
  243. dp[0] = tab[sp[0]];
  244. }
  245. else {
  246. sa = (mlib_u16 *) (sp - 1);
  247. s0 = sa[0];
  248. s1 = sa[1];
  249. s2 = sa[2];
  250. sa += 3;
  251. #ifdef __SUNPRO_C
  252. #pragma pipeloop(0)
  253. #endif /* __SUNPRO_C */
  254. for (i = 0; i < size - 8; i += 4, da++, sa += 2) {
  255. READ_U8_U8_NOTALIGN(tab, tab, tab, tab);
  256. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  257. s0 = s2;
  258. s1 = sa[0];
  259. s2 = sa[1];
  260. da[0] = t;
  261. }
  262. READ_U8_U8_NOTALIGN(tab, tab, tab, tab);
  263. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  264. da[0] = t;
  265. da++;
  266. dp = (mlib_u8 *) da;
  267. #ifdef _LITTLE_ENDIAN
  268. *dp++ = tab[s2 >> 8];
  269. #else
  270. *dp++ = tab[s2 & 0xFF];
  271. #endif /* _LITTLE_ENDIAN */
  272. sp = (mlib_u8 *) sa;
  273. i += 5;
  274. for (; i < size; i++, dp++, sp++)
  275. dp[0] = tab[sp[0]];
  276. }
  277. }
  278. }
  279. else if (csize == 2) {
  280. mlib_s32 i, j;
  281. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  282. mlib_u32 *da;
  283. mlib_u16 *sa;
  284. mlib_u8 *tab0 = (mlib_u8 *) table[0];
  285. mlib_u8 *tab1 = (mlib_u8 *) table[1];
  286. mlib_u8 *tab;
  287. mlib_u32 s0, s1, s2, t0, t1, t2, t3, t;
  288. mlib_s32 off;
  289. mlib_s32 size = xsize * 2;
  290. mlib_u8 *dp = dst, *sp = (void *)src;
  291. off = (mlib_s32) ((4 - ((mlib_addr) dst & 3)) & 3);
  292. for (i = 0; i < off - 1; i += 2, sp += 2) {
  293. *dp++ = tab0[sp[0]];
  294. *dp++ = tab1[sp[1]];
  295. size -= 2;
  296. }
  297. if ((off & 1) != 0) {
  298. *dp++ = tab0[sp[0]];
  299. size--;
  300. sp++;
  301. tab = tab0;
  302. tab0 = tab1;
  303. tab1 = tab;
  304. }
  305. da = (mlib_u32 *) dp;
  306. if (((mlib_addr) sp & 1) == 0) {
  307. sa = (mlib_u16 *) sp;
  308. s0 = sa[0];
  309. s1 = sa[1];
  310. sa += 2;
  311. #ifdef __SUNPRO_C
  312. #pragma pipeloop(0)
  313. #endif /* __SUNPRO_C */
  314. for (i = 0; i < size - 7; i += 4, da++, sa += 2) {
  315. READ_U8_U8_ALIGN(tab0, tab1, tab0, tab1);
  316. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  317. s0 = sa[0];
  318. s1 = sa[1];
  319. da[0] = t;
  320. }
  321. READ_U8_U8_ALIGN(tab0, tab1, tab0, tab1);
  322. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  323. da[0] = t;
  324. da++;
  325. dp = (mlib_u8 *) da;
  326. sp = (mlib_u8 *) sa;
  327. i += 4;
  328. for (; i < size - 1; i += 2, sp += 2) {
  329. *dp++ = tab0[sp[0]];
  330. *dp++ = tab1[sp[1]];
  331. }
  332. if (i < size)
  333. *dp = tab0[(*sp)];
  334. }
  335. else {
  336. sa = (mlib_u16 *) (sp - 1);
  337. s0 = sa[0];
  338. s1 = sa[1];
  339. s2 = sa[2];
  340. sa += 3;
  341. #ifdef __SUNPRO_C
  342. #pragma pipeloop(0)
  343. #endif /* __SUNPRO_C */
  344. for (i = 0; i < size - 8; i += 4, da++, sa += 2) {
  345. READ_U8_U8_NOTALIGN(tab0, tab1, tab0, tab1);
  346. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  347. s0 = s2;
  348. s1 = sa[0];
  349. s2 = sa[1];
  350. da[0] = t;
  351. }
  352. READ_U8_U8_NOTALIGN(tab0, tab1, tab0, tab1);
  353. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  354. da[0] = t;
  355. da++;
  356. dp = (mlib_u8 *) da;
  357. #ifdef _LITTLE_ENDIAN
  358. *dp++ = tab0[s2 >> 8];
  359. #else
  360. *dp++ = tab0[s2 & 0xFF];
  361. #endif /* _LITTLE_ENDIAN */
  362. sp = (mlib_u8 *) sa;
  363. i += 5;
  364. for (; i < size - 1; i += 2, sp += 2) {
  365. *dp++ = tab1[sp[0]];
  366. *dp++ = tab0[sp[1]];
  367. }
  368. if (i < size)
  369. *dp = tab1[(*sp)];
  370. }
  371. }
  372. }
  373. else if (csize == 3) {
  374. mlib_s32 i, j;
  375. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  376. mlib_u32 *da;
  377. mlib_u16 *sa;
  378. mlib_u8 *tab0 = (mlib_u8 *) table[0];
  379. mlib_u8 *tab1 = (mlib_u8 *) table[1];
  380. mlib_u8 *tab2 = (mlib_u8 *) table[2];
  381. mlib_u8 *tab;
  382. mlib_u32 s0, s1, s2, t0, t1, t2, t3, t;
  383. mlib_s32 off;
  384. mlib_s32 size = xsize * 3;
  385. mlib_u8 *dp = dst, *sp = (void *)src;
  386. off = (mlib_s32) ((4 - ((mlib_addr) dst & 3)) & 3);
  387. if (off == 1) {
  388. *dp++ = tab0[sp[0]];
  389. tab = tab0;
  390. tab0 = tab1;
  391. tab1 = tab2;
  392. tab2 = tab;
  393. size--;
  394. sp++;
  395. }
  396. else if (off == 2) {
  397. *dp++ = tab0[sp[0]];
  398. *dp++ = tab1[sp[1]];
  399. tab = tab2;
  400. tab2 = tab1;
  401. tab1 = tab0;
  402. tab0 = tab;
  403. size -= 2;
  404. sp += 2;
  405. }
  406. else if (off == 3) {
  407. *dp++ = tab0[sp[0]];
  408. *dp++ = tab1[sp[1]];
  409. *dp++ = tab2[sp[2]];
  410. size -= 3;
  411. sp += 3;
  412. }
  413. da = (mlib_u32 *) dp;
  414. if (((mlib_addr) sp & 1) == 0) {
  415. sa = (mlib_u16 *) sp;
  416. s0 = sa[0];
  417. s1 = sa[1];
  418. sa += 2;
  419. #ifdef __SUNPRO_C
  420. #pragma pipeloop(0)
  421. #endif /* __SUNPRO_C */
  422. for (i = 0; i < size - 7; i += 4, da++, sa += 2) {
  423. READ_U8_U8_ALIGN(tab0, tab1, tab2, tab0);
  424. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  425. tab = tab0;
  426. tab0 = tab1;
  427. tab1 = tab2;
  428. tab2 = tab;
  429. s0 = sa[0];
  430. s1 = sa[1];
  431. da[0] = t;
  432. }
  433. READ_U8_U8_ALIGN(tab0, tab1, tab2, tab0);
  434. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  435. da[0] = t;
  436. da++;
  437. dp = (mlib_u8 *) da;
  438. sp = (mlib_u8 *) sa;
  439. i += 4;
  440. if (i < size) {
  441. *dp++ = tab1[(*sp)];
  442. i++;
  443. sp++;
  444. }
  445. if (i < size) {
  446. *dp++ = tab2[(*sp)];
  447. i++;
  448. sp++;
  449. }
  450. if (i < size) {
  451. *dp++ = tab0[(*sp)];
  452. }
  453. }
  454. else {
  455. sa = (mlib_u16 *) (sp - 1);
  456. s0 = sa[0];
  457. s1 = sa[1];
  458. s2 = sa[2];
  459. sa += 3;
  460. #ifdef __SUNPRO_C
  461. #pragma pipeloop(0)
  462. #endif /* __SUNPRO_C */
  463. for (i = 0; i < size - 8; i += 4, da++, sa += 2) {
  464. READ_U8_U8_NOTALIGN(tab0, tab1, tab2, tab0);
  465. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  466. tab = tab0;
  467. tab0 = tab1;
  468. tab1 = tab2;
  469. tab2 = tab;
  470. s0 = s2;
  471. s1 = sa[0];
  472. s2 = sa[1];
  473. da[0] = t;
  474. }
  475. READ_U8_U8_NOTALIGN(tab0, tab1, tab2, tab0);
  476. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  477. da[0] = t;
  478. da++;
  479. dp = (mlib_u8 *) da;
  480. #ifdef _LITTLE_ENDIAN
  481. *dp++ = tab1[s2 >> 8];
  482. #else
  483. *dp++ = tab1[s2 & 0xFF];
  484. #endif /* _LITTLE_ENDIAN */
  485. sp = (mlib_u8 *) sa;
  486. i += 5;
  487. if (i < size) {
  488. *dp++ = tab2[(*sp)];
  489. i++;
  490. sp++;
  491. }
  492. if (i < size) {
  493. *dp++ = tab0[(*sp)];
  494. i++;
  495. sp++;
  496. }
  497. if (i < size) {
  498. *dp = tab1[(*sp)];
  499. }
  500. }
  501. }
  502. }
  503. else if (csize == 4) {
  504. mlib_s32 i, j;
  505. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  506. mlib_u32 *da;
  507. mlib_u16 *sa;
  508. mlib_u8 *tab0 = (mlib_u8 *) table[0];
  509. mlib_u8 *tab1 = (mlib_u8 *) table[1];
  510. mlib_u8 *tab2 = (mlib_u8 *) table[2];
  511. mlib_u8 *tab3 = (mlib_u8 *) table[3];
  512. mlib_u8 *tab;
  513. mlib_u32 s0, s1, s2, t0, t1, t2, t3, t;
  514. mlib_s32 off;
  515. mlib_s32 size = xsize * 4;
  516. mlib_u8 *dp = dst, *sp = (void *)src;
  517. off = (mlib_s32) ((4 - ((mlib_addr) dst & 3)) & 3);
  518. if (off == 1) {
  519. *dp++ = tab0[sp[0]];
  520. tab = tab0;
  521. tab0 = tab1;
  522. tab1 = tab2;
  523. tab2 = tab3;
  524. tab3 = tab;
  525. size--;
  526. sp++;
  527. }
  528. else if (off == 2) {
  529. *dp++ = tab0[sp[0]];
  530. *dp++ = tab1[sp[1]];
  531. tab = tab0;
  532. tab0 = tab2;
  533. tab2 = tab;
  534. tab = tab1;
  535. tab1 = tab3;
  536. tab3 = tab;
  537. size -= 2;
  538. sp += 2;
  539. }
  540. else if (off == 3) {
  541. *dp++ = tab0[sp[0]];
  542. *dp++ = tab1[sp[1]];
  543. *dp++ = tab2[sp[2]];
  544. tab = tab3;
  545. tab3 = tab2;
  546. tab2 = tab1;
  547. tab1 = tab0;
  548. tab0 = tab;
  549. size -= 3;
  550. sp += 3;
  551. }
  552. da = (mlib_u32 *) dp;
  553. if (((mlib_addr) sp & 1) == 0) {
  554. sa = (mlib_u16 *) sp;
  555. s0 = sa[0];
  556. s1 = sa[1];
  557. sa += 2;
  558. #ifdef __SUNPRO_C
  559. #pragma pipeloop(0)
  560. #endif /* __SUNPRO_C */
  561. for (i = 0; i < size - 7; i += 4, da++, sa += 2) {
  562. READ_U8_U8_ALIGN(tab0, tab1, tab2, tab3);
  563. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  564. s0 = sa[0];
  565. s1 = sa[1];
  566. da[0] = t;
  567. }
  568. READ_U8_U8_ALIGN(tab0, tab1, tab2, tab3);
  569. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  570. da[0] = t;
  571. da++;
  572. dp = (mlib_u8 *) da;
  573. sp = (mlib_u8 *) sa;
  574. i += 4;
  575. if (i < size) {
  576. *dp++ = tab0[(*sp)];
  577. i++;
  578. sp++;
  579. }
  580. if (i < size) {
  581. *dp++ = tab1[(*sp)];
  582. i++;
  583. sp++;
  584. }
  585. if (i < size) {
  586. *dp = tab2[(*sp)];
  587. }
  588. }
  589. else {
  590. sa = (mlib_u16 *) (sp - 1);
  591. s0 = sa[0];
  592. s1 = sa[1];
  593. s2 = sa[2];
  594. sa += 3;
  595. #ifdef __SUNPRO_C
  596. #pragma pipeloop(0)
  597. #endif /* __SUNPRO_C */
  598. for (i = 0; i < size - 8; i += 4, da++, sa += 2) {
  599. READ_U8_U8_NOTALIGN(tab0, tab1, tab2, tab3);
  600. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  601. s0 = s2;
  602. s1 = sa[0];
  603. s2 = sa[1];
  604. da[0] = t;
  605. }
  606. READ_U8_U8_NOTALIGN(tab0, tab1, tab2, tab3);
  607. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  608. da[0] = t;
  609. da++;
  610. dp = (mlib_u8 *) da;
  611. #ifdef _LITTLE_ENDIAN
  612. *dp++ = tab0[s2 >> 8];
  613. #else
  614. *dp++ = tab0[s2 & 0xFF];
  615. #endif /* _LITTLE_ENDIAN */
  616. sp = (mlib_u8 *) sa;
  617. i += 5;
  618. if (i < size) {
  619. *dp++ = tab1[(*sp)];
  620. i++;
  621. sp++;
  622. }
  623. if (i < size) {
  624. *dp++ = tab2[(*sp)];
  625. i++;
  626. sp++;
  627. }
  628. if (i < size) {
  629. *dp = tab3[(*sp)];
  630. }
  631. }
  632. }
  633. }
  634. }
  635. /***************************************************************/
  636. void mlib_c_ImageLookUp_S16_U8(const mlib_s16 *src,
  637. mlib_s32 slb,
  638. mlib_u8 *dst,
  639. mlib_s32 dlb,
  640. mlib_s32 xsize,
  641. mlib_s32 ysize,
  642. mlib_s32 csize,
  643. const mlib_u8 **table)
  644. {
  645. const mlib_u8 *table_base[4];
  646. mlib_s32 c;
  647. for (c = 0; c < csize; c++) {
  648. table_base[c] = &table[c][32768];
  649. }
  650. MLIB_C_IMAGELOOKUP(mlib_u8, mlib_s16, table_base);
  651. }
  652. /***************************************************************/
  653. void mlib_c_ImageLookUp_U16_U8(const mlib_u16 *src,
  654. mlib_s32 slb,
  655. mlib_u8 *dst,
  656. mlib_s32 dlb,
  657. mlib_s32 xsize,
  658. mlib_s32 ysize,
  659. mlib_s32 csize,
  660. const mlib_u8 **table)
  661. {
  662. const mlib_u8 *table_base[4];
  663. mlib_s32 c;
  664. for (c = 0; c < csize; c++) {
  665. table_base[c] = &table[c][0];
  666. }
  667. MLIB_C_IMAGELOOKUP(mlib_u8, mlib_u16, table_base);
  668. }
  669. /***************************************************************/
  670. void mlib_c_ImageLookUp_S32_U8(const mlib_s32 *src,
  671. mlib_s32 slb,
  672. mlib_u8 *dst,
  673. mlib_s32 dlb,
  674. mlib_s32 xsize,
  675. mlib_s32 ysize,
  676. mlib_s32 csize,
  677. const mlib_u8 **table)
  678. {
  679. const mlib_u8 *table_base[4];
  680. mlib_s32 c;
  681. for (c = 0; c < csize; c++) {
  682. table_base[c] = &table[c][TABLE_SHIFT_S32];
  683. }
  684. MLIB_C_IMAGELOOKUP(mlib_u8, mlib_s32, table_base);
  685. }
  686. /***************************************************************/
  687. void mlib_c_ImageLookUp_U8_S16(const mlib_u8 *src,
  688. mlib_s32 slb,
  689. mlib_s16 *dst,
  690. mlib_s32 dlb,
  691. mlib_s32 xsize,
  692. mlib_s32 ysize,
  693. mlib_s32 csize,
  694. const mlib_s16 **table)
  695. {
  696. if (xsize * csize < 12) {
  697. MLIB_C_IMAGELOOKUP(mlib_s16, mlib_u8, table);
  698. }
  699. else if (csize == 1) {
  700. mlib_s32 i, j;
  701. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  702. mlib_u32 *sa;
  703. mlib_u32 *da;
  704. mlib_u16 *tab = (mlib_u16 *) table[0];
  705. mlib_u32 s0, s1, t0, t1, t2, t3;
  706. mlib_u32 res1, res2;
  707. mlib_s32 off;
  708. mlib_s32 size = xsize;
  709. mlib_u16 *dp = (mlib_u16 *) dst;
  710. mlib_u8 *sp = (void *)src;
  711. off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
  712. for (i = 0; i < off; i++, sp++) {
  713. *dp++ = tab[sp[0]];
  714. size--;
  715. }
  716. sa = (mlib_u32 *) sp;
  717. if (((mlib_addr) dp & 3) == 0) {
  718. da = (mlib_u32 *) dp;
  719. s0 = sa[0];
  720. sa++;
  721. #ifdef __SUNPRO_C
  722. #pragma pipeloop(0)
  723. #endif /* __SUNPRO_C */
  724. for (i = 0; i < size - 7; i += 4, da += 2, sa++) {
  725. READ_U8_S16_ALIGN(tab, tab, tab, tab);
  726. res1 = (t0 << 16) + t1;
  727. res2 = (t2 << 16) + t3;
  728. s0 = sa[0];
  729. da[0] = res1;
  730. da[1] = res2;
  731. }
  732. READ_U8_S16_ALIGN(tab, tab, tab, tab);
  733. res1 = (t0 << 16) + t1;
  734. res2 = (t2 << 16) + t3;
  735. da[0] = res1;
  736. da[1] = res2;
  737. da += 2;
  738. dp = (mlib_u16 *) da;
  739. sp = (mlib_u8 *) sa;
  740. i += 4;
  741. for (; i < size; i++, dp++, sp++)
  742. dp[0] = tab[sp[0]];
  743. }
  744. else {
  745. *dp++ = tab[(*sp)];
  746. size--;
  747. da = (mlib_u32 *) dp;
  748. s0 = sa[0];
  749. s1 = sa[1];
  750. sa += 2;
  751. #ifdef __SUNPRO_C
  752. #pragma pipeloop(0)
  753. #endif /* __SUNPRO_C */
  754. for (i = 0; i < size - 10; i += 4, da += 2, sa++) {
  755. READ_U8_S16_NOTALIGN(tab, tab, tab, tab);
  756. s0 = s1;
  757. res1 = (t0 << 16) + t1;
  758. res2 = (t2 << 16) + t3;
  759. s1 = sa[0];
  760. da[0] = res1;
  761. da[1] = res2;
  762. }
  763. READ_U8_S16_NOTALIGN(tab, tab, tab, tab);
  764. res1 = (t0 << 16) + t1;
  765. res2 = (t2 << 16) + t3;
  766. da[0] = res1;
  767. da[1] = res2;
  768. ADD_READ_U8_S16_NOTALIGN(tab, tab, tab);
  769. res1 = (t0 << 16) + t1;
  770. da[2] = res1;
  771. da += 3;
  772. dp = (mlib_u16 *) da;
  773. *dp++ = (mlib_u16) t2;
  774. sp = (mlib_u8 *) sa;
  775. i += 7;
  776. for (; i < size; i++, dp++, sp++)
  777. dp[0] = tab[sp[0]];
  778. }
  779. }
  780. }
  781. else if (csize == 2) {
  782. mlib_s32 i, j;
  783. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  784. mlib_u32 *sa;
  785. mlib_u32 *da;
  786. mlib_u16 *tab0 = (mlib_u16 *) table[0];
  787. mlib_u16 *tab1 = (mlib_u16 *) table[1];
  788. mlib_u16 *tab;
  789. mlib_u32 s0, s1, t0, t1, t2, t3;
  790. mlib_u32 res1, res2;
  791. mlib_s32 off;
  792. mlib_s32 size = xsize * 2;
  793. mlib_u16 *dp = (mlib_u16 *) dst;
  794. mlib_u8 *sp = (void *)src;
  795. off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
  796. for (i = 0; i < off - 1; i += 2, sp += 2) {
  797. *dp++ = tab0[sp[0]];
  798. *dp++ = tab1[sp[1]];
  799. size -= 2;
  800. }
  801. if ((off & 1) != 0) {
  802. *dp++ = tab0[*sp];
  803. size--;
  804. sp++;
  805. tab = tab0;
  806. tab0 = tab1;
  807. tab1 = tab;
  808. }
  809. sa = (mlib_u32 *) sp;
  810. if (((mlib_addr) dp & 3) == 0) {
  811. da = (mlib_u32 *) dp;
  812. s0 = sa[0];
  813. sa++;
  814. #ifdef __SUNPRO_C
  815. #pragma pipeloop(0)
  816. #endif /* __SUNPRO_C */
  817. for (i = 0; i < size - 7; i += 4, da += 2, sa++) {
  818. READ_U8_S16_ALIGN(tab0, tab1, tab0, tab1);
  819. res1 = (t0 << 16) + t1;
  820. res2 = (t2 << 16) + t3;
  821. s0 = sa[0];
  822. da[0] = res1;
  823. da[1] = res2;
  824. }
  825. READ_U8_S16_ALIGN(tab0, tab1, tab0, tab1);
  826. res1 = (t0 << 16) + t1;
  827. res2 = (t2 << 16) + t3;
  828. da[0] = res1;
  829. da[1] = res2;
  830. da += 2;
  831. dp = (mlib_u16 *) da;
  832. sp = (mlib_u8 *) sa;
  833. i += 4;
  834. for (; i < size - 1; i += 2, sp += 2) {
  835. *dp++ = tab0[sp[0]];
  836. *dp++ = tab1[sp[1]];
  837. }
  838. if (i < size)
  839. *dp = tab0[(*sp)];
  840. }
  841. else {
  842. *dp++ = tab0[(*sp)];
  843. size--;
  844. da = (mlib_u32 *) dp;
  845. s0 = sa[0];
  846. s1 = sa[1];
  847. sa += 2;
  848. #ifdef __SUNPRO_C
  849. #pragma pipeloop(0)
  850. #endif /* __SUNPRO_C */
  851. for (i = 0; i < size - 10; i += 4, da += 2, sa++) {
  852. READ_U8_S16_NOTALIGN(tab1, tab0, tab1, tab0);
  853. s0 = s1;
  854. res1 = (t0 << 16) + t1;
  855. res2 = (t2 << 16) + t3;
  856. s1 = sa[0];
  857. da[0] = res1;
  858. da[1] = res2;
  859. }
  860. READ_U8_S16_NOTALIGN(tab1, tab0, tab1, tab0);
  861. res1 = (t0 << 16) + t1;
  862. res2 = (t2 << 16) + t3;
  863. da[0] = res1;
  864. da[1] = res2;
  865. ADD_READ_U8_S16_NOTALIGN(tab1, tab0, tab1);
  866. res1 = (t0 << 16) + t1;
  867. da[2] = res1;
  868. da += 3;
  869. dp = (mlib_u16 *) da;
  870. *dp++ = (mlib_u16) t2;
  871. sp = (mlib_u8 *) sa;
  872. i += 7;
  873. for (; i < size - 1; i += 2, sp += 2) {
  874. *dp++ = tab0[sp[0]];
  875. *dp++ = tab1[sp[1]];
  876. }
  877. if (i < size)
  878. *dp = tab0[(*sp)];
  879. }
  880. }
  881. }
  882. else if (csize == 3) {
  883. mlib_s32 i, j;
  884. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  885. mlib_u32 *sa;
  886. mlib_u32 *da;
  887. mlib_u16 *tab0 = (mlib_u16 *) table[0];
  888. mlib_u16 *tab1 = (mlib_u16 *) table[1];
  889. mlib_u16 *tab2 = (mlib_u16 *) table[2];
  890. mlib_u16 *tab;
  891. mlib_u32 s0, s1, t0, t1, t2, t3;
  892. mlib_u32 res1, res2;
  893. mlib_s32 off;
  894. mlib_s32 size = xsize * 3;
  895. mlib_u16 *dp = (mlib_u16 *) dst;
  896. mlib_u8 *sp = (void *)src;
  897. off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
  898. if (off == 1) {
  899. *dp++ = tab0[(*sp)];
  900. tab = tab0;
  901. tab0 = tab1;
  902. tab1 = tab2;
  903. tab2 = tab;
  904. size--;
  905. sp++;
  906. }
  907. else if (off == 2) {
  908. *dp++ = tab0[sp[0]];
  909. *dp++ = tab1[sp[1]];
  910. tab = tab2;
  911. tab2 = tab1;
  912. tab1 = tab0;
  913. tab0 = tab;
  914. size -= 2;
  915. sp += 2;
  916. }
  917. else if (off == 3) {
  918. *dp++ = tab0[sp[0]];
  919. *dp++ = tab1[sp[1]];
  920. *dp++ = tab2[sp[2]];
  921. size -= 3;
  922. sp += 3;
  923. }
  924. sa = (mlib_u32 *) sp;
  925. if (((mlib_addr) dp & 3) == 0) {
  926. da = (mlib_u32 *) dp;
  927. s0 = sa[0];
  928. sa++;
  929. #ifdef __SUNPRO_C
  930. #pragma pipeloop(0)
  931. #endif /* __SUNPRO_C */
  932. for (i = 0; i < size - 7; i += 4, da += 2, sa++) {
  933. READ_U8_S16_ALIGN(tab0, tab1, tab2, tab0);
  934. res1 = (t0 << 16) + t1;
  935. res2 = (t2 << 16) + t3;
  936. tab = tab0;
  937. tab0 = tab1;
  938. tab1 = tab2;
  939. tab2 = tab;
  940. s0 = sa[0];
  941. da[0] = res1;
  942. da[1] = res2;
  943. }
  944. READ_U8_S16_ALIGN(tab0, tab1, tab2, tab0);
  945. res1 = (t0 << 16) + t1;
  946. res2 = (t2 << 16) + t3;
  947. da[0] = res1;
  948. da[1] = res2;
  949. da += 2;
  950. dp = (mlib_u16 *) da;
  951. sp = (mlib_u8 *) sa;
  952. i += 4;
  953. if (i < size) {
  954. *dp++ = tab1[(*sp)];
  955. i++;
  956. sp++;
  957. }
  958. if (i < size) {
  959. *dp++ = tab2[(*sp)];
  960. i++;
  961. sp++;
  962. }
  963. if (i < size) {
  964. *dp = tab0[(*sp)];
  965. }
  966. }
  967. else {
  968. *dp++ = tab0[(*sp)];
  969. size--;
  970. da = (mlib_u32 *) dp;
  971. s0 = sa[0];
  972. s1 = sa[1];
  973. sa += 2;
  974. #ifdef __SUNPRO_C
  975. #pragma pipeloop(0)
  976. #endif /* __SUNPRO_C */
  977. for (i = 0; i < size - 10; i += 4, da += 2, sa++) {
  978. READ_U8_S16_NOTALIGN(tab1, tab2, tab0, tab1);
  979. s0 = s1;
  980. res1 = (t0 << 16) + t1;
  981. res2 = (t2 << 16) + t3;
  982. tab = tab0;
  983. tab0 = tab1;
  984. tab1 = tab2;
  985. tab2 = tab;
  986. s1 = sa[0];
  987. da[0] = res1;
  988. da[1] = res2;
  989. }
  990. READ_U8_S16_NOTALIGN(tab1, tab2, tab0, tab1);
  991. res1 = (t0 << 16) + t1;
  992. res2 = (t2 << 16) + t3;
  993. da[0] = res1;
  994. da[1] = res2;
  995. ADD_READ_U8_S16_NOTALIGN(tab2, tab0, tab1);
  996. res1 = (t0 << 16) + t1;
  997. da[2] = res1;
  998. da += 3;
  999. dp = (mlib_u16 *) da;
  1000. *dp++ = (mlib_u16) t2;
  1001. sp = (mlib_u8 *) sa;
  1002. i += 7;
  1003. if (i < size) {
  1004. *dp++ = tab2[(*sp)];
  1005. i++;
  1006. sp++;
  1007. }
  1008. if (i < size) {
  1009. *dp++ = tab0[(*sp)];
  1010. i++;
  1011. sp++;
  1012. }
  1013. if (i < size) {
  1014. *dp = tab1[(*sp)];
  1015. }
  1016. }
  1017. }
  1018. }
  1019. else if (csize == 4) {
  1020. mlib_s32 i, j;
  1021. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  1022. mlib_u32 *sa;
  1023. mlib_u32 *da;
  1024. mlib_u16 *tab0 = (mlib_u16 *) table[0];
  1025. mlib_u16 *tab1 = (mlib_u16 *) table[1];
  1026. mlib_u16 *tab2 = (mlib_u16 *) table[2];
  1027. mlib_u16 *tab3 = (mlib_u16 *) table[3];
  1028. mlib_u16 *tab;
  1029. mlib_u32 s0, s1, t0, t1, t2, t3;
  1030. mlib_u32 res1, res2;
  1031. mlib_s32 off;
  1032. mlib_s32 size = xsize * 4;
  1033. mlib_u16 *dp = (mlib_u16 *) dst;
  1034. mlib_u8 *sp = (void *)src;
  1035. off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
  1036. if (off == 1) {
  1037. *dp++ = tab0[(*sp)];
  1038. tab = tab0;
  1039. tab0 = tab1;
  1040. tab1 = tab2;
  1041. tab2 = tab3;
  1042. tab3 = tab;
  1043. size--;
  1044. sp++;
  1045. }
  1046. else if (off == 2) {
  1047. *dp++ = tab0[sp[0]];
  1048. *dp++ = tab1[sp[1]];
  1049. tab = tab0;
  1050. tab0 = tab2;
  1051. tab2 = tab;
  1052. tab = tab1;
  1053. tab1 = tab3;
  1054. tab3 = tab;
  1055. size -= 2;
  1056. sp += 2;
  1057. }
  1058. else if (off == 3) {
  1059. *dp++ = tab0[sp[0]];
  1060. *dp++ = tab1[sp[1]];
  1061. *dp++ = tab2[sp[2]];
  1062. tab = tab3;
  1063. tab3 = tab2;
  1064. tab2 = tab1;
  1065. tab1 = tab0;
  1066. tab0 = tab;
  1067. size -= 3;
  1068. sp += 3;
  1069. }
  1070. sa = (mlib_u32 *) sp;
  1071. if (((mlib_addr) dp & 3) == 0) {
  1072. da = (mlib_u32 *) dp;
  1073. s0 = sa[0];
  1074. sa++;
  1075. #ifdef __SUNPRO_C
  1076. #pragma pipeloop(0)
  1077. #endif /* __SUNPRO_C */
  1078. for (i = 0; i < size - 7; i += 4, da += 2, sa++) {
  1079. READ_U8_S16_ALIGN(tab0, tab1, tab2, tab3);
  1080. res1 = (t0 << 16) + t1;
  1081. res2 = (t2 << 16) + t3;
  1082. s0 = sa[0];
  1083. da[0] = res1;
  1084. da[1] = res2;
  1085. }
  1086. READ_U8_S16_ALIGN(tab0, tab1, tab2, tab3);
  1087. res1 = (t0 << 16) + t1;
  1088. res2 = (t2 << 16) + t3;
  1089. da[0] = res1;
  1090. da[1] = res2;
  1091. da += 2;
  1092. dp = (mlib_u16 *) da;
  1093. sp = (mlib_u8 *) sa;
  1094. i += 4;
  1095. if (i < size) {
  1096. *dp++ = tab0[(*sp)];
  1097. i++;
  1098. sp++;
  1099. }
  1100. if (i < size) {
  1101. *dp++ = tab1[(*sp)];
  1102. i++;
  1103. sp++;
  1104. }
  1105. if (i < size) {
  1106. *dp = tab2[(*sp)];
  1107. }
  1108. }
  1109. else {
  1110. *dp++ = tab0[(*sp)];
  1111. size--;
  1112. da = (mlib_u32 *) dp;
  1113. s0 = sa[0];
  1114. s1 = sa[1];
  1115. sa += 2;
  1116. #ifdef __SUNPRO_C
  1117. #pragma pipeloop(0)
  1118. #endif /* __SUNPRO_C */
  1119. for (i = 0; i < size - 10; i += 4, da += 2, sa++) {
  1120. READ_U8_S16_NOTALIGN(tab1, tab2, tab3, tab0);
  1121. s0 = s1;
  1122. res1 = (t0 << 16) + t1;
  1123. res2 = (t2 << 16) + t3;
  1124. s1 = sa[0];
  1125. da[0] = res1;
  1126. da[1] = res2;
  1127. }
  1128. READ_U8_S16_NOTALIGN(tab1, tab2, tab3, tab0);
  1129. res1 = (t0 << 16) + t1;
  1130. res2 = (t2 << 16) + t3;
  1131. da[0] = res1;
  1132. da[1] = res2;
  1133. ADD_READ_U8_S16_NOTALIGN(tab1, tab2, tab3);
  1134. res1 = (t0 << 16) + t1;
  1135. da[2] = res1;
  1136. da += 3;
  1137. dp = (mlib_u16 *) da;
  1138. *dp++ = (mlib_u16) t2;
  1139. sp = (mlib_u8 *) sa;
  1140. i += 7;
  1141. if (i < size) {
  1142. *dp++ = tab0[(*sp)];
  1143. i++;
  1144. sp++;
  1145. }
  1146. if (i < size) {
  1147. *dp++ = tab1[(*sp)];
  1148. i++;
  1149. sp++;
  1150. }
  1151. if (i < size) {
  1152. *dp = tab2[(*sp)];
  1153. }
  1154. }
  1155. }
  1156. }
  1157. }
  1158. /***************************************************************/
  1159. void mlib_c_ImageLookUp_S16_S16(const mlib_s16 *src,
  1160. mlib_s32 slb,
  1161. mlib_s16 *dst,
  1162. mlib_s32 dlb,
  1163. mlib_s32 xsize,
  1164. mlib_s32 ysize,
  1165. mlib_s32 csize,
  1166. const mlib_s16 **table)
  1167. {
  1168. const mlib_s16 *table_base[4];
  1169. mlib_s32 c;
  1170. for (c = 0; c < csize; c++) {
  1171. table_base[c] = &table[c][32768];
  1172. }
  1173. MLIB_C_IMAGELOOKUP(mlib_s16, mlib_s16, table_base);
  1174. }
  1175. /***************************************************************/
  1176. void mlib_c_ImageLookUp_U16_S16(const mlib_u16 *src,
  1177. mlib_s32 slb,
  1178. mlib_s16 *dst,
  1179. mlib_s32 dlb,
  1180. mlib_s32 xsize,
  1181. mlib_s32 ysize,
  1182. mlib_s32 csize,
  1183. const mlib_s16 **table)
  1184. {
  1185. const mlib_s16 *table_base[4];
  1186. mlib_s32 c;
  1187. for (c = 0; c < csize; c++) {
  1188. table_base[c] = &table[c][0];
  1189. }
  1190. MLIB_C_IMAGELOOKUP(mlib_s16, mlib_u16, table_base);
  1191. }
  1192. /***************************************************************/
  1193. void mlib_c_ImageLookUp_S32_S16(const mlib_s32 *src,
  1194. mlib_s32 slb,
  1195. mlib_s16 *dst,
  1196. mlib_s32 dlb,
  1197. mlib_s32 xsize,
  1198. mlib_s32 ysize,
  1199. mlib_s32 csize,
  1200. const mlib_s16 **table)
  1201. {
  1202. const mlib_s16 *table_base[4];
  1203. mlib_s32 c;
  1204. for (c = 0; c < csize; c++) {
  1205. table_base[c] = &table[c][TABLE_SHIFT_S32];
  1206. }
  1207. MLIB_C_IMAGELOOKUP(mlib_s16, mlib_s32, table_base);
  1208. }
  1209. /***************************************************************/
  1210. void mlib_c_ImageLookUp_S16_U16(const mlib_s16 *src,
  1211. mlib_s32 slb,
  1212. mlib_u16 *dst,
  1213. mlib_s32 dlb,
  1214. mlib_s32 xsize,
  1215. mlib_s32 ysize,
  1216. mlib_s32 csize,
  1217. const mlib_s16 **table)
  1218. {
  1219. const mlib_s16 *table_base[4];
  1220. mlib_s32 c;
  1221. for (c = 0; c < csize; c++) {
  1222. table_base[c] = &table[c][32768];
  1223. }
  1224. MLIB_C_IMAGELOOKUP(mlib_u16, mlib_s16, table_base);
  1225. }
  1226. /***************************************************************/
  1227. void mlib_c_ImageLookUp_U16_U16(const mlib_u16 *src,
  1228. mlib_s32 slb,
  1229. mlib_u16 *dst,
  1230. mlib_s32 dlb,
  1231. mlib_s32 xsize,
  1232. mlib_s32 ysize,
  1233. mlib_s32 csize,
  1234. const mlib_s16 **table)
  1235. {
  1236. const mlib_s16 *table_base[4];
  1237. mlib_s32 c;
  1238. for (c = 0; c < csize; c++) {
  1239. table_base[c] = &table[c][0];
  1240. }
  1241. MLIB_C_IMAGELOOKUP(mlib_u16, mlib_u16, table_base);
  1242. }
  1243. /***************************************************************/
  1244. void mlib_c_ImageLookUp_S32_U16(const mlib_s32 *src,
  1245. mlib_s32 slb,
  1246. mlib_u16 *dst,
  1247. mlib_s32 dlb,
  1248. mlib_s32 xsize,
  1249. mlib_s32 ysize,
  1250. mlib_s32 csize,
  1251. const mlib_s16 **table)
  1252. {
  1253. const mlib_s16 *table_base[4];
  1254. mlib_s32 c;
  1255. for (c = 0; c < csize; c++) {
  1256. table_base[c] = &table[c][TABLE_SHIFT_S32];
  1257. }
  1258. MLIB_C_IMAGELOOKUP(mlib_u16, mlib_s32, table_base);
  1259. }
  1260. /***************************************************************/
  1261. void mlib_c_ImageLookUp_U8_S32(const mlib_u8 *src,
  1262. mlib_s32 slb,
  1263. mlib_s32 *dst,
  1264. mlib_s32 dlb,
  1265. mlib_s32 xsize,
  1266. mlib_s32 ysize,
  1267. mlib_s32 csize,
  1268. const mlib_s32 **table)
  1269. {
  1270. if (xsize * csize < 7) {
  1271. MLIB_C_IMAGELOOKUP(mlib_s32, mlib_u8, table);
  1272. }
  1273. else if (csize == 1) {
  1274. mlib_s32 i, j;
  1275. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  1276. mlib_u32 *sa;
  1277. mlib_u32 *tab = (mlib_u32 *) table[0];
  1278. mlib_u32 s0, t0, t1, t2, t3;
  1279. mlib_s32 off;
  1280. mlib_s32 size = xsize;
  1281. mlib_u32 *dp = (mlib_u32 *) dst;
  1282. mlib_u8 *sp = (void *)src;
  1283. off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
  1284. for (i = 0; i < off; i++, sp++) {
  1285. *dp++ = tab[sp[0]];
  1286. size--;
  1287. }
  1288. sa = (mlib_u32 *) sp;
  1289. s0 = sa[0];
  1290. sa++;
  1291. #ifdef __SUNPRO_C
  1292. #pragma pipeloop(0)
  1293. #endif /* __SUNPRO_C */
  1294. for (i = 0; i < size - 7; i += 4, dp += 4, sa++) {
  1295. READ_U8_S32(tab, tab, tab, tab);
  1296. s0 = sa[0];
  1297. dp[0] = t0;
  1298. dp[1] = t1;
  1299. dp[2] = t2;
  1300. dp[3] = t3;
  1301. }
  1302. READ_U8_S32(tab, tab, tab, tab);
  1303. dp[0] = t0;
  1304. dp[1] = t1;
  1305. dp[2] = t2;
  1306. dp[3] = t3;
  1307. dp += 4;
  1308. sp = (mlib_u8 *) sa;
  1309. i += 4;
  1310. for (; i < size; i++, dp++, sp++)
  1311. dp[0] = tab[sp[0]];
  1312. }
  1313. }
  1314. else if (csize == 2) {
  1315. mlib_s32 i, j;
  1316. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  1317. mlib_u32 *sa;
  1318. mlib_u32 *tab0 = (mlib_u32 *) table[0];
  1319. mlib_u32 *tab1 = (mlib_u32 *) table[1];
  1320. mlib_u32 *tab;
  1321. mlib_u32 s0, t0, t1, t2, t3;
  1322. mlib_s32 off;
  1323. mlib_s32 size = xsize * 2;
  1324. mlib_u32 *dp = (mlib_u32 *) dst;
  1325. mlib_u8 *sp = (void *)src;
  1326. off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
  1327. for (i = 0; i < off - 1; i += 2, sp += 2) {
  1328. *dp++ = tab0[sp[0]];
  1329. *dp++ = tab1[sp[1]];
  1330. size -= 2;
  1331. }
  1332. if ((off & 1) != 0) {
  1333. *dp++ = tab0[*sp];
  1334. size--;
  1335. sp++;
  1336. tab = tab0;
  1337. tab0 = tab1;
  1338. tab1 = tab;
  1339. }
  1340. sa = (mlib_u32 *) sp;
  1341. s0 = sa[0];
  1342. sa++;
  1343. #ifdef __SUNPRO_C
  1344. #pragma pipeloop(0)
  1345. #endif /* __SUNPRO_C */
  1346. for (i = 0; i < size - 7; i += 4, dp += 4, sa++) {
  1347. READ_U8_S32(tab0, tab1, tab0, tab1);
  1348. s0 = sa[0];
  1349. dp[0] = t0;
  1350. dp[1] = t1;
  1351. dp[2] = t2;
  1352. dp[3] = t3;
  1353. }
  1354. READ_U8_S32(tab0, tab1, tab0, tab1);
  1355. dp[0] = t0;
  1356. dp[1] = t1;
  1357. dp[2] = t2;
  1358. dp[3] = t3;
  1359. dp += 4;
  1360. sp = (mlib_u8 *) sa;
  1361. i += 4;
  1362. for (; i < size - 1; i += 2, sp += 2) {
  1363. *dp++ = tab0[sp[0]];
  1364. *dp++ = tab1[sp[1]];
  1365. }
  1366. if (i < size)
  1367. *dp = tab0[(*sp)];
  1368. }
  1369. }
  1370. else if (csize == 3) {
  1371. mlib_s32 i, j;
  1372. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  1373. mlib_u32 *sa;
  1374. mlib_u32 *tab0 = (mlib_u32 *) table[0];
  1375. mlib_u32 *tab1 = (mlib_u32 *) table[1];
  1376. mlib_u32 *tab2 = (mlib_u32 *) table[2];
  1377. mlib_u32 *tab;
  1378. mlib_u32 s0, t0, t1, t2, t3;
  1379. mlib_s32 off;
  1380. mlib_s32 size = xsize * 3;
  1381. mlib_u32 *dp = (mlib_u32 *) dst;
  1382. mlib_u8 *sp = (void *)src;
  1383. off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
  1384. if (off == 1) {
  1385. *dp++ = tab0[(*sp)];
  1386. tab = tab0;
  1387. tab0 = tab1;
  1388. tab1 = tab2;
  1389. tab2 = tab;
  1390. size--;
  1391. sp++;
  1392. }
  1393. else if (off == 2) {
  1394. *dp++ = tab0[sp[0]];
  1395. *dp++ = tab1[sp[1]];
  1396. tab = tab2;
  1397. tab2 = tab1;
  1398. tab1 = tab0;
  1399. tab0 = tab;
  1400. size -= 2;
  1401. sp += 2;
  1402. }
  1403. else if (off == 3) {
  1404. *dp++ = tab0[sp[0]];
  1405. *dp++ = tab1[sp[1]];
  1406. *dp++ = tab2[sp[2]];
  1407. size -= 3;
  1408. sp += 3;
  1409. }
  1410. sa = (mlib_u32 *) sp;
  1411. s0 = sa[0];
  1412. sa++;
  1413. #ifdef __SUNPRO_C
  1414. #pragma pipeloop(0)
  1415. #endif /* __SUNPRO_C */
  1416. for (i = 0; i < size - 7; i += 4, dp += 4, sa++) {
  1417. READ_U8_S32(tab0, tab1, tab2, tab0);
  1418. tab = tab0;
  1419. tab0 = tab1;
  1420. tab1 = tab2;
  1421. tab2 = tab;
  1422. s0 = sa[0];
  1423. dp[0] = t0;
  1424. dp[1] = t1;
  1425. dp[2] = t2;
  1426. dp[3] = t3;
  1427. }
  1428. READ_U8_S32(tab0, tab1, tab2, tab0);
  1429. dp[0] = t0;
  1430. dp[1] = t1;
  1431. dp[2] = t2;
  1432. dp[3] = t3;
  1433. dp += 4;
  1434. sp = (mlib_u8 *) sa;
  1435. i += 4;
  1436. if (i < size) {
  1437. *dp++ = tab1[(*sp)];
  1438. i++;
  1439. sp++;
  1440. }
  1441. if (i < size) {
  1442. *dp++ = tab2[(*sp)];
  1443. i++;
  1444. sp++;
  1445. }
  1446. if (i < size) {
  1447. *dp = tab0[(*sp)];
  1448. }
  1449. }
  1450. }
  1451. else if (csize == 4) {
  1452. mlib_s32 i, j;
  1453. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  1454. mlib_u32 *sa;
  1455. mlib_u32 *tab0 = (mlib_u32 *) table[0];
  1456. mlib_u32 *tab1 = (mlib_u32 *) table[1];
  1457. mlib_u32 *tab2 = (mlib_u32 *) table[2];
  1458. mlib_u32 *tab3 = (mlib_u32 *) table[3];
  1459. mlib_u32 *tab;
  1460. mlib_u32 s0, t0, t1, t2, t3;
  1461. mlib_s32 off;
  1462. mlib_s32 size = xsize * 4;
  1463. mlib_u32 *dp = (mlib_u32 *) dst;
  1464. mlib_u8 *sp = (void *)src;
  1465. off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
  1466. if (off == 1) {
  1467. *dp++ = tab0[(*sp)];
  1468. tab = tab0;
  1469. tab0 = tab1;
  1470. tab1 = tab2;
  1471. tab2 = tab3;
  1472. tab3 = tab;
  1473. size--;
  1474. sp++;
  1475. }
  1476. else if (off == 2) {
  1477. *dp++ = tab0[sp[0]];
  1478. *dp++ = tab1[sp[1]];
  1479. tab = tab0;
  1480. tab0 = tab2;
  1481. tab2 = tab;
  1482. tab = tab1;
  1483. tab1 = tab3;
  1484. tab3 = tab;
  1485. size -= 2;
  1486. sp += 2;
  1487. }
  1488. else if (off == 3) {
  1489. *dp++ = tab0[sp[0]];
  1490. *dp++ = tab1[sp[1]];
  1491. *dp++ = tab2[sp[2]];
  1492. tab = tab3;
  1493. tab3 = tab2;
  1494. tab2 = tab1;
  1495. tab1 = tab0;
  1496. tab0 = tab;
  1497. size -= 3;
  1498. sp += 3;
  1499. }
  1500. sa = (mlib_u32 *) sp;
  1501. s0 = sa[0];
  1502. sa++;
  1503. #ifdef __SUNPRO_C
  1504. #pragma pipeloop(0)
  1505. #endif /* __SUNPRO_C */
  1506. for (i = 0; i < size - 7; i += 4, dp += 4, sa++) {
  1507. READ_U8_S32(tab0, tab1, tab2, tab3);
  1508. s0 = sa[0];
  1509. dp[0] = t0;
  1510. dp[1] = t1;
  1511. dp[2] = t2;
  1512. dp[3] = t3;
  1513. }
  1514. READ_U8_S32(tab0, tab1, tab2, tab3);
  1515. dp[0] = t0;
  1516. dp[1] = t1;
  1517. dp[2] = t2;
  1518. dp[3] = t3;
  1519. dp += 4;
  1520. sp = (mlib_u8 *) sa;
  1521. i += 4;
  1522. if (i < size) {
  1523. *dp++ = tab0[(*sp)];
  1524. i++;
  1525. sp++;
  1526. }
  1527. if (i < size) {
  1528. *dp++ = tab1[(*sp)];
  1529. i++;
  1530. sp++;
  1531. }
  1532. if (i < size) {
  1533. *dp = tab2[(*sp)];
  1534. }
  1535. }
  1536. }
  1537. }
  1538. /***************************************************************/
  1539. void mlib_c_ImageLookUp_S16_S32(const mlib_s16 *src,
  1540. mlib_s32 slb,
  1541. mlib_s32 *dst,
  1542. mlib_s32 dlb,
  1543. mlib_s32 xsize,
  1544. mlib_s32 ysize,
  1545. mlib_s32 csize,
  1546. const mlib_s32 **table)
  1547. {
  1548. const mlib_s32 *table_base[4];
  1549. mlib_s32 c;
  1550. for (c = 0; c < csize; c++) {
  1551. table_base[c] = &table[c][32768];
  1552. }
  1553. MLIB_C_IMAGELOOKUP(mlib_s32, mlib_s16, table_base);
  1554. }
  1555. /***************************************************************/
  1556. void mlib_c_ImageLookUp_U16_S32(const mlib_u16 *src,
  1557. mlib_

Large files files are truncated, but you can click here to view the full file