4 * Copyright (C) 1991-1997, Thomas G. Lane.
5 * This file is part of the Independent JPEG Group's software.
6 * For conditions of distribution and use, see the accompanying README file.
8 * This file contains output colorspace conversion routines.
11 #define JPEG_INTERNALS
17 /* Private subobject */
20 struct jpeg_color_deconverter pub
; /* public fields */
22 /* These fields are not needed anymore as these are now static tables */
25 /* Private state for YCC->RGB conversion */
26 int * Cr_r_tab
; /* => table for Cr to R conversion */
27 int * Cb_b_tab
; /* => table for Cb to B conversion */
28 INT32
* Cr_g_tab
; /* => table for Cr to G conversion */
29 INT32
* Cb_g_tab
; /* => table for Cb to G conversion */
31 } my_color_deconverter
;
33 typedef my_color_deconverter
* my_cconvert_ptr
;
36 /**************** YCbCr -> RGB conversion: most common case **************/
39 * YCbCr is defined per CCIR 601-1, except that Cb and Cr are
40 * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
41 * The conversion equations to be implemented are therefore
42 * R = Y + 1.40200 * Cr
43 * G = Y - 0.34414 * Cb - 0.71414 * Cr
44 * B = Y + 1.77200 * Cb
45 * where Cb and Cr represent the incoming values less CENTERJSAMPLE.
46 * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)
48 * To avoid floating-point arithmetic, we represent the fractional constants
49 * as integers scaled up by 2^16 (about 4 digits precision); we have to divide
50 * the products by 2^16, with appropriate rounding, to get the correct answer.
51 * Notice that Y, being an integral input, does not contribute any fraction
52 * so it need not participate in the rounding.
54 * For even more speed, we avoid doing any multiplications in the inner loop
55 * by precalculating the constants times Cb and Cr for all possible values.
56 * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);
57 * for 12-bit samples it is still acceptable. It's not very reasonable for
58 * 16-bit samples, but if you want lossless storage you shouldn't be changing
60 * The Cr=>R and Cb=>B values can be rounded to integers in advance; the
61 * values for the G calculation are left scaled up, since we must add them
62 * together before rounding.
65 #define SCALEBITS 16 /* speediest right-shift on some machines */
66 #define ONE_HALF ((INT32) 1 << (SCALEBITS-1))
67 #define FIX(x) ((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
69 /* Use static tables for color processing. */
71 const int Cr_r_tab
[(MAXJSAMPLE
+1) * SIZEOF(int)] ={
72 0xffffff4dUL
, 0xffffff4eUL
, 0xffffff4fUL
, 0xffffff51UL
, 0xffffff52UL
, 0xffffff54UL
,
73 0xffffff55UL
, 0xffffff56UL
, 0xffffff58UL
, 0xffffff59UL
, 0xffffff5bUL
, 0xffffff5cUL
,
74 0xffffff5dUL
, 0xffffff5fUL
, 0xffffff60UL
, 0xffffff62UL
, 0xffffff63UL
, 0xffffff64UL
,
75 0xffffff66UL
, 0xffffff67UL
, 0xffffff69UL
, 0xffffff6aUL
, 0xffffff6bUL
, 0xffffff6dUL
,
76 0xffffff6eUL
, 0xffffff70UL
, 0xffffff71UL
, 0xffffff72UL
, 0xffffff74UL
, 0xffffff75UL
,
77 0xffffff77UL
, 0xffffff78UL
, 0xffffff79UL
, 0xffffff7bUL
, 0xffffff7cUL
, 0xffffff7eUL
,
78 0xffffff7fUL
, 0xffffff80UL
, 0xffffff82UL
, 0xffffff83UL
, 0xffffff85UL
, 0xffffff86UL
,
79 0xffffff87UL
, 0xffffff89UL
, 0xffffff8aUL
, 0xffffff8cUL
, 0xffffff8dUL
, 0xffffff8eUL
,
80 0xffffff90UL
, 0xffffff91UL
, 0xffffff93UL
, 0xffffff94UL
, 0xffffff95UL
, 0xffffff97UL
,
81 0xffffff98UL
, 0xffffff9aUL
, 0xffffff9bUL
, 0xffffff9cUL
, 0xffffff9eUL
, 0xffffff9fUL
,
82 0xffffffa1UL
, 0xffffffa2UL
, 0xffffffa3UL
, 0xffffffa5UL
, 0xffffffa6UL
, 0xffffffa8UL
,
83 0xffffffa9UL
, 0xffffffaaUL
, 0xffffffacUL
, 0xffffffadUL
, 0xffffffafUL
, 0xffffffb0UL
,
84 0xffffffb1UL
, 0xffffffb3UL
, 0xffffffb4UL
, 0xffffffb6UL
, 0xffffffb7UL
, 0xffffffb8UL
,
85 0xffffffbaUL
, 0xffffffbbUL
, 0xffffffbdUL
, 0xffffffbeUL
, 0xffffffc0UL
, 0xffffffc1UL
,
86 0xffffffc2UL
, 0xffffffc4UL
, 0xffffffc5UL
, 0xffffffc7UL
, 0xffffffc8UL
, 0xffffffc9UL
,
87 0xffffffcbUL
, 0xffffffccUL
, 0xffffffceUL
, 0xffffffcfUL
, 0xffffffd0UL
, 0xffffffd2UL
,
88 0xffffffd3UL
, 0xffffffd5UL
, 0xffffffd6UL
, 0xffffffd7UL
, 0xffffffd9UL
, 0xffffffdaUL
,
89 0xffffffdcUL
, 0xffffffddUL
, 0xffffffdeUL
, 0xffffffe0UL
, 0xffffffe1UL
, 0xffffffe3UL
,
90 0xffffffe4UL
, 0xffffffe5UL
, 0xffffffe7UL
, 0xffffffe8UL
, 0xffffffeaUL
, 0xffffffebUL
,
91 0xffffffecUL
, 0xffffffeeUL
, 0xffffffefUL
, 0xfffffff1UL
, 0xfffffff2UL
, 0xfffffff3UL
,
92 0xfffffff5UL
, 0xfffffff6UL
, 0xfffffff8UL
, 0xfffffff9UL
, 0xfffffffaUL
, 0xfffffffcUL
,
93 0xfffffffdUL
, 0xffffffffUL
, 0x00UL
, 0x01UL
, 0x03UL
, 0x04UL
,
94 0x06UL
, 0x07UL
, 0x08UL
, 0x0aUL
, 0x0bUL
, 0x0dUL
,
95 0x0eUL
, 0x0fUL
, 0x11UL
, 0x12UL
, 0x14UL
, 0x15UL
,
96 0x16UL
, 0x18UL
, 0x19UL
, 0x1bUL
, 0x1cUL
, 0x1dUL
,
97 0x1fUL
, 0x20UL
, 0x22UL
, 0x23UL
, 0x24UL
, 0x26UL
,
98 0x27UL
, 0x29UL
, 0x2aUL
, 0x2bUL
, 0x2dUL
, 0x2eUL
,
99 0x30UL
, 0x31UL
, 0x32UL
, 0x34UL
, 0x35UL
, 0x37UL
,
100 0x38UL
, 0x39UL
, 0x3bUL
, 0x3cUL
, 0x3eUL
, 0x3fUL
,
101 0x40UL
, 0x42UL
, 0x43UL
, 0x45UL
, 0x46UL
, 0x48UL
,
102 0x49UL
, 0x4aUL
, 0x4cUL
, 0x4dUL
, 0x4fUL
, 0x50UL
,
103 0x51UL
, 0x53UL
, 0x54UL
, 0x56UL
, 0x57UL
, 0x58UL
,
104 0x5aUL
, 0x5bUL
, 0x5dUL
, 0x5eUL
, 0x5fUL
, 0x61UL
,
105 0x62UL
, 0x64UL
, 0x65UL
, 0x66UL
, 0x68UL
, 0x69UL
,
106 0x6bUL
, 0x6cUL
, 0x6dUL
, 0x6fUL
, 0x70UL
, 0x72UL
,
107 0x73UL
, 0x74UL
, 0x76UL
, 0x77UL
, 0x79UL
, 0x7aUL
,
108 0x7bUL
, 0x7dUL
, 0x7eUL
, 0x80UL
, 0x81UL
, 0x82UL
,
109 0x84UL
, 0x85UL
, 0x87UL
, 0x88UL
, 0x89UL
, 0x8bUL
,
110 0x8cUL
, 0x8eUL
, 0x8fUL
, 0x90UL
, 0x92UL
, 0x93UL
,
111 0x95UL
, 0x96UL
, 0x97UL
, 0x99UL
, 0x9aUL
, 0x9cUL
,
112 0x9dUL
, 0x9eUL
, 0xa0UL
, 0xa1UL
, 0xa3UL
, 0xa4UL
,
113 0xa5UL
, 0xa7UL
, 0xa8UL
, 0xaaUL
, 0xabUL
, 0xacUL
,
114 0xaeUL
, 0xafUL
, 0xb1UL
, 0xb2UL
117 const int Cb_b_tab
[(MAXJSAMPLE
+1) * SIZEOF(int)] ={
118 0xffffff1dUL
, 0xffffff1fUL
, 0xffffff21UL
, 0xffffff22UL
, 0xffffff24UL
, 0xffffff26UL
,
119 0xffffff28UL
, 0xffffff2aUL
, 0xffffff2bUL
, 0xffffff2dUL
, 0xffffff2fUL
, 0xffffff31UL
,
120 0xffffff32UL
, 0xffffff34UL
, 0xffffff36UL
, 0xffffff38UL
, 0xffffff3aUL
, 0xffffff3bUL
,
121 0xffffff3dUL
, 0xffffff3fUL
, 0xffffff41UL
, 0xffffff42UL
, 0xffffff44UL
, 0xffffff46UL
,
122 0xffffff48UL
, 0xffffff49UL
, 0xffffff4bUL
, 0xffffff4dUL
, 0xffffff4fUL
, 0xffffff51UL
,
123 0xffffff52UL
, 0xffffff54UL
, 0xffffff56UL
, 0xffffff58UL
, 0xffffff59UL
, 0xffffff5bUL
,
124 0xffffff5dUL
, 0xffffff5fUL
, 0xffffff61UL
, 0xffffff62UL
, 0xffffff64UL
, 0xffffff66UL
,
125 0xffffff68UL
, 0xffffff69UL
, 0xffffff6bUL
, 0xffffff6dUL
, 0xffffff6fUL
, 0xffffff70UL
,
126 0xffffff72UL
, 0xffffff74UL
, 0xffffff76UL
, 0xffffff78UL
, 0xffffff79UL
, 0xffffff7bUL
,
127 0xffffff7dUL
, 0xffffff7fUL
, 0xffffff80UL
, 0xffffff82UL
, 0xffffff84UL
, 0xffffff86UL
,
128 0xffffff88UL
, 0xffffff89UL
, 0xffffff8bUL
, 0xffffff8dUL
, 0xffffff8fUL
, 0xffffff90UL
,
129 0xffffff92UL
, 0xffffff94UL
, 0xffffff96UL
, 0xffffff97UL
, 0xffffff99UL
, 0xffffff9bUL
,
130 0xffffff9dUL
, 0xffffff9fUL
, 0xffffffa0UL
, 0xffffffa2UL
, 0xffffffa4UL
, 0xffffffa6UL
,
131 0xffffffa7UL
, 0xffffffa9UL
, 0xffffffabUL
, 0xffffffadUL
, 0xffffffaeUL
, 0xffffffb0UL
,
132 0xffffffb2UL
, 0xffffffb4UL
, 0xffffffb6UL
, 0xffffffb7UL
, 0xffffffb9UL
, 0xffffffbbUL
,
133 0xffffffbdUL
, 0xffffffbeUL
, 0xffffffc0UL
, 0xffffffc2UL
, 0xffffffc4UL
, 0xffffffc6UL
,
134 0xffffffc7UL
, 0xffffffc9UL
, 0xffffffcbUL
, 0xffffffcdUL
, 0xffffffceUL
, 0xffffffd0UL
,
135 0xffffffd2UL
, 0xffffffd4UL
, 0xffffffd5UL
, 0xffffffd7UL
, 0xffffffd9UL
, 0xffffffdbUL
,
136 0xffffffddUL
, 0xffffffdeUL
, 0xffffffe0UL
, 0xffffffe2UL
, 0xffffffe4UL
, 0xffffffe5UL
,
137 0xffffffe7UL
, 0xffffffe9UL
, 0xffffffebUL
, 0xffffffedUL
, 0xffffffeeUL
, 0xfffffff0UL
,
138 0xfffffff2UL
, 0xfffffff4UL
, 0xfffffff5UL
, 0xfffffff7UL
, 0xfffffff9UL
, 0xfffffffbUL
,
139 0xfffffffcUL
, 0xfffffffeUL
, 0x00UL
, 0x02UL
, 0x04UL
, 0x05UL
,
140 0x07UL
, 0x09UL
, 0x0bUL
, 0x0cUL
, 0x0eUL
, 0x10UL
,
141 0x12UL
, 0x13UL
, 0x15UL
, 0x17UL
, 0x19UL
, 0x1bUL
,
142 0x1cUL
, 0x1eUL
, 0x20UL
, 0x22UL
, 0x23UL
, 0x25UL
,
143 0x27UL
, 0x29UL
, 0x2bUL
, 0x2cUL
, 0x2eUL
, 0x30UL
,
144 0x32UL
, 0x33UL
, 0x35UL
, 0x37UL
, 0x39UL
, 0x3aUL
,
145 0x3cUL
, 0x3eUL
, 0x40UL
, 0x42UL
, 0x43UL
, 0x45UL
,
146 0x47UL
, 0x49UL
, 0x4aUL
, 0x4cUL
, 0x4eUL
, 0x50UL
,
147 0x52UL
, 0x53UL
, 0x55UL
, 0x57UL
, 0x59UL
, 0x5aUL
,
148 0x5cUL
, 0x5eUL
, 0x60UL
, 0x61UL
, 0x63UL
, 0x65UL
,
149 0x67UL
, 0x69UL
, 0x6aUL
, 0x6cUL
, 0x6eUL
, 0x70UL
,
150 0x71UL
, 0x73UL
, 0x75UL
, 0x77UL
, 0x78UL
, 0x7aUL
,
151 0x7cUL
, 0x7eUL
, 0x80UL
, 0x81UL
, 0x83UL
, 0x85UL
,
152 0x87UL
, 0x88UL
, 0x8aUL
, 0x8cUL
, 0x8eUL
, 0x90UL
,
153 0x91UL
, 0x93UL
, 0x95UL
, 0x97UL
, 0x98UL
, 0x9aUL
,
154 0x9cUL
, 0x9eUL
, 0x9fUL
, 0xa1UL
, 0xa3UL
, 0xa5UL
,
155 0xa7UL
, 0xa8UL
, 0xaaUL
, 0xacUL
, 0xaeUL
, 0xafUL
,
156 0xb1UL
, 0xb3UL
, 0xb5UL
, 0xb7UL
, 0xb8UL
, 0xbaUL
,
157 0xbcUL
, 0xbeUL
, 0xbfUL
, 0xc1UL
, 0xc3UL
, 0xc5UL
,
158 0xc6UL
, 0xc8UL
, 0xcaUL
, 0xccUL
, 0xceUL
, 0xcfUL
,
159 0xd1UL
, 0xd3UL
, 0xd5UL
, 0xd6UL
, 0xd8UL
, 0xdaUL
,
160 0xdcUL
, 0xdeUL
, 0xdfUL
, 0xe1UL
163 const int Cr_g_tab
[(MAXJSAMPLE
+1) * SIZEOF(int)] ={
164 0x5b6900UL
, 0x5ab22eUL
, 0x59fb5cUL
, 0x59448aUL
, 0x588db8UL
, 0x57d6e6UL
,
165 0x572014UL
, 0x566942UL
, 0x55b270UL
, 0x54fb9eUL
, 0x5444ccUL
, 0x538dfaUL
,
166 0x52d728UL
, 0x522056UL
, 0x516984UL
, 0x50b2b2UL
, 0x4ffbe0UL
, 0x4f450eUL
,
167 0x4e8e3cUL
, 0x4dd76aUL
, 0x4d2098UL
, 0x4c69c6UL
, 0x4bb2f4UL
, 0x4afc22UL
,
168 0x4a4550UL
, 0x498e7eUL
, 0x48d7acUL
, 0x4820daUL
, 0x476a08UL
, 0x46b336UL
,
169 0x45fc64UL
, 0x454592UL
, 0x448ec0UL
, 0x43d7eeUL
, 0x43211cUL
, 0x426a4aUL
,
170 0x41b378UL
, 0x40fca6UL
, 0x4045d4UL
, 0x3f8f02UL
, 0x3ed830UL
, 0x3e215eUL
,
171 0x3d6a8cUL
, 0x3cb3baUL
, 0x3bfce8UL
, 0x3b4616UL
, 0x3a8f44UL
, 0x39d872UL
,
172 0x3921a0UL
, 0x386aceUL
, 0x37b3fcUL
, 0x36fd2aUL
, 0x364658UL
, 0x358f86UL
,
173 0x34d8b4UL
, 0x3421e2UL
, 0x336b10UL
, 0x32b43eUL
, 0x31fd6cUL
, 0x31469aUL
,
174 0x308fc8UL
, 0x2fd8f6UL
, 0x2f2224UL
, 0x2e6b52UL
, 0x2db480UL
, 0x2cfdaeUL
,
175 0x2c46dcUL
, 0x2b900aUL
, 0x2ad938UL
, 0x2a2266UL
, 0x296b94UL
, 0x28b4c2UL
,
176 0x27fdf0UL
, 0x27471eUL
, 0x26904cUL
, 0x25d97aUL
, 0x2522a8UL
, 0x246bd6UL
,
177 0x23b504UL
, 0x22fe32UL
, 0x224760UL
, 0x21908eUL
, 0x20d9bcUL
, 0x2022eaUL
,
178 0x1f6c18UL
, 0x1eb546UL
, 0x1dfe74UL
, 0x1d47a2UL
, 0x1c90d0UL
, 0x1bd9feUL
,
179 0x1b232cUL
, 0x1a6c5aUL
, 0x19b588UL
, 0x18feb6UL
, 0x1847e4UL
, 0x179112UL
,
180 0x16da40UL
, 0x16236eUL
, 0x156c9cUL
, 0x14b5caUL
, 0x13fef8UL
, 0x134826UL
,
181 0x129154UL
, 0x11da82UL
, 0x1123b0UL
, 0x106cdeUL
, 0xfb60cUL
, 0xeff3aUL
,
182 0xe4868UL
, 0xd9196UL
, 0xcdac4UL
, 0xc23f2UL
, 0xb6d20UL
, 0xab64eUL
,
183 0x9ff7cUL
, 0x948aaUL
, 0x891d8UL
, 0x7db06UL
, 0x72434UL
, 0x66d62UL
,
184 0x5b690UL
, 0x4ffbeUL
, 0x448ecUL
, 0x3921aUL
, 0x2db48UL
, 0x22476UL
,
185 0x16da4UL
, 0xb6d2UL
, 0x0UL
, 0xffff492eUL
, 0xfffe925cUL
, 0xfffddb8aUL
,
186 0xfffd24b8UL
, 0xfffc6de6UL
, 0xfffbb714UL
, 0xfffb0042UL
, 0xfffa4970UL
, 0xfff9929eUL
,
187 0xfff8dbccUL
, 0xfff824faUL
, 0xfff76e28UL
, 0xfff6b756UL
, 0xfff60084UL
, 0xfff549b2UL
,
188 0xfff492e0UL
, 0xfff3dc0eUL
, 0xfff3253cUL
, 0xfff26e6aUL
, 0xfff1b798UL
, 0xfff100c6UL
,
189 0xfff049f4UL
, 0xffef9322UL
, 0xffeedc50UL
, 0xffee257eUL
, 0xffed6eacUL
, 0xffecb7daUL
,
190 0xffec0108UL
, 0xffeb4a36UL
, 0xffea9364UL
, 0xffe9dc92UL
, 0xffe925c0UL
, 0xffe86eeeUL
,
191 0xffe7b81cUL
, 0xffe7014aUL
, 0xffe64a78UL
, 0xffe593a6UL
, 0xffe4dcd4UL
, 0xffe42602UL
,
192 0xffe36f30UL
, 0xffe2b85eUL
, 0xffe2018cUL
, 0xffe14abaUL
, 0xffe093e8UL
, 0xffdfdd16UL
,
193 0xffdf2644UL
, 0xffde6f72UL
, 0xffddb8a0UL
, 0xffdd01ceUL
, 0xffdc4afcUL
, 0xffdb942aUL
,
194 0xffdadd58UL
, 0xffda2686UL
, 0xffd96fb4UL
, 0xffd8b8e2UL
, 0xffd80210UL
, 0xffd74b3eUL
,
195 0xffd6946cUL
, 0xffd5dd9aUL
, 0xffd526c8UL
, 0xffd46ff6UL
, 0xffd3b924UL
, 0xffd30252UL
,
196 0xffd24b80UL
, 0xffd194aeUL
, 0xffd0dddcUL
, 0xffd0270aUL
, 0xffcf7038UL
, 0xffceb966UL
,
197 0xffce0294UL
, 0xffcd4bc2UL
, 0xffcc94f0UL
, 0xffcbde1eUL
, 0xffcb274cUL
, 0xffca707aUL
,
198 0xffc9b9a8UL
, 0xffc902d6UL
, 0xffc84c04UL
, 0xffc79532UL
, 0xffc6de60UL
, 0xffc6278eUL
,
199 0xffc570bcUL
, 0xffc4b9eaUL
, 0xffc40318UL
, 0xffc34c46UL
, 0xffc29574UL
, 0xffc1dea2UL
,
200 0xffc127d0UL
, 0xffc070feUL
, 0xffbfba2cUL
, 0xffbf035aUL
, 0xffbe4c88UL
, 0xffbd95b6UL
,
201 0xffbcdee4UL
, 0xffbc2812UL
, 0xffbb7140UL
, 0xffbaba6eUL
, 0xffba039cUL
, 0xffb94ccaUL
,
202 0xffb895f8UL
, 0xffb7df26UL
, 0xffb72854UL
, 0xffb67182UL
, 0xffb5bab0UL
, 0xffb503deUL
,
203 0xffb44d0cUL
, 0xffb3963aUL
, 0xffb2df68UL
, 0xffb22896UL
, 0xffb171c4UL
, 0xffb0baf2UL
,
204 0xffb00420UL
, 0xffaf4d4eUL
, 0xffae967cUL
, 0xffaddfaaUL
, 0xffad28d8UL
, 0xffac7206UL
,
205 0xffabbb34UL
, 0xffab0462UL
, 0xffaa4d90UL
, 0xffa996beUL
, 0xffa8dfecUL
, 0xffa8291aUL
,
206 0xffa77248UL
, 0xffa6bb76UL
, 0xffa604a4UL
, 0xffa54dd2UL
209 const int Cb_g_tab
[(MAXJSAMPLE
+1) * SIZEOF(int)] ={
210 0x2c8d00UL
, 0x2c34e6UL
, 0x2bdcccUL
, 0x2b84b2UL
, 0x2b2c98UL
, 0x2ad47eUL
,
211 0x2a7c64UL
, 0x2a244aUL
, 0x29cc30UL
, 0x297416UL
, 0x291bfcUL
, 0x28c3e2UL
,
212 0x286bc8UL
, 0x2813aeUL
, 0x27bb94UL
, 0x27637aUL
, 0x270b60UL
, 0x26b346UL
,
213 0x265b2cUL
, 0x260312UL
, 0x25aaf8UL
, 0x2552deUL
, 0x24fac4UL
, 0x24a2aaUL
,
214 0x244a90UL
, 0x23f276UL
, 0x239a5cUL
, 0x234242UL
, 0x22ea28UL
, 0x22920eUL
,
215 0x2239f4UL
, 0x21e1daUL
, 0x2189c0UL
, 0x2131a6UL
, 0x20d98cUL
, 0x208172UL
,
216 0x202958UL
, 0x1fd13eUL
, 0x1f7924UL
, 0x1f210aUL
, 0x1ec8f0UL
, 0x1e70d6UL
,
217 0x1e18bcUL
, 0x1dc0a2UL
, 0x1d6888UL
, 0x1d106eUL
, 0x1cb854UL
, 0x1c603aUL
,
218 0x1c0820UL
, 0x1bb006UL
, 0x1b57ecUL
, 0x1affd2UL
, 0x1aa7b8UL
, 0x1a4f9eUL
,
219 0x19f784UL
, 0x199f6aUL
, 0x194750UL
, 0x18ef36UL
, 0x18971cUL
, 0x183f02UL
,
220 0x17e6e8UL
, 0x178eceUL
, 0x1736b4UL
, 0x16de9aUL
, 0x168680UL
, 0x162e66UL
,
221 0x15d64cUL
, 0x157e32UL
, 0x152618UL
, 0x14cdfeUL
, 0x1475e4UL
, 0x141dcaUL
,
222 0x13c5b0UL
, 0x136d96UL
, 0x13157cUL
, 0x12bd62UL
, 0x126548UL
, 0x120d2eUL
,
223 0x11b514UL
, 0x115cfaUL
, 0x1104e0UL
, 0x10acc6UL
, 0x1054acUL
, 0xffc92UL
,
224 0xfa478UL
, 0xf4c5eUL
, 0xef444UL
, 0xe9c2aUL
, 0xe4410UL
, 0xdebf6UL
,
225 0xd93dcUL
, 0xd3bc2UL
, 0xce3a8UL
, 0xc8b8eUL
, 0xc3374UL
, 0xbdb5aUL
,
226 0xb8340UL
, 0xb2b26UL
, 0xad30cUL
, 0xa7af2UL
, 0xa22d8UL
, 0x9cabeUL
,
227 0x972a4UL
, 0x91a8aUL
, 0x8c270UL
, 0x86a56UL
, 0x8123cUL
, 0x7ba22UL
,
228 0x76208UL
, 0x709eeUL
, 0x6b1d4UL
, 0x659baUL
, 0x601a0UL
, 0x5a986UL
,
229 0x5516cUL
, 0x4f952UL
, 0x4a138UL
, 0x4491eUL
, 0x3f104UL
, 0x398eaUL
,
230 0x340d0UL
, 0x2e8b6UL
, 0x2909cUL
, 0x23882UL
, 0x1e068UL
, 0x1884eUL
,
231 0x13034UL
, 0xd81aUL
, 0x8000UL
, 0x27e6UL
, 0xffffcfccUL
, 0xffff77b2UL
,
232 0xffff1f98UL
, 0xfffec77eUL
, 0xfffe6f64UL
, 0xfffe174aUL
, 0xfffdbf30UL
, 0xfffd6716UL
,
233 0xfffd0efcUL
, 0xfffcb6e2UL
, 0xfffc5ec8UL
, 0xfffc06aeUL
, 0xfffbae94UL
, 0xfffb567aUL
,
234 0xfffafe60UL
, 0xfffaa646UL
, 0xfffa4e2cUL
, 0xfff9f612UL
, 0xfff99df8UL
, 0xfff945deUL
,
235 0xfff8edc4UL
, 0xfff895aaUL
, 0xfff83d90UL
, 0xfff7e576UL
, 0xfff78d5cUL
, 0xfff73542UL
,
236 0xfff6dd28UL
, 0xfff6850eUL
, 0xfff62cf4UL
, 0xfff5d4daUL
, 0xfff57cc0UL
, 0xfff524a6UL
,
237 0xfff4cc8cUL
, 0xfff47472UL
, 0xfff41c58UL
, 0xfff3c43eUL
, 0xfff36c24UL
, 0xfff3140aUL
,
238 0xfff2bbf0UL
, 0xfff263d6UL
, 0xfff20bbcUL
, 0xfff1b3a2UL
, 0xfff15b88UL
, 0xfff1036eUL
,
239 0xfff0ab54UL
, 0xfff0533aUL
, 0xffeffb20UL
, 0xffefa306UL
, 0xffef4aecUL
, 0xffeef2d2UL
,
240 0xffee9ab8UL
, 0xffee429eUL
, 0xffedea84UL
, 0xffed926aUL
, 0xffed3a50UL
, 0xffece236UL
,
241 0xffec8a1cUL
, 0xffec3202UL
, 0xffebd9e8UL
, 0xffeb81ceUL
, 0xffeb29b4UL
, 0xffead19aUL
,
242 0xffea7980UL
, 0xffea2166UL
, 0xffe9c94cUL
, 0xffe97132UL
, 0xffe91918UL
, 0xffe8c0feUL
,
243 0xffe868e4UL
, 0xffe810caUL
, 0xffe7b8b0UL
, 0xffe76096UL
, 0xffe7087cUL
, 0xffe6b062UL
,
244 0xffe65848UL
, 0xffe6002eUL
, 0xffe5a814UL
, 0xffe54ffaUL
, 0xffe4f7e0UL
, 0xffe49fc6UL
,
245 0xffe447acUL
, 0xffe3ef92UL
, 0xffe39778UL
, 0xffe33f5eUL
, 0xffe2e744UL
, 0xffe28f2aUL
,
246 0xffe23710UL
, 0xffe1def6UL
, 0xffe186dcUL
, 0xffe12ec2UL
, 0xffe0d6a8UL
, 0xffe07e8eUL
,
247 0xffe02674UL
, 0xffdfce5aUL
, 0xffdf7640UL
, 0xffdf1e26UL
, 0xffdec60cUL
, 0xffde6df2UL
,
248 0xffde15d8UL
, 0xffddbdbeUL
, 0xffdd65a4UL
, 0xffdd0d8aUL
, 0xffdcb570UL
, 0xffdc5d56UL
,
249 0xffdc053cUL
, 0xffdbad22UL
, 0xffdb5508UL
, 0xffdafceeUL
, 0xffdaa4d4UL
, 0xffda4cbaUL
,
250 0xffd9f4a0UL
, 0xffd99c86UL
, 0xffd9446cUL
, 0xffd8ec52UL
, 0xffd89438UL
, 0xffd83c1eUL
,
251 0xffd7e404UL
, 0xffd78beaUL
, 0xffd733d0UL
, 0xffd6dbb6UL
, 0xffd6839cUL
, 0xffd62b82UL
,
252 0xffd5d368UL
, 0xffd57b4eUL
, 0xffd52334UL
, 0xffd4cb1aUL
256 * Initialize tables for YCC->RGB colorspace conversion.
260 build_ycc_rgb_table (j_decompress_ptr cinfo
)
263 /* The code below was used to generate the static tables above */
266 my_cconvert_ptr cconvert
= (my_cconvert_ptr
) cinfo
->cconvert
;
271 cconvert
->Cr_r_tab
= (int *)
272 (*cinfo
->mem
->alloc_small
) ((j_common_ptr
) cinfo
, JPOOL_IMAGE
,
273 (MAXJSAMPLE
+1) * SIZEOF(int));
274 cconvert
->Cb_b_tab
= (int *)
275 (*cinfo
->mem
->alloc_small
) ((j_common_ptr
) cinfo
, JPOOL_IMAGE
,
276 (MAXJSAMPLE
+1) * SIZEOF(int));
277 cconvert
->Cr_g_tab
= (INT32
*)
278 (*cinfo
->mem
->alloc_small
) ((j_common_ptr
) cinfo
, JPOOL_IMAGE
,
279 (MAXJSAMPLE
+1) * SIZEOF(INT32
));
280 cconvert
->Cb_g_tab
= (INT32
*)
281 (*cinfo
->mem
->alloc_small
) ((j_common_ptr
) cinfo
, JPOOL_IMAGE
,
282 (MAXJSAMPLE
+1) * SIZEOF(INT32
));
284 for (i
= 0, x
= -CENTERJSAMPLE
; i
<= MAXJSAMPLE
; i
++, x
++) {
285 /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
286 /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
287 /* Cr=>R value is nearest int to 1.40200 * x */
288 cconvert
->Cr_r_tab
[i
] = (int)
289 RIGHT_SHIFT(FIX(1.40200) * x
+ ONE_HALF
, SCALEBITS
);
290 /* Cb=>B value is nearest int to 1.77200 * x */
291 cconvert
->Cb_b_tab
[i
] = (int)
292 RIGHT_SHIFT(FIX(1.77200) * x
+ ONE_HALF
, SCALEBITS
);
293 /* Cr=>G value is scaled-up -0.71414 * x */
294 cconvert
->Cr_g_tab
[i
] = (- FIX(0.71414)) * x
;
295 /* Cb=>G value is scaled-up -0.34414 * x */
296 /* We also add in ONE_HALF so that need not do it in inner loop */
297 cconvert
->Cb_g_tab
[i
] = (- FIX(0.34414)) * x
+ ONE_HALF
;
304 * Convert some rows of samples to the output colorspace.
306 * Note that we change from noninterleaved, one-plane-per-component format
307 * to interleaved-pixel format. The output buffer is therefore three times
308 * as wide as the input buffer.
309 * A starting row offset is provided only for the input buffer. The caller
310 * can easily adjust the passed output_buf value to accommodate any row
311 * offset required on that side.
315 ycc_rgb_convert (j_decompress_ptr cinfo
,
316 JSAMPIMAGE input_buf
, JDIMENSION input_row
,
317 JSAMPARRAY output_buf
, int num_rows
)
319 my_cconvert_ptr cconvert
= (my_cconvert_ptr
) cinfo
->cconvert
;
320 register int y
, cb
, cr
;
321 JSAMPLE
* range_limit_y
;
323 JSAMPROW inptr0
, inptr1
, inptr2
;
325 JDIMENSION num_cols
= cinfo
->output_width
;
326 JSAMPLE
* range_limit
= cinfo
->sample_range_limit
;
329 while (--num_rows
>= 0) {
330 inptr0
= input_buf
[0][input_row
];
331 inptr1
= input_buf
[1][input_row
];
332 inptr2
= input_buf
[2][input_row
];
334 outptr
= *output_buf
++;
335 for (col
= 0; col
< num_cols
; col
++) {
336 y
= GETJSAMPLE(inptr0
[col
]);
337 cb
= GETJSAMPLE(inptr1
[col
]);
338 cr
= GETJSAMPLE(inptr2
[col
]);
339 range_limit_y
= range_limit
+ y
;
340 /* Range-limiting is essential due to noise introduced by DCT losses. */
341 outptr
[RGB_RED
] = range_limit_y
[Cr_r_tab
[cr
]];
342 outptr
[RGB_GREEN
] = range_limit_y
[
343 ((int) RIGHT_SHIFT(Cb_g_tab
[cb
] + Cr_g_tab
[cr
],
345 outptr
[RGB_BLUE
] = range_limit_y
[Cb_b_tab
[cb
]];
346 outptr
+= RGB_PIXELSIZE
;
352 /**************** Cases other than YCbCr -> RGB **************/
356 * Color conversion for no colorspace change: just copy the data,
357 * converting from separate-planes to interleaved representation.
361 null_convert (j_decompress_ptr cinfo
,
362 JSAMPIMAGE input_buf
, JDIMENSION input_row
,
363 JSAMPARRAY output_buf
, int num_rows
)
365 register JSAMPROW inptr
, outptr
;
366 register JDIMENSION count
;
367 register int num_components
= cinfo
->num_components
;
368 JDIMENSION num_cols
= cinfo
->output_width
;
371 while (--num_rows
>= 0) {
372 for (ci
= 0; ci
< num_components
; ci
++) {
373 inptr
= input_buf
[ci
][input_row
];
374 outptr
= output_buf
[0] + ci
;
375 for (count
= num_cols
; count
> 0; count
--) {
376 *outptr
= *inptr
++; /* needn't bother with GETJSAMPLE() here */
377 outptr
+= num_components
;
387 * Color conversion for grayscale: just copy the data.
388 * This also works for YCbCr -> grayscale conversion, in which
389 * we just copy the Y (luminance) component and ignore chrominance.
393 grayscale_convert (j_decompress_ptr cinfo
,
394 JSAMPIMAGE input_buf
, JDIMENSION input_row
,
395 JSAMPARRAY output_buf
, int num_rows
)
397 jcopy_sample_rows(input_buf
[0], (int) input_row
, output_buf
, 0,
398 num_rows
, cinfo
->output_width
);
403 * Convert grayscale to RGB: just duplicate the graylevel three times.
404 * This is provided to support applications that don't want to cope
405 * with grayscale as a separate case.
409 gray_rgb_convert (j_decompress_ptr cinfo
,
410 JSAMPIMAGE input_buf
, JDIMENSION input_row
,
411 JSAMPARRAY output_buf
, int num_rows
)
413 register JSAMPROW inptr
, outptr
;
414 register JDIMENSION col
;
415 JDIMENSION num_cols
= cinfo
->output_width
;
417 while (--num_rows
>= 0) {
418 inptr
= input_buf
[0][input_row
++];
419 outptr
= *output_buf
++;
420 for (col
= 0; col
< num_cols
; col
++) {
421 /* We can dispense with GETJSAMPLE() here */
422 outptr
[RGB_RED
] = outptr
[RGB_GREEN
] = outptr
[RGB_BLUE
] = inptr
[col
];
423 outptr
+= RGB_PIXELSIZE
;
430 * Adobe-style YCCK->CMYK conversion.
431 * We convert YCbCr to R=1-C, G=1-M, and B=1-Y using the same
432 * conversion as above, while passing K (black) unchanged.
436 ycck_cmyk_convert (j_decompress_ptr cinfo
,
437 JSAMPIMAGE input_buf
, JDIMENSION input_row
,
438 JSAMPARRAY output_buf
, int num_rows
)
440 my_cconvert_ptr cconvert
= (my_cconvert_ptr
) cinfo
->cconvert
;
441 register int y
, cb
, cr
;
442 register JSAMPROW outptr
;
443 register JSAMPROW inptr0
, inptr1
, inptr2
, inptr3
;
444 register JDIMENSION col
;
445 JDIMENSION num_cols
= cinfo
->output_width
;
446 /* copy these pointers into registers if possible */
447 register JSAMPLE
* range_limit
= cinfo
->sample_range_limit
;
450 while (--num_rows
>= 0) {
451 inptr0
= input_buf
[0][input_row
];
452 inptr1
= input_buf
[1][input_row
];
453 inptr2
= input_buf
[2][input_row
];
454 inptr3
= input_buf
[3][input_row
];
456 outptr
= *output_buf
++;
457 for (col
= 0; col
< num_cols
; col
++) {
458 y
= GETJSAMPLE(inptr0
[col
]);
459 cb
= GETJSAMPLE(inptr1
[col
]);
460 cr
= GETJSAMPLE(inptr2
[col
]);
461 /* Range-limiting is essential due to noise introduced by DCT losses. */
462 outptr
[0] = range_limit
[MAXJSAMPLE
- (y
+ Cr_r_tab
[cr
])]; /* red */
463 outptr
[1] = range_limit
[MAXJSAMPLE
- (y
+ /* green */
464 ((int) RIGHT_SHIFT(Cb_g_tab
[cb
] + Cr_g_tab
[cr
],
466 outptr
[2] = range_limit
[MAXJSAMPLE
- (y
+ Cb_b_tab
[cb
])]; /* blue */
467 /* K passes through unchanged */
468 outptr
[3] = inptr3
[col
]; /* don't need GETJSAMPLE here */
476 * Empty method for start_pass.
480 start_pass_dcolor (j_decompress_ptr cinfo
)
487 * Module initialization routine for output colorspace conversion.
491 jinit_color_deconverter (j_decompress_ptr cinfo
)
493 my_cconvert_ptr cconvert
;
496 cconvert
= (my_cconvert_ptr
)
497 (*cinfo
->mem
->alloc_small
) ((j_common_ptr
) cinfo
, JPOOL_IMAGE
,
498 SIZEOF(my_color_deconverter
));
499 cinfo
->cconvert
= (struct jpeg_color_deconverter
*) cconvert
;
500 cconvert
->pub
.start_pass
= start_pass_dcolor
;
502 /* Make sure num_components agrees with jpeg_color_space */
503 switch (cinfo
->jpeg_color_space
) {
505 if (cinfo
->num_components
!= 1)
506 ERREXIT(cinfo
, JERR_BAD_J_COLORSPACE
);
511 if (cinfo
->num_components
!= 3)
512 ERREXIT(cinfo
, JERR_BAD_J_COLORSPACE
);
517 if (cinfo
->num_components
!= 4)
518 ERREXIT(cinfo
, JERR_BAD_J_COLORSPACE
);
521 default: /* JCS_UNKNOWN can be anything */
522 if (cinfo
->num_components
< 1)
523 ERREXIT(cinfo
, JERR_BAD_J_COLORSPACE
);
527 /* Set out_color_components and conversion method based on requested space.
528 * Also clear the component_needed flags for any unused components,
529 * so that earlier pipeline stages can avoid useless computation.
532 switch (cinfo
->out_color_space
) {
534 cinfo
->out_color_components
= 1;
535 if (cinfo
->jpeg_color_space
== JCS_GRAYSCALE
||
536 cinfo
->jpeg_color_space
== JCS_YCbCr
) {
537 cconvert
->pub
.color_convert
= grayscale_convert
;
538 /* For color->grayscale conversion, only the Y (0) component is needed */
539 for (ci
= 1; ci
< cinfo
->num_components
; ci
++)
540 cinfo
->comp_info
[ci
].component_needed
= FALSE
;
542 ERREXIT(cinfo
, JERR_CONVERSION_NOTIMPL
);
546 cinfo
->out_color_components
= RGB_PIXELSIZE
;
547 if (cinfo
->jpeg_color_space
== JCS_YCbCr
) {
548 cconvert
->pub
.color_convert
= ycc_rgb_convert
;
549 build_ycc_rgb_table(cinfo
);
550 } else if (cinfo
->jpeg_color_space
== JCS_GRAYSCALE
) {
551 cconvert
->pub
.color_convert
= gray_rgb_convert
;
552 } else if (cinfo
->jpeg_color_space
== JCS_RGB
&& RGB_PIXELSIZE
== 3) {
553 cconvert
->pub
.color_convert
= null_convert
;
555 ERREXIT(cinfo
, JERR_CONVERSION_NOTIMPL
);
559 cinfo
->out_color_components
= 4;
560 if (cinfo
->jpeg_color_space
== JCS_YCCK
) {
561 cconvert
->pub
.color_convert
= ycck_cmyk_convert
;
562 build_ycc_rgb_table(cinfo
);
563 } else if (cinfo
->jpeg_color_space
== JCS_CMYK
) {
564 cconvert
->pub
.color_convert
= null_convert
;
566 ERREXIT(cinfo
, JERR_CONVERSION_NOTIMPL
);
570 /* Permit null conversion to same output space */
571 if (cinfo
->out_color_space
== cinfo
->jpeg_color_space
) {
572 cinfo
->out_color_components
= cinfo
->num_components
;
573 cconvert
->pub
.color_convert
= null_convert
;
574 } else /* unsupported non-null conversion */
575 ERREXIT(cinfo
, JERR_CONVERSION_NOTIMPL
);
579 if (cinfo
->quantize_colors
)
580 cinfo
->output_components
= 1; /* single colormapped output component */
582 cinfo
->output_components
= cinfo
->out_color_components
;