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,1096 @@
1
+ /*
2
+ * jchuff.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, 2014-2016, 2018-2019, D. R. Commander.
8
+ * Copyright (C) 2015, Matthieu Darbois.
9
+ * For conditions of distribution and use, see the accompanying README.ijg
10
+ * file.
11
+ *
12
+ * This file contains Huffman entropy encoding routines.
13
+ *
14
+ * Much of the complexity here has to do with supporting output suspension.
15
+ * If the data destination module demands suspension, we want to be able to
16
+ * back up to the start of the current MCU. To do this, we copy state
17
+ * variables into local working storage, and update them back to the
18
+ * permanent JPEG objects only upon successful completion of an MCU.
19
+ *
20
+ * NOTE: All referenced figures are from
21
+ * Recommendation ITU-T T.81 (1992) | ISO/IEC 10918-1:1994.
22
+ */
23
+
24
+ #define JPEG_INTERNALS
25
+ #include "jinclude.h"
26
+ #include "jpeglib.h"
27
+ #include "jsimd.h"
28
+ #include "jconfigint.h"
29
+ #include <limits.h>
30
+
31
+ /*
32
+ * NOTE: If USE_CLZ_INTRINSIC is defined, then clz/bsr instructions will be
33
+ * used for bit counting rather than the lookup table. This will reduce the
34
+ * memory footprint by 64k, which is important for some mobile applications
35
+ * that create many isolated instances of libjpeg-turbo (web browsers, for
36
+ * instance.) This may improve performance on some mobile platforms as well.
37
+ * This feature is enabled by default only on ARM processors, because some x86
38
+ * chips have a slow implementation of bsr, and the use of clz/bsr cannot be
39
+ * shown to have a significant performance impact even on the x86 chips that
40
+ * have a fast implementation of it. When building for ARMv6, you can
41
+ * explicitly disable the use of clz/bsr by adding -mthumb to the compiler
42
+ * flags (this defines __thumb__).
43
+ */
44
+
45
+ /* NOTE: Both GCC and Clang define __GNUC__ */
46
+ #if defined __GNUC__ && (defined __arm__ || defined __aarch64__)
47
+ #if !defined __thumb__ || defined __thumb2__
48
+ #define USE_CLZ_INTRINSIC
49
+ #endif
50
+ #endif
51
+
52
+ #ifdef USE_CLZ_INTRINSIC
53
+ #define JPEG_NBITS_NONZERO(x) (32 - __builtin_clz(x))
54
+ #define JPEG_NBITS(x) (x ? JPEG_NBITS_NONZERO(x) : 0)
55
+ #else
56
+ #include "jpeg_nbits_table.h"
57
+ #define JPEG_NBITS(x) (jpeg_nbits_table[x])
58
+ #define JPEG_NBITS_NONZERO(x) JPEG_NBITS(x)
59
+ #endif
60
+
61
+
62
+ /* Expanded entropy encoder object for Huffman encoding.
63
+ *
64
+ * The savable_state subrecord contains fields that change within an MCU,
65
+ * but must not be updated permanently until we complete the MCU.
66
+ */
67
+
68
+ typedef struct {
69
+ size_t put_buffer; /* current bit-accumulation buffer */
70
+ int put_bits; /* # of bits now in it */
71
+ int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
72
+ } savable_state;
73
+
74
+ /* This macro is to work around compilers with missing or broken
75
+ * structure assignment. You'll need to fix this code if you have
76
+ * such a compiler and you change MAX_COMPS_IN_SCAN.
77
+ */
78
+
79
+ #ifndef NO_STRUCT_ASSIGN
80
+ #define ASSIGN_STATE(dest, src) ((dest) = (src))
81
+ #else
82
+ #if MAX_COMPS_IN_SCAN == 4
83
+ #define ASSIGN_STATE(dest, src) \
84
+ ((dest).put_buffer = (src).put_buffer, \
85
+ (dest).put_bits = (src).put_bits, \
86
+ (dest).last_dc_val[0] = (src).last_dc_val[0], \
87
+ (dest).last_dc_val[1] = (src).last_dc_val[1], \
88
+ (dest).last_dc_val[2] = (src).last_dc_val[2], \
89
+ (dest).last_dc_val[3] = (src).last_dc_val[3])
90
+ #endif
91
+ #endif
92
+
93
+
94
+ typedef struct {
95
+ struct jpeg_entropy_encoder pub; /* public fields */
96
+
97
+ savable_state saved; /* Bit buffer & DC state at start of MCU */
98
+
99
+ /* These fields are NOT loaded into local working state. */
100
+ unsigned int restarts_to_go; /* MCUs left in this restart interval */
101
+ int next_restart_num; /* next restart number to write (0-7) */
102
+
103
+ /* Pointers to derived tables (these workspaces have image lifespan) */
104
+ c_derived_tbl *dc_derived_tbls[NUM_HUFF_TBLS];
105
+ c_derived_tbl *ac_derived_tbls[NUM_HUFF_TBLS];
106
+
107
+ #ifdef ENTROPY_OPT_SUPPORTED /* Statistics tables for optimization */
108
+ long *dc_count_ptrs[NUM_HUFF_TBLS];
109
+ long *ac_count_ptrs[NUM_HUFF_TBLS];
110
+ #endif
111
+
112
+ int simd;
113
+ } huff_entropy_encoder;
114
+
115
+ typedef huff_entropy_encoder *huff_entropy_ptr;
116
+
117
+ /* Working state while writing an MCU.
118
+ * This struct contains all the fields that are needed by subroutines.
119
+ */
120
+
121
+ typedef struct {
122
+ JOCTET *next_output_byte; /* => next byte to write in buffer */
123
+ size_t free_in_buffer; /* # of byte spaces remaining in buffer */
124
+ savable_state cur; /* Current bit buffer & DC state */
125
+ j_compress_ptr cinfo; /* dump_buffer needs access to this */
126
+ } working_state;
127
+
128
+
129
+ /* Forward declarations */
130
+ METHODDEF(boolean) encode_mcu_huff(j_compress_ptr cinfo, JBLOCKROW *MCU_data);
131
+ METHODDEF(void) finish_pass_huff(j_compress_ptr cinfo);
132
+ #ifdef ENTROPY_OPT_SUPPORTED
133
+ METHODDEF(boolean) encode_mcu_gather(j_compress_ptr cinfo,
134
+ JBLOCKROW *MCU_data);
135
+ METHODDEF(void) finish_pass_gather(j_compress_ptr cinfo);
136
+ #endif
137
+
138
+
139
+ /*
140
+ * Initialize for a Huffman-compressed scan.
141
+ * If gather_statistics is TRUE, we do not output anything during the scan,
142
+ * just count the Huffman symbols used and generate Huffman code tables.
143
+ */
144
+
145
+ METHODDEF(void)
146
+ start_pass_huff(j_compress_ptr cinfo, boolean gather_statistics)
147
+ {
148
+ huff_entropy_ptr entropy = (huff_entropy_ptr)cinfo->entropy;
149
+ int ci, dctbl, actbl;
150
+ jpeg_component_info *compptr;
151
+
152
+ if (gather_statistics) {
153
+ #ifdef ENTROPY_OPT_SUPPORTED
154
+ entropy->pub.encode_mcu = encode_mcu_gather;
155
+ entropy->pub.finish_pass = finish_pass_gather;
156
+ #else
157
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
158
+ #endif
159
+ } else {
160
+ entropy->pub.encode_mcu = encode_mcu_huff;
161
+ entropy->pub.finish_pass = finish_pass_huff;
162
+ }
163
+
164
+ entropy->simd = jsimd_can_huff_encode_one_block();
165
+
166
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
167
+ compptr = cinfo->cur_comp_info[ci];
168
+ dctbl = compptr->dc_tbl_no;
169
+ actbl = compptr->ac_tbl_no;
170
+ if (gather_statistics) {
171
+ #ifdef ENTROPY_OPT_SUPPORTED
172
+ /* Check for invalid table indexes */
173
+ /* (make_c_derived_tbl does this in the other path) */
174
+ if (dctbl < 0 || dctbl >= NUM_HUFF_TBLS)
175
+ ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, dctbl);
176
+ if (actbl < 0 || actbl >= NUM_HUFF_TBLS)
177
+ ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, actbl);
178
+ /* Allocate and zero the statistics tables */
179
+ /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */
180
+ if (entropy->dc_count_ptrs[dctbl] == NULL)
181
+ entropy->dc_count_ptrs[dctbl] = (long *)
182
+ (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
183
+ 257 * sizeof(long));
184
+ MEMZERO(entropy->dc_count_ptrs[dctbl], 257 * sizeof(long));
185
+ if (entropy->ac_count_ptrs[actbl] == NULL)
186
+ entropy->ac_count_ptrs[actbl] = (long *)
187
+ (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
188
+ 257 * sizeof(long));
189
+ MEMZERO(entropy->ac_count_ptrs[actbl], 257 * sizeof(long));
190
+ #endif
191
+ } else {
192
+ /* Compute derived values for Huffman tables */
193
+ /* We may do this more than once for a table, but it's not expensive */
194
+ jpeg_make_c_derived_tbl(cinfo, TRUE, dctbl,
195
+ &entropy->dc_derived_tbls[dctbl]);
196
+ jpeg_make_c_derived_tbl(cinfo, FALSE, actbl,
197
+ &entropy->ac_derived_tbls[actbl]);
198
+ }
199
+ /* Initialize DC predictions to 0 */
200
+ entropy->saved.last_dc_val[ci] = 0;
201
+ }
202
+
203
+ /* Initialize bit buffer to empty */
204
+ entropy->saved.put_buffer = 0;
205
+ entropy->saved.put_bits = 0;
206
+
207
+ /* Initialize restart stuff */
208
+ entropy->restarts_to_go = cinfo->restart_interval;
209
+ entropy->next_restart_num = 0;
210
+ }
211
+
212
+
213
+ /*
214
+ * Compute the derived values for a Huffman table.
215
+ * This routine also performs some validation checks on the table.
216
+ *
217
+ * Note this is also used by jcphuff.c.
218
+ */
219
+
220
+ GLOBAL(void)
221
+ jpeg_make_c_derived_tbl(j_compress_ptr cinfo, boolean isDC, int tblno,
222
+ c_derived_tbl **pdtbl)
223
+ {
224
+ JHUFF_TBL *htbl;
225
+ c_derived_tbl *dtbl;
226
+ int p, i, l, lastp, si, maxsymbol;
227
+ char huffsize[257];
228
+ unsigned int huffcode[257];
229
+ unsigned int code;
230
+
231
+ /* Note that huffsize[] and huffcode[] are filled in code-length order,
232
+ * paralleling the order of the symbols themselves in htbl->huffval[].
233
+ */
234
+
235
+ /* Find the input Huffman table */
236
+ if (tblno < 0 || tblno >= NUM_HUFF_TBLS)
237
+ ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
238
+ htbl =
239
+ isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];
240
+ if (htbl == NULL)
241
+ ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
242
+
243
+ /* Allocate a workspace if we haven't already done so. */
244
+ if (*pdtbl == NULL)
245
+ *pdtbl = (c_derived_tbl *)
246
+ (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
247
+ sizeof(c_derived_tbl));
248
+ dtbl = *pdtbl;
249
+
250
+ /* Figure C.1: make table of Huffman code length for each symbol */
251
+
252
+ p = 0;
253
+ for (l = 1; l <= 16; l++) {
254
+ i = (int)htbl->bits[l];
255
+ if (i < 0 || p + i > 256) /* protect against table overrun */
256
+ ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
257
+ while (i--)
258
+ huffsize[p++] = (char)l;
259
+ }
260
+ huffsize[p] = 0;
261
+ lastp = p;
262
+
263
+ /* Figure C.2: generate the codes themselves */
264
+ /* We also validate that the counts represent a legal Huffman code tree. */
265
+
266
+ code = 0;
267
+ si = huffsize[0];
268
+ p = 0;
269
+ while (huffsize[p]) {
270
+ while (((int)huffsize[p]) == si) {
271
+ huffcode[p++] = code;
272
+ code++;
273
+ }
274
+ /* code is now 1 more than the last code used for codelength si; but
275
+ * it must still fit in si bits, since no code is allowed to be all ones.
276
+ */
277
+ if (((JLONG)code) >= (((JLONG)1) << si))
278
+ ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
279
+ code <<= 1;
280
+ si++;
281
+ }
282
+
283
+ /* Figure C.3: generate encoding tables */
284
+ /* These are code and size indexed by symbol value */
285
+
286
+ /* Set all codeless symbols to have code length 0;
287
+ * this lets us detect duplicate VAL entries here, and later
288
+ * allows emit_bits to detect any attempt to emit such symbols.
289
+ */
290
+ MEMZERO(dtbl->ehufsi, sizeof(dtbl->ehufsi));
291
+
292
+ /* This is also a convenient place to check for out-of-range
293
+ * and duplicated VAL entries. We allow 0..255 for AC symbols
294
+ * but only 0..15 for DC. (We could constrain them further
295
+ * based on data depth and mode, but this seems enough.)
296
+ */
297
+ maxsymbol = isDC ? 15 : 255;
298
+
299
+ for (p = 0; p < lastp; p++) {
300
+ i = htbl->huffval[p];
301
+ if (i < 0 || i > maxsymbol || dtbl->ehufsi[i])
302
+ ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
303
+ dtbl->ehufco[i] = huffcode[p];
304
+ dtbl->ehufsi[i] = huffsize[p];
305
+ }
306
+ }
307
+
308
+
309
+ /* Outputting bytes to the file */
310
+
311
+ /* Emit a byte, taking 'action' if must suspend. */
312
+ #define emit_byte(state, val, action) { \
313
+ *(state)->next_output_byte++ = (JOCTET)(val); \
314
+ if (--(state)->free_in_buffer == 0) \
315
+ if (!dump_buffer(state)) \
316
+ { action; } \
317
+ }
318
+
319
+
320
+ LOCAL(boolean)
321
+ dump_buffer(working_state *state)
322
+ /* Empty the output buffer; return TRUE if successful, FALSE if must suspend */
323
+ {
324
+ struct jpeg_destination_mgr *dest = state->cinfo->dest;
325
+
326
+ if (!(*dest->empty_output_buffer) (state->cinfo))
327
+ return FALSE;
328
+ /* After a successful buffer dump, must reset buffer pointers */
329
+ state->next_output_byte = dest->next_output_byte;
330
+ state->free_in_buffer = dest->free_in_buffer;
331
+ return TRUE;
332
+ }
333
+
334
+
335
+ /* Outputting bits to the file */
336
+
337
+ /* These macros perform the same task as the emit_bits() function in the
338
+ * original libjpeg code. In addition to reducing overhead by explicitly
339
+ * inlining the code, additional performance is achieved by taking into
340
+ * account the size of the bit buffer and waiting until it is almost full
341
+ * before emptying it. This mostly benefits 64-bit platforms, since 6
342
+ * bytes can be stored in a 64-bit bit buffer before it has to be emptied.
343
+ */
344
+
345
+ #define EMIT_BYTE() { \
346
+ JOCTET c; \
347
+ put_bits -= 8; \
348
+ c = (JOCTET)GETJOCTET(put_buffer >> put_bits); \
349
+ *buffer++ = c; \
350
+ if (c == 0xFF) /* need to stuff a zero byte? */ \
351
+ *buffer++ = 0; \
352
+ }
353
+
354
+ #define PUT_BITS(code, size) { \
355
+ put_bits += size; \
356
+ put_buffer = (put_buffer << size) | code; \
357
+ }
358
+
359
+ #if SIZEOF_SIZE_T != 8 && !defined(_WIN64)
360
+
361
+ #define CHECKBUF15() { \
362
+ if (put_bits > 15) { \
363
+ EMIT_BYTE() \
364
+ EMIT_BYTE() \
365
+ } \
366
+ }
367
+
368
+ #endif
369
+
370
+ #define CHECKBUF31() { \
371
+ if (put_bits > 31) { \
372
+ EMIT_BYTE() \
373
+ EMIT_BYTE() \
374
+ EMIT_BYTE() \
375
+ EMIT_BYTE() \
376
+ } \
377
+ }
378
+
379
+ #define CHECKBUF47() { \
380
+ if (put_bits > 47) { \
381
+ EMIT_BYTE() \
382
+ EMIT_BYTE() \
383
+ EMIT_BYTE() \
384
+ EMIT_BYTE() \
385
+ EMIT_BYTE() \
386
+ EMIT_BYTE() \
387
+ } \
388
+ }
389
+
390
+ #if !defined(_WIN32) && !defined(SIZEOF_SIZE_T)
391
+ #error Cannot determine word size
392
+ #endif
393
+
394
+ #if SIZEOF_SIZE_T == 8 || defined(_WIN64)
395
+
396
+ #define EMIT_BITS(code, size) { \
397
+ CHECKBUF47() \
398
+ PUT_BITS(code, size) \
399
+ }
400
+
401
+ #define EMIT_CODE(code, size) { \
402
+ temp2 &= (((JLONG)1) << nbits) - 1; \
403
+ CHECKBUF31() \
404
+ PUT_BITS(code, size) \
405
+ PUT_BITS(temp2, nbits) \
406
+ }
407
+
408
+ #else
409
+
410
+ #define EMIT_BITS(code, size) { \
411
+ PUT_BITS(code, size) \
412
+ CHECKBUF15() \
413
+ }
414
+
415
+ #define EMIT_CODE(code, size) { \
416
+ temp2 &= (((JLONG)1) << nbits) - 1; \
417
+ PUT_BITS(code, size) \
418
+ CHECKBUF15() \
419
+ PUT_BITS(temp2, nbits) \
420
+ CHECKBUF15() \
421
+ }
422
+
423
+ #endif
424
+
425
+
426
+ /* Although it is exceedingly rare, it is possible for a Huffman-encoded
427
+ * coefficient block to be larger than the 128-byte unencoded block. For each
428
+ * of the 64 coefficients, PUT_BITS is invoked twice, and each invocation can
429
+ * theoretically store 16 bits (for a maximum of 2048 bits or 256 bytes per
430
+ * encoded block.) If, for instance, one artificially sets the AC
431
+ * coefficients to alternating values of 32767 and -32768 (using the JPEG
432
+ * scanning order-- 1, 8, 16, etc.), then this will produce an encoded block
433
+ * larger than 200 bytes.
434
+ */
435
+ #define BUFSIZE (DCTSIZE2 * 4)
436
+
437
+ #define LOAD_BUFFER() { \
438
+ if (state->free_in_buffer < BUFSIZE) { \
439
+ localbuf = 1; \
440
+ buffer = _buffer; \
441
+ } else \
442
+ buffer = state->next_output_byte; \
443
+ }
444
+
445
+ #define STORE_BUFFER() { \
446
+ if (localbuf) { \
447
+ bytes = buffer - _buffer; \
448
+ buffer = _buffer; \
449
+ while (bytes > 0) { \
450
+ bytestocopy = MIN(bytes, state->free_in_buffer); \
451
+ MEMCOPY(state->next_output_byte, buffer, bytestocopy); \
452
+ state->next_output_byte += bytestocopy; \
453
+ buffer += bytestocopy; \
454
+ state->free_in_buffer -= bytestocopy; \
455
+ if (state->free_in_buffer == 0) \
456
+ if (!dump_buffer(state)) return FALSE; \
457
+ bytes -= bytestocopy; \
458
+ } \
459
+ } else { \
460
+ state->free_in_buffer -= (buffer - state->next_output_byte); \
461
+ state->next_output_byte = buffer; \
462
+ } \
463
+ }
464
+
465
+
466
+ LOCAL(boolean)
467
+ flush_bits(working_state *state)
468
+ {
469
+ JOCTET _buffer[BUFSIZE], *buffer;
470
+ size_t put_buffer; int put_bits;
471
+ size_t bytes, bytestocopy; int localbuf = 0;
472
+
473
+ put_buffer = state->cur.put_buffer;
474
+ put_bits = state->cur.put_bits;
475
+ LOAD_BUFFER()
476
+
477
+ /* fill any partial byte with ones */
478
+ PUT_BITS(0x7F, 7)
479
+ while (put_bits >= 8) EMIT_BYTE()
480
+
481
+ state->cur.put_buffer = 0; /* and reset bit-buffer to empty */
482
+ state->cur.put_bits = 0;
483
+ STORE_BUFFER()
484
+
485
+ return TRUE;
486
+ }
487
+
488
+
489
+ /* Encode a single block's worth of coefficients */
490
+
491
+ LOCAL(boolean)
492
+ encode_one_block_simd(working_state *state, JCOEFPTR block, int last_dc_val,
493
+ c_derived_tbl *dctbl, c_derived_tbl *actbl)
494
+ {
495
+ JOCTET _buffer[BUFSIZE], *buffer;
496
+ size_t bytes, bytestocopy; int localbuf = 0;
497
+
498
+ LOAD_BUFFER()
499
+
500
+ buffer = jsimd_huff_encode_one_block(state, buffer, block, last_dc_val,
501
+ dctbl, actbl);
502
+
503
+ STORE_BUFFER()
504
+
505
+ return TRUE;
506
+ }
507
+
508
+ LOCAL(boolean)
509
+ encode_one_block(working_state *state, JCOEFPTR block, int last_dc_val,
510
+ c_derived_tbl *dctbl, c_derived_tbl *actbl)
511
+ {
512
+ int temp, temp2, temp3;
513
+ int nbits;
514
+ int r, code, size;
515
+ JOCTET _buffer[BUFSIZE], *buffer;
516
+ size_t put_buffer; int put_bits;
517
+ int code_0xf0 = actbl->ehufco[0xf0], size_0xf0 = actbl->ehufsi[0xf0];
518
+ size_t bytes, bytestocopy; int localbuf = 0;
519
+
520
+ put_buffer = state->cur.put_buffer;
521
+ put_bits = state->cur.put_bits;
522
+ LOAD_BUFFER()
523
+
524
+ /* Encode the DC coefficient difference per section F.1.2.1 */
525
+
526
+ temp = temp2 = block[0] - last_dc_val;
527
+
528
+ /* This is a well-known technique for obtaining the absolute value without a
529
+ * branch. It is derived from an assembly language technique presented in
530
+ * "How to Optimize for the Pentium Processors", Copyright (c) 1996, 1997 by
531
+ * Agner Fog.
532
+ */
533
+ temp3 = temp >> (CHAR_BIT * sizeof(int) - 1);
534
+ temp ^= temp3;
535
+ temp -= temp3;
536
+
537
+ /* For a negative input, want temp2 = bitwise complement of abs(input) */
538
+ /* This code assumes we are on a two's complement machine */
539
+ temp2 += temp3;
540
+
541
+ /* Find the number of bits needed for the magnitude of the coefficient */
542
+ nbits = JPEG_NBITS(temp);
543
+
544
+ /* Emit the Huffman-coded symbol for the number of bits */
545
+ code = dctbl->ehufco[nbits];
546
+ size = dctbl->ehufsi[nbits];
547
+ EMIT_BITS(code, size)
548
+
549
+ /* Mask off any extra bits in code */
550
+ temp2 &= (((JLONG)1) << nbits) - 1;
551
+
552
+ /* Emit that number of bits of the value, if positive, */
553
+ /* or the complement of its magnitude, if negative. */
554
+ EMIT_BITS(temp2, nbits)
555
+
556
+ /* Encode the AC coefficients per section F.1.2.2 */
557
+
558
+ r = 0; /* r = run length of zeros */
559
+
560
+ /* Manually unroll the k loop to eliminate the counter variable. This
561
+ * improves performance greatly on systems with a limited number of
562
+ * registers (such as x86.)
563
+ */
564
+ #define kloop(jpeg_natural_order_of_k) { \
565
+ if ((temp = block[jpeg_natural_order_of_k]) == 0) { \
566
+ r++; \
567
+ } else { \
568
+ temp2 = temp; \
569
+ /* Branch-less absolute value, bitwise complement, etc., same as above */ \
570
+ temp3 = temp >> (CHAR_BIT * sizeof(int) - 1); \
571
+ temp ^= temp3; \
572
+ temp -= temp3; \
573
+ temp2 += temp3; \
574
+ nbits = JPEG_NBITS_NONZERO(temp); \
575
+ /* if run length > 15, must emit special run-length-16 codes (0xF0) */ \
576
+ while (r > 15) { \
577
+ EMIT_BITS(code_0xf0, size_0xf0) \
578
+ r -= 16; \
579
+ } \
580
+ /* Emit Huffman symbol for run length / number of bits */ \
581
+ temp3 = (r << 4) + nbits; \
582
+ code = actbl->ehufco[temp3]; \
583
+ size = actbl->ehufsi[temp3]; \
584
+ EMIT_CODE(code, size) \
585
+ r = 0; \
586
+ } \
587
+ }
588
+
589
+ /* One iteration for each value in jpeg_natural_order[] */
590
+ kloop(1); kloop(8); kloop(16); kloop(9); kloop(2); kloop(3);
591
+ kloop(10); kloop(17); kloop(24); kloop(32); kloop(25); kloop(18);
592
+ kloop(11); kloop(4); kloop(5); kloop(12); kloop(19); kloop(26);
593
+ kloop(33); kloop(40); kloop(48); kloop(41); kloop(34); kloop(27);
594
+ kloop(20); kloop(13); kloop(6); kloop(7); kloop(14); kloop(21);
595
+ kloop(28); kloop(35); kloop(42); kloop(49); kloop(56); kloop(57);
596
+ kloop(50); kloop(43); kloop(36); kloop(29); kloop(22); kloop(15);
597
+ kloop(23); kloop(30); kloop(37); kloop(44); kloop(51); kloop(58);
598
+ kloop(59); kloop(52); kloop(45); kloop(38); kloop(31); kloop(39);
599
+ kloop(46); kloop(53); kloop(60); kloop(61); kloop(54); kloop(47);
600
+ kloop(55); kloop(62); kloop(63);
601
+
602
+ /* If the last coef(s) were zero, emit an end-of-block code */
603
+ if (r > 0) {
604
+ code = actbl->ehufco[0];
605
+ size = actbl->ehufsi[0];
606
+ EMIT_BITS(code, size)
607
+ }
608
+
609
+ state->cur.put_buffer = put_buffer;
610
+ state->cur.put_bits = put_bits;
611
+ STORE_BUFFER()
612
+
613
+ return TRUE;
614
+ }
615
+
616
+
617
+ /*
618
+ * Emit a restart marker & resynchronize predictions.
619
+ */
620
+
621
+ LOCAL(boolean)
622
+ emit_restart(working_state *state, int restart_num)
623
+ {
624
+ int ci;
625
+
626
+ if (!flush_bits(state))
627
+ return FALSE;
628
+
629
+ emit_byte(state, 0xFF, return FALSE);
630
+ emit_byte(state, JPEG_RST0 + restart_num, return FALSE);
631
+
632
+ /* Re-initialize DC predictions to 0 */
633
+ for (ci = 0; ci < state->cinfo->comps_in_scan; ci++)
634
+ state->cur.last_dc_val[ci] = 0;
635
+
636
+ /* The restart counter is not updated until we successfully write the MCU. */
637
+
638
+ return TRUE;
639
+ }
640
+
641
+
642
+ /*
643
+ * Encode and output one MCU's worth of Huffman-compressed coefficients.
644
+ */
645
+
646
+ METHODDEF(boolean)
647
+ encode_mcu_huff(j_compress_ptr cinfo, JBLOCKROW *MCU_data)
648
+ {
649
+ huff_entropy_ptr entropy = (huff_entropy_ptr)cinfo->entropy;
650
+ working_state state;
651
+ int blkn, ci;
652
+ jpeg_component_info *compptr;
653
+
654
+ /* Load up working state */
655
+ state.next_output_byte = cinfo->dest->next_output_byte;
656
+ state.free_in_buffer = cinfo->dest->free_in_buffer;
657
+ ASSIGN_STATE(state.cur, entropy->saved);
658
+ state.cinfo = cinfo;
659
+
660
+ /* Emit restart marker if needed */
661
+ if (cinfo->restart_interval) {
662
+ if (entropy->restarts_to_go == 0)
663
+ if (!emit_restart(&state, entropy->next_restart_num))
664
+ return FALSE;
665
+ }
666
+
667
+ /* Encode the MCU data blocks */
668
+ if (entropy->simd) {
669
+ for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
670
+ ci = cinfo->MCU_membership[blkn];
671
+ compptr = cinfo->cur_comp_info[ci];
672
+ if (!encode_one_block_simd(&state,
673
+ MCU_data[blkn][0], state.cur.last_dc_val[ci],
674
+ entropy->dc_derived_tbls[compptr->dc_tbl_no],
675
+ entropy->ac_derived_tbls[compptr->ac_tbl_no]))
676
+ return FALSE;
677
+ /* Update last_dc_val */
678
+ state.cur.last_dc_val[ci] = MCU_data[blkn][0][0];
679
+ }
680
+ } else {
681
+ for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
682
+ ci = cinfo->MCU_membership[blkn];
683
+ compptr = cinfo->cur_comp_info[ci];
684
+ if (!encode_one_block(&state,
685
+ MCU_data[blkn][0], state.cur.last_dc_val[ci],
686
+ entropy->dc_derived_tbls[compptr->dc_tbl_no],
687
+ entropy->ac_derived_tbls[compptr->ac_tbl_no]))
688
+ return FALSE;
689
+ /* Update last_dc_val */
690
+ state.cur.last_dc_val[ci] = MCU_data[blkn][0][0];
691
+ }
692
+ }
693
+
694
+ /* Completed MCU, so update state */
695
+ cinfo->dest->next_output_byte = state.next_output_byte;
696
+ cinfo->dest->free_in_buffer = state.free_in_buffer;
697
+ ASSIGN_STATE(entropy->saved, state.cur);
698
+
699
+ /* Update restart-interval state too */
700
+ if (cinfo->restart_interval) {
701
+ if (entropy->restarts_to_go == 0) {
702
+ entropy->restarts_to_go = cinfo->restart_interval;
703
+ entropy->next_restart_num++;
704
+ entropy->next_restart_num &= 7;
705
+ }
706
+ entropy->restarts_to_go--;
707
+ }
708
+
709
+ return TRUE;
710
+ }
711
+
712
+
713
+ /*
714
+ * Finish up at the end of a Huffman-compressed scan.
715
+ */
716
+
717
+ METHODDEF(void)
718
+ finish_pass_huff(j_compress_ptr cinfo)
719
+ {
720
+ huff_entropy_ptr entropy = (huff_entropy_ptr)cinfo->entropy;
721
+ working_state state;
722
+
723
+ /* Load up working state ... flush_bits needs it */
724
+ state.next_output_byte = cinfo->dest->next_output_byte;
725
+ state.free_in_buffer = cinfo->dest->free_in_buffer;
726
+ ASSIGN_STATE(state.cur, entropy->saved);
727
+ state.cinfo = cinfo;
728
+
729
+ /* Flush out the last data */
730
+ if (!flush_bits(&state))
731
+ ERREXIT(cinfo, JERR_CANT_SUSPEND);
732
+
733
+ /* Update state */
734
+ cinfo->dest->next_output_byte = state.next_output_byte;
735
+ cinfo->dest->free_in_buffer = state.free_in_buffer;
736
+ ASSIGN_STATE(entropy->saved, state.cur);
737
+ }
738
+
739
+
740
+ /*
741
+ * Huffman coding optimization.
742
+ *
743
+ * We first scan the supplied data and count the number of uses of each symbol
744
+ * that is to be Huffman-coded. (This process MUST agree with the code above.)
745
+ * Then we build a Huffman coding tree for the observed counts.
746
+ * Symbols which are not needed at all for the particular image are not
747
+ * assigned any code, which saves space in the DHT marker as well as in
748
+ * the compressed data.
749
+ */
750
+
751
+ #ifdef ENTROPY_OPT_SUPPORTED
752
+
753
+
754
+ /* Process a single block's worth of coefficients */
755
+
756
+ LOCAL(void)
757
+ htest_one_block(j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,
758
+ long dc_counts[], long ac_counts[])
759
+ {
760
+ register int temp;
761
+ register int nbits;
762
+ register int k, r;
763
+
764
+ /* Encode the DC coefficient difference per section F.1.2.1 */
765
+
766
+ temp = block[0] - last_dc_val;
767
+ if (temp < 0)
768
+ temp = -temp;
769
+
770
+ /* Find the number of bits needed for the magnitude of the coefficient */
771
+ nbits = 0;
772
+ while (temp) {
773
+ nbits++;
774
+ temp >>= 1;
775
+ }
776
+ /* Check for out-of-range coefficient values.
777
+ * Since we're encoding a difference, the range limit is twice as much.
778
+ */
779
+ if (nbits > MAX_COEF_BITS + 1)
780
+ ERREXIT(cinfo, JERR_BAD_DCT_COEF);
781
+
782
+ /* Count the Huffman symbol for the number of bits */
783
+ dc_counts[nbits]++;
784
+
785
+ /* Encode the AC coefficients per section F.1.2.2 */
786
+
787
+ r = 0; /* r = run length of zeros */
788
+
789
+ for (k = 1; k < DCTSIZE2; k++) {
790
+ if ((temp = block[jpeg_natural_order[k]]) == 0) {
791
+ r++;
792
+ } else {
793
+ /* if run length > 15, must emit special run-length-16 codes (0xF0) */
794
+ while (r > 15) {
795
+ ac_counts[0xF0]++;
796
+ r -= 16;
797
+ }
798
+
799
+ /* Find the number of bits needed for the magnitude of the coefficient */
800
+ if (temp < 0)
801
+ temp = -temp;
802
+
803
+ /* Find the number of bits needed for the magnitude of the coefficient */
804
+ nbits = 1; /* there must be at least one 1 bit */
805
+ while ((temp >>= 1))
806
+ nbits++;
807
+ /* Check for out-of-range coefficient values */
808
+ if (nbits > MAX_COEF_BITS)
809
+ ERREXIT(cinfo, JERR_BAD_DCT_COEF);
810
+
811
+ /* Count Huffman symbol for run length / number of bits */
812
+ ac_counts[(r << 4) + nbits]++;
813
+
814
+ r = 0;
815
+ }
816
+ }
817
+
818
+ /* If the last coef(s) were zero, emit an end-of-block code */
819
+ if (r > 0)
820
+ ac_counts[0]++;
821
+ }
822
+
823
+
824
+ /*
825
+ * Trial-encode one MCU's worth of Huffman-compressed coefficients.
826
+ * No data is actually output, so no suspension return is possible.
827
+ */
828
+
829
+ METHODDEF(boolean)
830
+ encode_mcu_gather(j_compress_ptr cinfo, JBLOCKROW *MCU_data)
831
+ {
832
+ huff_entropy_ptr entropy = (huff_entropy_ptr)cinfo->entropy;
833
+ int blkn, ci;
834
+ jpeg_component_info *compptr;
835
+
836
+ /* Take care of restart intervals if needed */
837
+ if (cinfo->restart_interval) {
838
+ if (entropy->restarts_to_go == 0) {
839
+ /* Re-initialize DC predictions to 0 */
840
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++)
841
+ entropy->saved.last_dc_val[ci] = 0;
842
+ /* Update restart state */
843
+ entropy->restarts_to_go = cinfo->restart_interval;
844
+ }
845
+ entropy->restarts_to_go--;
846
+ }
847
+
848
+ for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
849
+ ci = cinfo->MCU_membership[blkn];
850
+ compptr = cinfo->cur_comp_info[ci];
851
+ htest_one_block(cinfo, MCU_data[blkn][0], entropy->saved.last_dc_val[ci],
852
+ entropy->dc_count_ptrs[compptr->dc_tbl_no],
853
+ entropy->ac_count_ptrs[compptr->ac_tbl_no]);
854
+ entropy->saved.last_dc_val[ci] = MCU_data[blkn][0][0];
855
+ }
856
+
857
+ return TRUE;
858
+ }
859
+
860
+
861
+ /*
862
+ * Generate the best Huffman code table for the given counts, fill htbl.
863
+ * Note this is also used by jcphuff.c.
864
+ *
865
+ * The JPEG standard requires that no symbol be assigned a codeword of all
866
+ * one bits (so that padding bits added at the end of a compressed segment
867
+ * can't look like a valid code). Because of the canonical ordering of
868
+ * codewords, this just means that there must be an unused slot in the
869
+ * longest codeword length category. Annex K (Clause K.2) of
870
+ * Rec. ITU-T T.81 (1992) | ISO/IEC 10918-1:1994 suggests reserving such a slot
871
+ * by pretending that symbol 256 is a valid symbol with count 1. In theory
872
+ * that's not optimal; giving it count zero but including it in the symbol set
873
+ * anyway should give a better Huffman code. But the theoretically better code
874
+ * actually seems to come out worse in practice, because it produces more
875
+ * all-ones bytes (which incur stuffed zero bytes in the final file). In any
876
+ * case the difference is tiny.
877
+ *
878
+ * The JPEG standard requires Huffman codes to be no more than 16 bits long.
879
+ * If some symbols have a very small but nonzero probability, the Huffman tree
880
+ * must be adjusted to meet the code length restriction. We currently use
881
+ * the adjustment method suggested in JPEG section K.2. This method is *not*
882
+ * optimal; it may not choose the best possible limited-length code. But
883
+ * typically only very-low-frequency symbols will be given less-than-optimal
884
+ * lengths, so the code is almost optimal. Experimental comparisons against
885
+ * an optimal limited-length-code algorithm indicate that the difference is
886
+ * microscopic --- usually less than a hundredth of a percent of total size.
887
+ * So the extra complexity of an optimal algorithm doesn't seem worthwhile.
888
+ */
889
+
890
+ GLOBAL(void)
891
+ jpeg_gen_optimal_table(j_compress_ptr cinfo, JHUFF_TBL *htbl, long freq[])
892
+ {
893
+ #define MAX_CLEN 32 /* assumed maximum initial code length */
894
+ UINT8 bits[MAX_CLEN + 1]; /* bits[k] = # of symbols with code length k */
895
+ int codesize[257]; /* codesize[k] = code length of symbol k */
896
+ int others[257]; /* next symbol in current branch of tree */
897
+ int c1, c2;
898
+ int p, i, j;
899
+ long v;
900
+
901
+ /* This algorithm is explained in section K.2 of the JPEG standard */
902
+
903
+ MEMZERO(bits, sizeof(bits));
904
+ MEMZERO(codesize, sizeof(codesize));
905
+ for (i = 0; i < 257; i++)
906
+ others[i] = -1; /* init links to empty */
907
+
908
+ freq[256] = 1; /* make sure 256 has a nonzero count */
909
+ /* Including the pseudo-symbol 256 in the Huffman procedure guarantees
910
+ * that no real symbol is given code-value of all ones, because 256
911
+ * will be placed last in the largest codeword category.
912
+ */
913
+
914
+ /* Huffman's basic algorithm to assign optimal code lengths to symbols */
915
+
916
+ for (;;) {
917
+ /* Find the smallest nonzero frequency, set c1 = its symbol */
918
+ /* In case of ties, take the larger symbol number */
919
+ c1 = -1;
920
+ v = 1000000000L;
921
+ for (i = 0; i <= 256; i++) {
922
+ if (freq[i] && freq[i] <= v) {
923
+ v = freq[i];
924
+ c1 = i;
925
+ }
926
+ }
927
+
928
+ /* Find the next smallest nonzero frequency, set c2 = its symbol */
929
+ /* In case of ties, take the larger symbol number */
930
+ c2 = -1;
931
+ v = 1000000000L;
932
+ for (i = 0; i <= 256; i++) {
933
+ if (freq[i] && freq[i] <= v && i != c1) {
934
+ v = freq[i];
935
+ c2 = i;
936
+ }
937
+ }
938
+
939
+ /* Done if we've merged everything into one frequency */
940
+ if (c2 < 0)
941
+ break;
942
+
943
+ /* Else merge the two counts/trees */
944
+ freq[c1] += freq[c2];
945
+ freq[c2] = 0;
946
+
947
+ /* Increment the codesize of everything in c1's tree branch */
948
+ codesize[c1]++;
949
+ while (others[c1] >= 0) {
950
+ c1 = others[c1];
951
+ codesize[c1]++;
952
+ }
953
+
954
+ others[c1] = c2; /* chain c2 onto c1's tree branch */
955
+
956
+ /* Increment the codesize of everything in c2's tree branch */
957
+ codesize[c2]++;
958
+ while (others[c2] >= 0) {
959
+ c2 = others[c2];
960
+ codesize[c2]++;
961
+ }
962
+ }
963
+
964
+ /* Now count the number of symbols of each code length */
965
+ for (i = 0; i <= 256; i++) {
966
+ if (codesize[i]) {
967
+ /* The JPEG standard seems to think that this can't happen, */
968
+ /* but I'm paranoid... */
969
+ if (codesize[i] > MAX_CLEN)
970
+ ERREXIT(cinfo, JERR_HUFF_CLEN_OVERFLOW);
971
+
972
+ bits[codesize[i]]++;
973
+ }
974
+ }
975
+
976
+ /* JPEG doesn't allow symbols with code lengths over 16 bits, so if the pure
977
+ * Huffman procedure assigned any such lengths, we must adjust the coding.
978
+ * Here is what Rec. ITU-T T.81 | ISO/IEC 10918-1 says about how this next
979
+ * bit works: Since symbols are paired for the longest Huffman code, the
980
+ * symbols are removed from this length category two at a time. The prefix
981
+ * for the pair (which is one bit shorter) is allocated to one of the pair;
982
+ * then, skipping the BITS entry for that prefix length, a code word from the
983
+ * next shortest nonzero BITS entry is converted into a prefix for two code
984
+ * words one bit longer.
985
+ */
986
+
987
+ for (i = MAX_CLEN; i > 16; i--) {
988
+ while (bits[i] > 0) {
989
+ j = i - 2; /* find length of new prefix to be used */
990
+ while (bits[j] == 0)
991
+ j--;
992
+
993
+ bits[i] -= 2; /* remove two symbols */
994
+ bits[i - 1]++; /* one goes in this length */
995
+ bits[j + 1] += 2; /* two new symbols in this length */
996
+ bits[j]--; /* symbol of this length is now a prefix */
997
+ }
998
+ }
999
+
1000
+ /* Remove the count for the pseudo-symbol 256 from the largest codelength */
1001
+ while (bits[i] == 0) /* find largest codelength still in use */
1002
+ i--;
1003
+ bits[i]--;
1004
+
1005
+ /* Return final symbol counts (only for lengths 0..16) */
1006
+ MEMCOPY(htbl->bits, bits, sizeof(htbl->bits));
1007
+
1008
+ /* Return a list of the symbols sorted by code length */
1009
+ /* It's not real clear to me why we don't need to consider the codelength
1010
+ * changes made above, but Rec. ITU-T T.81 | ISO/IEC 10918-1 seems to think
1011
+ * this works.
1012
+ */
1013
+ p = 0;
1014
+ for (i = 1; i <= MAX_CLEN; i++) {
1015
+ for (j = 0; j <= 255; j++) {
1016
+ if (codesize[j] == i) {
1017
+ htbl->huffval[p] = (UINT8)j;
1018
+ p++;
1019
+ }
1020
+ }
1021
+ }
1022
+
1023
+ /* Set sent_table FALSE so updated table will be written to JPEG file. */
1024
+ htbl->sent_table = FALSE;
1025
+ }
1026
+
1027
+
1028
+ /*
1029
+ * Finish up a statistics-gathering pass and create the new Huffman tables.
1030
+ */
1031
+
1032
+ METHODDEF(void)
1033
+ finish_pass_gather(j_compress_ptr cinfo)
1034
+ {
1035
+ huff_entropy_ptr entropy = (huff_entropy_ptr)cinfo->entropy;
1036
+ int ci, dctbl, actbl;
1037
+ jpeg_component_info *compptr;
1038
+ JHUFF_TBL **htblptr;
1039
+ boolean did_dc[NUM_HUFF_TBLS];
1040
+ boolean did_ac[NUM_HUFF_TBLS];
1041
+
1042
+ /* It's important not to apply jpeg_gen_optimal_table more than once
1043
+ * per table, because it clobbers the input frequency counts!
1044
+ */
1045
+ MEMZERO(did_dc, sizeof(did_dc));
1046
+ MEMZERO(did_ac, sizeof(did_ac));
1047
+
1048
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
1049
+ compptr = cinfo->cur_comp_info[ci];
1050
+ dctbl = compptr->dc_tbl_no;
1051
+ actbl = compptr->ac_tbl_no;
1052
+ if (!did_dc[dctbl]) {
1053
+ htblptr = &cinfo->dc_huff_tbl_ptrs[dctbl];
1054
+ if (*htblptr == NULL)
1055
+ *htblptr = jpeg_alloc_huff_table((j_common_ptr)cinfo);
1056
+ jpeg_gen_optimal_table(cinfo, *htblptr, entropy->dc_count_ptrs[dctbl]);
1057
+ did_dc[dctbl] = TRUE;
1058
+ }
1059
+ if (!did_ac[actbl]) {
1060
+ htblptr = &cinfo->ac_huff_tbl_ptrs[actbl];
1061
+ if (*htblptr == NULL)
1062
+ *htblptr = jpeg_alloc_huff_table((j_common_ptr)cinfo);
1063
+ jpeg_gen_optimal_table(cinfo, *htblptr, entropy->ac_count_ptrs[actbl]);
1064
+ did_ac[actbl] = TRUE;
1065
+ }
1066
+ }
1067
+ }
1068
+
1069
+
1070
+ #endif /* ENTROPY_OPT_SUPPORTED */
1071
+
1072
+
1073
+ /*
1074
+ * Module initialization routine for Huffman entropy encoding.
1075
+ */
1076
+
1077
+ GLOBAL(void)
1078
+ jinit_huff_encoder(j_compress_ptr cinfo)
1079
+ {
1080
+ huff_entropy_ptr entropy;
1081
+ int i;
1082
+
1083
+ entropy = (huff_entropy_ptr)
1084
+ (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
1085
+ sizeof(huff_entropy_encoder));
1086
+ cinfo->entropy = (struct jpeg_entropy_encoder *)entropy;
1087
+ entropy->pub.start_pass = start_pass_huff;
1088
+
1089
+ /* Mark tables unallocated */
1090
+ for (i = 0; i < NUM_HUFF_TBLS; i++) {
1091
+ entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;
1092
+ #ifdef ENTROPY_OPT_SUPPORTED
1093
+ entropy->dc_count_ptrs[i] = entropy->ac_count_ptrs[i] = NULL;
1094
+ #endif
1095
+ }
1096
+ }