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,687 @@
1
+ /*
2
+ * jdphuff.c
3
+ *
4
+ * This file was part of the Independent JPEG Group's software:
5
+ * Copyright (C) 1995-1997, Thomas G. Lane.
6
+ * libjpeg-turbo Modifications:
7
+ * Copyright (C) 2015-2016, 2018, D. R. Commander.
8
+ * For conditions of distribution and use, see the accompanying README.ijg
9
+ * file.
10
+ *
11
+ * This file contains Huffman entropy decoding routines for progressive JPEG.
12
+ *
13
+ * Much of the complexity here has to do with supporting input suspension.
14
+ * If the data source module demands suspension, we want to be able to back
15
+ * up to the start of the current MCU. To do this, we copy state variables
16
+ * into local working storage, and update them back to the permanent
17
+ * storage only upon successful completion of an MCU.
18
+ *
19
+ * NOTE: All referenced figures are from
20
+ * Recommendation ITU-T T.81 (1992) | ISO/IEC 10918-1:1994.
21
+ */
22
+
23
+ #define JPEG_INTERNALS
24
+ #include "jinclude.h"
25
+ #include "jpeglib.h"
26
+ #include "jdhuff.h" /* Declarations shared with jdhuff.c */
27
+ #include <limits.h>
28
+
29
+
30
+ #ifdef D_PROGRESSIVE_SUPPORTED
31
+
32
+ /*
33
+ * Expanded entropy decoder object for progressive Huffman decoding.
34
+ *
35
+ * The savable_state subrecord contains fields that change within an MCU,
36
+ * but must not be updated permanently until we complete the MCU.
37
+ */
38
+
39
+ typedef struct {
40
+ unsigned int EOBRUN; /* remaining EOBs in EOBRUN */
41
+ int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
42
+ } savable_state;
43
+
44
+ /* This macro is to work around compilers with missing or broken
45
+ * structure assignment. You'll need to fix this code if you have
46
+ * such a compiler and you change MAX_COMPS_IN_SCAN.
47
+ */
48
+
49
+ #ifndef NO_STRUCT_ASSIGN
50
+ #define ASSIGN_STATE(dest, src) ((dest) = (src))
51
+ #else
52
+ #if MAX_COMPS_IN_SCAN == 4
53
+ #define ASSIGN_STATE(dest, src) \
54
+ ((dest).EOBRUN = (src).EOBRUN, \
55
+ (dest).last_dc_val[0] = (src).last_dc_val[0], \
56
+ (dest).last_dc_val[1] = (src).last_dc_val[1], \
57
+ (dest).last_dc_val[2] = (src).last_dc_val[2], \
58
+ (dest).last_dc_val[3] = (src).last_dc_val[3])
59
+ #endif
60
+ #endif
61
+
62
+
63
+ typedef struct {
64
+ struct jpeg_entropy_decoder pub; /* public fields */
65
+
66
+ /* These fields are loaded into local variables at start of each MCU.
67
+ * In case of suspension, we exit WITHOUT updating them.
68
+ */
69
+ bitread_perm_state bitstate; /* Bit buffer at start of MCU */
70
+ savable_state saved; /* Other state at start of MCU */
71
+
72
+ /* These fields are NOT loaded into local working state. */
73
+ unsigned int restarts_to_go; /* MCUs left in this restart interval */
74
+
75
+ /* Pointers to derived tables (these workspaces have image lifespan) */
76
+ d_derived_tbl *derived_tbls[NUM_HUFF_TBLS];
77
+
78
+ d_derived_tbl *ac_derived_tbl; /* active table during an AC scan */
79
+ } phuff_entropy_decoder;
80
+
81
+ typedef phuff_entropy_decoder *phuff_entropy_ptr;
82
+
83
+ /* Forward declarations */
84
+ METHODDEF(boolean) decode_mcu_DC_first(j_decompress_ptr cinfo,
85
+ JBLOCKROW *MCU_data);
86
+ METHODDEF(boolean) decode_mcu_AC_first(j_decompress_ptr cinfo,
87
+ JBLOCKROW *MCU_data);
88
+ METHODDEF(boolean) decode_mcu_DC_refine(j_decompress_ptr cinfo,
89
+ JBLOCKROW *MCU_data);
90
+ METHODDEF(boolean) decode_mcu_AC_refine(j_decompress_ptr cinfo,
91
+ JBLOCKROW *MCU_data);
92
+
93
+
94
+ /*
95
+ * Initialize for a Huffman-compressed scan.
96
+ */
97
+
98
+ METHODDEF(void)
99
+ start_pass_phuff_decoder(j_decompress_ptr cinfo)
100
+ {
101
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr)cinfo->entropy;
102
+ boolean is_DC_band, bad;
103
+ int ci, coefi, tbl;
104
+ d_derived_tbl **pdtbl;
105
+ int *coef_bit_ptr;
106
+ jpeg_component_info *compptr;
107
+
108
+ is_DC_band = (cinfo->Ss == 0);
109
+
110
+ /* Validate scan parameters */
111
+ bad = FALSE;
112
+ if (is_DC_band) {
113
+ if (cinfo->Se != 0)
114
+ bad = TRUE;
115
+ } else {
116
+ /* need not check Ss/Se < 0 since they came from unsigned bytes */
117
+ if (cinfo->Ss > cinfo->Se || cinfo->Se >= DCTSIZE2)
118
+ bad = TRUE;
119
+ /* AC scans may have only one component */
120
+ if (cinfo->comps_in_scan != 1)
121
+ bad = TRUE;
122
+ }
123
+ if (cinfo->Ah != 0) {
124
+ /* Successive approximation refinement scan: must have Al = Ah-1. */
125
+ if (cinfo->Al != cinfo->Ah - 1)
126
+ bad = TRUE;
127
+ }
128
+ if (cinfo->Al > 13) /* need not check for < 0 */
129
+ bad = TRUE;
130
+ /* Arguably the maximum Al value should be less than 13 for 8-bit precision,
131
+ * but the spec doesn't say so, and we try to be liberal about what we
132
+ * accept. Note: large Al values could result in out-of-range DC
133
+ * coefficients during early scans, leading to bizarre displays due to
134
+ * overflows in the IDCT math. But we won't crash.
135
+ */
136
+ if (bad)
137
+ ERREXIT4(cinfo, JERR_BAD_PROGRESSION,
138
+ cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al);
139
+ /* Update progression status, and verify that scan order is legal.
140
+ * Note that inter-scan inconsistencies are treated as warnings
141
+ * not fatal errors ... not clear if this is right way to behave.
142
+ */
143
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
144
+ int cindex = cinfo->cur_comp_info[ci]->component_index;
145
+ coef_bit_ptr = &cinfo->coef_bits[cindex][0];
146
+ if (!is_DC_band && coef_bit_ptr[0] < 0) /* AC without prior DC scan */
147
+ WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0);
148
+ for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) {
149
+ int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi];
150
+ if (cinfo->Ah != expected)
151
+ WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi);
152
+ coef_bit_ptr[coefi] = cinfo->Al;
153
+ }
154
+ }
155
+
156
+ /* Select MCU decoding routine */
157
+ if (cinfo->Ah == 0) {
158
+ if (is_DC_band)
159
+ entropy->pub.decode_mcu = decode_mcu_DC_first;
160
+ else
161
+ entropy->pub.decode_mcu = decode_mcu_AC_first;
162
+ } else {
163
+ if (is_DC_band)
164
+ entropy->pub.decode_mcu = decode_mcu_DC_refine;
165
+ else
166
+ entropy->pub.decode_mcu = decode_mcu_AC_refine;
167
+ }
168
+
169
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
170
+ compptr = cinfo->cur_comp_info[ci];
171
+ /* Make sure requested tables are present, and compute derived tables.
172
+ * We may build same derived table more than once, but it's not expensive.
173
+ */
174
+ if (is_DC_band) {
175
+ if (cinfo->Ah == 0) { /* DC refinement needs no table */
176
+ tbl = compptr->dc_tbl_no;
177
+ pdtbl = (d_derived_tbl **)(entropy->derived_tbls) + tbl;
178
+ jpeg_make_d_derived_tbl(cinfo, TRUE, tbl, pdtbl);
179
+ }
180
+ } else {
181
+ tbl = compptr->ac_tbl_no;
182
+ pdtbl = (d_derived_tbl **)(entropy->derived_tbls) + tbl;
183
+ jpeg_make_d_derived_tbl(cinfo, FALSE, tbl, pdtbl);
184
+ /* remember the single active table */
185
+ entropy->ac_derived_tbl = entropy->derived_tbls[tbl];
186
+ }
187
+ /* Initialize DC predictions to 0 */
188
+ entropy->saved.last_dc_val[ci] = 0;
189
+ }
190
+
191
+ /* Initialize bitread state variables */
192
+ entropy->bitstate.bits_left = 0;
193
+ entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */
194
+ entropy->pub.insufficient_data = FALSE;
195
+
196
+ /* Initialize private state variables */
197
+ entropy->saved.EOBRUN = 0;
198
+
199
+ /* Initialize restart counter */
200
+ entropy->restarts_to_go = cinfo->restart_interval;
201
+ }
202
+
203
+
204
+ /*
205
+ * Figure F.12: extend sign bit.
206
+ * On some machines, a shift and add will be faster than a table lookup.
207
+ */
208
+
209
+ #define AVOID_TABLES
210
+ #ifdef AVOID_TABLES
211
+
212
+ #define NEG_1 ((unsigned)-1)
213
+ #define HUFF_EXTEND(x, s) \
214
+ ((x) < (1 << ((s) - 1)) ? (x) + (((NEG_1) << (s)) + 1) : (x))
215
+
216
+ #else
217
+
218
+ #define HUFF_EXTEND(x, s) \
219
+ ((x) < extend_test[s] ? (x) + extend_offset[s] : (x))
220
+
221
+ static const int extend_test[16] = { /* entry n is 2**(n-1) */
222
+ 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
223
+ 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000
224
+ };
225
+
226
+ static const int extend_offset[16] = { /* entry n is (-1 << n) + 1 */
227
+ 0, ((-1) << 1) + 1, ((-1) << 2) + 1, ((-1) << 3) + 1, ((-1) << 4) + 1,
228
+ ((-1) << 5) + 1, ((-1) << 6) + 1, ((-1) << 7) + 1, ((-1) << 8) + 1,
229
+ ((-1) << 9) + 1, ((-1) << 10) + 1, ((-1) << 11) + 1, ((-1) << 12) + 1,
230
+ ((-1) << 13) + 1, ((-1) << 14) + 1, ((-1) << 15) + 1
231
+ };
232
+
233
+ #endif /* AVOID_TABLES */
234
+
235
+
236
+ /*
237
+ * Check for a restart marker & resynchronize decoder.
238
+ * Returns FALSE if must suspend.
239
+ */
240
+
241
+ LOCAL(boolean)
242
+ process_restart(j_decompress_ptr cinfo)
243
+ {
244
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr)cinfo->entropy;
245
+ int ci;
246
+
247
+ /* Throw away any unused bits remaining in bit buffer; */
248
+ /* include any full bytes in next_marker's count of discarded bytes */
249
+ cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8;
250
+ entropy->bitstate.bits_left = 0;
251
+
252
+ /* Advance past the RSTn marker */
253
+ if (!(*cinfo->marker->read_restart_marker) (cinfo))
254
+ return FALSE;
255
+
256
+ /* Re-initialize DC predictions to 0 */
257
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++)
258
+ entropy->saved.last_dc_val[ci] = 0;
259
+ /* Re-init EOB run count, too */
260
+ entropy->saved.EOBRUN = 0;
261
+
262
+ /* Reset restart counter */
263
+ entropy->restarts_to_go = cinfo->restart_interval;
264
+
265
+ /* Reset out-of-data flag, unless read_restart_marker left us smack up
266
+ * against a marker. In that case we will end up treating the next data
267
+ * segment as empty, and we can avoid producing bogus output pixels by
268
+ * leaving the flag set.
269
+ */
270
+ if (cinfo->unread_marker == 0)
271
+ entropy->pub.insufficient_data = FALSE;
272
+
273
+ return TRUE;
274
+ }
275
+
276
+
277
+ /*
278
+ * Huffman MCU decoding.
279
+ * Each of these routines decodes and returns one MCU's worth of
280
+ * Huffman-compressed coefficients.
281
+ * The coefficients are reordered from zigzag order into natural array order,
282
+ * but are not dequantized.
283
+ *
284
+ * The i'th block of the MCU is stored into the block pointed to by
285
+ * MCU_data[i]. WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER.
286
+ *
287
+ * We return FALSE if data source requested suspension. In that case no
288
+ * changes have been made to permanent state. (Exception: some output
289
+ * coefficients may already have been assigned. This is harmless for
290
+ * spectral selection, since we'll just re-assign them on the next call.
291
+ * Successive approximation AC refinement has to be more careful, however.)
292
+ */
293
+
294
+ /*
295
+ * MCU decoding for DC initial scan (either spectral selection,
296
+ * or first pass of successive approximation).
297
+ */
298
+
299
+ METHODDEF(boolean)
300
+ decode_mcu_DC_first(j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
301
+ {
302
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr)cinfo->entropy;
303
+ int Al = cinfo->Al;
304
+ register int s, r;
305
+ int blkn, ci;
306
+ JBLOCKROW block;
307
+ BITREAD_STATE_VARS;
308
+ savable_state state;
309
+ d_derived_tbl *tbl;
310
+ jpeg_component_info *compptr;
311
+
312
+ /* Process restart marker if needed; may have to suspend */
313
+ if (cinfo->restart_interval) {
314
+ if (entropy->restarts_to_go == 0)
315
+ if (!process_restart(cinfo))
316
+ return FALSE;
317
+ }
318
+
319
+ /* If we've run out of data, just leave the MCU set to zeroes.
320
+ * This way, we return uniform gray for the remainder of the segment.
321
+ */
322
+ if (!entropy->pub.insufficient_data) {
323
+
324
+ /* Load up working state */
325
+ BITREAD_LOAD_STATE(cinfo, entropy->bitstate);
326
+ ASSIGN_STATE(state, entropy->saved);
327
+
328
+ /* Outer loop handles each block in the MCU */
329
+
330
+ for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
331
+ block = MCU_data[blkn];
332
+ ci = cinfo->MCU_membership[blkn];
333
+ compptr = cinfo->cur_comp_info[ci];
334
+ tbl = entropy->derived_tbls[compptr->dc_tbl_no];
335
+
336
+ /* Decode a single block's worth of coefficients */
337
+
338
+ /* Section F.2.2.1: decode the DC coefficient difference */
339
+ HUFF_DECODE(s, br_state, tbl, return FALSE, label1);
340
+ if (s) {
341
+ CHECK_BIT_BUFFER(br_state, s, return FALSE);
342
+ r = GET_BITS(s);
343
+ s = HUFF_EXTEND(r, s);
344
+ }
345
+
346
+ /* Convert DC difference to actual value, update last_dc_val */
347
+ if ((state.last_dc_val[ci] >= 0 &&
348
+ s > INT_MAX - state.last_dc_val[ci]) ||
349
+ (state.last_dc_val[ci] < 0 && s < INT_MIN - state.last_dc_val[ci]))
350
+ ERREXIT(cinfo, JERR_BAD_DCT_COEF);
351
+ s += state.last_dc_val[ci];
352
+ state.last_dc_val[ci] = s;
353
+ /* Scale and output the coefficient (assumes jpeg_natural_order[0]=0) */
354
+ (*block)[0] = (JCOEF)LEFT_SHIFT(s, Al);
355
+ }
356
+
357
+ /* Completed MCU, so update state */
358
+ BITREAD_SAVE_STATE(cinfo, entropy->bitstate);
359
+ ASSIGN_STATE(entropy->saved, state);
360
+ }
361
+
362
+ /* Account for restart interval (no-op if not using restarts) */
363
+ entropy->restarts_to_go--;
364
+
365
+ return TRUE;
366
+ }
367
+
368
+
369
+ /*
370
+ * MCU decoding for AC initial scan (either spectral selection,
371
+ * or first pass of successive approximation).
372
+ */
373
+
374
+ METHODDEF(boolean)
375
+ decode_mcu_AC_first(j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
376
+ {
377
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr)cinfo->entropy;
378
+ int Se = cinfo->Se;
379
+ int Al = cinfo->Al;
380
+ register int s, k, r;
381
+ unsigned int EOBRUN;
382
+ JBLOCKROW block;
383
+ BITREAD_STATE_VARS;
384
+ d_derived_tbl *tbl;
385
+
386
+ /* Process restart marker if needed; may have to suspend */
387
+ if (cinfo->restart_interval) {
388
+ if (entropy->restarts_to_go == 0)
389
+ if (!process_restart(cinfo))
390
+ return FALSE;
391
+ }
392
+
393
+ /* If we've run out of data, just leave the MCU set to zeroes.
394
+ * This way, we return uniform gray for the remainder of the segment.
395
+ */
396
+ if (!entropy->pub.insufficient_data) {
397
+
398
+ /* Load up working state.
399
+ * We can avoid loading/saving bitread state if in an EOB run.
400
+ */
401
+ EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */
402
+
403
+ /* There is always only one block per MCU */
404
+
405
+ if (EOBRUN > 0) /* if it's a band of zeroes... */
406
+ EOBRUN--; /* ...process it now (we do nothing) */
407
+ else {
408
+ BITREAD_LOAD_STATE(cinfo, entropy->bitstate);
409
+ block = MCU_data[0];
410
+ tbl = entropy->ac_derived_tbl;
411
+
412
+ for (k = cinfo->Ss; k <= Se; k++) {
413
+ HUFF_DECODE(s, br_state, tbl, return FALSE, label2);
414
+ r = s >> 4;
415
+ s &= 15;
416
+ if (s) {
417
+ k += r;
418
+ CHECK_BIT_BUFFER(br_state, s, return FALSE);
419
+ r = GET_BITS(s);
420
+ s = HUFF_EXTEND(r, s);
421
+ /* Scale and output coefficient in natural (dezigzagged) order */
422
+ (*block)[jpeg_natural_order[k]] = (JCOEF)LEFT_SHIFT(s, Al);
423
+ } else {
424
+ if (r == 15) { /* ZRL */
425
+ k += 15; /* skip 15 zeroes in band */
426
+ } else { /* EOBr, run length is 2^r + appended bits */
427
+ EOBRUN = 1 << r;
428
+ if (r) { /* EOBr, r > 0 */
429
+ CHECK_BIT_BUFFER(br_state, r, return FALSE);
430
+ r = GET_BITS(r);
431
+ EOBRUN += r;
432
+ }
433
+ EOBRUN--; /* this band is processed at this moment */
434
+ break; /* force end-of-band */
435
+ }
436
+ }
437
+ }
438
+
439
+ BITREAD_SAVE_STATE(cinfo, entropy->bitstate);
440
+ }
441
+
442
+ /* Completed MCU, so update state */
443
+ entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */
444
+ }
445
+
446
+ /* Account for restart interval (no-op if not using restarts) */
447
+ entropy->restarts_to_go--;
448
+
449
+ return TRUE;
450
+ }
451
+
452
+
453
+ /*
454
+ * MCU decoding for DC successive approximation refinement scan.
455
+ * Note: we assume such scans can be multi-component, although the spec
456
+ * is not very clear on the point.
457
+ */
458
+
459
+ METHODDEF(boolean)
460
+ decode_mcu_DC_refine(j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
461
+ {
462
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr)cinfo->entropy;
463
+ int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
464
+ int blkn;
465
+ JBLOCKROW block;
466
+ BITREAD_STATE_VARS;
467
+
468
+ /* Process restart marker if needed; may have to suspend */
469
+ if (cinfo->restart_interval) {
470
+ if (entropy->restarts_to_go == 0)
471
+ if (!process_restart(cinfo))
472
+ return FALSE;
473
+ }
474
+
475
+ /* Not worth the cycles to check insufficient_data here,
476
+ * since we will not change the data anyway if we read zeroes.
477
+ */
478
+
479
+ /* Load up working state */
480
+ BITREAD_LOAD_STATE(cinfo, entropy->bitstate);
481
+
482
+ /* Outer loop handles each block in the MCU */
483
+
484
+ for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
485
+ block = MCU_data[blkn];
486
+
487
+ /* Encoded data is simply the next bit of the two's-complement DC value */
488
+ CHECK_BIT_BUFFER(br_state, 1, return FALSE);
489
+ if (GET_BITS(1))
490
+ (*block)[0] |= p1;
491
+ /* Note: since we use |=, repeating the assignment later is safe */
492
+ }
493
+
494
+ /* Completed MCU, so update state */
495
+ BITREAD_SAVE_STATE(cinfo, entropy->bitstate);
496
+
497
+ /* Account for restart interval (no-op if not using restarts) */
498
+ entropy->restarts_to_go--;
499
+
500
+ return TRUE;
501
+ }
502
+
503
+
504
+ /*
505
+ * MCU decoding for AC successive approximation refinement scan.
506
+ */
507
+
508
+ METHODDEF(boolean)
509
+ decode_mcu_AC_refine(j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
510
+ {
511
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr)cinfo->entropy;
512
+ int Se = cinfo->Se;
513
+ int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
514
+ int m1 = (NEG_1) << cinfo->Al; /* -1 in the bit position being coded */
515
+ register int s, k, r;
516
+ unsigned int EOBRUN;
517
+ JBLOCKROW block;
518
+ JCOEFPTR thiscoef;
519
+ BITREAD_STATE_VARS;
520
+ d_derived_tbl *tbl;
521
+ int num_newnz;
522
+ int newnz_pos[DCTSIZE2];
523
+
524
+ /* Process restart marker if needed; may have to suspend */
525
+ if (cinfo->restart_interval) {
526
+ if (entropy->restarts_to_go == 0)
527
+ if (!process_restart(cinfo))
528
+ return FALSE;
529
+ }
530
+
531
+ /* If we've run out of data, don't modify the MCU.
532
+ */
533
+ if (!entropy->pub.insufficient_data) {
534
+
535
+ /* Load up working state */
536
+ BITREAD_LOAD_STATE(cinfo, entropy->bitstate);
537
+ EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */
538
+
539
+ /* There is always only one block per MCU */
540
+ block = MCU_data[0];
541
+ tbl = entropy->ac_derived_tbl;
542
+
543
+ /* If we are forced to suspend, we must undo the assignments to any newly
544
+ * nonzero coefficients in the block, because otherwise we'd get confused
545
+ * next time about which coefficients were already nonzero.
546
+ * But we need not undo addition of bits to already-nonzero coefficients;
547
+ * instead, we can test the current bit to see if we already did it.
548
+ */
549
+ num_newnz = 0;
550
+
551
+ /* initialize coefficient loop counter to start of band */
552
+ k = cinfo->Ss;
553
+
554
+ if (EOBRUN == 0) {
555
+ for (; k <= Se; k++) {
556
+ HUFF_DECODE(s, br_state, tbl, goto undoit, label3);
557
+ r = s >> 4;
558
+ s &= 15;
559
+ if (s) {
560
+ if (s != 1) /* size of new coef should always be 1 */
561
+ WARNMS(cinfo, JWRN_HUFF_BAD_CODE);
562
+ CHECK_BIT_BUFFER(br_state, 1, goto undoit);
563
+ if (GET_BITS(1))
564
+ s = p1; /* newly nonzero coef is positive */
565
+ else
566
+ s = m1; /* newly nonzero coef is negative */
567
+ } else {
568
+ if (r != 15) {
569
+ EOBRUN = 1 << r; /* EOBr, run length is 2^r + appended bits */
570
+ if (r) {
571
+ CHECK_BIT_BUFFER(br_state, r, goto undoit);
572
+ r = GET_BITS(r);
573
+ EOBRUN += r;
574
+ }
575
+ break; /* rest of block is handled by EOB logic */
576
+ }
577
+ /* note s = 0 for processing ZRL */
578
+ }
579
+ /* Advance over already-nonzero coefs and r still-zero coefs,
580
+ * appending correction bits to the nonzeroes. A correction bit is 1
581
+ * if the absolute value of the coefficient must be increased.
582
+ */
583
+ do {
584
+ thiscoef = *block + jpeg_natural_order[k];
585
+ if (*thiscoef != 0) {
586
+ CHECK_BIT_BUFFER(br_state, 1, goto undoit);
587
+ if (GET_BITS(1)) {
588
+ if ((*thiscoef & p1) == 0) { /* do nothing if already set it */
589
+ if (*thiscoef >= 0)
590
+ *thiscoef += p1;
591
+ else
592
+ *thiscoef += m1;
593
+ }
594
+ }
595
+ } else {
596
+ if (--r < 0)
597
+ break; /* reached target zero coefficient */
598
+ }
599
+ k++;
600
+ } while (k <= Se);
601
+ if (s) {
602
+ int pos = jpeg_natural_order[k];
603
+ /* Output newly nonzero coefficient */
604
+ (*block)[pos] = (JCOEF)s;
605
+ /* Remember its position in case we have to suspend */
606
+ newnz_pos[num_newnz++] = pos;
607
+ }
608
+ }
609
+ }
610
+
611
+ if (EOBRUN > 0) {
612
+ /* Scan any remaining coefficient positions after the end-of-band
613
+ * (the last newly nonzero coefficient, if any). Append a correction
614
+ * bit to each already-nonzero coefficient. A correction bit is 1
615
+ * if the absolute value of the coefficient must be increased.
616
+ */
617
+ for (; k <= Se; k++) {
618
+ thiscoef = *block + jpeg_natural_order[k];
619
+ if (*thiscoef != 0) {
620
+ CHECK_BIT_BUFFER(br_state, 1, goto undoit);
621
+ if (GET_BITS(1)) {
622
+ if ((*thiscoef & p1) == 0) { /* do nothing if already changed it */
623
+ if (*thiscoef >= 0)
624
+ *thiscoef += p1;
625
+ else
626
+ *thiscoef += m1;
627
+ }
628
+ }
629
+ }
630
+ }
631
+ /* Count one block completed in EOB run */
632
+ EOBRUN--;
633
+ }
634
+
635
+ /* Completed MCU, so update state */
636
+ BITREAD_SAVE_STATE(cinfo, entropy->bitstate);
637
+ entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */
638
+ }
639
+
640
+ /* Account for restart interval (no-op if not using restarts) */
641
+ entropy->restarts_to_go--;
642
+
643
+ return TRUE;
644
+
645
+ undoit:
646
+ /* Re-zero any output coefficients that we made newly nonzero */
647
+ while (num_newnz > 0)
648
+ (*block)[newnz_pos[--num_newnz]] = 0;
649
+
650
+ return FALSE;
651
+ }
652
+
653
+
654
+ /*
655
+ * Module initialization routine for progressive Huffman entropy decoding.
656
+ */
657
+
658
+ GLOBAL(void)
659
+ jinit_phuff_decoder(j_decompress_ptr cinfo)
660
+ {
661
+ phuff_entropy_ptr entropy;
662
+ int *coef_bit_ptr;
663
+ int ci, i;
664
+
665
+ entropy = (phuff_entropy_ptr)
666
+ (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
667
+ sizeof(phuff_entropy_decoder));
668
+ cinfo->entropy = (struct jpeg_entropy_decoder *)entropy;
669
+ entropy->pub.start_pass = start_pass_phuff_decoder;
670
+
671
+ /* Mark derived tables unallocated */
672
+ for (i = 0; i < NUM_HUFF_TBLS; i++) {
673
+ entropy->derived_tbls[i] = NULL;
674
+ }
675
+
676
+ /* Create progression status table */
677
+ cinfo->coef_bits = (int (*)[DCTSIZE2])
678
+ (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
679
+ cinfo->num_components * DCTSIZE2 *
680
+ sizeof(int));
681
+ coef_bit_ptr = &cinfo->coef_bits[0][0];
682
+ for (ci = 0; ci < cinfo->num_components; ci++)
683
+ for (i = 0; i < DCTSIZE2; i++)
684
+ *coef_bit_ptr++ = -1;
685
+ }
686
+
687
+ #endif /* D_PROGRESSIVE_SUPPORTED */