image_intensities 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/ext/image_intensities/Makefile +73 -4
  3. data/ext/image_intensities/turbojpeg/cderror.h +137 -0
  4. data/ext/image_intensities/turbojpeg/cdjpeg.h +157 -0
  5. data/ext/image_intensities/turbojpeg/cmyk.h +61 -0
  6. data/ext/image_intensities/turbojpeg/jaricom.c +157 -0
  7. data/ext/image_intensities/turbojpeg/jcapimin.c +295 -0
  8. data/ext/image_intensities/turbojpeg/jcapistd.c +162 -0
  9. data/ext/image_intensities/turbojpeg/jcarith.c +932 -0
  10. data/ext/image_intensities/turbojpeg/jccoefct.c +449 -0
  11. data/ext/image_intensities/turbojpeg/jccolext.c +144 -0
  12. data/ext/image_intensities/turbojpeg/jccolor.c +710 -0
  13. data/ext/image_intensities/turbojpeg/jcdctmgr.c +721 -0
  14. data/ext/image_intensities/turbojpeg/jchuff.c +1096 -0
  15. data/ext/image_intensities/turbojpeg/jchuff.h +42 -0
  16. data/ext/image_intensities/turbojpeg/jcicc.c +105 -0
  17. data/ext/image_intensities/turbojpeg/jcinit.c +77 -0
  18. data/ext/image_intensities/turbojpeg/jcmainct.c +162 -0
  19. data/ext/image_intensities/turbojpeg/jcmarker.c +664 -0
  20. data/ext/image_intensities/turbojpeg/jcmaster.c +640 -0
  21. data/ext/image_intensities/turbojpeg/jcomapi.c +109 -0
  22. data/ext/image_intensities/turbojpeg/jconfig.h +73 -0
  23. data/ext/image_intensities/turbojpeg/jconfigint.h +31 -0
  24. data/ext/image_intensities/turbojpeg/jcparam.c +541 -0
  25. data/ext/image_intensities/turbojpeg/jcphuff.c +1105 -0
  26. data/ext/image_intensities/turbojpeg/jcprepct.c +351 -0
  27. data/ext/image_intensities/turbojpeg/jcsample.c +539 -0
  28. data/ext/image_intensities/turbojpeg/jctrans.c +400 -0
  29. data/ext/image_intensities/turbojpeg/jdapimin.c +407 -0
  30. data/ext/image_intensities/turbojpeg/jdapistd.c +639 -0
  31. data/ext/image_intensities/turbojpeg/jdarith.c +773 -0
  32. data/ext/image_intensities/turbojpeg/jdatadst-tj.c +203 -0
  33. data/ext/image_intensities/turbojpeg/jdatadst.c +293 -0
  34. data/ext/image_intensities/turbojpeg/jdatasrc-tj.c +194 -0
  35. data/ext/image_intensities/turbojpeg/jdatasrc.c +295 -0
  36. data/ext/image_intensities/turbojpeg/jdcoefct.c +692 -0
  37. data/ext/image_intensities/turbojpeg/jdcoefct.h +82 -0
  38. data/ext/image_intensities/turbojpeg/jdcol565.c +384 -0
  39. data/ext/image_intensities/turbojpeg/jdcolext.c +143 -0
  40. data/ext/image_intensities/turbojpeg/jdcolor.c +883 -0
  41. data/ext/image_intensities/turbojpeg/jdct.h +208 -0
  42. data/ext/image_intensities/turbojpeg/jddctmgr.c +352 -0
  43. data/ext/image_intensities/turbojpeg/jdhuff.c +831 -0
  44. data/ext/image_intensities/turbojpeg/jdhuff.h +238 -0
  45. data/ext/image_intensities/turbojpeg/jdicc.c +171 -0
  46. data/ext/image_intensities/turbojpeg/jdinput.c +408 -0
  47. data/ext/image_intensities/turbojpeg/jdmainct.c +460 -0
  48. data/ext/image_intensities/turbojpeg/jdmainct.h +71 -0
  49. data/ext/image_intensities/turbojpeg/jdmarker.c +1377 -0
  50. data/ext/image_intensities/turbojpeg/jdmaster.c +737 -0
  51. data/ext/image_intensities/turbojpeg/jdmaster.h +28 -0
  52. data/ext/image_intensities/turbojpeg/jdmerge.c +617 -0
  53. data/ext/image_intensities/turbojpeg/jdmrg565.c +354 -0
  54. data/ext/image_intensities/turbojpeg/jdmrgext.c +184 -0
  55. data/ext/image_intensities/turbojpeg/jdphuff.c +687 -0
  56. data/ext/image_intensities/turbojpeg/jdpostct.c +294 -0
  57. data/ext/image_intensities/turbojpeg/jdsample.c +518 -0
  58. data/ext/image_intensities/turbojpeg/jdsample.h +50 -0
  59. data/ext/image_intensities/turbojpeg/jdtrans.c +155 -0
  60. data/ext/image_intensities/turbojpeg/jerror.c +251 -0
  61. data/ext/image_intensities/turbojpeg/jfdctflt.c +169 -0
  62. data/ext/image_intensities/turbojpeg/jfdctfst.c +227 -0
  63. data/ext/image_intensities/turbojpeg/jfdctint.c +288 -0
  64. data/ext/image_intensities/turbojpeg/jidctflt.c +240 -0
  65. data/ext/image_intensities/turbojpeg/jidctfst.c +371 -0
  66. data/ext/image_intensities/turbojpeg/jidctint.c +2627 -0
  67. data/ext/image_intensities/turbojpeg/jidctred.c +409 -0
  68. data/ext/image_intensities/turbojpeg/jinclude.h +88 -0
  69. data/ext/image_intensities/turbojpeg/jmemmgr.c +1179 -0
  70. data/ext/image_intensities/turbojpeg/jmemnobs.c +115 -0
  71. data/ext/image_intensities/turbojpeg/jmemsys.h +178 -0
  72. data/ext/image_intensities/turbojpeg/jpeg_nbits_table.h +4098 -0
  73. data/ext/image_intensities/turbojpeg/jpegcomp.h +31 -0
  74. data/ext/image_intensities/turbojpeg/jquant1.c +859 -0
  75. data/ext/image_intensities/turbojpeg/jquant2.c +1285 -0
  76. data/ext/image_intensities/turbojpeg/jsimd.h +117 -0
  77. data/ext/image_intensities/turbojpeg/jsimd_none.c +418 -0
  78. data/ext/image_intensities/turbojpeg/jsimddct.h +70 -0
  79. data/ext/image_intensities/turbojpeg/jstdhuff.c +143 -0
  80. data/ext/image_intensities/turbojpeg/jutils.c +133 -0
  81. data/ext/image_intensities/turbojpeg/jversion.h +52 -0
  82. data/ext/image_intensities/turbojpeg/libturbojpeg.a +0 -0
  83. data/ext/image_intensities/turbojpeg/rdbmp.c +689 -0
  84. data/ext/image_intensities/turbojpeg/rdppm.c +766 -0
  85. data/ext/image_intensities/turbojpeg/tjutil.h +47 -0
  86. data/ext/image_intensities/turbojpeg/transupp.c +1628 -0
  87. data/ext/image_intensities/turbojpeg/transupp.h +210 -0
  88. data/ext/image_intensities/turbojpeg/turbojpeg.c +2150 -0
  89. data/ext/image_intensities/turbojpeg/wrbmp.c +558 -0
  90. data/ext/image_intensities/turbojpeg/wrppm.c +365 -0
  91. data/image_intensities.gemspec +1 -1
  92. data/lib/image_intensities/version.rb +1 -1
  93. metadata +91 -3
@@ -0,0 +1,82 @@
1
+ /*
2
+ * jdcoefct.h
3
+ *
4
+ * This file was part of the Independent JPEG Group's software:
5
+ * Copyright (C) 1994-1997, Thomas G. Lane.
6
+ * libjpeg-turbo Modifications:
7
+ * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
8
+ * For conditions of distribution and use, see the accompanying README.ijg
9
+ * file.
10
+ */
11
+
12
+ #define JPEG_INTERNALS
13
+ #include "jpeglib.h"
14
+
15
+
16
+ /* Block smoothing is only applicable for progressive JPEG, so: */
17
+ #ifndef D_PROGRESSIVE_SUPPORTED
18
+ #undef BLOCK_SMOOTHING_SUPPORTED
19
+ #endif
20
+
21
+
22
+ /* Private buffer controller object */
23
+
24
+ typedef struct {
25
+ struct jpeg_d_coef_controller pub; /* public fields */
26
+
27
+ /* These variables keep track of the current location of the input side. */
28
+ /* cinfo->input_iMCU_row is also used for this. */
29
+ JDIMENSION MCU_ctr; /* counts MCUs processed in current row */
30
+ int MCU_vert_offset; /* counts MCU rows within iMCU row */
31
+ int MCU_rows_per_iMCU_row; /* number of such rows needed */
32
+
33
+ /* The output side's location is represented by cinfo->output_iMCU_row. */
34
+
35
+ /* In single-pass modes, it's sufficient to buffer just one MCU.
36
+ * We allocate a workspace of D_MAX_BLOCKS_IN_MCU coefficient blocks,
37
+ * and let the entropy decoder write into that workspace each time.
38
+ * In multi-pass modes, this array points to the current MCU's blocks
39
+ * within the virtual arrays; it is used only by the input side.
40
+ */
41
+ JBLOCKROW MCU_buffer[D_MAX_BLOCKS_IN_MCU];
42
+
43
+ /* Temporary workspace for one MCU */
44
+ JCOEF *workspace;
45
+
46
+ #ifdef D_MULTISCAN_FILES_SUPPORTED
47
+ /* In multi-pass modes, we need a virtual block array for each component. */
48
+ jvirt_barray_ptr whole_image[MAX_COMPONENTS];
49
+ #endif
50
+
51
+ #ifdef BLOCK_SMOOTHING_SUPPORTED
52
+ /* When doing block smoothing, we latch coefficient Al values here */
53
+ int *coef_bits_latch;
54
+ #define SAVED_COEFS 6 /* we save coef_bits[0..5] */
55
+ #endif
56
+ } my_coef_controller;
57
+
58
+ typedef my_coef_controller *my_coef_ptr;
59
+
60
+
61
+ LOCAL(void)
62
+ start_iMCU_row(j_decompress_ptr cinfo)
63
+ /* Reset within-iMCU-row counters for a new row (input side) */
64
+ {
65
+ my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
66
+
67
+ /* In an interleaved scan, an MCU row is the same as an iMCU row.
68
+ * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.
69
+ * But at the bottom of the image, process only what's left.
70
+ */
71
+ if (cinfo->comps_in_scan > 1) {
72
+ coef->MCU_rows_per_iMCU_row = 1;
73
+ } else {
74
+ if (cinfo->input_iMCU_row < (cinfo->total_iMCU_rows - 1))
75
+ coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;
76
+ else
77
+ coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;
78
+ }
79
+
80
+ coef->MCU_ctr = 0;
81
+ coef->MCU_vert_offset = 0;
82
+ }
@@ -0,0 +1,384 @@
1
+ /*
2
+ * jdcol565.c
3
+ *
4
+ * This file was part of the Independent JPEG Group's software:
5
+ * Copyright (C) 1991-1997, Thomas G. Lane.
6
+ * Modifications:
7
+ * Copyright (C) 2013, Linaro Limited.
8
+ * Copyright (C) 2014-2015, D. R. Commander.
9
+ * For conditions of distribution and use, see the accompanying README.ijg
10
+ * file.
11
+ *
12
+ * This file contains output colorspace conversion routines.
13
+ */
14
+
15
+ /* This file is included by jdcolor.c */
16
+
17
+
18
+ INLINE
19
+ LOCAL(void)
20
+ ycc_rgb565_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
21
+ JDIMENSION input_row, JSAMPARRAY output_buf,
22
+ int num_rows)
23
+ {
24
+ my_cconvert_ptr cconvert = (my_cconvert_ptr)cinfo->cconvert;
25
+ register int y, cb, cr;
26
+ register JSAMPROW outptr;
27
+ register JSAMPROW inptr0, inptr1, inptr2;
28
+ register JDIMENSION col;
29
+ JDIMENSION num_cols = cinfo->output_width;
30
+ /* copy these pointers into registers if possible */
31
+ register JSAMPLE *range_limit = cinfo->sample_range_limit;
32
+ register int *Crrtab = cconvert->Cr_r_tab;
33
+ register int *Cbbtab = cconvert->Cb_b_tab;
34
+ register JLONG *Crgtab = cconvert->Cr_g_tab;
35
+ register JLONG *Cbgtab = cconvert->Cb_g_tab;
36
+ SHIFT_TEMPS
37
+
38
+ while (--num_rows >= 0) {
39
+ JLONG rgb;
40
+ unsigned int r, g, b;
41
+ inptr0 = input_buf[0][input_row];
42
+ inptr1 = input_buf[1][input_row];
43
+ inptr2 = input_buf[2][input_row];
44
+ input_row++;
45
+ outptr = *output_buf++;
46
+
47
+ if (PACK_NEED_ALIGNMENT(outptr)) {
48
+ y = GETJSAMPLE(*inptr0++);
49
+ cb = GETJSAMPLE(*inptr1++);
50
+ cr = GETJSAMPLE(*inptr2++);
51
+ r = range_limit[y + Crrtab[cr]];
52
+ g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
53
+ SCALEBITS))];
54
+ b = range_limit[y + Cbbtab[cb]];
55
+ rgb = PACK_SHORT_565(r, g, b);
56
+ *(INT16 *)outptr = (INT16)rgb;
57
+ outptr += 2;
58
+ num_cols--;
59
+ }
60
+ for (col = 0; col < (num_cols >> 1); col++) {
61
+ y = GETJSAMPLE(*inptr0++);
62
+ cb = GETJSAMPLE(*inptr1++);
63
+ cr = GETJSAMPLE(*inptr2++);
64
+ r = range_limit[y + Crrtab[cr]];
65
+ g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
66
+ SCALEBITS))];
67
+ b = range_limit[y + Cbbtab[cb]];
68
+ rgb = PACK_SHORT_565(r, g, b);
69
+
70
+ y = GETJSAMPLE(*inptr0++);
71
+ cb = GETJSAMPLE(*inptr1++);
72
+ cr = GETJSAMPLE(*inptr2++);
73
+ r = range_limit[y + Crrtab[cr]];
74
+ g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
75
+ SCALEBITS))];
76
+ b = range_limit[y + Cbbtab[cb]];
77
+ rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r, g, b));
78
+
79
+ WRITE_TWO_ALIGNED_PIXELS(outptr, rgb);
80
+ outptr += 4;
81
+ }
82
+ if (num_cols & 1) {
83
+ y = GETJSAMPLE(*inptr0);
84
+ cb = GETJSAMPLE(*inptr1);
85
+ cr = GETJSAMPLE(*inptr2);
86
+ r = range_limit[y + Crrtab[cr]];
87
+ g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
88
+ SCALEBITS))];
89
+ b = range_limit[y + Cbbtab[cb]];
90
+ rgb = PACK_SHORT_565(r, g, b);
91
+ *(INT16 *)outptr = (INT16)rgb;
92
+ }
93
+ }
94
+ }
95
+
96
+
97
+ INLINE
98
+ LOCAL(void)
99
+ ycc_rgb565D_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
100
+ JDIMENSION input_row, JSAMPARRAY output_buf,
101
+ int num_rows)
102
+ {
103
+ my_cconvert_ptr cconvert = (my_cconvert_ptr)cinfo->cconvert;
104
+ register int y, cb, cr;
105
+ register JSAMPROW outptr;
106
+ register JSAMPROW inptr0, inptr1, inptr2;
107
+ register JDIMENSION col;
108
+ JDIMENSION num_cols = cinfo->output_width;
109
+ /* copy these pointers into registers if possible */
110
+ register JSAMPLE *range_limit = cinfo->sample_range_limit;
111
+ register int *Crrtab = cconvert->Cr_r_tab;
112
+ register int *Cbbtab = cconvert->Cb_b_tab;
113
+ register JLONG *Crgtab = cconvert->Cr_g_tab;
114
+ register JLONG *Cbgtab = cconvert->Cb_g_tab;
115
+ JLONG d0 = dither_matrix[cinfo->output_scanline & DITHER_MASK];
116
+ SHIFT_TEMPS
117
+
118
+ while (--num_rows >= 0) {
119
+ JLONG rgb;
120
+ unsigned int r, g, b;
121
+
122
+ inptr0 = input_buf[0][input_row];
123
+ inptr1 = input_buf[1][input_row];
124
+ inptr2 = input_buf[2][input_row];
125
+ input_row++;
126
+ outptr = *output_buf++;
127
+ if (PACK_NEED_ALIGNMENT(outptr)) {
128
+ y = GETJSAMPLE(*inptr0++);
129
+ cb = GETJSAMPLE(*inptr1++);
130
+ cr = GETJSAMPLE(*inptr2++);
131
+ r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)];
132
+ g = range_limit[DITHER_565_G(y +
133
+ ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
134
+ SCALEBITS)), d0)];
135
+ b = range_limit[DITHER_565_B(y + Cbbtab[cb], d0)];
136
+ rgb = PACK_SHORT_565(r, g, b);
137
+ *(INT16 *)outptr = (INT16)rgb;
138
+ outptr += 2;
139
+ num_cols--;
140
+ }
141
+ for (col = 0; col < (num_cols >> 1); col++) {
142
+ y = GETJSAMPLE(*inptr0++);
143
+ cb = GETJSAMPLE(*inptr1++);
144
+ cr = GETJSAMPLE(*inptr2++);
145
+ r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)];
146
+ g = range_limit[DITHER_565_G(y +
147
+ ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
148
+ SCALEBITS)), d0)];
149
+ b = range_limit[DITHER_565_B(y + Cbbtab[cb], d0)];
150
+ d0 = DITHER_ROTATE(d0);
151
+ rgb = PACK_SHORT_565(r, g, b);
152
+
153
+ y = GETJSAMPLE(*inptr0++);
154
+ cb = GETJSAMPLE(*inptr1++);
155
+ cr = GETJSAMPLE(*inptr2++);
156
+ r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)];
157
+ g = range_limit[DITHER_565_G(y +
158
+ ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
159
+ SCALEBITS)), d0)];
160
+ b = range_limit[DITHER_565_B(y + Cbbtab[cb], d0)];
161
+ d0 = DITHER_ROTATE(d0);
162
+ rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r, g, b));
163
+
164
+ WRITE_TWO_ALIGNED_PIXELS(outptr, rgb);
165
+ outptr += 4;
166
+ }
167
+ if (num_cols & 1) {
168
+ y = GETJSAMPLE(*inptr0);
169
+ cb = GETJSAMPLE(*inptr1);
170
+ cr = GETJSAMPLE(*inptr2);
171
+ r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)];
172
+ g = range_limit[DITHER_565_G(y +
173
+ ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
174
+ SCALEBITS)), d0)];
175
+ b = range_limit[DITHER_565_B(y + Cbbtab[cb], d0)];
176
+ rgb = PACK_SHORT_565(r, g, b);
177
+ *(INT16 *)outptr = (INT16)rgb;
178
+ }
179
+ }
180
+ }
181
+
182
+
183
+ INLINE
184
+ LOCAL(void)
185
+ rgb_rgb565_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
186
+ JDIMENSION input_row, JSAMPARRAY output_buf,
187
+ int num_rows)
188
+ {
189
+ register JSAMPROW outptr;
190
+ register JSAMPROW inptr0, inptr1, inptr2;
191
+ register JDIMENSION col;
192
+ JDIMENSION num_cols = cinfo->output_width;
193
+ SHIFT_TEMPS
194
+
195
+ while (--num_rows >= 0) {
196
+ JLONG rgb;
197
+ unsigned int r, g, b;
198
+
199
+ inptr0 = input_buf[0][input_row];
200
+ inptr1 = input_buf[1][input_row];
201
+ inptr2 = input_buf[2][input_row];
202
+ input_row++;
203
+ outptr = *output_buf++;
204
+ if (PACK_NEED_ALIGNMENT(outptr)) {
205
+ r = GETJSAMPLE(*inptr0++);
206
+ g = GETJSAMPLE(*inptr1++);
207
+ b = GETJSAMPLE(*inptr2++);
208
+ rgb = PACK_SHORT_565(r, g, b);
209
+ *(INT16 *)outptr = (INT16)rgb;
210
+ outptr += 2;
211
+ num_cols--;
212
+ }
213
+ for (col = 0; col < (num_cols >> 1); col++) {
214
+ r = GETJSAMPLE(*inptr0++);
215
+ g = GETJSAMPLE(*inptr1++);
216
+ b = GETJSAMPLE(*inptr2++);
217
+ rgb = PACK_SHORT_565(r, g, b);
218
+
219
+ r = GETJSAMPLE(*inptr0++);
220
+ g = GETJSAMPLE(*inptr1++);
221
+ b = GETJSAMPLE(*inptr2++);
222
+ rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r, g, b));
223
+
224
+ WRITE_TWO_ALIGNED_PIXELS(outptr, rgb);
225
+ outptr += 4;
226
+ }
227
+ if (num_cols & 1) {
228
+ r = GETJSAMPLE(*inptr0);
229
+ g = GETJSAMPLE(*inptr1);
230
+ b = GETJSAMPLE(*inptr2);
231
+ rgb = PACK_SHORT_565(r, g, b);
232
+ *(INT16 *)outptr = (INT16)rgb;
233
+ }
234
+ }
235
+ }
236
+
237
+
238
+ INLINE
239
+ LOCAL(void)
240
+ rgb_rgb565D_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
241
+ JDIMENSION input_row, JSAMPARRAY output_buf,
242
+ int num_rows)
243
+ {
244
+ register JSAMPROW outptr;
245
+ register JSAMPROW inptr0, inptr1, inptr2;
246
+ register JDIMENSION col;
247
+ register JSAMPLE *range_limit = cinfo->sample_range_limit;
248
+ JDIMENSION num_cols = cinfo->output_width;
249
+ JLONG d0 = dither_matrix[cinfo->output_scanline & DITHER_MASK];
250
+ SHIFT_TEMPS
251
+
252
+ while (--num_rows >= 0) {
253
+ JLONG rgb;
254
+ unsigned int r, g, b;
255
+
256
+ inptr0 = input_buf[0][input_row];
257
+ inptr1 = input_buf[1][input_row];
258
+ inptr2 = input_buf[2][input_row];
259
+ input_row++;
260
+ outptr = *output_buf++;
261
+ if (PACK_NEED_ALIGNMENT(outptr)) {
262
+ r = range_limit[DITHER_565_R(GETJSAMPLE(*inptr0++), d0)];
263
+ g = range_limit[DITHER_565_G(GETJSAMPLE(*inptr1++), d0)];
264
+ b = range_limit[DITHER_565_B(GETJSAMPLE(*inptr2++), d0)];
265
+ rgb = PACK_SHORT_565(r, g, b);
266
+ *(INT16 *)outptr = (INT16)rgb;
267
+ outptr += 2;
268
+ num_cols--;
269
+ }
270
+ for (col = 0; col < (num_cols >> 1); col++) {
271
+ r = range_limit[DITHER_565_R(GETJSAMPLE(*inptr0++), d0)];
272
+ g = range_limit[DITHER_565_G(GETJSAMPLE(*inptr1++), d0)];
273
+ b = range_limit[DITHER_565_B(GETJSAMPLE(*inptr2++), d0)];
274
+ d0 = DITHER_ROTATE(d0);
275
+ rgb = PACK_SHORT_565(r, g, b);
276
+
277
+ r = range_limit[DITHER_565_R(GETJSAMPLE(*inptr0++), d0)];
278
+ g = range_limit[DITHER_565_G(GETJSAMPLE(*inptr1++), d0)];
279
+ b = range_limit[DITHER_565_B(GETJSAMPLE(*inptr2++), d0)];
280
+ d0 = DITHER_ROTATE(d0);
281
+ rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r, g, b));
282
+
283
+ WRITE_TWO_ALIGNED_PIXELS(outptr, rgb);
284
+ outptr += 4;
285
+ }
286
+ if (num_cols & 1) {
287
+ r = range_limit[DITHER_565_R(GETJSAMPLE(*inptr0), d0)];
288
+ g = range_limit[DITHER_565_G(GETJSAMPLE(*inptr1), d0)];
289
+ b = range_limit[DITHER_565_B(GETJSAMPLE(*inptr2), d0)];
290
+ rgb = PACK_SHORT_565(r, g, b);
291
+ *(INT16 *)outptr = (INT16)rgb;
292
+ }
293
+ }
294
+ }
295
+
296
+
297
+ INLINE
298
+ LOCAL(void)
299
+ gray_rgb565_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
300
+ JDIMENSION input_row, JSAMPARRAY output_buf,
301
+ int num_rows)
302
+ {
303
+ register JSAMPROW inptr, outptr;
304
+ register JDIMENSION col;
305
+ JDIMENSION num_cols = cinfo->output_width;
306
+
307
+ while (--num_rows >= 0) {
308
+ JLONG rgb;
309
+ unsigned int g;
310
+
311
+ inptr = input_buf[0][input_row++];
312
+ outptr = *output_buf++;
313
+ if (PACK_NEED_ALIGNMENT(outptr)) {
314
+ g = *inptr++;
315
+ rgb = PACK_SHORT_565(g, g, g);
316
+ *(INT16 *)outptr = (INT16)rgb;
317
+ outptr += 2;
318
+ num_cols--;
319
+ }
320
+ for (col = 0; col < (num_cols >> 1); col++) {
321
+ g = *inptr++;
322
+ rgb = PACK_SHORT_565(g, g, g);
323
+ g = *inptr++;
324
+ rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(g, g, g));
325
+ WRITE_TWO_ALIGNED_PIXELS(outptr, rgb);
326
+ outptr += 4;
327
+ }
328
+ if (num_cols & 1) {
329
+ g = *inptr;
330
+ rgb = PACK_SHORT_565(g, g, g);
331
+ *(INT16 *)outptr = (INT16)rgb;
332
+ }
333
+ }
334
+ }
335
+
336
+
337
+ INLINE
338
+ LOCAL(void)
339
+ gray_rgb565D_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
340
+ JDIMENSION input_row, JSAMPARRAY output_buf,
341
+ int num_rows)
342
+ {
343
+ register JSAMPROW inptr, outptr;
344
+ register JDIMENSION col;
345
+ register JSAMPLE *range_limit = cinfo->sample_range_limit;
346
+ JDIMENSION num_cols = cinfo->output_width;
347
+ JLONG d0 = dither_matrix[cinfo->output_scanline & DITHER_MASK];
348
+
349
+ while (--num_rows >= 0) {
350
+ JLONG rgb;
351
+ unsigned int g;
352
+
353
+ inptr = input_buf[0][input_row++];
354
+ outptr = *output_buf++;
355
+ if (PACK_NEED_ALIGNMENT(outptr)) {
356
+ g = *inptr++;
357
+ g = range_limit[DITHER_565_R(g, d0)];
358
+ rgb = PACK_SHORT_565(g, g, g);
359
+ *(INT16 *)outptr = (INT16)rgb;
360
+ outptr += 2;
361
+ num_cols--;
362
+ }
363
+ for (col = 0; col < (num_cols >> 1); col++) {
364
+ g = *inptr++;
365
+ g = range_limit[DITHER_565_R(g, d0)];
366
+ rgb = PACK_SHORT_565(g, g, g);
367
+ d0 = DITHER_ROTATE(d0);
368
+
369
+ g = *inptr++;
370
+ g = range_limit[DITHER_565_R(g, d0)];
371
+ rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(g, g, g));
372
+ d0 = DITHER_ROTATE(d0);
373
+
374
+ WRITE_TWO_ALIGNED_PIXELS(outptr, rgb);
375
+ outptr += 4;
376
+ }
377
+ if (num_cols & 1) {
378
+ g = *inptr;
379
+ g = range_limit[DITHER_565_R(g, d0)];
380
+ rgb = PACK_SHORT_565(g, g, g);
381
+ *(INT16 *)outptr = (INT16)rgb;
382
+ }
383
+ }
384
+ }
@@ -0,0 +1,143 @@
1
+ /*
2
+ * jdcolext.c
3
+ *
4
+ * This file was part of the Independent JPEG Group's software:
5
+ * Copyright (C) 1991-1997, Thomas G. Lane.
6
+ * libjpeg-turbo Modifications:
7
+ * Copyright (C) 2009, 2011, 2015, D. R. Commander.
8
+ * For conditions of distribution and use, see the accompanying README.ijg
9
+ * file.
10
+ *
11
+ * This file contains output colorspace conversion routines.
12
+ */
13
+
14
+
15
+ /* This file is included by jdcolor.c */
16
+
17
+
18
+ /*
19
+ * Convert some rows of samples to the output colorspace.
20
+ *
21
+ * Note that we change from noninterleaved, one-plane-per-component format
22
+ * to interleaved-pixel format. The output buffer is therefore three times
23
+ * as wide as the input buffer.
24
+ * A starting row offset is provided only for the input buffer. The caller
25
+ * can easily adjust the passed output_buf value to accommodate any row
26
+ * offset required on that side.
27
+ */
28
+
29
+ INLINE
30
+ LOCAL(void)
31
+ ycc_rgb_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
32
+ JDIMENSION input_row, JSAMPARRAY output_buf,
33
+ int num_rows)
34
+ {
35
+ my_cconvert_ptr cconvert = (my_cconvert_ptr)cinfo->cconvert;
36
+ register int y, cb, cr;
37
+ register JSAMPROW outptr;
38
+ register JSAMPROW inptr0, inptr1, inptr2;
39
+ register JDIMENSION col;
40
+ JDIMENSION num_cols = cinfo->output_width;
41
+ /* copy these pointers into registers if possible */
42
+ register JSAMPLE *range_limit = cinfo->sample_range_limit;
43
+ register int *Crrtab = cconvert->Cr_r_tab;
44
+ register int *Cbbtab = cconvert->Cb_b_tab;
45
+ register JLONG *Crgtab = cconvert->Cr_g_tab;
46
+ register JLONG *Cbgtab = cconvert->Cb_g_tab;
47
+ SHIFT_TEMPS
48
+
49
+ while (--num_rows >= 0) {
50
+ inptr0 = input_buf[0][input_row];
51
+ inptr1 = input_buf[1][input_row];
52
+ inptr2 = input_buf[2][input_row];
53
+ input_row++;
54
+ outptr = *output_buf++;
55
+ for (col = 0; col < num_cols; col++) {
56
+ y = GETJSAMPLE(inptr0[col]);
57
+ cb = GETJSAMPLE(inptr1[col]);
58
+ cr = GETJSAMPLE(inptr2[col]);
59
+ /* Range-limiting is essential due to noise introduced by DCT losses. */
60
+ outptr[RGB_RED] = range_limit[y + Crrtab[cr]];
61
+ outptr[RGB_GREEN] = range_limit[y +
62
+ ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
63
+ SCALEBITS))];
64
+ outptr[RGB_BLUE] = range_limit[y + Cbbtab[cb]];
65
+ /* Set unused byte to 0xFF so it can be interpreted as an opaque */
66
+ /* alpha channel value */
67
+ #ifdef RGB_ALPHA
68
+ outptr[RGB_ALPHA] = 0xFF;
69
+ #endif
70
+ outptr += RGB_PIXELSIZE;
71
+ }
72
+ }
73
+ }
74
+
75
+
76
+ /*
77
+ * Convert grayscale to RGB: just duplicate the graylevel three times.
78
+ * This is provided to support applications that don't want to cope
79
+ * with grayscale as a separate case.
80
+ */
81
+
82
+ INLINE
83
+ LOCAL(void)
84
+ gray_rgb_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
85
+ JDIMENSION input_row, JSAMPARRAY output_buf,
86
+ int num_rows)
87
+ {
88
+ register JSAMPROW inptr, outptr;
89
+ register JDIMENSION col;
90
+ JDIMENSION num_cols = cinfo->output_width;
91
+
92
+ while (--num_rows >= 0) {
93
+ inptr = input_buf[0][input_row++];
94
+ outptr = *output_buf++;
95
+ for (col = 0; col < num_cols; col++) {
96
+ /* We can dispense with GETJSAMPLE() here */
97
+ outptr[RGB_RED] = outptr[RGB_GREEN] = outptr[RGB_BLUE] = inptr[col];
98
+ /* Set unused byte to 0xFF so it can be interpreted as an opaque */
99
+ /* alpha channel value */
100
+ #ifdef RGB_ALPHA
101
+ outptr[RGB_ALPHA] = 0xFF;
102
+ #endif
103
+ outptr += RGB_PIXELSIZE;
104
+ }
105
+ }
106
+ }
107
+
108
+
109
+ /*
110
+ * Convert RGB to extended RGB: just swap the order of source pixels
111
+ */
112
+
113
+ INLINE
114
+ LOCAL(void)
115
+ rgb_rgb_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
116
+ JDIMENSION input_row, JSAMPARRAY output_buf,
117
+ int num_rows)
118
+ {
119
+ register JSAMPROW inptr0, inptr1, inptr2;
120
+ register JSAMPROW outptr;
121
+ register JDIMENSION col;
122
+ JDIMENSION num_cols = cinfo->output_width;
123
+
124
+ while (--num_rows >= 0) {
125
+ inptr0 = input_buf[0][input_row];
126
+ inptr1 = input_buf[1][input_row];
127
+ inptr2 = input_buf[2][input_row];
128
+ input_row++;
129
+ outptr = *output_buf++;
130
+ for (col = 0; col < num_cols; col++) {
131
+ /* We can dispense with GETJSAMPLE() here */
132
+ outptr[RGB_RED] = inptr0[col];
133
+ outptr[RGB_GREEN] = inptr1[col];
134
+ outptr[RGB_BLUE] = inptr2[col];
135
+ /* Set unused byte to 0xFF so it can be interpreted as an opaque */
136
+ /* alpha channel value */
137
+ #ifdef RGB_ALPHA
138
+ outptr[RGB_ALPHA] = 0xFF;
139
+ #endif
140
+ outptr += RGB_PIXELSIZE;
141
+ }
142
+ }
143
+ }