gxsamplp.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. /* Copyright (C) 1997, 1999 Aladdin Enterprises. All rights reserved.
  2. This software is provided AS-IS with no warranty, either express or
  3. implied.
  4. This software is distributed under license and may not be copied,
  5. modified or distributed except as expressly authorized under the terms
  6. of the license contained in the file LICENSE in this distribution.
  7. For more information about licensing, please refer to
  8. http://www.ghostscript.com/licensing/. For information on
  9. commercial licensing, go to http://www.artifex.com/licensing/ or
  10. contact Artifex Software, Inc., 101 Lucas Valley Road #110,
  11. San Rafael, CA 94903, U.S.A., +1(415)492-9861.
  12. */
  13. /* $Id: gxsamplp.h,v 1.2 2005/06/08 14:38:21 igor Exp $ */
  14. /* Templates for sample lookup and expansion */
  15. /* This module is allowed to include several times into a single .c file.
  16. The following macros to be defined in advance :
  17. MULTIPLE_MAPS - 1 if num_components_per_plane > 0 and
  18. components use different maps, 0 otherwise.
  19. TEMPLATE_sample_unpack_1 - a name for the function
  20. TEMPLATE_sample_unpack_2 - a name for the function
  21. TEMPLATE_sample_unpack_4 - a name for the function
  22. TEMPLATE_sample_unpack_8 - a name for the function
  23. */
  24. #if MULTIPLE_MAPS
  25. # define NEXT_MAP map = smap[++smap_index % num_components_per_plane].table.lookup4x1to32
  26. # define NEXT_MAP8 map = smap[++smap_index % num_components_per_plane].table.lookup8
  27. # define DEFINE_SMAP_INDEX int smap_index = 0;
  28. #else
  29. # define NEXT_MAP
  30. # define NEXT_MAP8
  31. # define DEFINE_SMAP_INDEX
  32. #endif
  33. const byte *
  34. TEMPLATE_sample_unpack_1(byte * bptr, int *pdata_x, const byte * data, int data_x,
  35. uint dsize, const sample_map *smap, int spread,
  36. int num_components_per_plane)
  37. {
  38. const sample_lookup_t * ptab = &smap->table;
  39. const byte *psrc = data + (data_x >> 3);
  40. int left = dsize - (data_x >> 3);
  41. DEFINE_SMAP_INDEX
  42. if (spread == 1) {
  43. bits32 *bufp = (bits32 *) bptr;
  44. const bits32 *map = &ptab->lookup4x1to32[0];
  45. uint b;
  46. if (left & 1) {
  47. b = psrc[0];
  48. bufp[0] = map[b >> 4];
  49. NEXT_MAP;
  50. bufp[1] = map[b & 0xf];
  51. NEXT_MAP;
  52. psrc++, bufp += 2;
  53. }
  54. left >>= 1;
  55. while (left--) {
  56. b = psrc[0];
  57. bufp[0] = map[b >> 4];
  58. NEXT_MAP;
  59. bufp[1] = map[b & 0xf];
  60. NEXT_MAP;
  61. b = psrc[1];
  62. bufp[2] = map[b >> 4];
  63. NEXT_MAP;
  64. bufp[3] = map[b & 0xf];
  65. NEXT_MAP;
  66. psrc += 2, bufp += 4;
  67. }
  68. } else {
  69. byte *bufp = bptr;
  70. const byte *map = &ptab->lookup8[0];
  71. while (left--) {
  72. uint b = *psrc++;
  73. *bufp = map[b >> 7];
  74. NEXT_MAP8;
  75. bufp += spread;
  76. *bufp = map[(b >> 6) & 1];
  77. NEXT_MAP8;
  78. bufp += spread;
  79. *bufp = map[(b >> 5) & 1];
  80. NEXT_MAP8;
  81. bufp += spread;
  82. *bufp = map[(b >> 4) & 1];
  83. NEXT_MAP8;
  84. bufp += spread;
  85. *bufp = map[(b >> 3) & 1];
  86. NEXT_MAP8;
  87. bufp += spread;
  88. *bufp = map[(b >> 2) & 1];
  89. NEXT_MAP8;
  90. bufp += spread;
  91. *bufp = map[(b >> 1) & 1];
  92. NEXT_MAP8;
  93. bufp += spread;
  94. *bufp = map[b & 1];
  95. NEXT_MAP8;
  96. bufp += spread;
  97. }
  98. }
  99. *pdata_x = data_x & 7;
  100. return bptr;
  101. }
  102. #undef NEXT_MAP
  103. #if MULTIPLE_MAPS
  104. # define NEXT_MAP map = smap[++smap_index % num_components_per_plane].table.lookup2x2to16
  105. #else
  106. # define NEXT_MAP
  107. #endif
  108. const byte *
  109. TEMPLATE_sample_unpack_2(byte * bptr, int *pdata_x, const byte * data, int data_x,
  110. uint dsize, const sample_map *smap, int spread,
  111. int num_components_per_plane)
  112. {
  113. const sample_lookup_t * ptab = &smap->table;
  114. const byte *psrc = data + (data_x >> 2);
  115. int left = dsize - (data_x >> 2);
  116. DEFINE_SMAP_INDEX
  117. if (spread == 1) {
  118. bits16 *bufp = (bits16 *) bptr;
  119. const bits16 *map = &ptab->lookup2x2to16[0];
  120. while (left--) {
  121. uint b = *psrc++;
  122. *bufp++ = map[b >> 4];
  123. NEXT_MAP;
  124. *bufp++ = map[b & 0xf];
  125. NEXT_MAP;
  126. }
  127. } else {
  128. byte *bufp = bptr;
  129. const byte *map = &ptab->lookup8[0];
  130. while (left--) {
  131. unsigned b = *psrc++;
  132. *bufp = map[b >> 6];
  133. NEXT_MAP8;
  134. bufp += spread;
  135. *bufp = map[(b >> 4) & 3];
  136. NEXT_MAP8;
  137. bufp += spread;
  138. *bufp = map[(b >> 2) & 3];
  139. NEXT_MAP8;
  140. bufp += spread;
  141. *bufp = map[b & 3];
  142. NEXT_MAP8;
  143. bufp += spread;
  144. }
  145. }
  146. *pdata_x = data_x & 3;
  147. return bptr;
  148. }
  149. #undef NEXT_MAP
  150. const byte *
  151. TEMPLATE_sample_unpack_4(byte * bptr, int *pdata_x, const byte * data, int data_x,
  152. uint dsize, const sample_map *smap, int spread,
  153. int num_components_per_plane)
  154. {
  155. const sample_lookup_t * ptab = &smap->table;
  156. byte *bufp = bptr;
  157. const byte *psrc = data + (data_x >> 1);
  158. int left = dsize - (data_x >> 1);
  159. const byte *map = &ptab->lookup8[0];
  160. DEFINE_SMAP_INDEX
  161. while (left--) {
  162. uint b = *psrc++;
  163. *bufp = map[b >> 4];
  164. NEXT_MAP8;
  165. bufp += spread;
  166. *bufp = map[b & 0xf];
  167. NEXT_MAP8;
  168. bufp += spread;
  169. }
  170. *pdata_x = data_x & 1;
  171. return bptr;
  172. }
  173. const byte *
  174. TEMPLATE_sample_unpack_8(byte * bptr, int *pdata_x, const byte * data, int data_x,
  175. uint dsize, const sample_map *smap, int spread,
  176. int num_components_per_plane)
  177. {
  178. const sample_lookup_t * ptab = &smap->table;
  179. byte *bufp = bptr;
  180. const byte *psrc = data + data_x;
  181. DEFINE_SMAP_INDEX
  182. *pdata_x = 0;
  183. if (spread == 1) {
  184. if (MULTIPLE_MAPS ||
  185. ptab->lookup8[0] != 0 ||
  186. ptab->lookup8[255] != 255
  187. ) {
  188. uint left = dsize - data_x;
  189. const byte *map = &ptab->lookup8[0];
  190. while (left--) {
  191. *bufp++ = map[*psrc++];
  192. NEXT_MAP8;
  193. }
  194. } else { /* No copying needed, and we'll use the data right away. */
  195. return psrc;
  196. }
  197. } else {
  198. int left = dsize - data_x;
  199. const byte *map = &ptab->lookup8[0];
  200. for (; left--; psrc++, bufp += spread) {
  201. *bufp = map[*psrc];
  202. NEXT_MAP8;
  203. }
  204. }
  205. return bptr;
  206. }
  207. #undef NEXT_MAP
  208. #undef NEXT_MAP8
  209. #undef DEFINE_SMAP_INDEX