1*3ac0a46fSAndroid Build Coastguard Worker //---------------------------------------------------------------------------------
2*3ac0a46fSAndroid Build Coastguard Worker //
3*3ac0a46fSAndroid Build Coastguard Worker // Little Color Management System
4*3ac0a46fSAndroid Build Coastguard Worker // Copyright (c) 1998-2023 Marti Maria Saguer
5*3ac0a46fSAndroid Build Coastguard Worker //
6*3ac0a46fSAndroid Build Coastguard Worker // Permission is hereby granted, free of charge, to any person obtaining
7*3ac0a46fSAndroid Build Coastguard Worker // a copy of this software and associated documentation files (the "Software"),
8*3ac0a46fSAndroid Build Coastguard Worker // to deal in the Software without restriction, including without limitation
9*3ac0a46fSAndroid Build Coastguard Worker // the rights to use, copy, modify, merge, publish, distribute, sublicense,
10*3ac0a46fSAndroid Build Coastguard Worker // and/or sell copies of the Software, and to permit persons to whom the Software
11*3ac0a46fSAndroid Build Coastguard Worker // is furnished to do so, subject to the following conditions:
12*3ac0a46fSAndroid Build Coastguard Worker //
13*3ac0a46fSAndroid Build Coastguard Worker // The above copyright notice and this permission notice shall be included in
14*3ac0a46fSAndroid Build Coastguard Worker // all copies or substantial portions of the Software.
15*3ac0a46fSAndroid Build Coastguard Worker //
16*3ac0a46fSAndroid Build Coastguard Worker // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17*3ac0a46fSAndroid Build Coastguard Worker // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
18*3ac0a46fSAndroid Build Coastguard Worker // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19*3ac0a46fSAndroid Build Coastguard Worker // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20*3ac0a46fSAndroid Build Coastguard Worker // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21*3ac0a46fSAndroid Build Coastguard Worker // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22*3ac0a46fSAndroid Build Coastguard Worker // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23*3ac0a46fSAndroid Build Coastguard Worker //
24*3ac0a46fSAndroid Build Coastguard Worker //---------------------------------------------------------------------------------
25*3ac0a46fSAndroid Build Coastguard Worker //
26*3ac0a46fSAndroid Build Coastguard Worker
27*3ac0a46fSAndroid Build Coastguard Worker #include "lcms2_internal.h"
28*3ac0a46fSAndroid Build Coastguard Worker
29*3ac0a46fSAndroid Build Coastguard Worker // This module handles all formats supported by lcms. There are two flavors, 16 bits and
30*3ac0a46fSAndroid Build Coastguard Worker // floating point. Floating point is supported only in a subset, those formats holding
31*3ac0a46fSAndroid Build Coastguard Worker // cmsFloat32Number (4 bytes per component) and double (marked as 0 bytes per component
32*3ac0a46fSAndroid Build Coastguard Worker // as special case)
33*3ac0a46fSAndroid Build Coastguard Worker
34*3ac0a46fSAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
35*3ac0a46fSAndroid Build Coastguard Worker
36*3ac0a46fSAndroid Build Coastguard Worker
37*3ac0a46fSAndroid Build Coastguard Worker // This macro return words stored as big endian
38*3ac0a46fSAndroid Build Coastguard Worker #define CHANGE_ENDIAN(w) (cmsUInt16Number) ((cmsUInt16Number) ((w)<<8)|((w)>>8))
39*3ac0a46fSAndroid Build Coastguard Worker
40*3ac0a46fSAndroid Build Coastguard Worker // These macros handles reversing (negative)
41*3ac0a46fSAndroid Build Coastguard Worker #define REVERSE_FLAVOR_8(x) ((cmsUInt8Number) (0xff-(x)))
42*3ac0a46fSAndroid Build Coastguard Worker #define REVERSE_FLAVOR_16(x) ((cmsUInt16Number)(0xffff-(x)))
43*3ac0a46fSAndroid Build Coastguard Worker
44*3ac0a46fSAndroid Build Coastguard Worker // * 0xffff / 0xff00 = (255 * 257) / (255 * 256) = 257 / 256
FomLabV2ToLabV4(cmsUInt16Number x)45*3ac0a46fSAndroid Build Coastguard Worker cmsINLINE cmsUInt16Number FomLabV2ToLabV4(cmsUInt16Number x)
46*3ac0a46fSAndroid Build Coastguard Worker {
47*3ac0a46fSAndroid Build Coastguard Worker int a = (x << 8 | x) >> 8; // * 257 / 256
48*3ac0a46fSAndroid Build Coastguard Worker if ( a > 0xffff) return 0xffff;
49*3ac0a46fSAndroid Build Coastguard Worker return (cmsUInt16Number) a;
50*3ac0a46fSAndroid Build Coastguard Worker }
51*3ac0a46fSAndroid Build Coastguard Worker
52*3ac0a46fSAndroid Build Coastguard Worker // * 0xf00 / 0xffff = * 256 / 257
FomLabV4ToLabV2(cmsUInt16Number x)53*3ac0a46fSAndroid Build Coastguard Worker cmsINLINE cmsUInt16Number FomLabV4ToLabV2(cmsUInt16Number x)
54*3ac0a46fSAndroid Build Coastguard Worker {
55*3ac0a46fSAndroid Build Coastguard Worker return (cmsUInt16Number) (((x << 8) + 0x80) / 257);
56*3ac0a46fSAndroid Build Coastguard Worker }
57*3ac0a46fSAndroid Build Coastguard Worker
58*3ac0a46fSAndroid Build Coastguard Worker
59*3ac0a46fSAndroid Build Coastguard Worker typedef struct {
60*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Type;
61*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Mask;
62*3ac0a46fSAndroid Build Coastguard Worker cmsFormatter16 Frm;
63*3ac0a46fSAndroid Build Coastguard Worker
64*3ac0a46fSAndroid Build Coastguard Worker } cmsFormatters16;
65*3ac0a46fSAndroid Build Coastguard Worker
66*3ac0a46fSAndroid Build Coastguard Worker typedef struct {
67*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Type;
68*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Mask;
69*3ac0a46fSAndroid Build Coastguard Worker cmsFormatterFloat Frm;
70*3ac0a46fSAndroid Build Coastguard Worker
71*3ac0a46fSAndroid Build Coastguard Worker } cmsFormattersFloat;
72*3ac0a46fSAndroid Build Coastguard Worker
73*3ac0a46fSAndroid Build Coastguard Worker
74*3ac0a46fSAndroid Build Coastguard Worker #define ANYSPACE COLORSPACE_SH(31)
75*3ac0a46fSAndroid Build Coastguard Worker #define ANYCHANNELS CHANNELS_SH(15)
76*3ac0a46fSAndroid Build Coastguard Worker #define ANYEXTRA EXTRA_SH(7)
77*3ac0a46fSAndroid Build Coastguard Worker #define ANYPLANAR PLANAR_SH(1)
78*3ac0a46fSAndroid Build Coastguard Worker #define ANYENDIAN ENDIAN16_SH(1)
79*3ac0a46fSAndroid Build Coastguard Worker #define ANYSWAP DOSWAP_SH(1)
80*3ac0a46fSAndroid Build Coastguard Worker #define ANYSWAPFIRST SWAPFIRST_SH(1)
81*3ac0a46fSAndroid Build Coastguard Worker #define ANYFLAVOR FLAVOR_SH(1)
82*3ac0a46fSAndroid Build Coastguard Worker #define ANYPREMUL PREMUL_SH(1)
83*3ac0a46fSAndroid Build Coastguard Worker
84*3ac0a46fSAndroid Build Coastguard Worker
85*3ac0a46fSAndroid Build Coastguard Worker // Suppress waning about info never being used
86*3ac0a46fSAndroid Build Coastguard Worker
87*3ac0a46fSAndroid Build Coastguard Worker #ifdef _MSC_VER
88*3ac0a46fSAndroid Build Coastguard Worker #pragma warning(disable : 4100)
89*3ac0a46fSAndroid Build Coastguard Worker #endif
90*3ac0a46fSAndroid Build Coastguard Worker
91*3ac0a46fSAndroid Build Coastguard Worker // Unpacking routines (16 bits) ----------------------------------------------------------------------------------------
92*3ac0a46fSAndroid Build Coastguard Worker
93*3ac0a46fSAndroid Build Coastguard Worker
94*3ac0a46fSAndroid Build Coastguard Worker // Does almost everything but is slow
95*3ac0a46fSAndroid Build Coastguard Worker static
UnrollChunkyBytes(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)96*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollChunkyBytes(CMSREGISTER _cmsTRANSFORM* info,
97*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
98*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
99*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
100*3ac0a46fSAndroid Build Coastguard Worker {
101*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat);
102*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number DoSwap = T_DOSWAP(info ->InputFormat);
103*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Reverse = T_FLAVOR(info ->InputFormat);
104*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapFirst = T_SWAPFIRST(info -> InputFormat);
105*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Extra = T_EXTRA(info -> InputFormat);
106*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Premul = T_PREMUL(info->InputFormat);
107*3ac0a46fSAndroid Build Coastguard Worker
108*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst;
109*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number v;
110*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number i;
111*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number alpha_factor = 1;
112*3ac0a46fSAndroid Build Coastguard Worker
113*3ac0a46fSAndroid Build Coastguard Worker if (ExtraFirst) {
114*3ac0a46fSAndroid Build Coastguard Worker
115*3ac0a46fSAndroid Build Coastguard Worker if (Premul && Extra)
116*3ac0a46fSAndroid Build Coastguard Worker alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(accum[0]));
117*3ac0a46fSAndroid Build Coastguard Worker
118*3ac0a46fSAndroid Build Coastguard Worker accum += Extra;
119*3ac0a46fSAndroid Build Coastguard Worker }
120*3ac0a46fSAndroid Build Coastguard Worker else
121*3ac0a46fSAndroid Build Coastguard Worker {
122*3ac0a46fSAndroid Build Coastguard Worker if (Premul && Extra)
123*3ac0a46fSAndroid Build Coastguard Worker alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(accum[nChan]));
124*3ac0a46fSAndroid Build Coastguard Worker }
125*3ac0a46fSAndroid Build Coastguard Worker
126*3ac0a46fSAndroid Build Coastguard Worker for (i=0; i < nChan; i++) {
127*3ac0a46fSAndroid Build Coastguard Worker
128*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i;
129*3ac0a46fSAndroid Build Coastguard Worker
130*3ac0a46fSAndroid Build Coastguard Worker v = FROM_8_TO_16(*accum);
131*3ac0a46fSAndroid Build Coastguard Worker v = Reverse ? REVERSE_FLAVOR_16(v) : v;
132*3ac0a46fSAndroid Build Coastguard Worker
133*3ac0a46fSAndroid Build Coastguard Worker if (Premul && alpha_factor > 0)
134*3ac0a46fSAndroid Build Coastguard Worker {
135*3ac0a46fSAndroid Build Coastguard Worker v = ((cmsUInt32Number)((cmsUInt32Number)v << 16) / alpha_factor);
136*3ac0a46fSAndroid Build Coastguard Worker if (v > 0xffff) v = 0xffff;
137*3ac0a46fSAndroid Build Coastguard Worker }
138*3ac0a46fSAndroid Build Coastguard Worker
139*3ac0a46fSAndroid Build Coastguard Worker wIn[index] = (cmsUInt16Number) v;
140*3ac0a46fSAndroid Build Coastguard Worker accum++;
141*3ac0a46fSAndroid Build Coastguard Worker }
142*3ac0a46fSAndroid Build Coastguard Worker
143*3ac0a46fSAndroid Build Coastguard Worker if (!ExtraFirst) {
144*3ac0a46fSAndroid Build Coastguard Worker accum += Extra;
145*3ac0a46fSAndroid Build Coastguard Worker }
146*3ac0a46fSAndroid Build Coastguard Worker
147*3ac0a46fSAndroid Build Coastguard Worker if (Extra == 0 && SwapFirst) {
148*3ac0a46fSAndroid Build Coastguard Worker cmsUInt16Number tmp = wIn[0];
149*3ac0a46fSAndroid Build Coastguard Worker
150*3ac0a46fSAndroid Build Coastguard Worker memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number));
151*3ac0a46fSAndroid Build Coastguard Worker wIn[nChan-1] = tmp;
152*3ac0a46fSAndroid Build Coastguard Worker }
153*3ac0a46fSAndroid Build Coastguard Worker
154*3ac0a46fSAndroid Build Coastguard Worker return accum;
155*3ac0a46fSAndroid Build Coastguard Worker
156*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
157*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
158*3ac0a46fSAndroid Build Coastguard Worker
159*3ac0a46fSAndroid Build Coastguard Worker }
160*3ac0a46fSAndroid Build Coastguard Worker
161*3ac0a46fSAndroid Build Coastguard Worker
162*3ac0a46fSAndroid Build Coastguard Worker // Extra channels are just ignored because come in the next planes
163*3ac0a46fSAndroid Build Coastguard Worker static
UnrollPlanarBytes(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)164*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollPlanarBytes(CMSREGISTER _cmsTRANSFORM* info,
165*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
166*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
167*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
168*3ac0a46fSAndroid Build Coastguard Worker {
169*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat);
170*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number DoSwap = T_DOSWAP(info ->InputFormat);
171*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapFirst = T_SWAPFIRST(info ->InputFormat);
172*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Reverse = T_FLAVOR(info ->InputFormat);
173*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number i;
174*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst;
175*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Extra = T_EXTRA(info->InputFormat);
176*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Premul = T_PREMUL(info->InputFormat);
177*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Init = accum;
178*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number alpha_factor = 1;
179*3ac0a46fSAndroid Build Coastguard Worker
180*3ac0a46fSAndroid Build Coastguard Worker if (ExtraFirst) {
181*3ac0a46fSAndroid Build Coastguard Worker
182*3ac0a46fSAndroid Build Coastguard Worker if (Premul && Extra)
183*3ac0a46fSAndroid Build Coastguard Worker alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(accum[0]));
184*3ac0a46fSAndroid Build Coastguard Worker
185*3ac0a46fSAndroid Build Coastguard Worker
186*3ac0a46fSAndroid Build Coastguard Worker accum += Extra * Stride;
187*3ac0a46fSAndroid Build Coastguard Worker }
188*3ac0a46fSAndroid Build Coastguard Worker else
189*3ac0a46fSAndroid Build Coastguard Worker {
190*3ac0a46fSAndroid Build Coastguard Worker if (Premul && Extra)
191*3ac0a46fSAndroid Build Coastguard Worker alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(accum[(nChan) * Stride]));
192*3ac0a46fSAndroid Build Coastguard Worker }
193*3ac0a46fSAndroid Build Coastguard Worker
194*3ac0a46fSAndroid Build Coastguard Worker for (i=0; i < nChan; i++) {
195*3ac0a46fSAndroid Build Coastguard Worker
196*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i;
197*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number v = FROM_8_TO_16(*accum);
198*3ac0a46fSAndroid Build Coastguard Worker
199*3ac0a46fSAndroid Build Coastguard Worker v = Reverse ? REVERSE_FLAVOR_16(v) : v;
200*3ac0a46fSAndroid Build Coastguard Worker
201*3ac0a46fSAndroid Build Coastguard Worker if (Premul && alpha_factor > 0)
202*3ac0a46fSAndroid Build Coastguard Worker {
203*3ac0a46fSAndroid Build Coastguard Worker v = ((cmsUInt32Number)((cmsUInt32Number)v << 16) / alpha_factor);
204*3ac0a46fSAndroid Build Coastguard Worker if (v > 0xffff) v = 0xffff;
205*3ac0a46fSAndroid Build Coastguard Worker }
206*3ac0a46fSAndroid Build Coastguard Worker
207*3ac0a46fSAndroid Build Coastguard Worker wIn[index] = (cmsUInt16Number) v;
208*3ac0a46fSAndroid Build Coastguard Worker accum += Stride;
209*3ac0a46fSAndroid Build Coastguard Worker }
210*3ac0a46fSAndroid Build Coastguard Worker
211*3ac0a46fSAndroid Build Coastguard Worker return (Init + 1);
212*3ac0a46fSAndroid Build Coastguard Worker }
213*3ac0a46fSAndroid Build Coastguard Worker
214*3ac0a46fSAndroid Build Coastguard Worker
215*3ac0a46fSAndroid Build Coastguard Worker // Special cases, provided for performance
216*3ac0a46fSAndroid Build Coastguard Worker static
Unroll4Bytes(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)217*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll4Bytes(CMSREGISTER _cmsTRANSFORM* info,
218*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
219*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
220*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
221*3ac0a46fSAndroid Build Coastguard Worker {
222*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = FROM_8_TO_16(*accum); accum++; // C
223*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = FROM_8_TO_16(*accum); accum++; // M
224*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = FROM_8_TO_16(*accum); accum++; // Y
225*3ac0a46fSAndroid Build Coastguard Worker wIn[3] = FROM_8_TO_16(*accum); accum++; // K
226*3ac0a46fSAndroid Build Coastguard Worker
227*3ac0a46fSAndroid Build Coastguard Worker return accum;
228*3ac0a46fSAndroid Build Coastguard Worker
229*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
230*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
231*3ac0a46fSAndroid Build Coastguard Worker }
232*3ac0a46fSAndroid Build Coastguard Worker
233*3ac0a46fSAndroid Build Coastguard Worker static
Unroll4BytesReverse(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)234*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll4BytesReverse(CMSREGISTER _cmsTRANSFORM* info,
235*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
236*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
237*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
238*3ac0a46fSAndroid Build Coastguard Worker {
239*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // C
240*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // M
241*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // Y
242*3ac0a46fSAndroid Build Coastguard Worker wIn[3] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // K
243*3ac0a46fSAndroid Build Coastguard Worker
244*3ac0a46fSAndroid Build Coastguard Worker return accum;
245*3ac0a46fSAndroid Build Coastguard Worker
246*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
247*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
248*3ac0a46fSAndroid Build Coastguard Worker }
249*3ac0a46fSAndroid Build Coastguard Worker
250*3ac0a46fSAndroid Build Coastguard Worker static
Unroll4BytesSwapFirst(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)251*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll4BytesSwapFirst(CMSREGISTER _cmsTRANSFORM* info,
252*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
253*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
254*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
255*3ac0a46fSAndroid Build Coastguard Worker {
256*3ac0a46fSAndroid Build Coastguard Worker wIn[3] = FROM_8_TO_16(*accum); accum++; // K
257*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = FROM_8_TO_16(*accum); accum++; // C
258*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = FROM_8_TO_16(*accum); accum++; // M
259*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = FROM_8_TO_16(*accum); accum++; // Y
260*3ac0a46fSAndroid Build Coastguard Worker
261*3ac0a46fSAndroid Build Coastguard Worker return accum;
262*3ac0a46fSAndroid Build Coastguard Worker
263*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
264*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
265*3ac0a46fSAndroid Build Coastguard Worker }
266*3ac0a46fSAndroid Build Coastguard Worker
267*3ac0a46fSAndroid Build Coastguard Worker // KYMC
268*3ac0a46fSAndroid Build Coastguard Worker static
Unroll4BytesSwap(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)269*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll4BytesSwap(CMSREGISTER _cmsTRANSFORM* info,
270*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
271*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
272*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
273*3ac0a46fSAndroid Build Coastguard Worker {
274*3ac0a46fSAndroid Build Coastguard Worker wIn[3] = FROM_8_TO_16(*accum); accum++; // K
275*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = FROM_8_TO_16(*accum); accum++; // Y
276*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = FROM_8_TO_16(*accum); accum++; // M
277*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = FROM_8_TO_16(*accum); accum++; // C
278*3ac0a46fSAndroid Build Coastguard Worker
279*3ac0a46fSAndroid Build Coastguard Worker return accum;
280*3ac0a46fSAndroid Build Coastguard Worker
281*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
282*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
283*3ac0a46fSAndroid Build Coastguard Worker }
284*3ac0a46fSAndroid Build Coastguard Worker
285*3ac0a46fSAndroid Build Coastguard Worker static
Unroll4BytesSwapSwapFirst(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)286*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll4BytesSwapSwapFirst(CMSREGISTER _cmsTRANSFORM* info,
287*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
288*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
289*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
290*3ac0a46fSAndroid Build Coastguard Worker {
291*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = FROM_8_TO_16(*accum); accum++; // K
292*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = FROM_8_TO_16(*accum); accum++; // Y
293*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = FROM_8_TO_16(*accum); accum++; // M
294*3ac0a46fSAndroid Build Coastguard Worker wIn[3] = FROM_8_TO_16(*accum); accum++; // C
295*3ac0a46fSAndroid Build Coastguard Worker
296*3ac0a46fSAndroid Build Coastguard Worker return accum;
297*3ac0a46fSAndroid Build Coastguard Worker
298*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
299*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
300*3ac0a46fSAndroid Build Coastguard Worker }
301*3ac0a46fSAndroid Build Coastguard Worker
302*3ac0a46fSAndroid Build Coastguard Worker static
Unroll3Bytes(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)303*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll3Bytes(CMSREGISTER _cmsTRANSFORM* info,
304*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
305*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
306*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
307*3ac0a46fSAndroid Build Coastguard Worker {
308*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = FROM_8_TO_16(*accum); accum++; // R
309*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = FROM_8_TO_16(*accum); accum++; // G
310*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = FROM_8_TO_16(*accum); accum++; // B
311*3ac0a46fSAndroid Build Coastguard Worker
312*3ac0a46fSAndroid Build Coastguard Worker return accum;
313*3ac0a46fSAndroid Build Coastguard Worker
314*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
315*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
316*3ac0a46fSAndroid Build Coastguard Worker }
317*3ac0a46fSAndroid Build Coastguard Worker
318*3ac0a46fSAndroid Build Coastguard Worker static
Unroll3BytesSkip1Swap(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)319*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll3BytesSkip1Swap(CMSREGISTER _cmsTRANSFORM* info,
320*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
321*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
322*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
323*3ac0a46fSAndroid Build Coastguard Worker {
324*3ac0a46fSAndroid Build Coastguard Worker accum++; // A
325*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = FROM_8_TO_16(*accum); accum++; // B
326*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = FROM_8_TO_16(*accum); accum++; // G
327*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = FROM_8_TO_16(*accum); accum++; // R
328*3ac0a46fSAndroid Build Coastguard Worker
329*3ac0a46fSAndroid Build Coastguard Worker return accum;
330*3ac0a46fSAndroid Build Coastguard Worker
331*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
332*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
333*3ac0a46fSAndroid Build Coastguard Worker }
334*3ac0a46fSAndroid Build Coastguard Worker
335*3ac0a46fSAndroid Build Coastguard Worker static
Unroll3BytesSkip1SwapSwapFirst(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)336*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll3BytesSkip1SwapSwapFirst(CMSREGISTER _cmsTRANSFORM* info,
337*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
338*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
339*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
340*3ac0a46fSAndroid Build Coastguard Worker {
341*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = FROM_8_TO_16(*accum); accum++; // B
342*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = FROM_8_TO_16(*accum); accum++; // G
343*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = FROM_8_TO_16(*accum); accum++; // R
344*3ac0a46fSAndroid Build Coastguard Worker accum++; // A
345*3ac0a46fSAndroid Build Coastguard Worker
346*3ac0a46fSAndroid Build Coastguard Worker return accum;
347*3ac0a46fSAndroid Build Coastguard Worker
348*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
349*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
350*3ac0a46fSAndroid Build Coastguard Worker }
351*3ac0a46fSAndroid Build Coastguard Worker
352*3ac0a46fSAndroid Build Coastguard Worker static
Unroll3BytesSkip1SwapFirst(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)353*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll3BytesSkip1SwapFirst(CMSREGISTER _cmsTRANSFORM* info,
354*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
355*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
356*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
357*3ac0a46fSAndroid Build Coastguard Worker {
358*3ac0a46fSAndroid Build Coastguard Worker accum++; // A
359*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = FROM_8_TO_16(*accum); accum++; // R
360*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = FROM_8_TO_16(*accum); accum++; // G
361*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = FROM_8_TO_16(*accum); accum++; // B
362*3ac0a46fSAndroid Build Coastguard Worker
363*3ac0a46fSAndroid Build Coastguard Worker return accum;
364*3ac0a46fSAndroid Build Coastguard Worker
365*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
366*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
367*3ac0a46fSAndroid Build Coastguard Worker }
368*3ac0a46fSAndroid Build Coastguard Worker
369*3ac0a46fSAndroid Build Coastguard Worker
370*3ac0a46fSAndroid Build Coastguard Worker // BRG
371*3ac0a46fSAndroid Build Coastguard Worker static
Unroll3BytesSwap(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)372*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll3BytesSwap(CMSREGISTER _cmsTRANSFORM* info,
373*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
374*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
375*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
376*3ac0a46fSAndroid Build Coastguard Worker {
377*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = FROM_8_TO_16(*accum); accum++; // B
378*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = FROM_8_TO_16(*accum); accum++; // G
379*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = FROM_8_TO_16(*accum); accum++; // R
380*3ac0a46fSAndroid Build Coastguard Worker
381*3ac0a46fSAndroid Build Coastguard Worker return accum;
382*3ac0a46fSAndroid Build Coastguard Worker
383*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
384*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
385*3ac0a46fSAndroid Build Coastguard Worker }
386*3ac0a46fSAndroid Build Coastguard Worker
387*3ac0a46fSAndroid Build Coastguard Worker static
UnrollLabV2_8(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)388*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollLabV2_8(CMSREGISTER _cmsTRANSFORM* info,
389*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
390*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
391*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
392*3ac0a46fSAndroid Build Coastguard Worker {
393*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // L
394*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // a
395*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // b
396*3ac0a46fSAndroid Build Coastguard Worker
397*3ac0a46fSAndroid Build Coastguard Worker return accum;
398*3ac0a46fSAndroid Build Coastguard Worker
399*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
400*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
401*3ac0a46fSAndroid Build Coastguard Worker }
402*3ac0a46fSAndroid Build Coastguard Worker
403*3ac0a46fSAndroid Build Coastguard Worker static
UnrollALabV2_8(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)404*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollALabV2_8(CMSREGISTER _cmsTRANSFORM* info,
405*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
406*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
407*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
408*3ac0a46fSAndroid Build Coastguard Worker {
409*3ac0a46fSAndroid Build Coastguard Worker accum++; // A
410*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // L
411*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // a
412*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // b
413*3ac0a46fSAndroid Build Coastguard Worker
414*3ac0a46fSAndroid Build Coastguard Worker return accum;
415*3ac0a46fSAndroid Build Coastguard Worker
416*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
417*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
418*3ac0a46fSAndroid Build Coastguard Worker }
419*3ac0a46fSAndroid Build Coastguard Worker
420*3ac0a46fSAndroid Build Coastguard Worker static
UnrollLabV2_16(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)421*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollLabV2_16(CMSREGISTER _cmsTRANSFORM* info,
422*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
423*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
424*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
425*3ac0a46fSAndroid Build Coastguard Worker {
426*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // L
427*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // a
428*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // b
429*3ac0a46fSAndroid Build Coastguard Worker
430*3ac0a46fSAndroid Build Coastguard Worker return accum;
431*3ac0a46fSAndroid Build Coastguard Worker
432*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
433*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
434*3ac0a46fSAndroid Build Coastguard Worker }
435*3ac0a46fSAndroid Build Coastguard Worker
436*3ac0a46fSAndroid Build Coastguard Worker // for duplex
437*3ac0a46fSAndroid Build Coastguard Worker static
Unroll2Bytes(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)438*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll2Bytes(CMSREGISTER _cmsTRANSFORM* info,
439*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
440*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
441*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
442*3ac0a46fSAndroid Build Coastguard Worker {
443*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = FROM_8_TO_16(*accum); accum++; // ch1
444*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = FROM_8_TO_16(*accum); accum++; // ch2
445*3ac0a46fSAndroid Build Coastguard Worker
446*3ac0a46fSAndroid Build Coastguard Worker return accum;
447*3ac0a46fSAndroid Build Coastguard Worker
448*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
449*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
450*3ac0a46fSAndroid Build Coastguard Worker }
451*3ac0a46fSAndroid Build Coastguard Worker
452*3ac0a46fSAndroid Build Coastguard Worker
453*3ac0a46fSAndroid Build Coastguard Worker
454*3ac0a46fSAndroid Build Coastguard Worker
455*3ac0a46fSAndroid Build Coastguard Worker // Monochrome duplicates L into RGB for null-transforms
456*3ac0a46fSAndroid Build Coastguard Worker static
Unroll1Byte(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)457*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll1Byte(CMSREGISTER _cmsTRANSFORM* info,
458*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
459*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
460*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
461*3ac0a46fSAndroid Build Coastguard Worker {
462*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++; // L
463*3ac0a46fSAndroid Build Coastguard Worker
464*3ac0a46fSAndroid Build Coastguard Worker return accum;
465*3ac0a46fSAndroid Build Coastguard Worker
466*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
467*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
468*3ac0a46fSAndroid Build Coastguard Worker }
469*3ac0a46fSAndroid Build Coastguard Worker
470*3ac0a46fSAndroid Build Coastguard Worker
471*3ac0a46fSAndroid Build Coastguard Worker static
Unroll1ByteSkip1(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)472*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll1ByteSkip1(CMSREGISTER _cmsTRANSFORM* info,
473*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
474*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
475*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
476*3ac0a46fSAndroid Build Coastguard Worker {
477*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++; // L
478*3ac0a46fSAndroid Build Coastguard Worker accum += 1;
479*3ac0a46fSAndroid Build Coastguard Worker
480*3ac0a46fSAndroid Build Coastguard Worker return accum;
481*3ac0a46fSAndroid Build Coastguard Worker
482*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
483*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
484*3ac0a46fSAndroid Build Coastguard Worker }
485*3ac0a46fSAndroid Build Coastguard Worker
486*3ac0a46fSAndroid Build Coastguard Worker static
Unroll1ByteSkip2(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)487*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll1ByteSkip2(CMSREGISTER _cmsTRANSFORM* info,
488*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
489*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
490*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
491*3ac0a46fSAndroid Build Coastguard Worker {
492*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++; // L
493*3ac0a46fSAndroid Build Coastguard Worker accum += 2;
494*3ac0a46fSAndroid Build Coastguard Worker
495*3ac0a46fSAndroid Build Coastguard Worker return accum;
496*3ac0a46fSAndroid Build Coastguard Worker
497*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
498*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
499*3ac0a46fSAndroid Build Coastguard Worker }
500*3ac0a46fSAndroid Build Coastguard Worker
501*3ac0a46fSAndroid Build Coastguard Worker static
Unroll1ByteReversed(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)502*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll1ByteReversed(CMSREGISTER _cmsTRANSFORM* info,
503*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
504*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
505*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
506*3ac0a46fSAndroid Build Coastguard Worker {
507*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = wIn[1] = wIn[2] = REVERSE_FLAVOR_16(FROM_8_TO_16(*accum)); accum++; // L
508*3ac0a46fSAndroid Build Coastguard Worker
509*3ac0a46fSAndroid Build Coastguard Worker return accum;
510*3ac0a46fSAndroid Build Coastguard Worker
511*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
512*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
513*3ac0a46fSAndroid Build Coastguard Worker }
514*3ac0a46fSAndroid Build Coastguard Worker
515*3ac0a46fSAndroid Build Coastguard Worker
516*3ac0a46fSAndroid Build Coastguard Worker static
UnrollAnyWords(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)517*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollAnyWords(CMSREGISTER _cmsTRANSFORM* info,
518*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
519*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
520*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
521*3ac0a46fSAndroid Build Coastguard Worker {
522*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat);
523*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapEndian = T_ENDIAN16(info -> InputFormat);
524*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number DoSwap = T_DOSWAP(info ->InputFormat);
525*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Reverse = T_FLAVOR(info ->InputFormat);
526*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapFirst = T_SWAPFIRST(info -> InputFormat);
527*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Extra = T_EXTRA(info -> InputFormat);
528*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst;
529*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number i;
530*3ac0a46fSAndroid Build Coastguard Worker
531*3ac0a46fSAndroid Build Coastguard Worker if (ExtraFirst) {
532*3ac0a46fSAndroid Build Coastguard Worker accum += Extra * sizeof(cmsUInt16Number);
533*3ac0a46fSAndroid Build Coastguard Worker }
534*3ac0a46fSAndroid Build Coastguard Worker
535*3ac0a46fSAndroid Build Coastguard Worker for (i=0; i < nChan; i++) {
536*3ac0a46fSAndroid Build Coastguard Worker
537*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i;
538*3ac0a46fSAndroid Build Coastguard Worker cmsUInt16Number v = *(cmsUInt16Number*) accum;
539*3ac0a46fSAndroid Build Coastguard Worker
540*3ac0a46fSAndroid Build Coastguard Worker if (SwapEndian)
541*3ac0a46fSAndroid Build Coastguard Worker v = CHANGE_ENDIAN(v);
542*3ac0a46fSAndroid Build Coastguard Worker
543*3ac0a46fSAndroid Build Coastguard Worker wIn[index] = Reverse ? REVERSE_FLAVOR_16(v) : v;
544*3ac0a46fSAndroid Build Coastguard Worker
545*3ac0a46fSAndroid Build Coastguard Worker accum += sizeof(cmsUInt16Number);
546*3ac0a46fSAndroid Build Coastguard Worker }
547*3ac0a46fSAndroid Build Coastguard Worker
548*3ac0a46fSAndroid Build Coastguard Worker if (!ExtraFirst) {
549*3ac0a46fSAndroid Build Coastguard Worker accum += Extra * sizeof(cmsUInt16Number);
550*3ac0a46fSAndroid Build Coastguard Worker }
551*3ac0a46fSAndroid Build Coastguard Worker
552*3ac0a46fSAndroid Build Coastguard Worker if (Extra == 0 && SwapFirst) {
553*3ac0a46fSAndroid Build Coastguard Worker
554*3ac0a46fSAndroid Build Coastguard Worker cmsUInt16Number tmp = wIn[0];
555*3ac0a46fSAndroid Build Coastguard Worker
556*3ac0a46fSAndroid Build Coastguard Worker memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number));
557*3ac0a46fSAndroid Build Coastguard Worker wIn[nChan-1] = tmp;
558*3ac0a46fSAndroid Build Coastguard Worker }
559*3ac0a46fSAndroid Build Coastguard Worker
560*3ac0a46fSAndroid Build Coastguard Worker return accum;
561*3ac0a46fSAndroid Build Coastguard Worker
562*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
563*3ac0a46fSAndroid Build Coastguard Worker }
564*3ac0a46fSAndroid Build Coastguard Worker
565*3ac0a46fSAndroid Build Coastguard Worker
566*3ac0a46fSAndroid Build Coastguard Worker static
UnrollAnyWordsPremul(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)567*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollAnyWordsPremul(CMSREGISTER _cmsTRANSFORM* info,
568*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
569*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
570*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
571*3ac0a46fSAndroid Build Coastguard Worker {
572*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat);
573*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapEndian = T_ENDIAN16(info -> InputFormat);
574*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number DoSwap = T_DOSWAP(info ->InputFormat);
575*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Reverse = T_FLAVOR(info ->InputFormat);
576*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapFirst = T_SWAPFIRST(info -> InputFormat);
577*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst;
578*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number i;
579*3ac0a46fSAndroid Build Coastguard Worker
580*3ac0a46fSAndroid Build Coastguard Worker cmsUInt16Number alpha = (ExtraFirst ? accum[0] : accum[nChan - 1]);
581*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(alpha));
582*3ac0a46fSAndroid Build Coastguard Worker
583*3ac0a46fSAndroid Build Coastguard Worker if (ExtraFirst) {
584*3ac0a46fSAndroid Build Coastguard Worker accum += sizeof(cmsUInt16Number);
585*3ac0a46fSAndroid Build Coastguard Worker }
586*3ac0a46fSAndroid Build Coastguard Worker
587*3ac0a46fSAndroid Build Coastguard Worker for (i=0; i < nChan; i++) {
588*3ac0a46fSAndroid Build Coastguard Worker
589*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i;
590*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number v = *(cmsUInt16Number*) accum;
591*3ac0a46fSAndroid Build Coastguard Worker
592*3ac0a46fSAndroid Build Coastguard Worker if (SwapEndian)
593*3ac0a46fSAndroid Build Coastguard Worker v = CHANGE_ENDIAN(v);
594*3ac0a46fSAndroid Build Coastguard Worker
595*3ac0a46fSAndroid Build Coastguard Worker if (alpha_factor > 0) {
596*3ac0a46fSAndroid Build Coastguard Worker
597*3ac0a46fSAndroid Build Coastguard Worker v = (v << 16) / alpha_factor;
598*3ac0a46fSAndroid Build Coastguard Worker if (v > 0xffff) v = 0xffff;
599*3ac0a46fSAndroid Build Coastguard Worker }
600*3ac0a46fSAndroid Build Coastguard Worker
601*3ac0a46fSAndroid Build Coastguard Worker wIn[index] = (cmsUInt16Number) (Reverse ? REVERSE_FLAVOR_16(v) : v);
602*3ac0a46fSAndroid Build Coastguard Worker
603*3ac0a46fSAndroid Build Coastguard Worker accum += sizeof(cmsUInt16Number);
604*3ac0a46fSAndroid Build Coastguard Worker }
605*3ac0a46fSAndroid Build Coastguard Worker
606*3ac0a46fSAndroid Build Coastguard Worker if (!ExtraFirst) {
607*3ac0a46fSAndroid Build Coastguard Worker accum += sizeof(cmsUInt16Number);
608*3ac0a46fSAndroid Build Coastguard Worker }
609*3ac0a46fSAndroid Build Coastguard Worker
610*3ac0a46fSAndroid Build Coastguard Worker return accum;
611*3ac0a46fSAndroid Build Coastguard Worker
612*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
613*3ac0a46fSAndroid Build Coastguard Worker }
614*3ac0a46fSAndroid Build Coastguard Worker
615*3ac0a46fSAndroid Build Coastguard Worker
616*3ac0a46fSAndroid Build Coastguard Worker
617*3ac0a46fSAndroid Build Coastguard Worker static
UnrollPlanarWords(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)618*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollPlanarWords(CMSREGISTER _cmsTRANSFORM* info,
619*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
620*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
621*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
622*3ac0a46fSAndroid Build Coastguard Worker {
623*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat);
624*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number DoSwap= T_DOSWAP(info ->InputFormat);
625*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Reverse= T_FLAVOR(info ->InputFormat);
626*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapEndian = T_ENDIAN16(info -> InputFormat);
627*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number i;
628*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Init = accum;
629*3ac0a46fSAndroid Build Coastguard Worker
630*3ac0a46fSAndroid Build Coastguard Worker if (DoSwap) {
631*3ac0a46fSAndroid Build Coastguard Worker accum += T_EXTRA(info -> InputFormat) * Stride;
632*3ac0a46fSAndroid Build Coastguard Worker }
633*3ac0a46fSAndroid Build Coastguard Worker
634*3ac0a46fSAndroid Build Coastguard Worker for (i=0; i < nChan; i++) {
635*3ac0a46fSAndroid Build Coastguard Worker
636*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i;
637*3ac0a46fSAndroid Build Coastguard Worker cmsUInt16Number v = *(cmsUInt16Number*) accum;
638*3ac0a46fSAndroid Build Coastguard Worker
639*3ac0a46fSAndroid Build Coastguard Worker if (SwapEndian)
640*3ac0a46fSAndroid Build Coastguard Worker v = CHANGE_ENDIAN(v);
641*3ac0a46fSAndroid Build Coastguard Worker
642*3ac0a46fSAndroid Build Coastguard Worker wIn[index] = Reverse ? REVERSE_FLAVOR_16(v) : v;
643*3ac0a46fSAndroid Build Coastguard Worker
644*3ac0a46fSAndroid Build Coastguard Worker accum += Stride;
645*3ac0a46fSAndroid Build Coastguard Worker }
646*3ac0a46fSAndroid Build Coastguard Worker
647*3ac0a46fSAndroid Build Coastguard Worker return (Init + sizeof(cmsUInt16Number));
648*3ac0a46fSAndroid Build Coastguard Worker }
649*3ac0a46fSAndroid Build Coastguard Worker
650*3ac0a46fSAndroid Build Coastguard Worker static
UnrollPlanarWordsPremul(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)651*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollPlanarWordsPremul(CMSREGISTER _cmsTRANSFORM* info,
652*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
653*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
654*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
655*3ac0a46fSAndroid Build Coastguard Worker {
656*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat);
657*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number DoSwap= T_DOSWAP(info ->InputFormat);
658*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapFirst = T_SWAPFIRST(info->InputFormat);
659*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Reverse= T_FLAVOR(info ->InputFormat);
660*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapEndian = T_ENDIAN16(info -> InputFormat);
661*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number i;
662*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst;
663*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Init = accum;
664*3ac0a46fSAndroid Build Coastguard Worker
665*3ac0a46fSAndroid Build Coastguard Worker cmsUInt16Number alpha = (ExtraFirst ? accum[0] : accum[(nChan - 1) * Stride]);
666*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(alpha));
667*3ac0a46fSAndroid Build Coastguard Worker
668*3ac0a46fSAndroid Build Coastguard Worker if (ExtraFirst) {
669*3ac0a46fSAndroid Build Coastguard Worker accum += Stride;
670*3ac0a46fSAndroid Build Coastguard Worker }
671*3ac0a46fSAndroid Build Coastguard Worker
672*3ac0a46fSAndroid Build Coastguard Worker for (i=0; i < nChan; i++) {
673*3ac0a46fSAndroid Build Coastguard Worker
674*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i;
675*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number v = (cmsUInt32Number) *(cmsUInt16Number*) accum;
676*3ac0a46fSAndroid Build Coastguard Worker
677*3ac0a46fSAndroid Build Coastguard Worker if (SwapEndian)
678*3ac0a46fSAndroid Build Coastguard Worker v = CHANGE_ENDIAN(v);
679*3ac0a46fSAndroid Build Coastguard Worker
680*3ac0a46fSAndroid Build Coastguard Worker if (alpha_factor > 0) {
681*3ac0a46fSAndroid Build Coastguard Worker
682*3ac0a46fSAndroid Build Coastguard Worker v = (v << 16) / alpha_factor;
683*3ac0a46fSAndroid Build Coastguard Worker if (v > 0xffff) v = 0xffff;
684*3ac0a46fSAndroid Build Coastguard Worker }
685*3ac0a46fSAndroid Build Coastguard Worker
686*3ac0a46fSAndroid Build Coastguard Worker wIn[index] = (cmsUInt16Number) (Reverse ? REVERSE_FLAVOR_16(v) : v);
687*3ac0a46fSAndroid Build Coastguard Worker
688*3ac0a46fSAndroid Build Coastguard Worker accum += Stride;
689*3ac0a46fSAndroid Build Coastguard Worker }
690*3ac0a46fSAndroid Build Coastguard Worker
691*3ac0a46fSAndroid Build Coastguard Worker return (Init + sizeof(cmsUInt16Number));
692*3ac0a46fSAndroid Build Coastguard Worker }
693*3ac0a46fSAndroid Build Coastguard Worker
694*3ac0a46fSAndroid Build Coastguard Worker static
Unroll4Words(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)695*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll4Words(CMSREGISTER _cmsTRANSFORM* info,
696*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
697*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
698*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
699*3ac0a46fSAndroid Build Coastguard Worker {
700*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C
701*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M
702*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y
703*3ac0a46fSAndroid Build Coastguard Worker wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // K
704*3ac0a46fSAndroid Build Coastguard Worker
705*3ac0a46fSAndroid Build Coastguard Worker return accum;
706*3ac0a46fSAndroid Build Coastguard Worker
707*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
708*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
709*3ac0a46fSAndroid Build Coastguard Worker }
710*3ac0a46fSAndroid Build Coastguard Worker
711*3ac0a46fSAndroid Build Coastguard Worker static
Unroll4WordsReverse(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)712*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll4WordsReverse(CMSREGISTER _cmsTRANSFORM* info,
713*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
714*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
715*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
716*3ac0a46fSAndroid Build Coastguard Worker {
717*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // C
718*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // M
719*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // Y
720*3ac0a46fSAndroid Build Coastguard Worker wIn[3] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // K
721*3ac0a46fSAndroid Build Coastguard Worker
722*3ac0a46fSAndroid Build Coastguard Worker return accum;
723*3ac0a46fSAndroid Build Coastguard Worker
724*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
725*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
726*3ac0a46fSAndroid Build Coastguard Worker }
727*3ac0a46fSAndroid Build Coastguard Worker
728*3ac0a46fSAndroid Build Coastguard Worker static
Unroll4WordsSwapFirst(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)729*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll4WordsSwapFirst(CMSREGISTER _cmsTRANSFORM* info,
730*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
731*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
732*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
733*3ac0a46fSAndroid Build Coastguard Worker {
734*3ac0a46fSAndroid Build Coastguard Worker wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // K
735*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C
736*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M
737*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y
738*3ac0a46fSAndroid Build Coastguard Worker
739*3ac0a46fSAndroid Build Coastguard Worker return accum;
740*3ac0a46fSAndroid Build Coastguard Worker
741*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
742*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
743*3ac0a46fSAndroid Build Coastguard Worker }
744*3ac0a46fSAndroid Build Coastguard Worker
745*3ac0a46fSAndroid Build Coastguard Worker // KYMC
746*3ac0a46fSAndroid Build Coastguard Worker static
Unroll4WordsSwap(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)747*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll4WordsSwap(CMSREGISTER _cmsTRANSFORM* info,
748*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
749*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
750*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
751*3ac0a46fSAndroid Build Coastguard Worker {
752*3ac0a46fSAndroid Build Coastguard Worker wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // K
753*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y
754*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M
755*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C
756*3ac0a46fSAndroid Build Coastguard Worker
757*3ac0a46fSAndroid Build Coastguard Worker return accum;
758*3ac0a46fSAndroid Build Coastguard Worker
759*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
760*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
761*3ac0a46fSAndroid Build Coastguard Worker }
762*3ac0a46fSAndroid Build Coastguard Worker
763*3ac0a46fSAndroid Build Coastguard Worker static
Unroll4WordsSwapSwapFirst(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)764*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll4WordsSwapSwapFirst(CMSREGISTER _cmsTRANSFORM* info,
765*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
766*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
767*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
768*3ac0a46fSAndroid Build Coastguard Worker {
769*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // K
770*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // Y
771*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // M
772*3ac0a46fSAndroid Build Coastguard Worker wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // C
773*3ac0a46fSAndroid Build Coastguard Worker
774*3ac0a46fSAndroid Build Coastguard Worker return accum;
775*3ac0a46fSAndroid Build Coastguard Worker
776*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
777*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
778*3ac0a46fSAndroid Build Coastguard Worker }
779*3ac0a46fSAndroid Build Coastguard Worker
780*3ac0a46fSAndroid Build Coastguard Worker static
Unroll3Words(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)781*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll3Words(CMSREGISTER _cmsTRANSFORM* info,
782*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
783*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
784*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
785*3ac0a46fSAndroid Build Coastguard Worker {
786*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C R
787*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M G
788*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y B
789*3ac0a46fSAndroid Build Coastguard Worker
790*3ac0a46fSAndroid Build Coastguard Worker return accum;
791*3ac0a46fSAndroid Build Coastguard Worker
792*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
793*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
794*3ac0a46fSAndroid Build Coastguard Worker }
795*3ac0a46fSAndroid Build Coastguard Worker
796*3ac0a46fSAndroid Build Coastguard Worker static
Unroll3WordsSwap(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)797*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll3WordsSwap(CMSREGISTER _cmsTRANSFORM* info,
798*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
799*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
800*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
801*3ac0a46fSAndroid Build Coastguard Worker {
802*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // C R
803*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M G
804*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // Y B
805*3ac0a46fSAndroid Build Coastguard Worker
806*3ac0a46fSAndroid Build Coastguard Worker return accum;
807*3ac0a46fSAndroid Build Coastguard Worker
808*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
809*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
810*3ac0a46fSAndroid Build Coastguard Worker }
811*3ac0a46fSAndroid Build Coastguard Worker
812*3ac0a46fSAndroid Build Coastguard Worker static
Unroll3WordsSkip1Swap(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)813*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll3WordsSkip1Swap(CMSREGISTER _cmsTRANSFORM* info,
814*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
815*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
816*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
817*3ac0a46fSAndroid Build Coastguard Worker {
818*3ac0a46fSAndroid Build Coastguard Worker accum += 2; // A
819*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = *(cmsUInt16Number*) accum; accum += 2; // R
820*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = *(cmsUInt16Number*) accum; accum += 2; // G
821*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = *(cmsUInt16Number*) accum; accum += 2; // B
822*3ac0a46fSAndroid Build Coastguard Worker
823*3ac0a46fSAndroid Build Coastguard Worker return accum;
824*3ac0a46fSAndroid Build Coastguard Worker
825*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
826*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
827*3ac0a46fSAndroid Build Coastguard Worker }
828*3ac0a46fSAndroid Build Coastguard Worker
829*3ac0a46fSAndroid Build Coastguard Worker static
Unroll3WordsSkip1SwapFirst(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)830*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll3WordsSkip1SwapFirst(CMSREGISTER _cmsTRANSFORM* info,
831*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
832*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
833*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
834*3ac0a46fSAndroid Build Coastguard Worker {
835*3ac0a46fSAndroid Build Coastguard Worker accum += 2; // A
836*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = *(cmsUInt16Number*) accum; accum += 2; // R
837*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = *(cmsUInt16Number*) accum; accum += 2; // G
838*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = *(cmsUInt16Number*) accum; accum += 2; // B
839*3ac0a46fSAndroid Build Coastguard Worker
840*3ac0a46fSAndroid Build Coastguard Worker return accum;
841*3ac0a46fSAndroid Build Coastguard Worker
842*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
843*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
844*3ac0a46fSAndroid Build Coastguard Worker }
845*3ac0a46fSAndroid Build Coastguard Worker
846*3ac0a46fSAndroid Build Coastguard Worker static
Unroll1Word(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)847*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll1Word(CMSREGISTER _cmsTRANSFORM* info,
848*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
849*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
850*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
851*3ac0a46fSAndroid Build Coastguard Worker {
852*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = wIn[1] = wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // L
853*3ac0a46fSAndroid Build Coastguard Worker
854*3ac0a46fSAndroid Build Coastguard Worker return accum;
855*3ac0a46fSAndroid Build Coastguard Worker
856*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
857*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
858*3ac0a46fSAndroid Build Coastguard Worker }
859*3ac0a46fSAndroid Build Coastguard Worker
860*3ac0a46fSAndroid Build Coastguard Worker static
Unroll1WordReversed(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)861*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll1WordReversed(CMSREGISTER _cmsTRANSFORM* info,
862*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
863*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
864*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
865*3ac0a46fSAndroid Build Coastguard Worker {
866*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = wIn[1] = wIn[2] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2;
867*3ac0a46fSAndroid Build Coastguard Worker
868*3ac0a46fSAndroid Build Coastguard Worker return accum;
869*3ac0a46fSAndroid Build Coastguard Worker
870*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
871*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
872*3ac0a46fSAndroid Build Coastguard Worker }
873*3ac0a46fSAndroid Build Coastguard Worker
874*3ac0a46fSAndroid Build Coastguard Worker static
Unroll1WordSkip3(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)875*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll1WordSkip3(CMSREGISTER _cmsTRANSFORM* info,
876*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
877*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
878*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
879*3ac0a46fSAndroid Build Coastguard Worker {
880*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = wIn[1] = wIn[2] = *(cmsUInt16Number*) accum;
881*3ac0a46fSAndroid Build Coastguard Worker
882*3ac0a46fSAndroid Build Coastguard Worker accum += 8;
883*3ac0a46fSAndroid Build Coastguard Worker
884*3ac0a46fSAndroid Build Coastguard Worker return accum;
885*3ac0a46fSAndroid Build Coastguard Worker
886*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
887*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
888*3ac0a46fSAndroid Build Coastguard Worker }
889*3ac0a46fSAndroid Build Coastguard Worker
890*3ac0a46fSAndroid Build Coastguard Worker static
Unroll2Words(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)891*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll2Words(CMSREGISTER _cmsTRANSFORM* info,
892*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
893*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
894*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
895*3ac0a46fSAndroid Build Coastguard Worker {
896*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = *(cmsUInt16Number*) accum; accum += 2; // ch1
897*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = *(cmsUInt16Number*) accum; accum += 2; // ch2
898*3ac0a46fSAndroid Build Coastguard Worker
899*3ac0a46fSAndroid Build Coastguard Worker return accum;
900*3ac0a46fSAndroid Build Coastguard Worker
901*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
902*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
903*3ac0a46fSAndroid Build Coastguard Worker }
904*3ac0a46fSAndroid Build Coastguard Worker
905*3ac0a46fSAndroid Build Coastguard Worker
906*3ac0a46fSAndroid Build Coastguard Worker // This is a conversion of Lab double to 16 bits
907*3ac0a46fSAndroid Build Coastguard Worker static
UnrollLabDoubleTo16(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)908*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollLabDoubleTo16(CMSREGISTER _cmsTRANSFORM* info,
909*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
910*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
911*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
912*3ac0a46fSAndroid Build Coastguard Worker {
913*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(info -> InputFormat)) {
914*3ac0a46fSAndroid Build Coastguard Worker
915*3ac0a46fSAndroid Build Coastguard Worker cmsCIELab Lab;
916*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* pos_L;
917*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* pos_a;
918*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* pos_b;
919*3ac0a46fSAndroid Build Coastguard Worker
920*3ac0a46fSAndroid Build Coastguard Worker pos_L = accum;
921*3ac0a46fSAndroid Build Coastguard Worker pos_a = accum + Stride;
922*3ac0a46fSAndroid Build Coastguard Worker pos_b = accum + Stride * 2;
923*3ac0a46fSAndroid Build Coastguard Worker
924*3ac0a46fSAndroid Build Coastguard Worker Lab.L = *(cmsFloat64Number*) pos_L;
925*3ac0a46fSAndroid Build Coastguard Worker Lab.a = *(cmsFloat64Number*) pos_a;
926*3ac0a46fSAndroid Build Coastguard Worker Lab.b = *(cmsFloat64Number*) pos_b;
927*3ac0a46fSAndroid Build Coastguard Worker
928*3ac0a46fSAndroid Build Coastguard Worker cmsFloat2LabEncoded(wIn, &Lab);
929*3ac0a46fSAndroid Build Coastguard Worker return accum + sizeof(cmsFloat64Number);
930*3ac0a46fSAndroid Build Coastguard Worker }
931*3ac0a46fSAndroid Build Coastguard Worker else {
932*3ac0a46fSAndroid Build Coastguard Worker
933*3ac0a46fSAndroid Build Coastguard Worker cmsFloat2LabEncoded(wIn, (cmsCIELab*) accum);
934*3ac0a46fSAndroid Build Coastguard Worker accum += sizeof(cmsCIELab) + T_EXTRA(info ->InputFormat) * sizeof(cmsFloat64Number);
935*3ac0a46fSAndroid Build Coastguard Worker return accum;
936*3ac0a46fSAndroid Build Coastguard Worker }
937*3ac0a46fSAndroid Build Coastguard Worker }
938*3ac0a46fSAndroid Build Coastguard Worker
939*3ac0a46fSAndroid Build Coastguard Worker
940*3ac0a46fSAndroid Build Coastguard Worker // This is a conversion of Lab float to 16 bits
941*3ac0a46fSAndroid Build Coastguard Worker static
UnrollLabFloatTo16(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)942*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollLabFloatTo16(CMSREGISTER _cmsTRANSFORM* info,
943*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
944*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
945*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
946*3ac0a46fSAndroid Build Coastguard Worker {
947*3ac0a46fSAndroid Build Coastguard Worker cmsCIELab Lab;
948*3ac0a46fSAndroid Build Coastguard Worker
949*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(info -> InputFormat)) {
950*3ac0a46fSAndroid Build Coastguard Worker
951*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* pos_L;
952*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* pos_a;
953*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* pos_b;
954*3ac0a46fSAndroid Build Coastguard Worker
955*3ac0a46fSAndroid Build Coastguard Worker pos_L = accum;
956*3ac0a46fSAndroid Build Coastguard Worker pos_a = accum + Stride;
957*3ac0a46fSAndroid Build Coastguard Worker pos_b = accum + Stride * 2;
958*3ac0a46fSAndroid Build Coastguard Worker
959*3ac0a46fSAndroid Build Coastguard Worker Lab.L = *(cmsFloat32Number*)pos_L;
960*3ac0a46fSAndroid Build Coastguard Worker Lab.a = *(cmsFloat32Number*)pos_a;
961*3ac0a46fSAndroid Build Coastguard Worker Lab.b = *(cmsFloat32Number*)pos_b;
962*3ac0a46fSAndroid Build Coastguard Worker
963*3ac0a46fSAndroid Build Coastguard Worker cmsFloat2LabEncoded(wIn, &Lab);
964*3ac0a46fSAndroid Build Coastguard Worker return accum + sizeof(cmsFloat32Number);
965*3ac0a46fSAndroid Build Coastguard Worker }
966*3ac0a46fSAndroid Build Coastguard Worker else {
967*3ac0a46fSAndroid Build Coastguard Worker
968*3ac0a46fSAndroid Build Coastguard Worker Lab.L = ((cmsFloat32Number*) accum)[0];
969*3ac0a46fSAndroid Build Coastguard Worker Lab.a = ((cmsFloat32Number*) accum)[1];
970*3ac0a46fSAndroid Build Coastguard Worker Lab.b = ((cmsFloat32Number*) accum)[2];
971*3ac0a46fSAndroid Build Coastguard Worker
972*3ac0a46fSAndroid Build Coastguard Worker cmsFloat2LabEncoded(wIn, &Lab);
973*3ac0a46fSAndroid Build Coastguard Worker accum += (3 + T_EXTRA(info ->InputFormat)) * sizeof(cmsFloat32Number);
974*3ac0a46fSAndroid Build Coastguard Worker return accum;
975*3ac0a46fSAndroid Build Coastguard Worker }
976*3ac0a46fSAndroid Build Coastguard Worker }
977*3ac0a46fSAndroid Build Coastguard Worker
978*3ac0a46fSAndroid Build Coastguard Worker // This is a conversion of XYZ double to 16 bits
979*3ac0a46fSAndroid Build Coastguard Worker static
UnrollXYZDoubleTo16(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)980*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollXYZDoubleTo16(CMSREGISTER _cmsTRANSFORM* info,
981*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
982*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
983*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
984*3ac0a46fSAndroid Build Coastguard Worker {
985*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(info -> InputFormat)) {
986*3ac0a46fSAndroid Build Coastguard Worker
987*3ac0a46fSAndroid Build Coastguard Worker cmsCIEXYZ XYZ;
988*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* pos_X;
989*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* pos_Y;
990*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* pos_Z;
991*3ac0a46fSAndroid Build Coastguard Worker
992*3ac0a46fSAndroid Build Coastguard Worker pos_X = accum;
993*3ac0a46fSAndroid Build Coastguard Worker pos_Y = accum + Stride;
994*3ac0a46fSAndroid Build Coastguard Worker pos_Z = accum + Stride * 2;
995*3ac0a46fSAndroid Build Coastguard Worker
996*3ac0a46fSAndroid Build Coastguard Worker XYZ.X = *(cmsFloat64Number*)pos_X;
997*3ac0a46fSAndroid Build Coastguard Worker XYZ.Y = *(cmsFloat64Number*)pos_Y;
998*3ac0a46fSAndroid Build Coastguard Worker XYZ.Z = *(cmsFloat64Number*)pos_Z;
999*3ac0a46fSAndroid Build Coastguard Worker
1000*3ac0a46fSAndroid Build Coastguard Worker cmsFloat2XYZEncoded(wIn, &XYZ);
1001*3ac0a46fSAndroid Build Coastguard Worker
1002*3ac0a46fSAndroid Build Coastguard Worker return accum + sizeof(cmsFloat64Number);
1003*3ac0a46fSAndroid Build Coastguard Worker
1004*3ac0a46fSAndroid Build Coastguard Worker }
1005*3ac0a46fSAndroid Build Coastguard Worker
1006*3ac0a46fSAndroid Build Coastguard Worker else {
1007*3ac0a46fSAndroid Build Coastguard Worker cmsFloat2XYZEncoded(wIn, (cmsCIEXYZ*) accum);
1008*3ac0a46fSAndroid Build Coastguard Worker accum += sizeof(cmsCIEXYZ) + T_EXTRA(info ->InputFormat) * sizeof(cmsFloat64Number);
1009*3ac0a46fSAndroid Build Coastguard Worker
1010*3ac0a46fSAndroid Build Coastguard Worker return accum;
1011*3ac0a46fSAndroid Build Coastguard Worker }
1012*3ac0a46fSAndroid Build Coastguard Worker }
1013*3ac0a46fSAndroid Build Coastguard Worker
1014*3ac0a46fSAndroid Build Coastguard Worker // This is a conversion of XYZ float to 16 bits
1015*3ac0a46fSAndroid Build Coastguard Worker static
UnrollXYZFloatTo16(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)1016*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollXYZFloatTo16(CMSREGISTER _cmsTRANSFORM* info,
1017*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
1018*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
1019*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
1020*3ac0a46fSAndroid Build Coastguard Worker {
1021*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(info -> InputFormat)) {
1022*3ac0a46fSAndroid Build Coastguard Worker
1023*3ac0a46fSAndroid Build Coastguard Worker cmsCIEXYZ XYZ;
1024*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* pos_X;
1025*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* pos_Y;
1026*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* pos_Z;
1027*3ac0a46fSAndroid Build Coastguard Worker
1028*3ac0a46fSAndroid Build Coastguard Worker pos_X = accum;
1029*3ac0a46fSAndroid Build Coastguard Worker pos_Y = accum + Stride;
1030*3ac0a46fSAndroid Build Coastguard Worker pos_Z = accum + Stride * 2;
1031*3ac0a46fSAndroid Build Coastguard Worker
1032*3ac0a46fSAndroid Build Coastguard Worker XYZ.X = *(cmsFloat32Number*)pos_X;
1033*3ac0a46fSAndroid Build Coastguard Worker XYZ.Y = *(cmsFloat32Number*)pos_Y;
1034*3ac0a46fSAndroid Build Coastguard Worker XYZ.Z = *(cmsFloat32Number*)pos_Z;
1035*3ac0a46fSAndroid Build Coastguard Worker
1036*3ac0a46fSAndroid Build Coastguard Worker cmsFloat2XYZEncoded(wIn, &XYZ);
1037*3ac0a46fSAndroid Build Coastguard Worker
1038*3ac0a46fSAndroid Build Coastguard Worker return accum + sizeof(cmsFloat32Number);
1039*3ac0a46fSAndroid Build Coastguard Worker
1040*3ac0a46fSAndroid Build Coastguard Worker }
1041*3ac0a46fSAndroid Build Coastguard Worker
1042*3ac0a46fSAndroid Build Coastguard Worker else {
1043*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number* Pt = (cmsFloat32Number*) accum;
1044*3ac0a46fSAndroid Build Coastguard Worker cmsCIEXYZ XYZ;
1045*3ac0a46fSAndroid Build Coastguard Worker
1046*3ac0a46fSAndroid Build Coastguard Worker XYZ.X = Pt[0];
1047*3ac0a46fSAndroid Build Coastguard Worker XYZ.Y = Pt[1];
1048*3ac0a46fSAndroid Build Coastguard Worker XYZ.Z = Pt[2];
1049*3ac0a46fSAndroid Build Coastguard Worker cmsFloat2XYZEncoded(wIn, &XYZ);
1050*3ac0a46fSAndroid Build Coastguard Worker
1051*3ac0a46fSAndroid Build Coastguard Worker accum += 3 * sizeof(cmsFloat32Number) + T_EXTRA(info ->InputFormat) * sizeof(cmsFloat32Number);
1052*3ac0a46fSAndroid Build Coastguard Worker
1053*3ac0a46fSAndroid Build Coastguard Worker return accum;
1054*3ac0a46fSAndroid Build Coastguard Worker }
1055*3ac0a46fSAndroid Build Coastguard Worker }
1056*3ac0a46fSAndroid Build Coastguard Worker
1057*3ac0a46fSAndroid Build Coastguard Worker // Check if space is marked as ink
IsInkSpace(cmsUInt32Number Type)1058*3ac0a46fSAndroid Build Coastguard Worker cmsINLINE cmsBool IsInkSpace(cmsUInt32Number Type)
1059*3ac0a46fSAndroid Build Coastguard Worker {
1060*3ac0a46fSAndroid Build Coastguard Worker switch (T_COLORSPACE(Type)) {
1061*3ac0a46fSAndroid Build Coastguard Worker
1062*3ac0a46fSAndroid Build Coastguard Worker case PT_CMY:
1063*3ac0a46fSAndroid Build Coastguard Worker case PT_CMYK:
1064*3ac0a46fSAndroid Build Coastguard Worker case PT_MCH5:
1065*3ac0a46fSAndroid Build Coastguard Worker case PT_MCH6:
1066*3ac0a46fSAndroid Build Coastguard Worker case PT_MCH7:
1067*3ac0a46fSAndroid Build Coastguard Worker case PT_MCH8:
1068*3ac0a46fSAndroid Build Coastguard Worker case PT_MCH9:
1069*3ac0a46fSAndroid Build Coastguard Worker case PT_MCH10:
1070*3ac0a46fSAndroid Build Coastguard Worker case PT_MCH11:
1071*3ac0a46fSAndroid Build Coastguard Worker case PT_MCH12:
1072*3ac0a46fSAndroid Build Coastguard Worker case PT_MCH13:
1073*3ac0a46fSAndroid Build Coastguard Worker case PT_MCH14:
1074*3ac0a46fSAndroid Build Coastguard Worker case PT_MCH15: return TRUE;
1075*3ac0a46fSAndroid Build Coastguard Worker
1076*3ac0a46fSAndroid Build Coastguard Worker default: return FALSE;
1077*3ac0a46fSAndroid Build Coastguard Worker }
1078*3ac0a46fSAndroid Build Coastguard Worker }
1079*3ac0a46fSAndroid Build Coastguard Worker
1080*3ac0a46fSAndroid Build Coastguard Worker // Return the size in bytes of a given formatter
1081*3ac0a46fSAndroid Build Coastguard Worker static
PixelSize(cmsUInt32Number Format)1082*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number PixelSize(cmsUInt32Number Format)
1083*3ac0a46fSAndroid Build Coastguard Worker {
1084*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number fmt_bytes = T_BYTES(Format);
1085*3ac0a46fSAndroid Build Coastguard Worker
1086*3ac0a46fSAndroid Build Coastguard Worker // For double, the T_BYTES field is zero
1087*3ac0a46fSAndroid Build Coastguard Worker if (fmt_bytes == 0)
1088*3ac0a46fSAndroid Build Coastguard Worker return sizeof(cmsUInt64Number);
1089*3ac0a46fSAndroid Build Coastguard Worker
1090*3ac0a46fSAndroid Build Coastguard Worker // Otherwise, it is already correct for all formats
1091*3ac0a46fSAndroid Build Coastguard Worker return fmt_bytes;
1092*3ac0a46fSAndroid Build Coastguard Worker }
1093*3ac0a46fSAndroid Build Coastguard Worker
1094*3ac0a46fSAndroid Build Coastguard Worker // Inks does come in percentage, remaining cases are between 0..1.0, again to 16 bits
1095*3ac0a46fSAndroid Build Coastguard Worker static
UnrollDoubleTo16(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)1096*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollDoubleTo16(CMSREGISTER _cmsTRANSFORM* info,
1097*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
1098*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
1099*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
1100*3ac0a46fSAndroid Build Coastguard Worker {
1101*3ac0a46fSAndroid Build Coastguard Worker
1102*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat);
1103*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number DoSwap = T_DOSWAP(info ->InputFormat);
1104*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Reverse = T_FLAVOR(info ->InputFormat);
1105*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapFirst = T_SWAPFIRST(info -> InputFormat);
1106*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Extra = T_EXTRA(info -> InputFormat);
1107*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst;
1108*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Planar = T_PLANAR(info -> InputFormat);
1109*3ac0a46fSAndroid Build Coastguard Worker cmsFloat64Number v;
1110*3ac0a46fSAndroid Build Coastguard Worker cmsUInt16Number vi;
1111*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number i, start = 0;
1112*3ac0a46fSAndroid Build Coastguard Worker cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 655.35 : 65535.0;
1113*3ac0a46fSAndroid Build Coastguard Worker
1114*3ac0a46fSAndroid Build Coastguard Worker
1115*3ac0a46fSAndroid Build Coastguard Worker Stride /= PixelSize(info->InputFormat);
1116*3ac0a46fSAndroid Build Coastguard Worker
1117*3ac0a46fSAndroid Build Coastguard Worker if (ExtraFirst)
1118*3ac0a46fSAndroid Build Coastguard Worker start = Extra;
1119*3ac0a46fSAndroid Build Coastguard Worker
1120*3ac0a46fSAndroid Build Coastguard Worker for (i=0; i < nChan; i++) {
1121*3ac0a46fSAndroid Build Coastguard Worker
1122*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i;
1123*3ac0a46fSAndroid Build Coastguard Worker
1124*3ac0a46fSAndroid Build Coastguard Worker if (Planar)
1125*3ac0a46fSAndroid Build Coastguard Worker v = (cmsFloat32Number) ((cmsFloat64Number*) accum)[(i + start) * Stride];
1126*3ac0a46fSAndroid Build Coastguard Worker else
1127*3ac0a46fSAndroid Build Coastguard Worker v = (cmsFloat32Number) ((cmsFloat64Number*) accum)[i + start];
1128*3ac0a46fSAndroid Build Coastguard Worker
1129*3ac0a46fSAndroid Build Coastguard Worker vi = _cmsQuickSaturateWord(v * maximum);
1130*3ac0a46fSAndroid Build Coastguard Worker
1131*3ac0a46fSAndroid Build Coastguard Worker if (Reverse)
1132*3ac0a46fSAndroid Build Coastguard Worker vi = REVERSE_FLAVOR_16(vi);
1133*3ac0a46fSAndroid Build Coastguard Worker
1134*3ac0a46fSAndroid Build Coastguard Worker wIn[index] = vi;
1135*3ac0a46fSAndroid Build Coastguard Worker }
1136*3ac0a46fSAndroid Build Coastguard Worker
1137*3ac0a46fSAndroid Build Coastguard Worker
1138*3ac0a46fSAndroid Build Coastguard Worker if (Extra == 0 && SwapFirst) {
1139*3ac0a46fSAndroid Build Coastguard Worker cmsUInt16Number tmp = wIn[0];
1140*3ac0a46fSAndroid Build Coastguard Worker
1141*3ac0a46fSAndroid Build Coastguard Worker memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number));
1142*3ac0a46fSAndroid Build Coastguard Worker wIn[nChan-1] = tmp;
1143*3ac0a46fSAndroid Build Coastguard Worker }
1144*3ac0a46fSAndroid Build Coastguard Worker
1145*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(info -> InputFormat))
1146*3ac0a46fSAndroid Build Coastguard Worker return accum + sizeof(cmsFloat64Number);
1147*3ac0a46fSAndroid Build Coastguard Worker else
1148*3ac0a46fSAndroid Build Coastguard Worker return accum + (nChan + Extra) * sizeof(cmsFloat64Number);
1149*3ac0a46fSAndroid Build Coastguard Worker }
1150*3ac0a46fSAndroid Build Coastguard Worker
1151*3ac0a46fSAndroid Build Coastguard Worker
1152*3ac0a46fSAndroid Build Coastguard Worker
1153*3ac0a46fSAndroid Build Coastguard Worker static
UnrollFloatTo16(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)1154*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollFloatTo16(CMSREGISTER _cmsTRANSFORM* info,
1155*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
1156*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
1157*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
1158*3ac0a46fSAndroid Build Coastguard Worker {
1159*3ac0a46fSAndroid Build Coastguard Worker
1160*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat);
1161*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number DoSwap = T_DOSWAP(info ->InputFormat);
1162*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Reverse = T_FLAVOR(info ->InputFormat);
1163*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapFirst = T_SWAPFIRST(info -> InputFormat);
1164*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Extra = T_EXTRA(info -> InputFormat);
1165*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst;
1166*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Planar = T_PLANAR(info -> InputFormat);
1167*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number v;
1168*3ac0a46fSAndroid Build Coastguard Worker cmsUInt16Number vi;
1169*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number i, start = 0;
1170*3ac0a46fSAndroid Build Coastguard Worker cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 655.35 : 65535.0;
1171*3ac0a46fSAndroid Build Coastguard Worker
1172*3ac0a46fSAndroid Build Coastguard Worker Stride /= PixelSize(info->InputFormat);
1173*3ac0a46fSAndroid Build Coastguard Worker
1174*3ac0a46fSAndroid Build Coastguard Worker if (ExtraFirst)
1175*3ac0a46fSAndroid Build Coastguard Worker start = Extra;
1176*3ac0a46fSAndroid Build Coastguard Worker
1177*3ac0a46fSAndroid Build Coastguard Worker for (i=0; i < nChan; i++) {
1178*3ac0a46fSAndroid Build Coastguard Worker
1179*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i;
1180*3ac0a46fSAndroid Build Coastguard Worker
1181*3ac0a46fSAndroid Build Coastguard Worker if (Planar)
1182*3ac0a46fSAndroid Build Coastguard Worker v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[(i + start) * Stride];
1183*3ac0a46fSAndroid Build Coastguard Worker else
1184*3ac0a46fSAndroid Build Coastguard Worker v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[i + start];
1185*3ac0a46fSAndroid Build Coastguard Worker
1186*3ac0a46fSAndroid Build Coastguard Worker vi = _cmsQuickSaturateWord(v * maximum);
1187*3ac0a46fSAndroid Build Coastguard Worker
1188*3ac0a46fSAndroid Build Coastguard Worker if (Reverse)
1189*3ac0a46fSAndroid Build Coastguard Worker vi = REVERSE_FLAVOR_16(vi);
1190*3ac0a46fSAndroid Build Coastguard Worker
1191*3ac0a46fSAndroid Build Coastguard Worker wIn[index] = vi;
1192*3ac0a46fSAndroid Build Coastguard Worker }
1193*3ac0a46fSAndroid Build Coastguard Worker
1194*3ac0a46fSAndroid Build Coastguard Worker
1195*3ac0a46fSAndroid Build Coastguard Worker if (Extra == 0 && SwapFirst) {
1196*3ac0a46fSAndroid Build Coastguard Worker cmsUInt16Number tmp = wIn[0];
1197*3ac0a46fSAndroid Build Coastguard Worker
1198*3ac0a46fSAndroid Build Coastguard Worker memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number));
1199*3ac0a46fSAndroid Build Coastguard Worker wIn[nChan-1] = tmp;
1200*3ac0a46fSAndroid Build Coastguard Worker }
1201*3ac0a46fSAndroid Build Coastguard Worker
1202*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(info -> InputFormat))
1203*3ac0a46fSAndroid Build Coastguard Worker return accum + sizeof(cmsFloat32Number);
1204*3ac0a46fSAndroid Build Coastguard Worker else
1205*3ac0a46fSAndroid Build Coastguard Worker return accum + (nChan + Extra) * sizeof(cmsFloat32Number);
1206*3ac0a46fSAndroid Build Coastguard Worker }
1207*3ac0a46fSAndroid Build Coastguard Worker
1208*3ac0a46fSAndroid Build Coastguard Worker
1209*3ac0a46fSAndroid Build Coastguard Worker
1210*3ac0a46fSAndroid Build Coastguard Worker
1211*3ac0a46fSAndroid Build Coastguard Worker // For 1 channel, we need to duplicate data (it comes in 0..1.0 range)
1212*3ac0a46fSAndroid Build Coastguard Worker static
UnrollDouble1Chan(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)1213*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollDouble1Chan(CMSREGISTER _cmsTRANSFORM* info,
1214*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
1215*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
1216*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
1217*3ac0a46fSAndroid Build Coastguard Worker {
1218*3ac0a46fSAndroid Build Coastguard Worker cmsFloat64Number* Inks = (cmsFloat64Number*) accum;
1219*3ac0a46fSAndroid Build Coastguard Worker
1220*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = wIn[1] = wIn[2] = _cmsQuickSaturateWord(Inks[0] * 65535.0);
1221*3ac0a46fSAndroid Build Coastguard Worker
1222*3ac0a46fSAndroid Build Coastguard Worker return accum + sizeof(cmsFloat64Number);
1223*3ac0a46fSAndroid Build Coastguard Worker
1224*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
1225*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
1226*3ac0a46fSAndroid Build Coastguard Worker }
1227*3ac0a46fSAndroid Build Coastguard Worker
1228*3ac0a46fSAndroid Build Coastguard Worker //-------------------------------------------------------------------------------------------------------------------
1229*3ac0a46fSAndroid Build Coastguard Worker
1230*3ac0a46fSAndroid Build Coastguard Worker // For anything going from cmsUInt8Number
1231*3ac0a46fSAndroid Build Coastguard Worker static
Unroll8ToFloat(_cmsTRANSFORM * info,cmsFloat32Number wIn[],cmsUInt8Number * accum,cmsUInt32Number Stride)1232*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll8ToFloat(_cmsTRANSFORM* info,
1233*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number wIn[],
1234*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* accum,
1235*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Stride)
1236*3ac0a46fSAndroid Build Coastguard Worker {
1237*3ac0a46fSAndroid Build Coastguard Worker
1238*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number nChan = T_CHANNELS(info->InputFormat);
1239*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number DoSwap = T_DOSWAP(info->InputFormat);
1240*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Reverse = T_FLAVOR(info->InputFormat);
1241*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapFirst = T_SWAPFIRST(info->InputFormat);
1242*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Extra = T_EXTRA(info->InputFormat);
1243*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst;
1244*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Planar = T_PLANAR(info->InputFormat);
1245*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number v;
1246*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number i, start = 0;
1247*3ac0a46fSAndroid Build Coastguard Worker
1248*3ac0a46fSAndroid Build Coastguard Worker Stride /= PixelSize(info->InputFormat);
1249*3ac0a46fSAndroid Build Coastguard Worker
1250*3ac0a46fSAndroid Build Coastguard Worker if (ExtraFirst)
1251*3ac0a46fSAndroid Build Coastguard Worker start = Extra;
1252*3ac0a46fSAndroid Build Coastguard Worker
1253*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < nChan; i++) {
1254*3ac0a46fSAndroid Build Coastguard Worker
1255*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i;
1256*3ac0a46fSAndroid Build Coastguard Worker
1257*3ac0a46fSAndroid Build Coastguard Worker if (Planar)
1258*3ac0a46fSAndroid Build Coastguard Worker v = (cmsFloat32Number) ((cmsUInt8Number *)accum)[(i + start) * Stride];
1259*3ac0a46fSAndroid Build Coastguard Worker else
1260*3ac0a46fSAndroid Build Coastguard Worker v = (cmsFloat32Number) ((cmsUInt8Number *)accum)[i + start];
1261*3ac0a46fSAndroid Build Coastguard Worker
1262*3ac0a46fSAndroid Build Coastguard Worker v /= 255.0F;
1263*3ac0a46fSAndroid Build Coastguard Worker
1264*3ac0a46fSAndroid Build Coastguard Worker wIn[index] = Reverse ? 1 - v : v;
1265*3ac0a46fSAndroid Build Coastguard Worker }
1266*3ac0a46fSAndroid Build Coastguard Worker
1267*3ac0a46fSAndroid Build Coastguard Worker
1268*3ac0a46fSAndroid Build Coastguard Worker if (Extra == 0 && SwapFirst) {
1269*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number tmp = wIn[0];
1270*3ac0a46fSAndroid Build Coastguard Worker
1271*3ac0a46fSAndroid Build Coastguard Worker memmove(&wIn[0], &wIn[1], (nChan - 1) * sizeof(cmsFloat32Number));
1272*3ac0a46fSAndroid Build Coastguard Worker wIn[nChan - 1] = tmp;
1273*3ac0a46fSAndroid Build Coastguard Worker }
1274*3ac0a46fSAndroid Build Coastguard Worker
1275*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(info->InputFormat))
1276*3ac0a46fSAndroid Build Coastguard Worker return accum + sizeof(cmsUInt8Number);
1277*3ac0a46fSAndroid Build Coastguard Worker else
1278*3ac0a46fSAndroid Build Coastguard Worker return accum + (nChan + Extra) * sizeof(cmsUInt8Number);
1279*3ac0a46fSAndroid Build Coastguard Worker }
1280*3ac0a46fSAndroid Build Coastguard Worker
1281*3ac0a46fSAndroid Build Coastguard Worker
1282*3ac0a46fSAndroid Build Coastguard Worker // For anything going from cmsUInt16Number
1283*3ac0a46fSAndroid Build Coastguard Worker static
Unroll16ToFloat(_cmsTRANSFORM * info,cmsFloat32Number wIn[],cmsUInt8Number * accum,cmsUInt32Number Stride)1284*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Unroll16ToFloat(_cmsTRANSFORM* info,
1285*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number wIn[],
1286*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* accum,
1287*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Stride)
1288*3ac0a46fSAndroid Build Coastguard Worker {
1289*3ac0a46fSAndroid Build Coastguard Worker
1290*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number nChan = T_CHANNELS(info->InputFormat);
1291*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number DoSwap = T_DOSWAP(info->InputFormat);
1292*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Reverse = T_FLAVOR(info->InputFormat);
1293*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapFirst = T_SWAPFIRST(info->InputFormat);
1294*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Extra = T_EXTRA(info->InputFormat);
1295*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst;
1296*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Planar = T_PLANAR(info->InputFormat);
1297*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number v;
1298*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number i, start = 0;
1299*3ac0a46fSAndroid Build Coastguard Worker
1300*3ac0a46fSAndroid Build Coastguard Worker Stride /= PixelSize(info->InputFormat);
1301*3ac0a46fSAndroid Build Coastguard Worker
1302*3ac0a46fSAndroid Build Coastguard Worker if (ExtraFirst)
1303*3ac0a46fSAndroid Build Coastguard Worker start = Extra;
1304*3ac0a46fSAndroid Build Coastguard Worker
1305*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < nChan; i++) {
1306*3ac0a46fSAndroid Build Coastguard Worker
1307*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i;
1308*3ac0a46fSAndroid Build Coastguard Worker
1309*3ac0a46fSAndroid Build Coastguard Worker if (Planar)
1310*3ac0a46fSAndroid Build Coastguard Worker v = (cmsFloat32Number)((cmsUInt16Number*)accum)[(i + start) * Stride];
1311*3ac0a46fSAndroid Build Coastguard Worker else
1312*3ac0a46fSAndroid Build Coastguard Worker v = (cmsFloat32Number)((cmsUInt16Number*)accum)[i + start];
1313*3ac0a46fSAndroid Build Coastguard Worker
1314*3ac0a46fSAndroid Build Coastguard Worker v /= 65535.0F;
1315*3ac0a46fSAndroid Build Coastguard Worker
1316*3ac0a46fSAndroid Build Coastguard Worker wIn[index] = Reverse ? 1 - v : v;
1317*3ac0a46fSAndroid Build Coastguard Worker }
1318*3ac0a46fSAndroid Build Coastguard Worker
1319*3ac0a46fSAndroid Build Coastguard Worker
1320*3ac0a46fSAndroid Build Coastguard Worker if (Extra == 0 && SwapFirst) {
1321*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number tmp = wIn[0];
1322*3ac0a46fSAndroid Build Coastguard Worker
1323*3ac0a46fSAndroid Build Coastguard Worker memmove(&wIn[0], &wIn[1], (nChan - 1) * sizeof(cmsFloat32Number));
1324*3ac0a46fSAndroid Build Coastguard Worker wIn[nChan - 1] = tmp;
1325*3ac0a46fSAndroid Build Coastguard Worker }
1326*3ac0a46fSAndroid Build Coastguard Worker
1327*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(info->InputFormat))
1328*3ac0a46fSAndroid Build Coastguard Worker return accum + sizeof(cmsUInt16Number);
1329*3ac0a46fSAndroid Build Coastguard Worker else
1330*3ac0a46fSAndroid Build Coastguard Worker return accum + (nChan + Extra) * sizeof(cmsUInt16Number);
1331*3ac0a46fSAndroid Build Coastguard Worker }
1332*3ac0a46fSAndroid Build Coastguard Worker
1333*3ac0a46fSAndroid Build Coastguard Worker
1334*3ac0a46fSAndroid Build Coastguard Worker // For anything going from cmsFloat32Number
1335*3ac0a46fSAndroid Build Coastguard Worker static
UnrollFloatsToFloat(_cmsTRANSFORM * info,cmsFloat32Number wIn[],cmsUInt8Number * accum,cmsUInt32Number Stride)1336*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollFloatsToFloat(_cmsTRANSFORM* info,
1337*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number wIn[],
1338*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* accum,
1339*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Stride)
1340*3ac0a46fSAndroid Build Coastguard Worker {
1341*3ac0a46fSAndroid Build Coastguard Worker
1342*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number nChan = T_CHANNELS(info->InputFormat);
1343*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number DoSwap = T_DOSWAP(info->InputFormat);
1344*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Reverse = T_FLAVOR(info->InputFormat);
1345*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapFirst = T_SWAPFIRST(info->InputFormat);
1346*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Extra = T_EXTRA(info->InputFormat);
1347*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst;
1348*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Planar = T_PLANAR(info->InputFormat);
1349*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Premul = T_PREMUL(info->InputFormat);
1350*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number v;
1351*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number i, start = 0;
1352*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number maximum = IsInkSpace(info->InputFormat) ? 100.0F : 1.0F;
1353*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number alpha_factor = 1.0f;
1354*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number* ptr = (cmsFloat32Number*)accum;
1355*3ac0a46fSAndroid Build Coastguard Worker
1356*3ac0a46fSAndroid Build Coastguard Worker Stride /= PixelSize(info->InputFormat);
1357*3ac0a46fSAndroid Build Coastguard Worker
1358*3ac0a46fSAndroid Build Coastguard Worker if (Premul && Extra)
1359*3ac0a46fSAndroid Build Coastguard Worker {
1360*3ac0a46fSAndroid Build Coastguard Worker if (Planar)
1361*3ac0a46fSAndroid Build Coastguard Worker alpha_factor = (ExtraFirst ? ptr[0] : ptr[nChan * Stride]) / maximum;
1362*3ac0a46fSAndroid Build Coastguard Worker else
1363*3ac0a46fSAndroid Build Coastguard Worker alpha_factor = (ExtraFirst ? ptr[0] : ptr[nChan]) / maximum;
1364*3ac0a46fSAndroid Build Coastguard Worker }
1365*3ac0a46fSAndroid Build Coastguard Worker
1366*3ac0a46fSAndroid Build Coastguard Worker if (ExtraFirst)
1367*3ac0a46fSAndroid Build Coastguard Worker start = Extra;
1368*3ac0a46fSAndroid Build Coastguard Worker
1369*3ac0a46fSAndroid Build Coastguard Worker for (i=0; i < nChan; i++) {
1370*3ac0a46fSAndroid Build Coastguard Worker
1371*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i;
1372*3ac0a46fSAndroid Build Coastguard Worker
1373*3ac0a46fSAndroid Build Coastguard Worker if (Planar)
1374*3ac0a46fSAndroid Build Coastguard Worker v = ptr[(i + start) * Stride];
1375*3ac0a46fSAndroid Build Coastguard Worker else
1376*3ac0a46fSAndroid Build Coastguard Worker v = ptr[i + start];
1377*3ac0a46fSAndroid Build Coastguard Worker
1378*3ac0a46fSAndroid Build Coastguard Worker if (Premul && alpha_factor > 0)
1379*3ac0a46fSAndroid Build Coastguard Worker v /= alpha_factor;
1380*3ac0a46fSAndroid Build Coastguard Worker
1381*3ac0a46fSAndroid Build Coastguard Worker v /= maximum;
1382*3ac0a46fSAndroid Build Coastguard Worker
1383*3ac0a46fSAndroid Build Coastguard Worker wIn[index] = Reverse ? 1 - v : v;
1384*3ac0a46fSAndroid Build Coastguard Worker }
1385*3ac0a46fSAndroid Build Coastguard Worker
1386*3ac0a46fSAndroid Build Coastguard Worker
1387*3ac0a46fSAndroid Build Coastguard Worker if (Extra == 0 && SwapFirst) {
1388*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number tmp = wIn[0];
1389*3ac0a46fSAndroid Build Coastguard Worker
1390*3ac0a46fSAndroid Build Coastguard Worker memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number));
1391*3ac0a46fSAndroid Build Coastguard Worker wIn[nChan-1] = tmp;
1392*3ac0a46fSAndroid Build Coastguard Worker }
1393*3ac0a46fSAndroid Build Coastguard Worker
1394*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(info -> InputFormat))
1395*3ac0a46fSAndroid Build Coastguard Worker return accum + sizeof(cmsFloat32Number);
1396*3ac0a46fSAndroid Build Coastguard Worker else
1397*3ac0a46fSAndroid Build Coastguard Worker return accum + (nChan + Extra) * sizeof(cmsFloat32Number);
1398*3ac0a46fSAndroid Build Coastguard Worker }
1399*3ac0a46fSAndroid Build Coastguard Worker
1400*3ac0a46fSAndroid Build Coastguard Worker // For anything going from double
1401*3ac0a46fSAndroid Build Coastguard Worker
1402*3ac0a46fSAndroid Build Coastguard Worker static
UnrollDoublesToFloat(_cmsTRANSFORM * info,cmsFloat32Number wIn[],cmsUInt8Number * accum,cmsUInt32Number Stride)1403*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollDoublesToFloat(_cmsTRANSFORM* info,
1404*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number wIn[],
1405*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* accum,
1406*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Stride)
1407*3ac0a46fSAndroid Build Coastguard Worker {
1408*3ac0a46fSAndroid Build Coastguard Worker
1409*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number nChan = T_CHANNELS(info->InputFormat);
1410*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number DoSwap = T_DOSWAP(info->InputFormat);
1411*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Reverse = T_FLAVOR(info->InputFormat);
1412*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapFirst = T_SWAPFIRST(info->InputFormat);
1413*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Extra = T_EXTRA(info->InputFormat);
1414*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst;
1415*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Planar = T_PLANAR(info->InputFormat);
1416*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Premul = T_PREMUL(info->InputFormat);
1417*3ac0a46fSAndroid Build Coastguard Worker cmsFloat64Number v;
1418*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number i, start = 0;
1419*3ac0a46fSAndroid Build Coastguard Worker cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 100.0 : 1.0;
1420*3ac0a46fSAndroid Build Coastguard Worker cmsFloat64Number alpha_factor = 1.0;
1421*3ac0a46fSAndroid Build Coastguard Worker cmsFloat64Number* ptr = (cmsFloat64Number*)accum;
1422*3ac0a46fSAndroid Build Coastguard Worker
1423*3ac0a46fSAndroid Build Coastguard Worker Stride /= PixelSize(info->InputFormat);
1424*3ac0a46fSAndroid Build Coastguard Worker
1425*3ac0a46fSAndroid Build Coastguard Worker if (Premul && Extra)
1426*3ac0a46fSAndroid Build Coastguard Worker {
1427*3ac0a46fSAndroid Build Coastguard Worker if (Planar)
1428*3ac0a46fSAndroid Build Coastguard Worker alpha_factor = (ExtraFirst ? ptr[0] : ptr[(nChan) * Stride]) / maximum;
1429*3ac0a46fSAndroid Build Coastguard Worker else
1430*3ac0a46fSAndroid Build Coastguard Worker alpha_factor = (ExtraFirst ? ptr[0] : ptr[nChan]) / maximum;
1431*3ac0a46fSAndroid Build Coastguard Worker }
1432*3ac0a46fSAndroid Build Coastguard Worker
1433*3ac0a46fSAndroid Build Coastguard Worker if (ExtraFirst)
1434*3ac0a46fSAndroid Build Coastguard Worker start = Extra;
1435*3ac0a46fSAndroid Build Coastguard Worker
1436*3ac0a46fSAndroid Build Coastguard Worker for (i=0; i < nChan; i++) {
1437*3ac0a46fSAndroid Build Coastguard Worker
1438*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i;
1439*3ac0a46fSAndroid Build Coastguard Worker
1440*3ac0a46fSAndroid Build Coastguard Worker if (Planar)
1441*3ac0a46fSAndroid Build Coastguard Worker v = (cmsFloat64Number) ((cmsFloat64Number*) accum)[(i + start) * Stride];
1442*3ac0a46fSAndroid Build Coastguard Worker else
1443*3ac0a46fSAndroid Build Coastguard Worker v = (cmsFloat64Number) ((cmsFloat64Number*) accum)[i + start];
1444*3ac0a46fSAndroid Build Coastguard Worker
1445*3ac0a46fSAndroid Build Coastguard Worker
1446*3ac0a46fSAndroid Build Coastguard Worker if (Premul && alpha_factor > 0)
1447*3ac0a46fSAndroid Build Coastguard Worker v /= alpha_factor;
1448*3ac0a46fSAndroid Build Coastguard Worker
1449*3ac0a46fSAndroid Build Coastguard Worker v /= maximum;
1450*3ac0a46fSAndroid Build Coastguard Worker
1451*3ac0a46fSAndroid Build Coastguard Worker wIn[index] = (cmsFloat32Number) (Reverse ? 1.0 - v : v);
1452*3ac0a46fSAndroid Build Coastguard Worker }
1453*3ac0a46fSAndroid Build Coastguard Worker
1454*3ac0a46fSAndroid Build Coastguard Worker
1455*3ac0a46fSAndroid Build Coastguard Worker if (Extra == 0 && SwapFirst) {
1456*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number tmp = wIn[0];
1457*3ac0a46fSAndroid Build Coastguard Worker
1458*3ac0a46fSAndroid Build Coastguard Worker memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number));
1459*3ac0a46fSAndroid Build Coastguard Worker wIn[nChan-1] = tmp;
1460*3ac0a46fSAndroid Build Coastguard Worker }
1461*3ac0a46fSAndroid Build Coastguard Worker
1462*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(info -> InputFormat))
1463*3ac0a46fSAndroid Build Coastguard Worker return accum + sizeof(cmsFloat64Number);
1464*3ac0a46fSAndroid Build Coastguard Worker else
1465*3ac0a46fSAndroid Build Coastguard Worker return accum + (nChan + Extra) * sizeof(cmsFloat64Number);
1466*3ac0a46fSAndroid Build Coastguard Worker }
1467*3ac0a46fSAndroid Build Coastguard Worker
1468*3ac0a46fSAndroid Build Coastguard Worker
1469*3ac0a46fSAndroid Build Coastguard Worker
1470*3ac0a46fSAndroid Build Coastguard Worker // From Lab double to cmsFloat32Number
1471*3ac0a46fSAndroid Build Coastguard Worker static
UnrollLabDoubleToFloat(_cmsTRANSFORM * info,cmsFloat32Number wIn[],cmsUInt8Number * accum,cmsUInt32Number Stride)1472*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollLabDoubleToFloat(_cmsTRANSFORM* info,
1473*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number wIn[],
1474*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* accum,
1475*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Stride)
1476*3ac0a46fSAndroid Build Coastguard Worker {
1477*3ac0a46fSAndroid Build Coastguard Worker cmsFloat64Number* Pt = (cmsFloat64Number*) accum;
1478*3ac0a46fSAndroid Build Coastguard Worker
1479*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(info -> InputFormat)) {
1480*3ac0a46fSAndroid Build Coastguard Worker
1481*3ac0a46fSAndroid Build Coastguard Worker Stride /= PixelSize(info->InputFormat);
1482*3ac0a46fSAndroid Build Coastguard Worker
1483*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1
1484*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = (cmsFloat32Number) ((Pt[Stride] + 128) / 255.0); // form -128..+127 to 0..1
1485*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = (cmsFloat32Number) ((Pt[Stride*2] + 128) / 255.0);
1486*3ac0a46fSAndroid Build Coastguard Worker
1487*3ac0a46fSAndroid Build Coastguard Worker return accum + sizeof(cmsFloat64Number);
1488*3ac0a46fSAndroid Build Coastguard Worker }
1489*3ac0a46fSAndroid Build Coastguard Worker else {
1490*3ac0a46fSAndroid Build Coastguard Worker
1491*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1
1492*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = (cmsFloat32Number) ((Pt[1] + 128) / 255.0); // form -128..+127 to 0..1
1493*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = (cmsFloat32Number) ((Pt[2] + 128) / 255.0);
1494*3ac0a46fSAndroid Build Coastguard Worker
1495*3ac0a46fSAndroid Build Coastguard Worker accum += sizeof(cmsFloat64Number)*(3 + T_EXTRA(info ->InputFormat));
1496*3ac0a46fSAndroid Build Coastguard Worker return accum;
1497*3ac0a46fSAndroid Build Coastguard Worker }
1498*3ac0a46fSAndroid Build Coastguard Worker }
1499*3ac0a46fSAndroid Build Coastguard Worker
1500*3ac0a46fSAndroid Build Coastguard Worker // From Lab double to cmsFloat32Number
1501*3ac0a46fSAndroid Build Coastguard Worker static
UnrollLabFloatToFloat(_cmsTRANSFORM * info,cmsFloat32Number wIn[],cmsUInt8Number * accum,cmsUInt32Number Stride)1502*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollLabFloatToFloat(_cmsTRANSFORM* info,
1503*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number wIn[],
1504*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* accum,
1505*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Stride)
1506*3ac0a46fSAndroid Build Coastguard Worker {
1507*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number* Pt = (cmsFloat32Number*) accum;
1508*3ac0a46fSAndroid Build Coastguard Worker
1509*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(info -> InputFormat)) {
1510*3ac0a46fSAndroid Build Coastguard Worker
1511*3ac0a46fSAndroid Build Coastguard Worker Stride /= PixelSize(info->InputFormat);
1512*3ac0a46fSAndroid Build Coastguard Worker
1513*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1
1514*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = (cmsFloat32Number) ((Pt[Stride] + 128) / 255.0); // form -128..+127 to 0..1
1515*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = (cmsFloat32Number) ((Pt[Stride*2] + 128) / 255.0);
1516*3ac0a46fSAndroid Build Coastguard Worker
1517*3ac0a46fSAndroid Build Coastguard Worker return accum + sizeof(cmsFloat32Number);
1518*3ac0a46fSAndroid Build Coastguard Worker }
1519*3ac0a46fSAndroid Build Coastguard Worker else {
1520*3ac0a46fSAndroid Build Coastguard Worker
1521*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1
1522*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = (cmsFloat32Number) ((Pt[1] + 128) / 255.0); // form -128..+127 to 0..1
1523*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = (cmsFloat32Number) ((Pt[2] + 128) / 255.0);
1524*3ac0a46fSAndroid Build Coastguard Worker
1525*3ac0a46fSAndroid Build Coastguard Worker accum += sizeof(cmsFloat32Number)*(3 + T_EXTRA(info ->InputFormat));
1526*3ac0a46fSAndroid Build Coastguard Worker return accum;
1527*3ac0a46fSAndroid Build Coastguard Worker }
1528*3ac0a46fSAndroid Build Coastguard Worker }
1529*3ac0a46fSAndroid Build Coastguard Worker
1530*3ac0a46fSAndroid Build Coastguard Worker // 1.15 fixed point, that means maximum value is MAX_ENCODEABLE_XYZ (0xFFFF)
1531*3ac0a46fSAndroid Build Coastguard Worker static
UnrollXYZDoubleToFloat(_cmsTRANSFORM * info,cmsFloat32Number wIn[],cmsUInt8Number * accum,cmsUInt32Number Stride)1532*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollXYZDoubleToFloat(_cmsTRANSFORM* info,
1533*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number wIn[],
1534*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* accum,
1535*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Stride)
1536*3ac0a46fSAndroid Build Coastguard Worker {
1537*3ac0a46fSAndroid Build Coastguard Worker cmsFloat64Number* Pt = (cmsFloat64Number*) accum;
1538*3ac0a46fSAndroid Build Coastguard Worker
1539*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(info -> InputFormat)) {
1540*3ac0a46fSAndroid Build Coastguard Worker
1541*3ac0a46fSAndroid Build Coastguard Worker Stride /= PixelSize(info->InputFormat);
1542*3ac0a46fSAndroid Build Coastguard Worker
1543*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ);
1544*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = (cmsFloat32Number) (Pt[Stride] / MAX_ENCODEABLE_XYZ);
1545*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = (cmsFloat32Number) (Pt[Stride*2] / MAX_ENCODEABLE_XYZ);
1546*3ac0a46fSAndroid Build Coastguard Worker
1547*3ac0a46fSAndroid Build Coastguard Worker return accum + sizeof(cmsFloat64Number);
1548*3ac0a46fSAndroid Build Coastguard Worker }
1549*3ac0a46fSAndroid Build Coastguard Worker else {
1550*3ac0a46fSAndroid Build Coastguard Worker
1551*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ);
1552*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = (cmsFloat32Number) (Pt[1] / MAX_ENCODEABLE_XYZ);
1553*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = (cmsFloat32Number) (Pt[2] / MAX_ENCODEABLE_XYZ);
1554*3ac0a46fSAndroid Build Coastguard Worker
1555*3ac0a46fSAndroid Build Coastguard Worker accum += sizeof(cmsFloat64Number)*(3 + T_EXTRA(info ->InputFormat));
1556*3ac0a46fSAndroid Build Coastguard Worker return accum;
1557*3ac0a46fSAndroid Build Coastguard Worker }
1558*3ac0a46fSAndroid Build Coastguard Worker }
1559*3ac0a46fSAndroid Build Coastguard Worker
1560*3ac0a46fSAndroid Build Coastguard Worker static
UnrollXYZFloatToFloat(_cmsTRANSFORM * info,cmsFloat32Number wIn[],cmsUInt8Number * accum,cmsUInt32Number Stride)1561*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollXYZFloatToFloat(_cmsTRANSFORM* info,
1562*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number wIn[],
1563*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* accum,
1564*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Stride)
1565*3ac0a46fSAndroid Build Coastguard Worker {
1566*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number* Pt = (cmsFloat32Number*) accum;
1567*3ac0a46fSAndroid Build Coastguard Worker
1568*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(info -> InputFormat)) {
1569*3ac0a46fSAndroid Build Coastguard Worker
1570*3ac0a46fSAndroid Build Coastguard Worker Stride /= PixelSize(info->InputFormat);
1571*3ac0a46fSAndroid Build Coastguard Worker
1572*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ);
1573*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = (cmsFloat32Number) (Pt[Stride] / MAX_ENCODEABLE_XYZ);
1574*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = (cmsFloat32Number) (Pt[Stride*2] / MAX_ENCODEABLE_XYZ);
1575*3ac0a46fSAndroid Build Coastguard Worker
1576*3ac0a46fSAndroid Build Coastguard Worker return accum + sizeof(cmsFloat32Number);
1577*3ac0a46fSAndroid Build Coastguard Worker }
1578*3ac0a46fSAndroid Build Coastguard Worker else {
1579*3ac0a46fSAndroid Build Coastguard Worker
1580*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ);
1581*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = (cmsFloat32Number) (Pt[1] / MAX_ENCODEABLE_XYZ);
1582*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = (cmsFloat32Number) (Pt[2] / MAX_ENCODEABLE_XYZ);
1583*3ac0a46fSAndroid Build Coastguard Worker
1584*3ac0a46fSAndroid Build Coastguard Worker accum += sizeof(cmsFloat32Number)*(3 + T_EXTRA(info ->InputFormat));
1585*3ac0a46fSAndroid Build Coastguard Worker return accum;
1586*3ac0a46fSAndroid Build Coastguard Worker }
1587*3ac0a46fSAndroid Build Coastguard Worker }
1588*3ac0a46fSAndroid Build Coastguard Worker
1589*3ac0a46fSAndroid Build Coastguard Worker
lab4toFloat(cmsFloat32Number wIn[],cmsUInt16Number lab4[3])1590*3ac0a46fSAndroid Build Coastguard Worker cmsINLINE void lab4toFloat(cmsFloat32Number wIn[], cmsUInt16Number lab4[3])
1591*3ac0a46fSAndroid Build Coastguard Worker {
1592*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number L = (cmsFloat32Number) lab4[0] / 655.35F;
1593*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number a = ((cmsFloat32Number) lab4[1] / 257.0F) - 128.0F;
1594*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number b = ((cmsFloat32Number) lab4[2] / 257.0F) - 128.0F;
1595*3ac0a46fSAndroid Build Coastguard Worker
1596*3ac0a46fSAndroid Build Coastguard Worker wIn[0] = (L / 100.0F); // from 0..100 to 0..1
1597*3ac0a46fSAndroid Build Coastguard Worker wIn[1] = ((a + 128.0F) / 255.0F); // form -128..+127 to 0..1
1598*3ac0a46fSAndroid Build Coastguard Worker wIn[2] = ((b + 128.0F) / 255.0F);
1599*3ac0a46fSAndroid Build Coastguard Worker
1600*3ac0a46fSAndroid Build Coastguard Worker }
1601*3ac0a46fSAndroid Build Coastguard Worker
1602*3ac0a46fSAndroid Build Coastguard Worker static
UnrollLabV2_8ToFloat(_cmsTRANSFORM * info,cmsFloat32Number wIn[],cmsUInt8Number * accum,cmsUInt32Number Stride)1603*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollLabV2_8ToFloat(_cmsTRANSFORM* info,
1604*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number wIn[],
1605*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* accum,
1606*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Stride)
1607*3ac0a46fSAndroid Build Coastguard Worker {
1608*3ac0a46fSAndroid Build Coastguard Worker cmsUInt16Number lab4[3];
1609*3ac0a46fSAndroid Build Coastguard Worker
1610*3ac0a46fSAndroid Build Coastguard Worker lab4[0] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // L
1611*3ac0a46fSAndroid Build Coastguard Worker lab4[1] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // a
1612*3ac0a46fSAndroid Build Coastguard Worker lab4[2] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // b
1613*3ac0a46fSAndroid Build Coastguard Worker
1614*3ac0a46fSAndroid Build Coastguard Worker lab4toFloat(wIn, lab4);
1615*3ac0a46fSAndroid Build Coastguard Worker
1616*3ac0a46fSAndroid Build Coastguard Worker return accum;
1617*3ac0a46fSAndroid Build Coastguard Worker
1618*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
1619*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
1620*3ac0a46fSAndroid Build Coastguard Worker }
1621*3ac0a46fSAndroid Build Coastguard Worker
1622*3ac0a46fSAndroid Build Coastguard Worker static
UnrollALabV2_8ToFloat(_cmsTRANSFORM * info,cmsFloat32Number wIn[],cmsUInt8Number * accum,cmsUInt32Number Stride)1623*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollALabV2_8ToFloat(_cmsTRANSFORM* info,
1624*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number wIn[],
1625*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* accum,
1626*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Stride)
1627*3ac0a46fSAndroid Build Coastguard Worker {
1628*3ac0a46fSAndroid Build Coastguard Worker cmsUInt16Number lab4[3];
1629*3ac0a46fSAndroid Build Coastguard Worker
1630*3ac0a46fSAndroid Build Coastguard Worker accum++; // A
1631*3ac0a46fSAndroid Build Coastguard Worker lab4[0] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // L
1632*3ac0a46fSAndroid Build Coastguard Worker lab4[1] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // a
1633*3ac0a46fSAndroid Build Coastguard Worker lab4[2] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // b
1634*3ac0a46fSAndroid Build Coastguard Worker
1635*3ac0a46fSAndroid Build Coastguard Worker lab4toFloat(wIn, lab4);
1636*3ac0a46fSAndroid Build Coastguard Worker
1637*3ac0a46fSAndroid Build Coastguard Worker return accum;
1638*3ac0a46fSAndroid Build Coastguard Worker
1639*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
1640*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
1641*3ac0a46fSAndroid Build Coastguard Worker }
1642*3ac0a46fSAndroid Build Coastguard Worker
1643*3ac0a46fSAndroid Build Coastguard Worker static
UnrollLabV2_16ToFloat(_cmsTRANSFORM * info,cmsFloat32Number wIn[],cmsUInt8Number * accum,cmsUInt32Number Stride)1644*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollLabV2_16ToFloat(_cmsTRANSFORM* info,
1645*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number wIn[],
1646*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* accum,
1647*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Stride)
1648*3ac0a46fSAndroid Build Coastguard Worker {
1649*3ac0a46fSAndroid Build Coastguard Worker cmsUInt16Number lab4[3];
1650*3ac0a46fSAndroid Build Coastguard Worker
1651*3ac0a46fSAndroid Build Coastguard Worker lab4[0] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // L
1652*3ac0a46fSAndroid Build Coastguard Worker lab4[1] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // a
1653*3ac0a46fSAndroid Build Coastguard Worker lab4[2] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // b
1654*3ac0a46fSAndroid Build Coastguard Worker
1655*3ac0a46fSAndroid Build Coastguard Worker lab4toFloat(wIn, lab4);
1656*3ac0a46fSAndroid Build Coastguard Worker
1657*3ac0a46fSAndroid Build Coastguard Worker return accum;
1658*3ac0a46fSAndroid Build Coastguard Worker
1659*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
1660*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
1661*3ac0a46fSAndroid Build Coastguard Worker }
1662*3ac0a46fSAndroid Build Coastguard Worker
1663*3ac0a46fSAndroid Build Coastguard Worker
1664*3ac0a46fSAndroid Build Coastguard Worker // Packing routines -----------------------------------------------------------------------------------------------------------
1665*3ac0a46fSAndroid Build Coastguard Worker
1666*3ac0a46fSAndroid Build Coastguard Worker
1667*3ac0a46fSAndroid Build Coastguard Worker // Generic chunky for byte
1668*3ac0a46fSAndroid Build Coastguard Worker static
PackChunkyBytes(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)1669*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* PackChunkyBytes(CMSREGISTER _cmsTRANSFORM* info,
1670*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
1671*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
1672*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
1673*3ac0a46fSAndroid Build Coastguard Worker {
1674*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat);
1675*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat);
1676*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat);
1677*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Extra = T_EXTRA(info->OutputFormat);
1678*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat);
1679*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Premul = T_PREMUL(info->OutputFormat);
1680*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst;
1681*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* swap1;
1682*3ac0a46fSAndroid Build Coastguard Worker cmsUInt16Number v = 0;
1683*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number i;
1684*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number alpha_factor = 0;
1685*3ac0a46fSAndroid Build Coastguard Worker
1686*3ac0a46fSAndroid Build Coastguard Worker swap1 = output;
1687*3ac0a46fSAndroid Build Coastguard Worker
1688*3ac0a46fSAndroid Build Coastguard Worker if (ExtraFirst) {
1689*3ac0a46fSAndroid Build Coastguard Worker
1690*3ac0a46fSAndroid Build Coastguard Worker if (Premul && Extra)
1691*3ac0a46fSAndroid Build Coastguard Worker alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(output[0]));
1692*3ac0a46fSAndroid Build Coastguard Worker
1693*3ac0a46fSAndroid Build Coastguard Worker output += Extra;
1694*3ac0a46fSAndroid Build Coastguard Worker }
1695*3ac0a46fSAndroid Build Coastguard Worker else
1696*3ac0a46fSAndroid Build Coastguard Worker {
1697*3ac0a46fSAndroid Build Coastguard Worker if (Premul && Extra)
1698*3ac0a46fSAndroid Build Coastguard Worker alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(output[nChan]));
1699*3ac0a46fSAndroid Build Coastguard Worker }
1700*3ac0a46fSAndroid Build Coastguard Worker
1701*3ac0a46fSAndroid Build Coastguard Worker for (i=0; i < nChan; i++) {
1702*3ac0a46fSAndroid Build Coastguard Worker
1703*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i;
1704*3ac0a46fSAndroid Build Coastguard Worker
1705*3ac0a46fSAndroid Build Coastguard Worker v = wOut[index];
1706*3ac0a46fSAndroid Build Coastguard Worker
1707*3ac0a46fSAndroid Build Coastguard Worker if (Reverse)
1708*3ac0a46fSAndroid Build Coastguard Worker v = REVERSE_FLAVOR_16(v);
1709*3ac0a46fSAndroid Build Coastguard Worker
1710*3ac0a46fSAndroid Build Coastguard Worker if (Premul)
1711*3ac0a46fSAndroid Build Coastguard Worker {
1712*3ac0a46fSAndroid Build Coastguard Worker v = (cmsUInt16Number)((cmsUInt32Number)((cmsUInt32Number)v * alpha_factor + 0x8000) >> 16);
1713*3ac0a46fSAndroid Build Coastguard Worker }
1714*3ac0a46fSAndroid Build Coastguard Worker
1715*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(v);
1716*3ac0a46fSAndroid Build Coastguard Worker }
1717*3ac0a46fSAndroid Build Coastguard Worker
1718*3ac0a46fSAndroid Build Coastguard Worker if (!ExtraFirst) {
1719*3ac0a46fSAndroid Build Coastguard Worker output += Extra;
1720*3ac0a46fSAndroid Build Coastguard Worker }
1721*3ac0a46fSAndroid Build Coastguard Worker
1722*3ac0a46fSAndroid Build Coastguard Worker if (Extra == 0 && SwapFirst) {
1723*3ac0a46fSAndroid Build Coastguard Worker
1724*3ac0a46fSAndroid Build Coastguard Worker memmove(swap1 + 1, swap1, nChan-1);
1725*3ac0a46fSAndroid Build Coastguard Worker *swap1 = FROM_16_TO_8(v);
1726*3ac0a46fSAndroid Build Coastguard Worker }
1727*3ac0a46fSAndroid Build Coastguard Worker
1728*3ac0a46fSAndroid Build Coastguard Worker return output;
1729*3ac0a46fSAndroid Build Coastguard Worker
1730*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
1731*3ac0a46fSAndroid Build Coastguard Worker }
1732*3ac0a46fSAndroid Build Coastguard Worker
1733*3ac0a46fSAndroid Build Coastguard Worker static
PackChunkyWords(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)1734*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* PackChunkyWords(CMSREGISTER _cmsTRANSFORM* info,
1735*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
1736*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
1737*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
1738*3ac0a46fSAndroid Build Coastguard Worker {
1739*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat);
1740*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapEndian = T_ENDIAN16(info->OutputFormat);
1741*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat);
1742*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat);
1743*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Extra = T_EXTRA(info->OutputFormat);
1744*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat);
1745*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Premul = T_PREMUL(info->OutputFormat);
1746*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst;
1747*3ac0a46fSAndroid Build Coastguard Worker cmsUInt16Number* swap1;
1748*3ac0a46fSAndroid Build Coastguard Worker cmsUInt16Number v = 0;
1749*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number i;
1750*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number alpha_factor = 0;
1751*3ac0a46fSAndroid Build Coastguard Worker
1752*3ac0a46fSAndroid Build Coastguard Worker swap1 = (cmsUInt16Number*) output;
1753*3ac0a46fSAndroid Build Coastguard Worker
1754*3ac0a46fSAndroid Build Coastguard Worker if (ExtraFirst) {
1755*3ac0a46fSAndroid Build Coastguard Worker
1756*3ac0a46fSAndroid Build Coastguard Worker if (Premul && Extra)
1757*3ac0a46fSAndroid Build Coastguard Worker alpha_factor = _cmsToFixedDomain(*(cmsUInt16Number*) output);
1758*3ac0a46fSAndroid Build Coastguard Worker
1759*3ac0a46fSAndroid Build Coastguard Worker output += Extra * sizeof(cmsUInt16Number);
1760*3ac0a46fSAndroid Build Coastguard Worker }
1761*3ac0a46fSAndroid Build Coastguard Worker else
1762*3ac0a46fSAndroid Build Coastguard Worker {
1763*3ac0a46fSAndroid Build Coastguard Worker if (Premul && Extra)
1764*3ac0a46fSAndroid Build Coastguard Worker alpha_factor = _cmsToFixedDomain(((cmsUInt16Number*) output)[nChan]);
1765*3ac0a46fSAndroid Build Coastguard Worker }
1766*3ac0a46fSAndroid Build Coastguard Worker
1767*3ac0a46fSAndroid Build Coastguard Worker for (i=0; i < nChan; i++) {
1768*3ac0a46fSAndroid Build Coastguard Worker
1769*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i;
1770*3ac0a46fSAndroid Build Coastguard Worker
1771*3ac0a46fSAndroid Build Coastguard Worker v = wOut[index];
1772*3ac0a46fSAndroid Build Coastguard Worker
1773*3ac0a46fSAndroid Build Coastguard Worker if (SwapEndian)
1774*3ac0a46fSAndroid Build Coastguard Worker v = CHANGE_ENDIAN(v);
1775*3ac0a46fSAndroid Build Coastguard Worker
1776*3ac0a46fSAndroid Build Coastguard Worker if (Reverse)
1777*3ac0a46fSAndroid Build Coastguard Worker v = REVERSE_FLAVOR_16(v);
1778*3ac0a46fSAndroid Build Coastguard Worker
1779*3ac0a46fSAndroid Build Coastguard Worker if (Premul)
1780*3ac0a46fSAndroid Build Coastguard Worker {
1781*3ac0a46fSAndroid Build Coastguard Worker v = (cmsUInt16Number)((cmsUInt32Number)((cmsUInt32Number)v * alpha_factor + 0x8000) >> 16);
1782*3ac0a46fSAndroid Build Coastguard Worker }
1783*3ac0a46fSAndroid Build Coastguard Worker
1784*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = v;
1785*3ac0a46fSAndroid Build Coastguard Worker
1786*3ac0a46fSAndroid Build Coastguard Worker output += sizeof(cmsUInt16Number);
1787*3ac0a46fSAndroid Build Coastguard Worker }
1788*3ac0a46fSAndroid Build Coastguard Worker
1789*3ac0a46fSAndroid Build Coastguard Worker if (!ExtraFirst) {
1790*3ac0a46fSAndroid Build Coastguard Worker output += Extra * sizeof(cmsUInt16Number);
1791*3ac0a46fSAndroid Build Coastguard Worker }
1792*3ac0a46fSAndroid Build Coastguard Worker
1793*3ac0a46fSAndroid Build Coastguard Worker if (Extra == 0 && SwapFirst) {
1794*3ac0a46fSAndroid Build Coastguard Worker
1795*3ac0a46fSAndroid Build Coastguard Worker memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsUInt16Number));
1796*3ac0a46fSAndroid Build Coastguard Worker *swap1 = v;
1797*3ac0a46fSAndroid Build Coastguard Worker }
1798*3ac0a46fSAndroid Build Coastguard Worker
1799*3ac0a46fSAndroid Build Coastguard Worker return output;
1800*3ac0a46fSAndroid Build Coastguard Worker
1801*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
1802*3ac0a46fSAndroid Build Coastguard Worker }
1803*3ac0a46fSAndroid Build Coastguard Worker
1804*3ac0a46fSAndroid Build Coastguard Worker
1805*3ac0a46fSAndroid Build Coastguard Worker
1806*3ac0a46fSAndroid Build Coastguard Worker static
PackPlanarBytes(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)1807*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* PackPlanarBytes(CMSREGISTER _cmsTRANSFORM* info,
1808*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
1809*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
1810*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
1811*3ac0a46fSAndroid Build Coastguard Worker {
1812*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat);
1813*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat);
1814*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat);
1815*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat);
1816*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Extra = T_EXTRA(info->OutputFormat);
1817*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst;
1818*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Premul = T_PREMUL(info->OutputFormat);
1819*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number i;
1820*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Init = output;
1821*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number alpha_factor = 0;
1822*3ac0a46fSAndroid Build Coastguard Worker
1823*3ac0a46fSAndroid Build Coastguard Worker
1824*3ac0a46fSAndroid Build Coastguard Worker if (ExtraFirst) {
1825*3ac0a46fSAndroid Build Coastguard Worker
1826*3ac0a46fSAndroid Build Coastguard Worker if (Premul && Extra)
1827*3ac0a46fSAndroid Build Coastguard Worker alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(output[0]));
1828*3ac0a46fSAndroid Build Coastguard Worker
1829*3ac0a46fSAndroid Build Coastguard Worker output += Extra * Stride;
1830*3ac0a46fSAndroid Build Coastguard Worker }
1831*3ac0a46fSAndroid Build Coastguard Worker else
1832*3ac0a46fSAndroid Build Coastguard Worker {
1833*3ac0a46fSAndroid Build Coastguard Worker if (Premul && Extra)
1834*3ac0a46fSAndroid Build Coastguard Worker alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(output[nChan * Stride]));
1835*3ac0a46fSAndroid Build Coastguard Worker }
1836*3ac0a46fSAndroid Build Coastguard Worker
1837*3ac0a46fSAndroid Build Coastguard Worker
1838*3ac0a46fSAndroid Build Coastguard Worker for (i=0; i < nChan; i++) {
1839*3ac0a46fSAndroid Build Coastguard Worker
1840*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i;
1841*3ac0a46fSAndroid Build Coastguard Worker cmsUInt16Number v = wOut[index];
1842*3ac0a46fSAndroid Build Coastguard Worker
1843*3ac0a46fSAndroid Build Coastguard Worker if (Reverse)
1844*3ac0a46fSAndroid Build Coastguard Worker v = REVERSE_FLAVOR_16(v);
1845*3ac0a46fSAndroid Build Coastguard Worker
1846*3ac0a46fSAndroid Build Coastguard Worker if (Premul)
1847*3ac0a46fSAndroid Build Coastguard Worker {
1848*3ac0a46fSAndroid Build Coastguard Worker v = (cmsUInt16Number)((cmsUInt32Number)((cmsUInt32Number)v * alpha_factor + 0x8000) >> 16);
1849*3ac0a46fSAndroid Build Coastguard Worker }
1850*3ac0a46fSAndroid Build Coastguard Worker
1851*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt8Number*)output = FROM_16_TO_8(v);
1852*3ac0a46fSAndroid Build Coastguard Worker
1853*3ac0a46fSAndroid Build Coastguard Worker output += Stride;
1854*3ac0a46fSAndroid Build Coastguard Worker }
1855*3ac0a46fSAndroid Build Coastguard Worker
1856*3ac0a46fSAndroid Build Coastguard Worker return (Init + 1);
1857*3ac0a46fSAndroid Build Coastguard Worker
1858*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
1859*3ac0a46fSAndroid Build Coastguard Worker }
1860*3ac0a46fSAndroid Build Coastguard Worker
1861*3ac0a46fSAndroid Build Coastguard Worker
1862*3ac0a46fSAndroid Build Coastguard Worker static
PackPlanarWords(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)1863*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* PackPlanarWords(CMSREGISTER _cmsTRANSFORM* info,
1864*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
1865*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
1866*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
1867*3ac0a46fSAndroid Build Coastguard Worker {
1868*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat);
1869*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat);
1870*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat);
1871*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat);
1872*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Extra = T_EXTRA(info->OutputFormat);
1873*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst;
1874*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Premul = T_PREMUL(info->OutputFormat);
1875*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapEndian = T_ENDIAN16(info->OutputFormat);
1876*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number i;
1877*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Init = output;
1878*3ac0a46fSAndroid Build Coastguard Worker cmsUInt16Number v;
1879*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number alpha_factor = 0;
1880*3ac0a46fSAndroid Build Coastguard Worker
1881*3ac0a46fSAndroid Build Coastguard Worker if (ExtraFirst) {
1882*3ac0a46fSAndroid Build Coastguard Worker
1883*3ac0a46fSAndroid Build Coastguard Worker if (Premul && Extra)
1884*3ac0a46fSAndroid Build Coastguard Worker alpha_factor = _cmsToFixedDomain(((cmsUInt16Number*) output)[0]);
1885*3ac0a46fSAndroid Build Coastguard Worker
1886*3ac0a46fSAndroid Build Coastguard Worker output += Extra * Stride;
1887*3ac0a46fSAndroid Build Coastguard Worker }
1888*3ac0a46fSAndroid Build Coastguard Worker else
1889*3ac0a46fSAndroid Build Coastguard Worker {
1890*3ac0a46fSAndroid Build Coastguard Worker if (Premul && Extra)
1891*3ac0a46fSAndroid Build Coastguard Worker alpha_factor = _cmsToFixedDomain(((cmsUInt16Number*)output)[nChan * Stride]);
1892*3ac0a46fSAndroid Build Coastguard Worker }
1893*3ac0a46fSAndroid Build Coastguard Worker
1894*3ac0a46fSAndroid Build Coastguard Worker for (i=0; i < nChan; i++) {
1895*3ac0a46fSAndroid Build Coastguard Worker
1896*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i;
1897*3ac0a46fSAndroid Build Coastguard Worker
1898*3ac0a46fSAndroid Build Coastguard Worker v = wOut[index];
1899*3ac0a46fSAndroid Build Coastguard Worker
1900*3ac0a46fSAndroid Build Coastguard Worker if (SwapEndian)
1901*3ac0a46fSAndroid Build Coastguard Worker v = CHANGE_ENDIAN(v);
1902*3ac0a46fSAndroid Build Coastguard Worker
1903*3ac0a46fSAndroid Build Coastguard Worker if (Reverse)
1904*3ac0a46fSAndroid Build Coastguard Worker v = REVERSE_FLAVOR_16(v);
1905*3ac0a46fSAndroid Build Coastguard Worker
1906*3ac0a46fSAndroid Build Coastguard Worker if (Premul)
1907*3ac0a46fSAndroid Build Coastguard Worker {
1908*3ac0a46fSAndroid Build Coastguard Worker v = (cmsUInt16Number)((cmsUInt32Number)((cmsUInt32Number)v * alpha_factor + 0x8000) >> 16);
1909*3ac0a46fSAndroid Build Coastguard Worker }
1910*3ac0a46fSAndroid Build Coastguard Worker
1911*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = v;
1912*3ac0a46fSAndroid Build Coastguard Worker output += Stride;
1913*3ac0a46fSAndroid Build Coastguard Worker }
1914*3ac0a46fSAndroid Build Coastguard Worker
1915*3ac0a46fSAndroid Build Coastguard Worker return (Init + sizeof(cmsUInt16Number));
1916*3ac0a46fSAndroid Build Coastguard Worker }
1917*3ac0a46fSAndroid Build Coastguard Worker
1918*3ac0a46fSAndroid Build Coastguard Worker // CMYKcm (unrolled for speed)
1919*3ac0a46fSAndroid Build Coastguard Worker
1920*3ac0a46fSAndroid Build Coastguard Worker static
Pack6Bytes(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)1921*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack6Bytes(CMSREGISTER _cmsTRANSFORM* info,
1922*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
1923*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
1924*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
1925*3ac0a46fSAndroid Build Coastguard Worker {
1926*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[0]);
1927*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[1]);
1928*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[2]);
1929*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[3]);
1930*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[4]);
1931*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[5]);
1932*3ac0a46fSAndroid Build Coastguard Worker
1933*3ac0a46fSAndroid Build Coastguard Worker return output;
1934*3ac0a46fSAndroid Build Coastguard Worker
1935*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
1936*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
1937*3ac0a46fSAndroid Build Coastguard Worker }
1938*3ac0a46fSAndroid Build Coastguard Worker
1939*3ac0a46fSAndroid Build Coastguard Worker // KCMYcm
1940*3ac0a46fSAndroid Build Coastguard Worker
1941*3ac0a46fSAndroid Build Coastguard Worker static
Pack6BytesSwap(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)1942*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack6BytesSwap(CMSREGISTER _cmsTRANSFORM* info,
1943*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
1944*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
1945*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
1946*3ac0a46fSAndroid Build Coastguard Worker {
1947*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[5]);
1948*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[4]);
1949*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[3]);
1950*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[2]);
1951*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[1]);
1952*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[0]);
1953*3ac0a46fSAndroid Build Coastguard Worker
1954*3ac0a46fSAndroid Build Coastguard Worker return output;
1955*3ac0a46fSAndroid Build Coastguard Worker
1956*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
1957*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
1958*3ac0a46fSAndroid Build Coastguard Worker }
1959*3ac0a46fSAndroid Build Coastguard Worker
1960*3ac0a46fSAndroid Build Coastguard Worker // CMYKcm
1961*3ac0a46fSAndroid Build Coastguard Worker static
Pack6Words(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)1962*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack6Words(CMSREGISTER _cmsTRANSFORM* info,
1963*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
1964*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
1965*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
1966*3ac0a46fSAndroid Build Coastguard Worker {
1967*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[0];
1968*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
1969*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[1];
1970*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
1971*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[2];
1972*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
1973*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[3];
1974*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
1975*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[4];
1976*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
1977*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[5];
1978*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
1979*3ac0a46fSAndroid Build Coastguard Worker
1980*3ac0a46fSAndroid Build Coastguard Worker return output;
1981*3ac0a46fSAndroid Build Coastguard Worker
1982*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
1983*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
1984*3ac0a46fSAndroid Build Coastguard Worker }
1985*3ac0a46fSAndroid Build Coastguard Worker
1986*3ac0a46fSAndroid Build Coastguard Worker // KCMYcm
1987*3ac0a46fSAndroid Build Coastguard Worker static
Pack6WordsSwap(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)1988*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack6WordsSwap(CMSREGISTER _cmsTRANSFORM* info,
1989*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
1990*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
1991*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
1992*3ac0a46fSAndroid Build Coastguard Worker {
1993*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[5];
1994*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
1995*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[4];
1996*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
1997*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[3];
1998*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
1999*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[2];
2000*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2001*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[1];
2002*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2003*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[0];
2004*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2005*3ac0a46fSAndroid Build Coastguard Worker
2006*3ac0a46fSAndroid Build Coastguard Worker return output;
2007*3ac0a46fSAndroid Build Coastguard Worker
2008*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2009*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2010*3ac0a46fSAndroid Build Coastguard Worker }
2011*3ac0a46fSAndroid Build Coastguard Worker
2012*3ac0a46fSAndroid Build Coastguard Worker
2013*3ac0a46fSAndroid Build Coastguard Worker static
Pack4Bytes(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2014*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack4Bytes(CMSREGISTER _cmsTRANSFORM* info,
2015*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2016*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2017*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2018*3ac0a46fSAndroid Build Coastguard Worker {
2019*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[0]);
2020*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[1]);
2021*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[2]);
2022*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[3]);
2023*3ac0a46fSAndroid Build Coastguard Worker
2024*3ac0a46fSAndroid Build Coastguard Worker return output;
2025*3ac0a46fSAndroid Build Coastguard Worker
2026*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2027*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2028*3ac0a46fSAndroid Build Coastguard Worker }
2029*3ac0a46fSAndroid Build Coastguard Worker
2030*3ac0a46fSAndroid Build Coastguard Worker static
Pack4BytesReverse(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2031*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack4BytesReverse(CMSREGISTER _cmsTRANSFORM* info,
2032*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2033*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2034*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2035*3ac0a46fSAndroid Build Coastguard Worker {
2036*3ac0a46fSAndroid Build Coastguard Worker *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[0]));
2037*3ac0a46fSAndroid Build Coastguard Worker *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[1]));
2038*3ac0a46fSAndroid Build Coastguard Worker *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[2]));
2039*3ac0a46fSAndroid Build Coastguard Worker *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[3]));
2040*3ac0a46fSAndroid Build Coastguard Worker
2041*3ac0a46fSAndroid Build Coastguard Worker return output;
2042*3ac0a46fSAndroid Build Coastguard Worker
2043*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2044*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2045*3ac0a46fSAndroid Build Coastguard Worker }
2046*3ac0a46fSAndroid Build Coastguard Worker
2047*3ac0a46fSAndroid Build Coastguard Worker
2048*3ac0a46fSAndroid Build Coastguard Worker static
Pack4BytesSwapFirst(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2049*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack4BytesSwapFirst(CMSREGISTER _cmsTRANSFORM* info,
2050*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2051*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2052*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2053*3ac0a46fSAndroid Build Coastguard Worker {
2054*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[3]);
2055*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[0]);
2056*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[1]);
2057*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[2]);
2058*3ac0a46fSAndroid Build Coastguard Worker
2059*3ac0a46fSAndroid Build Coastguard Worker return output;
2060*3ac0a46fSAndroid Build Coastguard Worker
2061*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2062*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2063*3ac0a46fSAndroid Build Coastguard Worker }
2064*3ac0a46fSAndroid Build Coastguard Worker
2065*3ac0a46fSAndroid Build Coastguard Worker // ABGR
2066*3ac0a46fSAndroid Build Coastguard Worker static
Pack4BytesSwap(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2067*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack4BytesSwap(CMSREGISTER _cmsTRANSFORM* info,
2068*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2069*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2070*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2071*3ac0a46fSAndroid Build Coastguard Worker {
2072*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[3]);
2073*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[2]);
2074*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[1]);
2075*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[0]);
2076*3ac0a46fSAndroid Build Coastguard Worker
2077*3ac0a46fSAndroid Build Coastguard Worker return output;
2078*3ac0a46fSAndroid Build Coastguard Worker
2079*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2080*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2081*3ac0a46fSAndroid Build Coastguard Worker }
2082*3ac0a46fSAndroid Build Coastguard Worker
2083*3ac0a46fSAndroid Build Coastguard Worker static
Pack4BytesSwapSwapFirst(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2084*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack4BytesSwapSwapFirst(CMSREGISTER _cmsTRANSFORM* info,
2085*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2086*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2087*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2088*3ac0a46fSAndroid Build Coastguard Worker {
2089*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[2]);
2090*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[1]);
2091*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[0]);
2092*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[3]);
2093*3ac0a46fSAndroid Build Coastguard Worker
2094*3ac0a46fSAndroid Build Coastguard Worker return output;
2095*3ac0a46fSAndroid Build Coastguard Worker
2096*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2097*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2098*3ac0a46fSAndroid Build Coastguard Worker }
2099*3ac0a46fSAndroid Build Coastguard Worker
2100*3ac0a46fSAndroid Build Coastguard Worker static
Pack4Words(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2101*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack4Words(CMSREGISTER _cmsTRANSFORM* info,
2102*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2103*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2104*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2105*3ac0a46fSAndroid Build Coastguard Worker {
2106*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[0];
2107*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2108*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[1];
2109*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2110*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[2];
2111*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2112*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[3];
2113*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2114*3ac0a46fSAndroid Build Coastguard Worker
2115*3ac0a46fSAndroid Build Coastguard Worker return output;
2116*3ac0a46fSAndroid Build Coastguard Worker
2117*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2118*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2119*3ac0a46fSAndroid Build Coastguard Worker }
2120*3ac0a46fSAndroid Build Coastguard Worker
2121*3ac0a46fSAndroid Build Coastguard Worker static
Pack4WordsReverse(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2122*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack4WordsReverse(CMSREGISTER _cmsTRANSFORM* info,
2123*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2124*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2125*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2126*3ac0a46fSAndroid Build Coastguard Worker {
2127*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[0]);
2128*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2129*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[1]);
2130*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2131*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[2]);
2132*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2133*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[3]);
2134*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2135*3ac0a46fSAndroid Build Coastguard Worker
2136*3ac0a46fSAndroid Build Coastguard Worker return output;
2137*3ac0a46fSAndroid Build Coastguard Worker
2138*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2139*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2140*3ac0a46fSAndroid Build Coastguard Worker }
2141*3ac0a46fSAndroid Build Coastguard Worker
2142*3ac0a46fSAndroid Build Coastguard Worker // ABGR
2143*3ac0a46fSAndroid Build Coastguard Worker static
Pack4WordsSwap(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2144*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack4WordsSwap(CMSREGISTER _cmsTRANSFORM* info,
2145*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2146*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2147*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2148*3ac0a46fSAndroid Build Coastguard Worker {
2149*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[3];
2150*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2151*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[2];
2152*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2153*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[1];
2154*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2155*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[0];
2156*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2157*3ac0a46fSAndroid Build Coastguard Worker
2158*3ac0a46fSAndroid Build Coastguard Worker return output;
2159*3ac0a46fSAndroid Build Coastguard Worker
2160*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2161*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2162*3ac0a46fSAndroid Build Coastguard Worker }
2163*3ac0a46fSAndroid Build Coastguard Worker
2164*3ac0a46fSAndroid Build Coastguard Worker // CMYK
2165*3ac0a46fSAndroid Build Coastguard Worker static
Pack4WordsBigEndian(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2166*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack4WordsBigEndian(CMSREGISTER _cmsTRANSFORM* info,
2167*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2168*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2169*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2170*3ac0a46fSAndroid Build Coastguard Worker {
2171*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[0]);
2172*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2173*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[1]);
2174*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2175*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[2]);
2176*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2177*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[3]);
2178*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2179*3ac0a46fSAndroid Build Coastguard Worker
2180*3ac0a46fSAndroid Build Coastguard Worker return output;
2181*3ac0a46fSAndroid Build Coastguard Worker
2182*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2183*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2184*3ac0a46fSAndroid Build Coastguard Worker }
2185*3ac0a46fSAndroid Build Coastguard Worker
2186*3ac0a46fSAndroid Build Coastguard Worker
2187*3ac0a46fSAndroid Build Coastguard Worker static
PackLabV2_8(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2188*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* PackLabV2_8(CMSREGISTER _cmsTRANSFORM* info,
2189*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2190*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2191*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2192*3ac0a46fSAndroid Build Coastguard Worker {
2193*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[0]));
2194*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[1]));
2195*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[2]));
2196*3ac0a46fSAndroid Build Coastguard Worker
2197*3ac0a46fSAndroid Build Coastguard Worker return output;
2198*3ac0a46fSAndroid Build Coastguard Worker
2199*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2200*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2201*3ac0a46fSAndroid Build Coastguard Worker }
2202*3ac0a46fSAndroid Build Coastguard Worker
2203*3ac0a46fSAndroid Build Coastguard Worker static
PackALabV2_8(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2204*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* PackALabV2_8(CMSREGISTER _cmsTRANSFORM* info,
2205*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2206*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2207*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2208*3ac0a46fSAndroid Build Coastguard Worker {
2209*3ac0a46fSAndroid Build Coastguard Worker output++;
2210*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[0]));
2211*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[1]));
2212*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[2]));
2213*3ac0a46fSAndroid Build Coastguard Worker
2214*3ac0a46fSAndroid Build Coastguard Worker return output;
2215*3ac0a46fSAndroid Build Coastguard Worker
2216*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2217*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2218*3ac0a46fSAndroid Build Coastguard Worker }
2219*3ac0a46fSAndroid Build Coastguard Worker
2220*3ac0a46fSAndroid Build Coastguard Worker static
PackLabV2_16(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2221*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* PackLabV2_16(CMSREGISTER _cmsTRANSFORM* info,
2222*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2223*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2224*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2225*3ac0a46fSAndroid Build Coastguard Worker {
2226*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = FomLabV4ToLabV2(wOut[0]);
2227*3ac0a46fSAndroid Build Coastguard Worker output += 2;
2228*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = FomLabV4ToLabV2(wOut[1]);
2229*3ac0a46fSAndroid Build Coastguard Worker output += 2;
2230*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = FomLabV4ToLabV2(wOut[2]);
2231*3ac0a46fSAndroid Build Coastguard Worker output += 2;
2232*3ac0a46fSAndroid Build Coastguard Worker
2233*3ac0a46fSAndroid Build Coastguard Worker return output;
2234*3ac0a46fSAndroid Build Coastguard Worker
2235*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2236*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2237*3ac0a46fSAndroid Build Coastguard Worker }
2238*3ac0a46fSAndroid Build Coastguard Worker
2239*3ac0a46fSAndroid Build Coastguard Worker static
Pack3Bytes(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2240*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack3Bytes(CMSREGISTER _cmsTRANSFORM* info,
2241*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2242*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2243*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2244*3ac0a46fSAndroid Build Coastguard Worker {
2245*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[0]);
2246*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[1]);
2247*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[2]);
2248*3ac0a46fSAndroid Build Coastguard Worker
2249*3ac0a46fSAndroid Build Coastguard Worker return output;
2250*3ac0a46fSAndroid Build Coastguard Worker
2251*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2252*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2253*3ac0a46fSAndroid Build Coastguard Worker }
2254*3ac0a46fSAndroid Build Coastguard Worker
2255*3ac0a46fSAndroid Build Coastguard Worker static
Pack3BytesOptimized(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2256*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack3BytesOptimized(CMSREGISTER _cmsTRANSFORM* info,
2257*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2258*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2259*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2260*3ac0a46fSAndroid Build Coastguard Worker {
2261*3ac0a46fSAndroid Build Coastguard Worker *output++ = (wOut[0] & 0xFFU);
2262*3ac0a46fSAndroid Build Coastguard Worker *output++ = (wOut[1] & 0xFFU);
2263*3ac0a46fSAndroid Build Coastguard Worker *output++ = (wOut[2] & 0xFFU);
2264*3ac0a46fSAndroid Build Coastguard Worker
2265*3ac0a46fSAndroid Build Coastguard Worker return output;
2266*3ac0a46fSAndroid Build Coastguard Worker
2267*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2268*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2269*3ac0a46fSAndroid Build Coastguard Worker }
2270*3ac0a46fSAndroid Build Coastguard Worker
2271*3ac0a46fSAndroid Build Coastguard Worker static
Pack3BytesSwap(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2272*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack3BytesSwap(CMSREGISTER _cmsTRANSFORM* info,
2273*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2274*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2275*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2276*3ac0a46fSAndroid Build Coastguard Worker {
2277*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[2]);
2278*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[1]);
2279*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[0]);
2280*3ac0a46fSAndroid Build Coastguard Worker
2281*3ac0a46fSAndroid Build Coastguard Worker return output;
2282*3ac0a46fSAndroid Build Coastguard Worker
2283*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2284*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2285*3ac0a46fSAndroid Build Coastguard Worker }
2286*3ac0a46fSAndroid Build Coastguard Worker
2287*3ac0a46fSAndroid Build Coastguard Worker static
Pack3BytesSwapOptimized(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2288*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack3BytesSwapOptimized(CMSREGISTER _cmsTRANSFORM* info,
2289*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2290*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2291*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2292*3ac0a46fSAndroid Build Coastguard Worker {
2293*3ac0a46fSAndroid Build Coastguard Worker *output++ = (wOut[2] & 0xFFU);
2294*3ac0a46fSAndroid Build Coastguard Worker *output++ = (wOut[1] & 0xFFU);
2295*3ac0a46fSAndroid Build Coastguard Worker *output++ = (wOut[0] & 0xFFU);
2296*3ac0a46fSAndroid Build Coastguard Worker
2297*3ac0a46fSAndroid Build Coastguard Worker return output;
2298*3ac0a46fSAndroid Build Coastguard Worker
2299*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2300*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2301*3ac0a46fSAndroid Build Coastguard Worker }
2302*3ac0a46fSAndroid Build Coastguard Worker
2303*3ac0a46fSAndroid Build Coastguard Worker
2304*3ac0a46fSAndroid Build Coastguard Worker static
Pack3Words(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2305*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack3Words(CMSREGISTER _cmsTRANSFORM* info,
2306*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2307*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2308*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2309*3ac0a46fSAndroid Build Coastguard Worker {
2310*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[0];
2311*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2312*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[1];
2313*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2314*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[2];
2315*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2316*3ac0a46fSAndroid Build Coastguard Worker
2317*3ac0a46fSAndroid Build Coastguard Worker return output;
2318*3ac0a46fSAndroid Build Coastguard Worker
2319*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2320*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2321*3ac0a46fSAndroid Build Coastguard Worker }
2322*3ac0a46fSAndroid Build Coastguard Worker
2323*3ac0a46fSAndroid Build Coastguard Worker static
Pack3WordsSwap(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2324*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack3WordsSwap(CMSREGISTER _cmsTRANSFORM* info,
2325*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2326*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2327*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2328*3ac0a46fSAndroid Build Coastguard Worker {
2329*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[2];
2330*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2331*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[1];
2332*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2333*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[0];
2334*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2335*3ac0a46fSAndroid Build Coastguard Worker
2336*3ac0a46fSAndroid Build Coastguard Worker return output;
2337*3ac0a46fSAndroid Build Coastguard Worker
2338*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2339*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2340*3ac0a46fSAndroid Build Coastguard Worker }
2341*3ac0a46fSAndroid Build Coastguard Worker
2342*3ac0a46fSAndroid Build Coastguard Worker static
Pack3WordsBigEndian(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2343*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack3WordsBigEndian(CMSREGISTER _cmsTRANSFORM* info,
2344*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2345*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2346*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2347*3ac0a46fSAndroid Build Coastguard Worker {
2348*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[0]);
2349*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2350*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[1]);
2351*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2352*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[2]);
2353*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2354*3ac0a46fSAndroid Build Coastguard Worker
2355*3ac0a46fSAndroid Build Coastguard Worker return output;
2356*3ac0a46fSAndroid Build Coastguard Worker
2357*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2358*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2359*3ac0a46fSAndroid Build Coastguard Worker }
2360*3ac0a46fSAndroid Build Coastguard Worker
2361*3ac0a46fSAndroid Build Coastguard Worker static
Pack3BytesAndSkip1(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2362*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack3BytesAndSkip1(CMSREGISTER _cmsTRANSFORM* info,
2363*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2364*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2365*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2366*3ac0a46fSAndroid Build Coastguard Worker {
2367*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[0]);
2368*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[1]);
2369*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[2]);
2370*3ac0a46fSAndroid Build Coastguard Worker output++;
2371*3ac0a46fSAndroid Build Coastguard Worker
2372*3ac0a46fSAndroid Build Coastguard Worker return output;
2373*3ac0a46fSAndroid Build Coastguard Worker
2374*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2375*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2376*3ac0a46fSAndroid Build Coastguard Worker }
2377*3ac0a46fSAndroid Build Coastguard Worker
2378*3ac0a46fSAndroid Build Coastguard Worker static
Pack3BytesAndSkip1Optimized(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2379*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack3BytesAndSkip1Optimized(CMSREGISTER _cmsTRANSFORM* info,
2380*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2381*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2382*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2383*3ac0a46fSAndroid Build Coastguard Worker {
2384*3ac0a46fSAndroid Build Coastguard Worker *output++ = (wOut[0] & 0xFFU);
2385*3ac0a46fSAndroid Build Coastguard Worker *output++ = (wOut[1] & 0xFFU);
2386*3ac0a46fSAndroid Build Coastguard Worker *output++ = (wOut[2] & 0xFFU);
2387*3ac0a46fSAndroid Build Coastguard Worker output++;
2388*3ac0a46fSAndroid Build Coastguard Worker
2389*3ac0a46fSAndroid Build Coastguard Worker return output;
2390*3ac0a46fSAndroid Build Coastguard Worker
2391*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2392*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2393*3ac0a46fSAndroid Build Coastguard Worker }
2394*3ac0a46fSAndroid Build Coastguard Worker
2395*3ac0a46fSAndroid Build Coastguard Worker
2396*3ac0a46fSAndroid Build Coastguard Worker static
Pack3BytesAndSkip1SwapFirst(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2397*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack3BytesAndSkip1SwapFirst(CMSREGISTER _cmsTRANSFORM* info,
2398*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2399*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2400*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2401*3ac0a46fSAndroid Build Coastguard Worker {
2402*3ac0a46fSAndroid Build Coastguard Worker output++;
2403*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[0]);
2404*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[1]);
2405*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[2]);
2406*3ac0a46fSAndroid Build Coastguard Worker
2407*3ac0a46fSAndroid Build Coastguard Worker return output;
2408*3ac0a46fSAndroid Build Coastguard Worker
2409*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2410*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2411*3ac0a46fSAndroid Build Coastguard Worker }
2412*3ac0a46fSAndroid Build Coastguard Worker
2413*3ac0a46fSAndroid Build Coastguard Worker static
Pack3BytesAndSkip1SwapFirstOptimized(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2414*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack3BytesAndSkip1SwapFirstOptimized(CMSREGISTER _cmsTRANSFORM* info,
2415*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2416*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2417*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2418*3ac0a46fSAndroid Build Coastguard Worker {
2419*3ac0a46fSAndroid Build Coastguard Worker output++;
2420*3ac0a46fSAndroid Build Coastguard Worker *output++ = (wOut[0] & 0xFFU);
2421*3ac0a46fSAndroid Build Coastguard Worker *output++ = (wOut[1] & 0xFFU);
2422*3ac0a46fSAndroid Build Coastguard Worker *output++ = (wOut[2] & 0xFFU);
2423*3ac0a46fSAndroid Build Coastguard Worker
2424*3ac0a46fSAndroid Build Coastguard Worker return output;
2425*3ac0a46fSAndroid Build Coastguard Worker
2426*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2427*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2428*3ac0a46fSAndroid Build Coastguard Worker }
2429*3ac0a46fSAndroid Build Coastguard Worker
2430*3ac0a46fSAndroid Build Coastguard Worker static
Pack3BytesAndSkip1Swap(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2431*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack3BytesAndSkip1Swap(CMSREGISTER _cmsTRANSFORM* info,
2432*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2433*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2434*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2435*3ac0a46fSAndroid Build Coastguard Worker {
2436*3ac0a46fSAndroid Build Coastguard Worker output++;
2437*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[2]);
2438*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[1]);
2439*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[0]);
2440*3ac0a46fSAndroid Build Coastguard Worker
2441*3ac0a46fSAndroid Build Coastguard Worker return output;
2442*3ac0a46fSAndroid Build Coastguard Worker
2443*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2444*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2445*3ac0a46fSAndroid Build Coastguard Worker }
2446*3ac0a46fSAndroid Build Coastguard Worker
2447*3ac0a46fSAndroid Build Coastguard Worker static
Pack3BytesAndSkip1SwapOptimized(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2448*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack3BytesAndSkip1SwapOptimized(CMSREGISTER _cmsTRANSFORM* info,
2449*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2450*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2451*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2452*3ac0a46fSAndroid Build Coastguard Worker {
2453*3ac0a46fSAndroid Build Coastguard Worker output++;
2454*3ac0a46fSAndroid Build Coastguard Worker *output++ = (wOut[2] & 0xFFU);
2455*3ac0a46fSAndroid Build Coastguard Worker *output++ = (wOut[1] & 0xFFU);
2456*3ac0a46fSAndroid Build Coastguard Worker *output++ = (wOut[0] & 0xFFU);
2457*3ac0a46fSAndroid Build Coastguard Worker
2458*3ac0a46fSAndroid Build Coastguard Worker return output;
2459*3ac0a46fSAndroid Build Coastguard Worker
2460*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2461*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2462*3ac0a46fSAndroid Build Coastguard Worker }
2463*3ac0a46fSAndroid Build Coastguard Worker
2464*3ac0a46fSAndroid Build Coastguard Worker
2465*3ac0a46fSAndroid Build Coastguard Worker static
Pack3BytesAndSkip1SwapSwapFirst(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2466*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack3BytesAndSkip1SwapSwapFirst(CMSREGISTER _cmsTRANSFORM* info,
2467*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2468*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2469*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2470*3ac0a46fSAndroid Build Coastguard Worker {
2471*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[2]);
2472*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[1]);
2473*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[0]);
2474*3ac0a46fSAndroid Build Coastguard Worker output++;
2475*3ac0a46fSAndroid Build Coastguard Worker
2476*3ac0a46fSAndroid Build Coastguard Worker return output;
2477*3ac0a46fSAndroid Build Coastguard Worker
2478*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2479*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2480*3ac0a46fSAndroid Build Coastguard Worker }
2481*3ac0a46fSAndroid Build Coastguard Worker
2482*3ac0a46fSAndroid Build Coastguard Worker static
Pack3BytesAndSkip1SwapSwapFirstOptimized(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2483*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack3BytesAndSkip1SwapSwapFirstOptimized(CMSREGISTER _cmsTRANSFORM* info,
2484*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2485*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2486*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2487*3ac0a46fSAndroid Build Coastguard Worker {
2488*3ac0a46fSAndroid Build Coastguard Worker *output++ = (wOut[2] & 0xFFU);
2489*3ac0a46fSAndroid Build Coastguard Worker *output++ = (wOut[1] & 0xFFU);
2490*3ac0a46fSAndroid Build Coastguard Worker *output++ = (wOut[0] & 0xFFU);
2491*3ac0a46fSAndroid Build Coastguard Worker output++;
2492*3ac0a46fSAndroid Build Coastguard Worker
2493*3ac0a46fSAndroid Build Coastguard Worker return output;
2494*3ac0a46fSAndroid Build Coastguard Worker
2495*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2496*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2497*3ac0a46fSAndroid Build Coastguard Worker }
2498*3ac0a46fSAndroid Build Coastguard Worker
2499*3ac0a46fSAndroid Build Coastguard Worker static
Pack3WordsAndSkip1(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2500*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack3WordsAndSkip1(CMSREGISTER _cmsTRANSFORM* info,
2501*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2502*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2503*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2504*3ac0a46fSAndroid Build Coastguard Worker {
2505*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[0];
2506*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2507*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[1];
2508*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2509*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[2];
2510*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2511*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2512*3ac0a46fSAndroid Build Coastguard Worker
2513*3ac0a46fSAndroid Build Coastguard Worker return output;
2514*3ac0a46fSAndroid Build Coastguard Worker
2515*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2516*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2517*3ac0a46fSAndroid Build Coastguard Worker }
2518*3ac0a46fSAndroid Build Coastguard Worker
2519*3ac0a46fSAndroid Build Coastguard Worker static
Pack3WordsAndSkip1Swap(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2520*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack3WordsAndSkip1Swap(CMSREGISTER _cmsTRANSFORM* info,
2521*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2522*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2523*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2524*3ac0a46fSAndroid Build Coastguard Worker {
2525*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2526*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[2];
2527*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2528*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[1];
2529*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2530*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[0];
2531*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2532*3ac0a46fSAndroid Build Coastguard Worker
2533*3ac0a46fSAndroid Build Coastguard Worker return output;
2534*3ac0a46fSAndroid Build Coastguard Worker
2535*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2536*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2537*3ac0a46fSAndroid Build Coastguard Worker }
2538*3ac0a46fSAndroid Build Coastguard Worker
2539*3ac0a46fSAndroid Build Coastguard Worker
2540*3ac0a46fSAndroid Build Coastguard Worker static
Pack3WordsAndSkip1SwapFirst(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2541*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack3WordsAndSkip1SwapFirst(CMSREGISTER _cmsTRANSFORM* info,
2542*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2543*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2544*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2545*3ac0a46fSAndroid Build Coastguard Worker {
2546*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2547*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[0];
2548*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2549*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[1];
2550*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2551*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[2];
2552*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2553*3ac0a46fSAndroid Build Coastguard Worker
2554*3ac0a46fSAndroid Build Coastguard Worker return output;
2555*3ac0a46fSAndroid Build Coastguard Worker
2556*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2557*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2558*3ac0a46fSAndroid Build Coastguard Worker }
2559*3ac0a46fSAndroid Build Coastguard Worker
2560*3ac0a46fSAndroid Build Coastguard Worker
2561*3ac0a46fSAndroid Build Coastguard Worker static
Pack3WordsAndSkip1SwapSwapFirst(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2562*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack3WordsAndSkip1SwapSwapFirst(CMSREGISTER _cmsTRANSFORM* info,
2563*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2564*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2565*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2566*3ac0a46fSAndroid Build Coastguard Worker {
2567*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[2];
2568*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2569*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[1];
2570*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2571*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[0];
2572*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2573*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2574*3ac0a46fSAndroid Build Coastguard Worker
2575*3ac0a46fSAndroid Build Coastguard Worker return output;
2576*3ac0a46fSAndroid Build Coastguard Worker
2577*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2578*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2579*3ac0a46fSAndroid Build Coastguard Worker }
2580*3ac0a46fSAndroid Build Coastguard Worker
2581*3ac0a46fSAndroid Build Coastguard Worker
2582*3ac0a46fSAndroid Build Coastguard Worker
2583*3ac0a46fSAndroid Build Coastguard Worker static
Pack1Byte(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2584*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack1Byte(CMSREGISTER _cmsTRANSFORM* info,
2585*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2586*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2587*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2588*3ac0a46fSAndroid Build Coastguard Worker {
2589*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[0]);
2590*3ac0a46fSAndroid Build Coastguard Worker
2591*3ac0a46fSAndroid Build Coastguard Worker return output;
2592*3ac0a46fSAndroid Build Coastguard Worker
2593*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2594*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2595*3ac0a46fSAndroid Build Coastguard Worker }
2596*3ac0a46fSAndroid Build Coastguard Worker
2597*3ac0a46fSAndroid Build Coastguard Worker
2598*3ac0a46fSAndroid Build Coastguard Worker static
Pack1ByteReversed(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2599*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack1ByteReversed(CMSREGISTER _cmsTRANSFORM* info,
2600*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2601*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2602*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2603*3ac0a46fSAndroid Build Coastguard Worker {
2604*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(REVERSE_FLAVOR_16(wOut[0]));
2605*3ac0a46fSAndroid Build Coastguard Worker
2606*3ac0a46fSAndroid Build Coastguard Worker return output;
2607*3ac0a46fSAndroid Build Coastguard Worker
2608*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2609*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2610*3ac0a46fSAndroid Build Coastguard Worker }
2611*3ac0a46fSAndroid Build Coastguard Worker
2612*3ac0a46fSAndroid Build Coastguard Worker
2613*3ac0a46fSAndroid Build Coastguard Worker static
Pack1ByteSkip1(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2614*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack1ByteSkip1(CMSREGISTER _cmsTRANSFORM* info,
2615*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2616*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2617*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2618*3ac0a46fSAndroid Build Coastguard Worker {
2619*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[0]);
2620*3ac0a46fSAndroid Build Coastguard Worker output++;
2621*3ac0a46fSAndroid Build Coastguard Worker
2622*3ac0a46fSAndroid Build Coastguard Worker return output;
2623*3ac0a46fSAndroid Build Coastguard Worker
2624*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2625*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2626*3ac0a46fSAndroid Build Coastguard Worker }
2627*3ac0a46fSAndroid Build Coastguard Worker
2628*3ac0a46fSAndroid Build Coastguard Worker
2629*3ac0a46fSAndroid Build Coastguard Worker static
Pack1ByteSkip1SwapFirst(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2630*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack1ByteSkip1SwapFirst(CMSREGISTER _cmsTRANSFORM* info,
2631*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2632*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2633*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2634*3ac0a46fSAndroid Build Coastguard Worker {
2635*3ac0a46fSAndroid Build Coastguard Worker output++;
2636*3ac0a46fSAndroid Build Coastguard Worker *output++ = FROM_16_TO_8(wOut[0]);
2637*3ac0a46fSAndroid Build Coastguard Worker
2638*3ac0a46fSAndroid Build Coastguard Worker return output;
2639*3ac0a46fSAndroid Build Coastguard Worker
2640*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2641*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2642*3ac0a46fSAndroid Build Coastguard Worker }
2643*3ac0a46fSAndroid Build Coastguard Worker
2644*3ac0a46fSAndroid Build Coastguard Worker static
Pack1Word(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2645*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack1Word(CMSREGISTER _cmsTRANSFORM* info,
2646*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2647*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2648*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2649*3ac0a46fSAndroid Build Coastguard Worker {
2650*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[0];
2651*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2652*3ac0a46fSAndroid Build Coastguard Worker
2653*3ac0a46fSAndroid Build Coastguard Worker return output;
2654*3ac0a46fSAndroid Build Coastguard Worker
2655*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2656*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2657*3ac0a46fSAndroid Build Coastguard Worker }
2658*3ac0a46fSAndroid Build Coastguard Worker
2659*3ac0a46fSAndroid Build Coastguard Worker
2660*3ac0a46fSAndroid Build Coastguard Worker static
Pack1WordReversed(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2661*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack1WordReversed(CMSREGISTER _cmsTRANSFORM* info,
2662*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2663*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2664*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2665*3ac0a46fSAndroid Build Coastguard Worker {
2666*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[0]);
2667*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2668*3ac0a46fSAndroid Build Coastguard Worker
2669*3ac0a46fSAndroid Build Coastguard Worker return output;
2670*3ac0a46fSAndroid Build Coastguard Worker
2671*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2672*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2673*3ac0a46fSAndroid Build Coastguard Worker }
2674*3ac0a46fSAndroid Build Coastguard Worker
2675*3ac0a46fSAndroid Build Coastguard Worker static
Pack1WordBigEndian(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2676*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack1WordBigEndian(CMSREGISTER _cmsTRANSFORM* info,
2677*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2678*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2679*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2680*3ac0a46fSAndroid Build Coastguard Worker {
2681*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[0]);
2682*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2683*3ac0a46fSAndroid Build Coastguard Worker
2684*3ac0a46fSAndroid Build Coastguard Worker return output;
2685*3ac0a46fSAndroid Build Coastguard Worker
2686*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2687*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2688*3ac0a46fSAndroid Build Coastguard Worker }
2689*3ac0a46fSAndroid Build Coastguard Worker
2690*3ac0a46fSAndroid Build Coastguard Worker
2691*3ac0a46fSAndroid Build Coastguard Worker static
Pack1WordSkip1(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2692*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack1WordSkip1(CMSREGISTER _cmsTRANSFORM* info,
2693*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2694*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2695*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2696*3ac0a46fSAndroid Build Coastguard Worker {
2697*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[0];
2698*3ac0a46fSAndroid Build Coastguard Worker output+= 4;
2699*3ac0a46fSAndroid Build Coastguard Worker
2700*3ac0a46fSAndroid Build Coastguard Worker return output;
2701*3ac0a46fSAndroid Build Coastguard Worker
2702*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2703*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2704*3ac0a46fSAndroid Build Coastguard Worker }
2705*3ac0a46fSAndroid Build Coastguard Worker
2706*3ac0a46fSAndroid Build Coastguard Worker static
Pack1WordSkip1SwapFirst(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2707*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* Pack1WordSkip1SwapFirst(CMSREGISTER _cmsTRANSFORM* info,
2708*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2709*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2710*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2711*3ac0a46fSAndroid Build Coastguard Worker {
2712*3ac0a46fSAndroid Build Coastguard Worker output += 2;
2713*3ac0a46fSAndroid Build Coastguard Worker *(cmsUInt16Number*) output = wOut[0];
2714*3ac0a46fSAndroid Build Coastguard Worker output+= 2;
2715*3ac0a46fSAndroid Build Coastguard Worker
2716*3ac0a46fSAndroid Build Coastguard Worker return output;
2717*3ac0a46fSAndroid Build Coastguard Worker
2718*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(info);
2719*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Stride);
2720*3ac0a46fSAndroid Build Coastguard Worker }
2721*3ac0a46fSAndroid Build Coastguard Worker
2722*3ac0a46fSAndroid Build Coastguard Worker
2723*3ac0a46fSAndroid Build Coastguard Worker // Unencoded Float values -- don't try optimize speed
2724*3ac0a46fSAndroid Build Coastguard Worker static
PackLabDoubleFrom16(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2725*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* PackLabDoubleFrom16(CMSREGISTER _cmsTRANSFORM* info,
2726*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2727*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2728*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2729*3ac0a46fSAndroid Build Coastguard Worker {
2730*3ac0a46fSAndroid Build Coastguard Worker
2731*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(info -> OutputFormat)) {
2732*3ac0a46fSAndroid Build Coastguard Worker
2733*3ac0a46fSAndroid Build Coastguard Worker cmsCIELab Lab;
2734*3ac0a46fSAndroid Build Coastguard Worker cmsFloat64Number* Out = (cmsFloat64Number*) output;
2735*3ac0a46fSAndroid Build Coastguard Worker cmsLabEncoded2Float(&Lab, wOut);
2736*3ac0a46fSAndroid Build Coastguard Worker
2737*3ac0a46fSAndroid Build Coastguard Worker Out[0] = Lab.L;
2738*3ac0a46fSAndroid Build Coastguard Worker Out[Stride] = Lab.a;
2739*3ac0a46fSAndroid Build Coastguard Worker Out[Stride*2] = Lab.b;
2740*3ac0a46fSAndroid Build Coastguard Worker
2741*3ac0a46fSAndroid Build Coastguard Worker return output + sizeof(cmsFloat64Number);
2742*3ac0a46fSAndroid Build Coastguard Worker }
2743*3ac0a46fSAndroid Build Coastguard Worker else {
2744*3ac0a46fSAndroid Build Coastguard Worker
2745*3ac0a46fSAndroid Build Coastguard Worker cmsLabEncoded2Float((cmsCIELab*) output, wOut);
2746*3ac0a46fSAndroid Build Coastguard Worker return output + (sizeof(cmsCIELab) + T_EXTRA(info ->OutputFormat) * sizeof(cmsFloat64Number));
2747*3ac0a46fSAndroid Build Coastguard Worker }
2748*3ac0a46fSAndroid Build Coastguard Worker }
2749*3ac0a46fSAndroid Build Coastguard Worker
2750*3ac0a46fSAndroid Build Coastguard Worker
2751*3ac0a46fSAndroid Build Coastguard Worker static
PackLabFloatFrom16(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2752*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* PackLabFloatFrom16(CMSREGISTER _cmsTRANSFORM* info,
2753*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2754*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2755*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2756*3ac0a46fSAndroid Build Coastguard Worker {
2757*3ac0a46fSAndroid Build Coastguard Worker cmsCIELab Lab;
2758*3ac0a46fSAndroid Build Coastguard Worker cmsLabEncoded2Float(&Lab, wOut);
2759*3ac0a46fSAndroid Build Coastguard Worker
2760*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(info -> OutputFormat)) {
2761*3ac0a46fSAndroid Build Coastguard Worker
2762*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number* Out = (cmsFloat32Number*) output;
2763*3ac0a46fSAndroid Build Coastguard Worker
2764*3ac0a46fSAndroid Build Coastguard Worker Stride /= PixelSize(info->OutputFormat);
2765*3ac0a46fSAndroid Build Coastguard Worker
2766*3ac0a46fSAndroid Build Coastguard Worker Out[0] = (cmsFloat32Number)Lab.L;
2767*3ac0a46fSAndroid Build Coastguard Worker Out[Stride] = (cmsFloat32Number)Lab.a;
2768*3ac0a46fSAndroid Build Coastguard Worker Out[Stride*2] = (cmsFloat32Number)Lab.b;
2769*3ac0a46fSAndroid Build Coastguard Worker
2770*3ac0a46fSAndroid Build Coastguard Worker return output + sizeof(cmsFloat32Number);
2771*3ac0a46fSAndroid Build Coastguard Worker }
2772*3ac0a46fSAndroid Build Coastguard Worker else {
2773*3ac0a46fSAndroid Build Coastguard Worker
2774*3ac0a46fSAndroid Build Coastguard Worker ((cmsFloat32Number*) output)[0] = (cmsFloat32Number) Lab.L;
2775*3ac0a46fSAndroid Build Coastguard Worker ((cmsFloat32Number*) output)[1] = (cmsFloat32Number) Lab.a;
2776*3ac0a46fSAndroid Build Coastguard Worker ((cmsFloat32Number*) output)[2] = (cmsFloat32Number) Lab.b;
2777*3ac0a46fSAndroid Build Coastguard Worker
2778*3ac0a46fSAndroid Build Coastguard Worker return output + (3 + T_EXTRA(info ->OutputFormat)) * sizeof(cmsFloat32Number);
2779*3ac0a46fSAndroid Build Coastguard Worker }
2780*3ac0a46fSAndroid Build Coastguard Worker }
2781*3ac0a46fSAndroid Build Coastguard Worker
2782*3ac0a46fSAndroid Build Coastguard Worker static
PackXYZDoubleFrom16(CMSREGISTER _cmsTRANSFORM * Info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2783*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* PackXYZDoubleFrom16(CMSREGISTER _cmsTRANSFORM* Info,
2784*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2785*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2786*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2787*3ac0a46fSAndroid Build Coastguard Worker {
2788*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(Info -> OutputFormat)) {
2789*3ac0a46fSAndroid Build Coastguard Worker
2790*3ac0a46fSAndroid Build Coastguard Worker cmsCIEXYZ XYZ;
2791*3ac0a46fSAndroid Build Coastguard Worker cmsFloat64Number* Out = (cmsFloat64Number*) output;
2792*3ac0a46fSAndroid Build Coastguard Worker cmsXYZEncoded2Float(&XYZ, wOut);
2793*3ac0a46fSAndroid Build Coastguard Worker
2794*3ac0a46fSAndroid Build Coastguard Worker Stride /= PixelSize(Info->OutputFormat);
2795*3ac0a46fSAndroid Build Coastguard Worker
2796*3ac0a46fSAndroid Build Coastguard Worker Out[0] = XYZ.X;
2797*3ac0a46fSAndroid Build Coastguard Worker Out[Stride] = XYZ.Y;
2798*3ac0a46fSAndroid Build Coastguard Worker Out[Stride*2] = XYZ.Z;
2799*3ac0a46fSAndroid Build Coastguard Worker
2800*3ac0a46fSAndroid Build Coastguard Worker return output + sizeof(cmsFloat64Number);
2801*3ac0a46fSAndroid Build Coastguard Worker
2802*3ac0a46fSAndroid Build Coastguard Worker }
2803*3ac0a46fSAndroid Build Coastguard Worker else {
2804*3ac0a46fSAndroid Build Coastguard Worker
2805*3ac0a46fSAndroid Build Coastguard Worker cmsXYZEncoded2Float((cmsCIEXYZ*) output, wOut);
2806*3ac0a46fSAndroid Build Coastguard Worker
2807*3ac0a46fSAndroid Build Coastguard Worker return output + (sizeof(cmsCIEXYZ) + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat64Number));
2808*3ac0a46fSAndroid Build Coastguard Worker }
2809*3ac0a46fSAndroid Build Coastguard Worker }
2810*3ac0a46fSAndroid Build Coastguard Worker
2811*3ac0a46fSAndroid Build Coastguard Worker static
PackXYZFloatFrom16(CMSREGISTER _cmsTRANSFORM * Info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2812*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* PackXYZFloatFrom16(CMSREGISTER _cmsTRANSFORM* Info,
2813*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2814*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2815*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2816*3ac0a46fSAndroid Build Coastguard Worker {
2817*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(Info -> OutputFormat)) {
2818*3ac0a46fSAndroid Build Coastguard Worker
2819*3ac0a46fSAndroid Build Coastguard Worker cmsCIEXYZ XYZ;
2820*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number* Out = (cmsFloat32Number*) output;
2821*3ac0a46fSAndroid Build Coastguard Worker cmsXYZEncoded2Float(&XYZ, wOut);
2822*3ac0a46fSAndroid Build Coastguard Worker
2823*3ac0a46fSAndroid Build Coastguard Worker Stride /= PixelSize(Info->OutputFormat);
2824*3ac0a46fSAndroid Build Coastguard Worker
2825*3ac0a46fSAndroid Build Coastguard Worker Out[0] = (cmsFloat32Number) XYZ.X;
2826*3ac0a46fSAndroid Build Coastguard Worker Out[Stride] = (cmsFloat32Number) XYZ.Y;
2827*3ac0a46fSAndroid Build Coastguard Worker Out[Stride*2] = (cmsFloat32Number) XYZ.Z;
2828*3ac0a46fSAndroid Build Coastguard Worker
2829*3ac0a46fSAndroid Build Coastguard Worker return output + sizeof(cmsFloat32Number);
2830*3ac0a46fSAndroid Build Coastguard Worker
2831*3ac0a46fSAndroid Build Coastguard Worker }
2832*3ac0a46fSAndroid Build Coastguard Worker else {
2833*3ac0a46fSAndroid Build Coastguard Worker
2834*3ac0a46fSAndroid Build Coastguard Worker cmsCIEXYZ XYZ;
2835*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number* Out = (cmsFloat32Number*) output;
2836*3ac0a46fSAndroid Build Coastguard Worker cmsXYZEncoded2Float(&XYZ, wOut);
2837*3ac0a46fSAndroid Build Coastguard Worker
2838*3ac0a46fSAndroid Build Coastguard Worker Out[0] = (cmsFloat32Number) XYZ.X;
2839*3ac0a46fSAndroid Build Coastguard Worker Out[1] = (cmsFloat32Number) XYZ.Y;
2840*3ac0a46fSAndroid Build Coastguard Worker Out[2] = (cmsFloat32Number) XYZ.Z;
2841*3ac0a46fSAndroid Build Coastguard Worker
2842*3ac0a46fSAndroid Build Coastguard Worker return output + (3 * sizeof(cmsFloat32Number) + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat32Number));
2843*3ac0a46fSAndroid Build Coastguard Worker }
2844*3ac0a46fSAndroid Build Coastguard Worker }
2845*3ac0a46fSAndroid Build Coastguard Worker
2846*3ac0a46fSAndroid Build Coastguard Worker static
PackDoubleFrom16(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2847*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* PackDoubleFrom16(CMSREGISTER _cmsTRANSFORM* info,
2848*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2849*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2850*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2851*3ac0a46fSAndroid Build Coastguard Worker {
2852*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number nChan = T_CHANNELS(info -> OutputFormat);
2853*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number DoSwap = T_DOSWAP(info ->OutputFormat);
2854*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Reverse = T_FLAVOR(info ->OutputFormat);
2855*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Extra = T_EXTRA(info -> OutputFormat);
2856*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapFirst = T_SWAPFIRST(info -> OutputFormat);
2857*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Planar = T_PLANAR(info -> OutputFormat);
2858*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst;
2859*3ac0a46fSAndroid Build Coastguard Worker cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 655.35 : 65535.0;
2860*3ac0a46fSAndroid Build Coastguard Worker cmsFloat64Number v = 0;
2861*3ac0a46fSAndroid Build Coastguard Worker cmsFloat64Number* swap1 = (cmsFloat64Number*) output;
2862*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number i, start = 0;
2863*3ac0a46fSAndroid Build Coastguard Worker
2864*3ac0a46fSAndroid Build Coastguard Worker Stride /= PixelSize(info->OutputFormat);
2865*3ac0a46fSAndroid Build Coastguard Worker
2866*3ac0a46fSAndroid Build Coastguard Worker if (ExtraFirst)
2867*3ac0a46fSAndroid Build Coastguard Worker start = Extra;
2868*3ac0a46fSAndroid Build Coastguard Worker
2869*3ac0a46fSAndroid Build Coastguard Worker for (i=0; i < nChan; i++) {
2870*3ac0a46fSAndroid Build Coastguard Worker
2871*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i;
2872*3ac0a46fSAndroid Build Coastguard Worker
2873*3ac0a46fSAndroid Build Coastguard Worker v = (cmsFloat64Number) wOut[index] / maximum;
2874*3ac0a46fSAndroid Build Coastguard Worker
2875*3ac0a46fSAndroid Build Coastguard Worker if (Reverse)
2876*3ac0a46fSAndroid Build Coastguard Worker v = maximum - v;
2877*3ac0a46fSAndroid Build Coastguard Worker
2878*3ac0a46fSAndroid Build Coastguard Worker if (Planar)
2879*3ac0a46fSAndroid Build Coastguard Worker ((cmsFloat64Number*) output)[(i + start) * Stride]= v;
2880*3ac0a46fSAndroid Build Coastguard Worker else
2881*3ac0a46fSAndroid Build Coastguard Worker ((cmsFloat64Number*) output)[i + start] = v;
2882*3ac0a46fSAndroid Build Coastguard Worker }
2883*3ac0a46fSAndroid Build Coastguard Worker
2884*3ac0a46fSAndroid Build Coastguard Worker
2885*3ac0a46fSAndroid Build Coastguard Worker if (Extra == 0 && SwapFirst) {
2886*3ac0a46fSAndroid Build Coastguard Worker
2887*3ac0a46fSAndroid Build Coastguard Worker memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat64Number));
2888*3ac0a46fSAndroid Build Coastguard Worker *swap1 = v;
2889*3ac0a46fSAndroid Build Coastguard Worker }
2890*3ac0a46fSAndroid Build Coastguard Worker
2891*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(info -> OutputFormat))
2892*3ac0a46fSAndroid Build Coastguard Worker return output + sizeof(cmsFloat64Number);
2893*3ac0a46fSAndroid Build Coastguard Worker else
2894*3ac0a46fSAndroid Build Coastguard Worker return output + (nChan + Extra) * sizeof(cmsFloat64Number);
2895*3ac0a46fSAndroid Build Coastguard Worker
2896*3ac0a46fSAndroid Build Coastguard Worker }
2897*3ac0a46fSAndroid Build Coastguard Worker
2898*3ac0a46fSAndroid Build Coastguard Worker
2899*3ac0a46fSAndroid Build Coastguard Worker static
PackFloatFrom16(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)2900*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* PackFloatFrom16(CMSREGISTER _cmsTRANSFORM* info,
2901*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
2902*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
2903*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
2904*3ac0a46fSAndroid Build Coastguard Worker {
2905*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat);
2906*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat);
2907*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat);
2908*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Extra = T_EXTRA(info->OutputFormat);
2909*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat);
2910*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Planar = T_PLANAR(info->OutputFormat);
2911*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst;
2912*3ac0a46fSAndroid Build Coastguard Worker cmsFloat64Number maximum = IsInkSpace(info->OutputFormat) ? 655.35 : 65535.0;
2913*3ac0a46fSAndroid Build Coastguard Worker cmsFloat64Number v = 0;
2914*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number* swap1 = (cmsFloat32Number*)output;
2915*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number i, start = 0;
2916*3ac0a46fSAndroid Build Coastguard Worker
2917*3ac0a46fSAndroid Build Coastguard Worker Stride /= PixelSize(info->OutputFormat);
2918*3ac0a46fSAndroid Build Coastguard Worker
2919*3ac0a46fSAndroid Build Coastguard Worker if (ExtraFirst)
2920*3ac0a46fSAndroid Build Coastguard Worker start = Extra;
2921*3ac0a46fSAndroid Build Coastguard Worker
2922*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < nChan; i++) {
2923*3ac0a46fSAndroid Build Coastguard Worker
2924*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i;
2925*3ac0a46fSAndroid Build Coastguard Worker
2926*3ac0a46fSAndroid Build Coastguard Worker v = (cmsFloat64Number)wOut[index] / maximum;
2927*3ac0a46fSAndroid Build Coastguard Worker
2928*3ac0a46fSAndroid Build Coastguard Worker if (Reverse)
2929*3ac0a46fSAndroid Build Coastguard Worker v = maximum - v;
2930*3ac0a46fSAndroid Build Coastguard Worker
2931*3ac0a46fSAndroid Build Coastguard Worker if (Planar)
2932*3ac0a46fSAndroid Build Coastguard Worker ((cmsFloat32Number*)output)[(i + start) * Stride] = (cmsFloat32Number)v;
2933*3ac0a46fSAndroid Build Coastguard Worker else
2934*3ac0a46fSAndroid Build Coastguard Worker ((cmsFloat32Number*)output)[i + start] = (cmsFloat32Number)v;
2935*3ac0a46fSAndroid Build Coastguard Worker }
2936*3ac0a46fSAndroid Build Coastguard Worker
2937*3ac0a46fSAndroid Build Coastguard Worker
2938*3ac0a46fSAndroid Build Coastguard Worker if (Extra == 0 && SwapFirst) {
2939*3ac0a46fSAndroid Build Coastguard Worker
2940*3ac0a46fSAndroid Build Coastguard Worker memmove(swap1 + 1, swap1, (nChan - 1)* sizeof(cmsFloat32Number));
2941*3ac0a46fSAndroid Build Coastguard Worker *swap1 = (cmsFloat32Number)v;
2942*3ac0a46fSAndroid Build Coastguard Worker }
2943*3ac0a46fSAndroid Build Coastguard Worker
2944*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(info->OutputFormat))
2945*3ac0a46fSAndroid Build Coastguard Worker return output + sizeof(cmsFloat32Number);
2946*3ac0a46fSAndroid Build Coastguard Worker else
2947*3ac0a46fSAndroid Build Coastguard Worker return output + (nChan + Extra) * sizeof(cmsFloat32Number);
2948*3ac0a46fSAndroid Build Coastguard Worker }
2949*3ac0a46fSAndroid Build Coastguard Worker
2950*3ac0a46fSAndroid Build Coastguard Worker
2951*3ac0a46fSAndroid Build Coastguard Worker
2952*3ac0a46fSAndroid Build Coastguard Worker // --------------------------------------------------------------------------------------------------------
2953*3ac0a46fSAndroid Build Coastguard Worker
2954*3ac0a46fSAndroid Build Coastguard Worker static
PackFloatsFromFloat(_cmsTRANSFORM * info,cmsFloat32Number wOut[],cmsUInt8Number * output,cmsUInt32Number Stride)2955*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* PackFloatsFromFloat(_cmsTRANSFORM* info,
2956*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number wOut[],
2957*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* output,
2958*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Stride)
2959*3ac0a46fSAndroid Build Coastguard Worker {
2960*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat);
2961*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat);
2962*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat);
2963*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Extra = T_EXTRA(info->OutputFormat);
2964*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat);
2965*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Planar = T_PLANAR(info->OutputFormat);
2966*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst;
2967*3ac0a46fSAndroid Build Coastguard Worker cmsFloat64Number maximum = IsInkSpace(info->OutputFormat) ? 100.0 : 1.0;
2968*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number* swap1 = (cmsFloat32Number*)output;
2969*3ac0a46fSAndroid Build Coastguard Worker cmsFloat64Number v = 0;
2970*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number i, start = 0;
2971*3ac0a46fSAndroid Build Coastguard Worker
2972*3ac0a46fSAndroid Build Coastguard Worker Stride /= PixelSize(info->OutputFormat);
2973*3ac0a46fSAndroid Build Coastguard Worker
2974*3ac0a46fSAndroid Build Coastguard Worker if (ExtraFirst)
2975*3ac0a46fSAndroid Build Coastguard Worker start = Extra;
2976*3ac0a46fSAndroid Build Coastguard Worker
2977*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < nChan; i++) {
2978*3ac0a46fSAndroid Build Coastguard Worker
2979*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i;
2980*3ac0a46fSAndroid Build Coastguard Worker
2981*3ac0a46fSAndroid Build Coastguard Worker v = wOut[index] * maximum;
2982*3ac0a46fSAndroid Build Coastguard Worker
2983*3ac0a46fSAndroid Build Coastguard Worker if (Reverse)
2984*3ac0a46fSAndroid Build Coastguard Worker v = maximum - v;
2985*3ac0a46fSAndroid Build Coastguard Worker
2986*3ac0a46fSAndroid Build Coastguard Worker if (Planar)
2987*3ac0a46fSAndroid Build Coastguard Worker ((cmsFloat32Number*)output)[(i + start)* Stride] = (cmsFloat32Number)v;
2988*3ac0a46fSAndroid Build Coastguard Worker else
2989*3ac0a46fSAndroid Build Coastguard Worker ((cmsFloat32Number*)output)[i + start] = (cmsFloat32Number)v;
2990*3ac0a46fSAndroid Build Coastguard Worker }
2991*3ac0a46fSAndroid Build Coastguard Worker
2992*3ac0a46fSAndroid Build Coastguard Worker
2993*3ac0a46fSAndroid Build Coastguard Worker if (Extra == 0 && SwapFirst) {
2994*3ac0a46fSAndroid Build Coastguard Worker
2995*3ac0a46fSAndroid Build Coastguard Worker memmove(swap1 + 1, swap1, (nChan - 1)* sizeof(cmsFloat32Number));
2996*3ac0a46fSAndroid Build Coastguard Worker *swap1 = (cmsFloat32Number)v;
2997*3ac0a46fSAndroid Build Coastguard Worker }
2998*3ac0a46fSAndroid Build Coastguard Worker
2999*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(info->OutputFormat))
3000*3ac0a46fSAndroid Build Coastguard Worker return output + sizeof(cmsFloat32Number);
3001*3ac0a46fSAndroid Build Coastguard Worker else
3002*3ac0a46fSAndroid Build Coastguard Worker return output + (nChan + Extra) * sizeof(cmsFloat32Number);
3003*3ac0a46fSAndroid Build Coastguard Worker }
3004*3ac0a46fSAndroid Build Coastguard Worker
3005*3ac0a46fSAndroid Build Coastguard Worker static
PackDoublesFromFloat(_cmsTRANSFORM * info,cmsFloat32Number wOut[],cmsUInt8Number * output,cmsUInt32Number Stride)3006*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* PackDoublesFromFloat(_cmsTRANSFORM* info,
3007*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number wOut[],
3008*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* output,
3009*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Stride)
3010*3ac0a46fSAndroid Build Coastguard Worker {
3011*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat);
3012*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat);
3013*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat);
3014*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Extra = T_EXTRA(info->OutputFormat);
3015*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat);
3016*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Planar = T_PLANAR(info->OutputFormat);
3017*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst;
3018*3ac0a46fSAndroid Build Coastguard Worker cmsFloat64Number maximum = IsInkSpace(info->OutputFormat) ? 100.0 : 1.0;
3019*3ac0a46fSAndroid Build Coastguard Worker cmsFloat64Number v = 0;
3020*3ac0a46fSAndroid Build Coastguard Worker cmsFloat64Number* swap1 = (cmsFloat64Number*)output;
3021*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number i, start = 0;
3022*3ac0a46fSAndroid Build Coastguard Worker
3023*3ac0a46fSAndroid Build Coastguard Worker Stride /= PixelSize(info->OutputFormat);
3024*3ac0a46fSAndroid Build Coastguard Worker
3025*3ac0a46fSAndroid Build Coastguard Worker if (ExtraFirst)
3026*3ac0a46fSAndroid Build Coastguard Worker start = Extra;
3027*3ac0a46fSAndroid Build Coastguard Worker
3028*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < nChan; i++) {
3029*3ac0a46fSAndroid Build Coastguard Worker
3030*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i;
3031*3ac0a46fSAndroid Build Coastguard Worker
3032*3ac0a46fSAndroid Build Coastguard Worker v = wOut[index] * maximum;
3033*3ac0a46fSAndroid Build Coastguard Worker
3034*3ac0a46fSAndroid Build Coastguard Worker if (Reverse)
3035*3ac0a46fSAndroid Build Coastguard Worker v = maximum - v;
3036*3ac0a46fSAndroid Build Coastguard Worker
3037*3ac0a46fSAndroid Build Coastguard Worker if (Planar)
3038*3ac0a46fSAndroid Build Coastguard Worker ((cmsFloat64Number*)output)[(i + start) * Stride] = v;
3039*3ac0a46fSAndroid Build Coastguard Worker else
3040*3ac0a46fSAndroid Build Coastguard Worker ((cmsFloat64Number*)output)[i + start] = v;
3041*3ac0a46fSAndroid Build Coastguard Worker }
3042*3ac0a46fSAndroid Build Coastguard Worker
3043*3ac0a46fSAndroid Build Coastguard Worker if (Extra == 0 && SwapFirst) {
3044*3ac0a46fSAndroid Build Coastguard Worker
3045*3ac0a46fSAndroid Build Coastguard Worker memmove(swap1 + 1, swap1, (nChan - 1)* sizeof(cmsFloat64Number));
3046*3ac0a46fSAndroid Build Coastguard Worker *swap1 = v;
3047*3ac0a46fSAndroid Build Coastguard Worker }
3048*3ac0a46fSAndroid Build Coastguard Worker
3049*3ac0a46fSAndroid Build Coastguard Worker
3050*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(info->OutputFormat))
3051*3ac0a46fSAndroid Build Coastguard Worker return output + sizeof(cmsFloat64Number);
3052*3ac0a46fSAndroid Build Coastguard Worker else
3053*3ac0a46fSAndroid Build Coastguard Worker return output + (nChan + Extra) * sizeof(cmsFloat64Number);
3054*3ac0a46fSAndroid Build Coastguard Worker
3055*3ac0a46fSAndroid Build Coastguard Worker }
3056*3ac0a46fSAndroid Build Coastguard Worker
3057*3ac0a46fSAndroid Build Coastguard Worker static
PackLabFloatFromFloat(_cmsTRANSFORM * Info,cmsFloat32Number wOut[],cmsUInt8Number * output,cmsUInt32Number Stride)3058*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* PackLabFloatFromFloat(_cmsTRANSFORM* Info,
3059*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number wOut[],
3060*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* output,
3061*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Stride)
3062*3ac0a46fSAndroid Build Coastguard Worker {
3063*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number* Out = (cmsFloat32Number*) output;
3064*3ac0a46fSAndroid Build Coastguard Worker
3065*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(Info -> OutputFormat)) {
3066*3ac0a46fSAndroid Build Coastguard Worker
3067*3ac0a46fSAndroid Build Coastguard Worker Stride /= PixelSize(Info->OutputFormat);
3068*3ac0a46fSAndroid Build Coastguard Worker
3069*3ac0a46fSAndroid Build Coastguard Worker Out[0] = (cmsFloat32Number) (wOut[0] * 100.0);
3070*3ac0a46fSAndroid Build Coastguard Worker Out[Stride] = (cmsFloat32Number) (wOut[1] * 255.0 - 128.0);
3071*3ac0a46fSAndroid Build Coastguard Worker Out[Stride*2] = (cmsFloat32Number) (wOut[2] * 255.0 - 128.0);
3072*3ac0a46fSAndroid Build Coastguard Worker
3073*3ac0a46fSAndroid Build Coastguard Worker return output + sizeof(cmsFloat32Number);
3074*3ac0a46fSAndroid Build Coastguard Worker }
3075*3ac0a46fSAndroid Build Coastguard Worker else {
3076*3ac0a46fSAndroid Build Coastguard Worker
3077*3ac0a46fSAndroid Build Coastguard Worker Out[0] = (cmsFloat32Number) (wOut[0] * 100.0);
3078*3ac0a46fSAndroid Build Coastguard Worker Out[1] = (cmsFloat32Number) (wOut[1] * 255.0 - 128.0);
3079*3ac0a46fSAndroid Build Coastguard Worker Out[2] = (cmsFloat32Number) (wOut[2] * 255.0 - 128.0);
3080*3ac0a46fSAndroid Build Coastguard Worker
3081*3ac0a46fSAndroid Build Coastguard Worker return output + (sizeof(cmsFloat32Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat32Number));
3082*3ac0a46fSAndroid Build Coastguard Worker }
3083*3ac0a46fSAndroid Build Coastguard Worker
3084*3ac0a46fSAndroid Build Coastguard Worker }
3085*3ac0a46fSAndroid Build Coastguard Worker
3086*3ac0a46fSAndroid Build Coastguard Worker
3087*3ac0a46fSAndroid Build Coastguard Worker static
PackLabDoubleFromFloat(_cmsTRANSFORM * Info,cmsFloat32Number wOut[],cmsUInt8Number * output,cmsUInt32Number Stride)3088*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* PackLabDoubleFromFloat(_cmsTRANSFORM* Info,
3089*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number wOut[],
3090*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* output,
3091*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Stride)
3092*3ac0a46fSAndroid Build Coastguard Worker {
3093*3ac0a46fSAndroid Build Coastguard Worker cmsFloat64Number* Out = (cmsFloat64Number*) output;
3094*3ac0a46fSAndroid Build Coastguard Worker
3095*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(Info -> OutputFormat)) {
3096*3ac0a46fSAndroid Build Coastguard Worker
3097*3ac0a46fSAndroid Build Coastguard Worker Stride /= PixelSize(Info->OutputFormat);
3098*3ac0a46fSAndroid Build Coastguard Worker
3099*3ac0a46fSAndroid Build Coastguard Worker Out[0] = (cmsFloat64Number) (wOut[0] * 100.0);
3100*3ac0a46fSAndroid Build Coastguard Worker Out[Stride] = (cmsFloat64Number) (wOut[1] * 255.0 - 128.0);
3101*3ac0a46fSAndroid Build Coastguard Worker Out[Stride*2] = (cmsFloat64Number) (wOut[2] * 255.0 - 128.0);
3102*3ac0a46fSAndroid Build Coastguard Worker
3103*3ac0a46fSAndroid Build Coastguard Worker return output + sizeof(cmsFloat64Number);
3104*3ac0a46fSAndroid Build Coastguard Worker }
3105*3ac0a46fSAndroid Build Coastguard Worker else {
3106*3ac0a46fSAndroid Build Coastguard Worker
3107*3ac0a46fSAndroid Build Coastguard Worker Out[0] = (cmsFloat64Number) (wOut[0] * 100.0);
3108*3ac0a46fSAndroid Build Coastguard Worker Out[1] = (cmsFloat64Number) (wOut[1] * 255.0 - 128.0);
3109*3ac0a46fSAndroid Build Coastguard Worker Out[2] = (cmsFloat64Number) (wOut[2] * 255.0 - 128.0);
3110*3ac0a46fSAndroid Build Coastguard Worker
3111*3ac0a46fSAndroid Build Coastguard Worker return output + (sizeof(cmsFloat64Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat64Number));
3112*3ac0a46fSAndroid Build Coastguard Worker }
3113*3ac0a46fSAndroid Build Coastguard Worker
3114*3ac0a46fSAndroid Build Coastguard Worker }
3115*3ac0a46fSAndroid Build Coastguard Worker
3116*3ac0a46fSAndroid Build Coastguard Worker
3117*3ac0a46fSAndroid Build Coastguard Worker // From 0..1 range to 0..MAX_ENCODEABLE_XYZ
3118*3ac0a46fSAndroid Build Coastguard Worker static
PackXYZFloatFromFloat(_cmsTRANSFORM * Info,cmsFloat32Number wOut[],cmsUInt8Number * output,cmsUInt32Number Stride)3119*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* PackXYZFloatFromFloat(_cmsTRANSFORM* Info,
3120*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number wOut[],
3121*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* output,
3122*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Stride)
3123*3ac0a46fSAndroid Build Coastguard Worker {
3124*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number* Out = (cmsFloat32Number*) output;
3125*3ac0a46fSAndroid Build Coastguard Worker
3126*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(Info -> OutputFormat)) {
3127*3ac0a46fSAndroid Build Coastguard Worker
3128*3ac0a46fSAndroid Build Coastguard Worker Stride /= PixelSize(Info->OutputFormat);
3129*3ac0a46fSAndroid Build Coastguard Worker
3130*3ac0a46fSAndroid Build Coastguard Worker Out[0] = (cmsFloat32Number) (wOut[0] * MAX_ENCODEABLE_XYZ);
3131*3ac0a46fSAndroid Build Coastguard Worker Out[Stride] = (cmsFloat32Number) (wOut[1] * MAX_ENCODEABLE_XYZ);
3132*3ac0a46fSAndroid Build Coastguard Worker Out[Stride*2] = (cmsFloat32Number) (wOut[2] * MAX_ENCODEABLE_XYZ);
3133*3ac0a46fSAndroid Build Coastguard Worker
3134*3ac0a46fSAndroid Build Coastguard Worker return output + sizeof(cmsFloat32Number);
3135*3ac0a46fSAndroid Build Coastguard Worker }
3136*3ac0a46fSAndroid Build Coastguard Worker else {
3137*3ac0a46fSAndroid Build Coastguard Worker
3138*3ac0a46fSAndroid Build Coastguard Worker Out[0] = (cmsFloat32Number) (wOut[0] * MAX_ENCODEABLE_XYZ);
3139*3ac0a46fSAndroid Build Coastguard Worker Out[1] = (cmsFloat32Number) (wOut[1] * MAX_ENCODEABLE_XYZ);
3140*3ac0a46fSAndroid Build Coastguard Worker Out[2] = (cmsFloat32Number) (wOut[2] * MAX_ENCODEABLE_XYZ);
3141*3ac0a46fSAndroid Build Coastguard Worker
3142*3ac0a46fSAndroid Build Coastguard Worker return output + (sizeof(cmsFloat32Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat32Number));
3143*3ac0a46fSAndroid Build Coastguard Worker }
3144*3ac0a46fSAndroid Build Coastguard Worker
3145*3ac0a46fSAndroid Build Coastguard Worker }
3146*3ac0a46fSAndroid Build Coastguard Worker
3147*3ac0a46fSAndroid Build Coastguard Worker // Same, but convert to double
3148*3ac0a46fSAndroid Build Coastguard Worker static
PackXYZDoubleFromFloat(_cmsTRANSFORM * Info,cmsFloat32Number wOut[],cmsUInt8Number * output,cmsUInt32Number Stride)3149*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* PackXYZDoubleFromFloat(_cmsTRANSFORM* Info,
3150*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number wOut[],
3151*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* output,
3152*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Stride)
3153*3ac0a46fSAndroid Build Coastguard Worker {
3154*3ac0a46fSAndroid Build Coastguard Worker cmsFloat64Number* Out = (cmsFloat64Number*) output;
3155*3ac0a46fSAndroid Build Coastguard Worker
3156*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(Info -> OutputFormat)) {
3157*3ac0a46fSAndroid Build Coastguard Worker
3158*3ac0a46fSAndroid Build Coastguard Worker Stride /= PixelSize(Info->OutputFormat);
3159*3ac0a46fSAndroid Build Coastguard Worker
3160*3ac0a46fSAndroid Build Coastguard Worker Out[0] = (cmsFloat64Number) (wOut[0] * MAX_ENCODEABLE_XYZ);
3161*3ac0a46fSAndroid Build Coastguard Worker Out[Stride] = (cmsFloat64Number) (wOut[1] * MAX_ENCODEABLE_XYZ);
3162*3ac0a46fSAndroid Build Coastguard Worker Out[Stride*2] = (cmsFloat64Number) (wOut[2] * MAX_ENCODEABLE_XYZ);
3163*3ac0a46fSAndroid Build Coastguard Worker
3164*3ac0a46fSAndroid Build Coastguard Worker return output + sizeof(cmsFloat64Number);
3165*3ac0a46fSAndroid Build Coastguard Worker }
3166*3ac0a46fSAndroid Build Coastguard Worker else {
3167*3ac0a46fSAndroid Build Coastguard Worker
3168*3ac0a46fSAndroid Build Coastguard Worker Out[0] = (cmsFloat64Number) (wOut[0] * MAX_ENCODEABLE_XYZ);
3169*3ac0a46fSAndroid Build Coastguard Worker Out[1] = (cmsFloat64Number) (wOut[1] * MAX_ENCODEABLE_XYZ);
3170*3ac0a46fSAndroid Build Coastguard Worker Out[2] = (cmsFloat64Number) (wOut[2] * MAX_ENCODEABLE_XYZ);
3171*3ac0a46fSAndroid Build Coastguard Worker
3172*3ac0a46fSAndroid Build Coastguard Worker return output + (sizeof(cmsFloat64Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat64Number));
3173*3ac0a46fSAndroid Build Coastguard Worker }
3174*3ac0a46fSAndroid Build Coastguard Worker
3175*3ac0a46fSAndroid Build Coastguard Worker }
3176*3ac0a46fSAndroid Build Coastguard Worker
3177*3ac0a46fSAndroid Build Coastguard Worker
3178*3ac0a46fSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------------------------------------------
3179*3ac0a46fSAndroid Build Coastguard Worker
3180*3ac0a46fSAndroid Build Coastguard Worker #ifndef CMS_NO_HALF_SUPPORT
3181*3ac0a46fSAndroid Build Coastguard Worker
3182*3ac0a46fSAndroid Build Coastguard Worker // Decodes an stream of half floats to wIn[] described by input format
3183*3ac0a46fSAndroid Build Coastguard Worker
3184*3ac0a46fSAndroid Build Coastguard Worker static
UnrollHalfTo16(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wIn[],CMSREGISTER cmsUInt8Number * accum,CMSREGISTER cmsUInt32Number Stride)3185*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollHalfTo16(CMSREGISTER _cmsTRANSFORM* info,
3186*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wIn[],
3187*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* accum,
3188*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
3189*3ac0a46fSAndroid Build Coastguard Worker {
3190*3ac0a46fSAndroid Build Coastguard Worker
3191*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat);
3192*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number DoSwap = T_DOSWAP(info ->InputFormat);
3193*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Reverse = T_FLAVOR(info ->InputFormat);
3194*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapFirst = T_SWAPFIRST(info -> InputFormat);
3195*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Extra = T_EXTRA(info -> InputFormat);
3196*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst;
3197*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Planar = T_PLANAR(info -> InputFormat);
3198*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number v;
3199*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number i, start = 0;
3200*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 655.35F : 65535.0F;
3201*3ac0a46fSAndroid Build Coastguard Worker
3202*3ac0a46fSAndroid Build Coastguard Worker
3203*3ac0a46fSAndroid Build Coastguard Worker Stride /= PixelSize(info->OutputFormat);
3204*3ac0a46fSAndroid Build Coastguard Worker
3205*3ac0a46fSAndroid Build Coastguard Worker if (ExtraFirst)
3206*3ac0a46fSAndroid Build Coastguard Worker start = Extra;
3207*3ac0a46fSAndroid Build Coastguard Worker
3208*3ac0a46fSAndroid Build Coastguard Worker for (i=0; i < nChan; i++) {
3209*3ac0a46fSAndroid Build Coastguard Worker
3210*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i;
3211*3ac0a46fSAndroid Build Coastguard Worker
3212*3ac0a46fSAndroid Build Coastguard Worker if (Planar)
3213*3ac0a46fSAndroid Build Coastguard Worker v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[(i + start) * Stride] );
3214*3ac0a46fSAndroid Build Coastguard Worker else
3215*3ac0a46fSAndroid Build Coastguard Worker v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[i + start] ) ;
3216*3ac0a46fSAndroid Build Coastguard Worker
3217*3ac0a46fSAndroid Build Coastguard Worker if (Reverse) v = maximum - v;
3218*3ac0a46fSAndroid Build Coastguard Worker
3219*3ac0a46fSAndroid Build Coastguard Worker wIn[index] = _cmsQuickSaturateWord((cmsFloat64Number) v * maximum);
3220*3ac0a46fSAndroid Build Coastguard Worker }
3221*3ac0a46fSAndroid Build Coastguard Worker
3222*3ac0a46fSAndroid Build Coastguard Worker
3223*3ac0a46fSAndroid Build Coastguard Worker if (Extra == 0 && SwapFirst) {
3224*3ac0a46fSAndroid Build Coastguard Worker cmsUInt16Number tmp = wIn[0];
3225*3ac0a46fSAndroid Build Coastguard Worker
3226*3ac0a46fSAndroid Build Coastguard Worker memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number));
3227*3ac0a46fSAndroid Build Coastguard Worker wIn[nChan-1] = tmp;
3228*3ac0a46fSAndroid Build Coastguard Worker }
3229*3ac0a46fSAndroid Build Coastguard Worker
3230*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(info -> InputFormat))
3231*3ac0a46fSAndroid Build Coastguard Worker return accum + sizeof(cmsUInt16Number);
3232*3ac0a46fSAndroid Build Coastguard Worker else
3233*3ac0a46fSAndroid Build Coastguard Worker return accum + (nChan + Extra) * sizeof(cmsUInt16Number);
3234*3ac0a46fSAndroid Build Coastguard Worker }
3235*3ac0a46fSAndroid Build Coastguard Worker
3236*3ac0a46fSAndroid Build Coastguard Worker // Decodes an stream of half floats to wIn[] described by input format
3237*3ac0a46fSAndroid Build Coastguard Worker
3238*3ac0a46fSAndroid Build Coastguard Worker static
UnrollHalfToFloat(_cmsTRANSFORM * info,cmsFloat32Number wIn[],cmsUInt8Number * accum,cmsUInt32Number Stride)3239*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* UnrollHalfToFloat(_cmsTRANSFORM* info,
3240*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number wIn[],
3241*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* accum,
3242*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Stride)
3243*3ac0a46fSAndroid Build Coastguard Worker {
3244*3ac0a46fSAndroid Build Coastguard Worker
3245*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat);
3246*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number DoSwap = T_DOSWAP(info ->InputFormat);
3247*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Reverse = T_FLAVOR(info ->InputFormat);
3248*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapFirst = T_SWAPFIRST(info -> InputFormat);
3249*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Extra = T_EXTRA(info -> InputFormat);
3250*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst;
3251*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Planar = T_PLANAR(info -> InputFormat);
3252*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number v;
3253*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number i, start = 0;
3254*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 100.0F : 1.0F;
3255*3ac0a46fSAndroid Build Coastguard Worker
3256*3ac0a46fSAndroid Build Coastguard Worker Stride /= PixelSize(info->OutputFormat);
3257*3ac0a46fSAndroid Build Coastguard Worker
3258*3ac0a46fSAndroid Build Coastguard Worker if (ExtraFirst)
3259*3ac0a46fSAndroid Build Coastguard Worker start = Extra;
3260*3ac0a46fSAndroid Build Coastguard Worker
3261*3ac0a46fSAndroid Build Coastguard Worker for (i=0; i < nChan; i++) {
3262*3ac0a46fSAndroid Build Coastguard Worker
3263*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i;
3264*3ac0a46fSAndroid Build Coastguard Worker
3265*3ac0a46fSAndroid Build Coastguard Worker if (Planar)
3266*3ac0a46fSAndroid Build Coastguard Worker v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[(i + start) * Stride] );
3267*3ac0a46fSAndroid Build Coastguard Worker else
3268*3ac0a46fSAndroid Build Coastguard Worker v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[i + start] ) ;
3269*3ac0a46fSAndroid Build Coastguard Worker
3270*3ac0a46fSAndroid Build Coastguard Worker v /= maximum;
3271*3ac0a46fSAndroid Build Coastguard Worker
3272*3ac0a46fSAndroid Build Coastguard Worker wIn[index] = Reverse ? 1 - v : v;
3273*3ac0a46fSAndroid Build Coastguard Worker }
3274*3ac0a46fSAndroid Build Coastguard Worker
3275*3ac0a46fSAndroid Build Coastguard Worker
3276*3ac0a46fSAndroid Build Coastguard Worker if (Extra == 0 && SwapFirst) {
3277*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number tmp = wIn[0];
3278*3ac0a46fSAndroid Build Coastguard Worker
3279*3ac0a46fSAndroid Build Coastguard Worker memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number));
3280*3ac0a46fSAndroid Build Coastguard Worker wIn[nChan-1] = tmp;
3281*3ac0a46fSAndroid Build Coastguard Worker }
3282*3ac0a46fSAndroid Build Coastguard Worker
3283*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(info -> InputFormat))
3284*3ac0a46fSAndroid Build Coastguard Worker return accum + sizeof(cmsUInt16Number);
3285*3ac0a46fSAndroid Build Coastguard Worker else
3286*3ac0a46fSAndroid Build Coastguard Worker return accum + (nChan + Extra) * sizeof(cmsUInt16Number);
3287*3ac0a46fSAndroid Build Coastguard Worker }
3288*3ac0a46fSAndroid Build Coastguard Worker
3289*3ac0a46fSAndroid Build Coastguard Worker
3290*3ac0a46fSAndroid Build Coastguard Worker static
PackHalfFrom16(CMSREGISTER _cmsTRANSFORM * info,CMSREGISTER cmsUInt16Number wOut[],CMSREGISTER cmsUInt8Number * output,CMSREGISTER cmsUInt32Number Stride)3291*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* PackHalfFrom16(CMSREGISTER _cmsTRANSFORM* info,
3292*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt16Number wOut[],
3293*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt8Number* output,
3294*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER cmsUInt32Number Stride)
3295*3ac0a46fSAndroid Build Coastguard Worker {
3296*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat);
3297*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat);
3298*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat);
3299*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Extra = T_EXTRA(info->OutputFormat);
3300*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat);
3301*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Planar = T_PLANAR(info->OutputFormat);
3302*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst;
3303*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number maximum = IsInkSpace(info->OutputFormat) ? 655.35F : 65535.0F;
3304*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number v = 0;
3305*3ac0a46fSAndroid Build Coastguard Worker cmsUInt16Number* swap1 = (cmsUInt16Number*)output;
3306*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number i, start = 0;
3307*3ac0a46fSAndroid Build Coastguard Worker
3308*3ac0a46fSAndroid Build Coastguard Worker Stride /= PixelSize(info->OutputFormat);
3309*3ac0a46fSAndroid Build Coastguard Worker
3310*3ac0a46fSAndroid Build Coastguard Worker if (ExtraFirst)
3311*3ac0a46fSAndroid Build Coastguard Worker start = Extra;
3312*3ac0a46fSAndroid Build Coastguard Worker
3313*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < nChan; i++) {
3314*3ac0a46fSAndroid Build Coastguard Worker
3315*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i;
3316*3ac0a46fSAndroid Build Coastguard Worker
3317*3ac0a46fSAndroid Build Coastguard Worker v = (cmsFloat32Number)wOut[index] / maximum;
3318*3ac0a46fSAndroid Build Coastguard Worker
3319*3ac0a46fSAndroid Build Coastguard Worker if (Reverse)
3320*3ac0a46fSAndroid Build Coastguard Worker v = maximum - v;
3321*3ac0a46fSAndroid Build Coastguard Worker
3322*3ac0a46fSAndroid Build Coastguard Worker if (Planar)
3323*3ac0a46fSAndroid Build Coastguard Worker ((cmsUInt16Number*)output)[(i + start) * Stride] = _cmsFloat2Half(v);
3324*3ac0a46fSAndroid Build Coastguard Worker else
3325*3ac0a46fSAndroid Build Coastguard Worker ((cmsUInt16Number*)output)[i + start] = _cmsFloat2Half(v);
3326*3ac0a46fSAndroid Build Coastguard Worker }
3327*3ac0a46fSAndroid Build Coastguard Worker
3328*3ac0a46fSAndroid Build Coastguard Worker
3329*3ac0a46fSAndroid Build Coastguard Worker if (Extra == 0 && SwapFirst) {
3330*3ac0a46fSAndroid Build Coastguard Worker
3331*3ac0a46fSAndroid Build Coastguard Worker memmove(swap1 + 1, swap1, (nChan - 1)* sizeof(cmsUInt16Number));
3332*3ac0a46fSAndroid Build Coastguard Worker *swap1 = _cmsFloat2Half(v);
3333*3ac0a46fSAndroid Build Coastguard Worker }
3334*3ac0a46fSAndroid Build Coastguard Worker
3335*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(info->OutputFormat))
3336*3ac0a46fSAndroid Build Coastguard Worker return output + sizeof(cmsUInt16Number);
3337*3ac0a46fSAndroid Build Coastguard Worker else
3338*3ac0a46fSAndroid Build Coastguard Worker return output + (nChan + Extra) * sizeof(cmsUInt16Number);
3339*3ac0a46fSAndroid Build Coastguard Worker }
3340*3ac0a46fSAndroid Build Coastguard Worker
3341*3ac0a46fSAndroid Build Coastguard Worker
3342*3ac0a46fSAndroid Build Coastguard Worker
3343*3ac0a46fSAndroid Build Coastguard Worker static
PackHalfFromFloat(_cmsTRANSFORM * info,cmsFloat32Number wOut[],cmsUInt8Number * output,cmsUInt32Number Stride)3344*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* PackHalfFromFloat(_cmsTRANSFORM* info,
3345*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number wOut[],
3346*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* output,
3347*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Stride)
3348*3ac0a46fSAndroid Build Coastguard Worker {
3349*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat);
3350*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat);
3351*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat);
3352*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Extra = T_EXTRA(info->OutputFormat);
3353*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat);
3354*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Planar = T_PLANAR(info->OutputFormat);
3355*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst;
3356*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number maximum = IsInkSpace(info->OutputFormat) ? 100.0F : 1.0F;
3357*3ac0a46fSAndroid Build Coastguard Worker cmsUInt16Number* swap1 = (cmsUInt16Number*)output;
3358*3ac0a46fSAndroid Build Coastguard Worker cmsFloat32Number v = 0;
3359*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number i, start = 0;
3360*3ac0a46fSAndroid Build Coastguard Worker
3361*3ac0a46fSAndroid Build Coastguard Worker Stride /= PixelSize(info->OutputFormat);
3362*3ac0a46fSAndroid Build Coastguard Worker
3363*3ac0a46fSAndroid Build Coastguard Worker if (ExtraFirst)
3364*3ac0a46fSAndroid Build Coastguard Worker start = Extra;
3365*3ac0a46fSAndroid Build Coastguard Worker
3366*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < nChan; i++) {
3367*3ac0a46fSAndroid Build Coastguard Worker
3368*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i;
3369*3ac0a46fSAndroid Build Coastguard Worker
3370*3ac0a46fSAndroid Build Coastguard Worker v = wOut[index] * maximum;
3371*3ac0a46fSAndroid Build Coastguard Worker
3372*3ac0a46fSAndroid Build Coastguard Worker if (Reverse)
3373*3ac0a46fSAndroid Build Coastguard Worker v = maximum - v;
3374*3ac0a46fSAndroid Build Coastguard Worker
3375*3ac0a46fSAndroid Build Coastguard Worker if (Planar)
3376*3ac0a46fSAndroid Build Coastguard Worker ((cmsUInt16Number*)output)[(i + start)* Stride] = _cmsFloat2Half(v);
3377*3ac0a46fSAndroid Build Coastguard Worker else
3378*3ac0a46fSAndroid Build Coastguard Worker ((cmsUInt16Number*)output)[i + start] = _cmsFloat2Half(v);
3379*3ac0a46fSAndroid Build Coastguard Worker }
3380*3ac0a46fSAndroid Build Coastguard Worker
3381*3ac0a46fSAndroid Build Coastguard Worker
3382*3ac0a46fSAndroid Build Coastguard Worker if (Extra == 0 && SwapFirst) {
3383*3ac0a46fSAndroid Build Coastguard Worker
3384*3ac0a46fSAndroid Build Coastguard Worker memmove(swap1 + 1, swap1, (nChan - 1)* sizeof(cmsUInt16Number));
3385*3ac0a46fSAndroid Build Coastguard Worker *swap1 = (cmsUInt16Number)_cmsFloat2Half(v);
3386*3ac0a46fSAndroid Build Coastguard Worker }
3387*3ac0a46fSAndroid Build Coastguard Worker
3388*3ac0a46fSAndroid Build Coastguard Worker if (T_PLANAR(info->OutputFormat))
3389*3ac0a46fSAndroid Build Coastguard Worker return output + sizeof(cmsUInt16Number);
3390*3ac0a46fSAndroid Build Coastguard Worker else
3391*3ac0a46fSAndroid Build Coastguard Worker return output + (nChan + Extra)* sizeof(cmsUInt16Number);
3392*3ac0a46fSAndroid Build Coastguard Worker }
3393*3ac0a46fSAndroid Build Coastguard Worker
3394*3ac0a46fSAndroid Build Coastguard Worker #endif
3395*3ac0a46fSAndroid Build Coastguard Worker
3396*3ac0a46fSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------------------------------------------
3397*3ac0a46fSAndroid Build Coastguard Worker
3398*3ac0a46fSAndroid Build Coastguard Worker
3399*3ac0a46fSAndroid Build Coastguard Worker static const cmsFormatters16 InputFormatters16[] = {
3400*3ac0a46fSAndroid Build Coastguard Worker
3401*3ac0a46fSAndroid Build Coastguard Worker // Type Mask Function
3402*3ac0a46fSAndroid Build Coastguard Worker // ---------------------------- ------------------------------------ ----------------------------
3403*3ac0a46fSAndroid Build Coastguard Worker { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, UnrollLabDoubleTo16},
3404*3ac0a46fSAndroid Build Coastguard Worker { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, UnrollXYZDoubleTo16},
3405*3ac0a46fSAndroid Build Coastguard Worker { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, UnrollLabFloatTo16},
3406*3ac0a46fSAndroid Build Coastguard Worker { TYPE_XYZ_FLT, ANYPLANAR|ANYEXTRA, UnrollXYZFloatTo16},
3407*3ac0a46fSAndroid Build Coastguard Worker { TYPE_GRAY_DBL, 0, UnrollDouble1Chan},
3408*3ac0a46fSAndroid Build Coastguard Worker { FLOAT_SH(1)|BYTES_SH(0), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR|
3409*3ac0a46fSAndroid Build Coastguard Worker ANYSWAP|ANYEXTRA|ANYSPACE, UnrollDoubleTo16},
3410*3ac0a46fSAndroid Build Coastguard Worker { FLOAT_SH(1)|BYTES_SH(4), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR|
3411*3ac0a46fSAndroid Build Coastguard Worker ANYSWAP|ANYEXTRA|ANYSPACE, UnrollFloatTo16},
3412*3ac0a46fSAndroid Build Coastguard Worker #ifndef CMS_NO_HALF_SUPPORT
3413*3ac0a46fSAndroid Build Coastguard Worker { FLOAT_SH(1)|BYTES_SH(2), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR|
3414*3ac0a46fSAndroid Build Coastguard Worker ANYEXTRA|ANYSWAP|ANYSPACE, UnrollHalfTo16},
3415*3ac0a46fSAndroid Build Coastguard Worker #endif
3416*3ac0a46fSAndroid Build Coastguard Worker
3417*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(1)|BYTES_SH(1), ANYSPACE, Unroll1Byte},
3418*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(1), ANYSPACE, Unroll1ByteSkip1},
3419*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(2), ANYSPACE, Unroll1ByteSkip2},
3420*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Unroll1ByteReversed},
3421*3ac0a46fSAndroid Build Coastguard Worker { COLORSPACE_SH(PT_MCH2)|CHANNELS_SH(2)|BYTES_SH(1), 0, Unroll2Bytes},
3422*3ac0a46fSAndroid Build Coastguard Worker
3423*3ac0a46fSAndroid Build Coastguard Worker { TYPE_LabV2_8, 0, UnrollLabV2_8 },
3424*3ac0a46fSAndroid Build Coastguard Worker { TYPE_ALabV2_8, 0, UnrollALabV2_8 },
3425*3ac0a46fSAndroid Build Coastguard Worker { TYPE_LabV2_16, 0, UnrollLabV2_16 },
3426*3ac0a46fSAndroid Build Coastguard Worker
3427*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|BYTES_SH(1), ANYSPACE, Unroll3Bytes},
3428*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll3BytesSwap},
3429*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll3BytesSkip1Swap},
3430*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll3BytesSkip1SwapFirst},
3431*3ac0a46fSAndroid Build Coastguard Worker
3432*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1),
3433*3ac0a46fSAndroid Build Coastguard Worker ANYSPACE, Unroll3BytesSkip1SwapSwapFirst},
3434*3ac0a46fSAndroid Build Coastguard Worker
3435*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(4)|BYTES_SH(1), ANYSPACE, Unroll4Bytes},
3436*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Unroll4BytesReverse},
3437*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll4BytesSwapFirst},
3438*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll4BytesSwap},
3439*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll4BytesSwapSwapFirst},
3440*3ac0a46fSAndroid Build Coastguard Worker
3441*3ac0a46fSAndroid Build Coastguard Worker { BYTES_SH(1)|PLANAR_SH(1), ANYFLAVOR|ANYSWAPFIRST|ANYPREMUL|
3442*3ac0a46fSAndroid Build Coastguard Worker ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollPlanarBytes},
3443*3ac0a46fSAndroid Build Coastguard Worker
3444*3ac0a46fSAndroid Build Coastguard Worker { BYTES_SH(1), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYPREMUL|
3445*3ac0a46fSAndroid Build Coastguard Worker ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollChunkyBytes},
3446*3ac0a46fSAndroid Build Coastguard Worker
3447*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(1)|BYTES_SH(2), ANYSPACE, Unroll1Word},
3448*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1), ANYSPACE, Unroll1WordReversed},
3449*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(1)|BYTES_SH(2)|EXTRA_SH(3), ANYSPACE, Unroll1WordSkip3},
3450*3ac0a46fSAndroid Build Coastguard Worker
3451*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(2)|BYTES_SH(2), ANYSPACE, Unroll2Words},
3452*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|BYTES_SH(2), ANYSPACE, Unroll3Words},
3453*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(4)|BYTES_SH(2), ANYSPACE, Unroll4Words},
3454*3ac0a46fSAndroid Build Coastguard Worker
3455*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Unroll3WordsSwap},
3456*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll3WordsSkip1SwapFirst},
3457*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll3WordsSkip1Swap},
3458*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1), ANYSPACE, Unroll4WordsReverse},
3459*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(4)|BYTES_SH(2)|SWAPFIRST_SH(1), ANYSPACE, Unroll4WordsSwapFirst},
3460*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Unroll4WordsSwap},
3461*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll4WordsSwapSwapFirst},
3462*3ac0a46fSAndroid Build Coastguard Worker
3463*3ac0a46fSAndroid Build Coastguard Worker
3464*3ac0a46fSAndroid Build Coastguard Worker { BYTES_SH(2)|PLANAR_SH(1), ANYFLAVOR|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollPlanarWords},
3465*3ac0a46fSAndroid Build Coastguard Worker { BYTES_SH(2), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollAnyWords},
3466*3ac0a46fSAndroid Build Coastguard Worker
3467*3ac0a46fSAndroid Build Coastguard Worker { BYTES_SH(2)|PLANAR_SH(1), ANYFLAVOR|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE|PREMUL_SH(1), UnrollPlanarWordsPremul},
3468*3ac0a46fSAndroid Build Coastguard Worker { BYTES_SH(2), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE|PREMUL_SH(1), UnrollAnyWordsPremul}
3469*3ac0a46fSAndroid Build Coastguard Worker
3470*3ac0a46fSAndroid Build Coastguard Worker };
3471*3ac0a46fSAndroid Build Coastguard Worker
3472*3ac0a46fSAndroid Build Coastguard Worker
3473*3ac0a46fSAndroid Build Coastguard Worker
3474*3ac0a46fSAndroid Build Coastguard Worker static const cmsFormattersFloat InputFormattersFloat[] = {
3475*3ac0a46fSAndroid Build Coastguard Worker
3476*3ac0a46fSAndroid Build Coastguard Worker // Type Mask Function
3477*3ac0a46fSAndroid Build Coastguard Worker // ---------------------------- ------------------------------------ ----------------------------
3478*3ac0a46fSAndroid Build Coastguard Worker { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, UnrollLabDoubleToFloat},
3479*3ac0a46fSAndroid Build Coastguard Worker { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, UnrollLabFloatToFloat},
3480*3ac0a46fSAndroid Build Coastguard Worker
3481*3ac0a46fSAndroid Build Coastguard Worker { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, UnrollXYZDoubleToFloat},
3482*3ac0a46fSAndroid Build Coastguard Worker { TYPE_XYZ_FLT, ANYPLANAR|ANYEXTRA, UnrollXYZFloatToFloat},
3483*3ac0a46fSAndroid Build Coastguard Worker
3484*3ac0a46fSAndroid Build Coastguard Worker { FLOAT_SH(1)|BYTES_SH(4), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|
3485*3ac0a46fSAndroid Build Coastguard Worker ANYPREMUL|ANYCHANNELS|ANYSPACE, UnrollFloatsToFloat},
3486*3ac0a46fSAndroid Build Coastguard Worker
3487*3ac0a46fSAndroid Build Coastguard Worker { FLOAT_SH(1)|BYTES_SH(0), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|
3488*3ac0a46fSAndroid Build Coastguard Worker ANYCHANNELS|ANYSPACE|ANYPREMUL, UnrollDoublesToFloat},
3489*3ac0a46fSAndroid Build Coastguard Worker
3490*3ac0a46fSAndroid Build Coastguard Worker { TYPE_LabV2_8, 0, UnrollLabV2_8ToFloat },
3491*3ac0a46fSAndroid Build Coastguard Worker { TYPE_ALabV2_8, 0, UnrollALabV2_8ToFloat },
3492*3ac0a46fSAndroid Build Coastguard Worker { TYPE_LabV2_16, 0, UnrollLabV2_16ToFloat },
3493*3ac0a46fSAndroid Build Coastguard Worker
3494*3ac0a46fSAndroid Build Coastguard Worker { BYTES_SH(1), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|
3495*3ac0a46fSAndroid Build Coastguard Worker ANYCHANNELS|ANYSPACE, Unroll8ToFloat},
3496*3ac0a46fSAndroid Build Coastguard Worker
3497*3ac0a46fSAndroid Build Coastguard Worker { BYTES_SH(2), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|
3498*3ac0a46fSAndroid Build Coastguard Worker ANYCHANNELS|ANYSPACE, Unroll16ToFloat},
3499*3ac0a46fSAndroid Build Coastguard Worker #ifndef CMS_NO_HALF_SUPPORT
3500*3ac0a46fSAndroid Build Coastguard Worker { FLOAT_SH(1)|BYTES_SH(2), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|
3501*3ac0a46fSAndroid Build Coastguard Worker ANYCHANNELS|ANYSPACE, UnrollHalfToFloat},
3502*3ac0a46fSAndroid Build Coastguard Worker #endif
3503*3ac0a46fSAndroid Build Coastguard Worker };
3504*3ac0a46fSAndroid Build Coastguard Worker
3505*3ac0a46fSAndroid Build Coastguard Worker
3506*3ac0a46fSAndroid Build Coastguard Worker // Bit fields set to one in the mask are not compared
3507*3ac0a46fSAndroid Build Coastguard Worker static
_cmsGetStockInputFormatter(cmsUInt32Number dwInput,cmsUInt32Number dwFlags)3508*3ac0a46fSAndroid Build Coastguard Worker cmsFormatter _cmsGetStockInputFormatter(cmsUInt32Number dwInput, cmsUInt32Number dwFlags)
3509*3ac0a46fSAndroid Build Coastguard Worker {
3510*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number i;
3511*3ac0a46fSAndroid Build Coastguard Worker cmsFormatter fr;
3512*3ac0a46fSAndroid Build Coastguard Worker
3513*3ac0a46fSAndroid Build Coastguard Worker switch (dwFlags) {
3514*3ac0a46fSAndroid Build Coastguard Worker
3515*3ac0a46fSAndroid Build Coastguard Worker case CMS_PACK_FLAGS_16BITS: {
3516*3ac0a46fSAndroid Build Coastguard Worker for (i=0; i < sizeof(InputFormatters16) / sizeof(cmsFormatters16); i++) {
3517*3ac0a46fSAndroid Build Coastguard Worker const cmsFormatters16* f = InputFormatters16 + i;
3518*3ac0a46fSAndroid Build Coastguard Worker
3519*3ac0a46fSAndroid Build Coastguard Worker if ((dwInput & ~f ->Mask) == f ->Type) {
3520*3ac0a46fSAndroid Build Coastguard Worker fr.Fmt16 = f ->Frm;
3521*3ac0a46fSAndroid Build Coastguard Worker return fr;
3522*3ac0a46fSAndroid Build Coastguard Worker }
3523*3ac0a46fSAndroid Build Coastguard Worker }
3524*3ac0a46fSAndroid Build Coastguard Worker }
3525*3ac0a46fSAndroid Build Coastguard Worker break;
3526*3ac0a46fSAndroid Build Coastguard Worker
3527*3ac0a46fSAndroid Build Coastguard Worker case CMS_PACK_FLAGS_FLOAT: {
3528*3ac0a46fSAndroid Build Coastguard Worker for (i=0; i < sizeof(InputFormattersFloat) / sizeof(cmsFormattersFloat); i++) {
3529*3ac0a46fSAndroid Build Coastguard Worker const cmsFormattersFloat* f = InputFormattersFloat + i;
3530*3ac0a46fSAndroid Build Coastguard Worker
3531*3ac0a46fSAndroid Build Coastguard Worker if ((dwInput & ~f ->Mask) == f ->Type) {
3532*3ac0a46fSAndroid Build Coastguard Worker fr.FmtFloat = f ->Frm;
3533*3ac0a46fSAndroid Build Coastguard Worker return fr;
3534*3ac0a46fSAndroid Build Coastguard Worker }
3535*3ac0a46fSAndroid Build Coastguard Worker }
3536*3ac0a46fSAndroid Build Coastguard Worker }
3537*3ac0a46fSAndroid Build Coastguard Worker break;
3538*3ac0a46fSAndroid Build Coastguard Worker
3539*3ac0a46fSAndroid Build Coastguard Worker default:;
3540*3ac0a46fSAndroid Build Coastguard Worker
3541*3ac0a46fSAndroid Build Coastguard Worker }
3542*3ac0a46fSAndroid Build Coastguard Worker
3543*3ac0a46fSAndroid Build Coastguard Worker fr.Fmt16 = NULL;
3544*3ac0a46fSAndroid Build Coastguard Worker return fr;
3545*3ac0a46fSAndroid Build Coastguard Worker }
3546*3ac0a46fSAndroid Build Coastguard Worker
3547*3ac0a46fSAndroid Build Coastguard Worker static const cmsFormatters16 OutputFormatters16[] = {
3548*3ac0a46fSAndroid Build Coastguard Worker // Type Mask Function
3549*3ac0a46fSAndroid Build Coastguard Worker // ---------------------------- ------------------------------------ ----------------------------
3550*3ac0a46fSAndroid Build Coastguard Worker
3551*3ac0a46fSAndroid Build Coastguard Worker { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, PackLabDoubleFrom16},
3552*3ac0a46fSAndroid Build Coastguard Worker { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, PackXYZDoubleFrom16},
3553*3ac0a46fSAndroid Build Coastguard Worker
3554*3ac0a46fSAndroid Build Coastguard Worker { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, PackLabFloatFrom16},
3555*3ac0a46fSAndroid Build Coastguard Worker { TYPE_XYZ_FLT, ANYPLANAR|ANYEXTRA, PackXYZFloatFrom16},
3556*3ac0a46fSAndroid Build Coastguard Worker
3557*3ac0a46fSAndroid Build Coastguard Worker { FLOAT_SH(1)|BYTES_SH(0), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|
3558*3ac0a46fSAndroid Build Coastguard Worker ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE, PackDoubleFrom16},
3559*3ac0a46fSAndroid Build Coastguard Worker { FLOAT_SH(1)|BYTES_SH(4), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|
3560*3ac0a46fSAndroid Build Coastguard Worker ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE, PackFloatFrom16},
3561*3ac0a46fSAndroid Build Coastguard Worker #ifndef CMS_NO_HALF_SUPPORT
3562*3ac0a46fSAndroid Build Coastguard Worker { FLOAT_SH(1)|BYTES_SH(2), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|
3563*3ac0a46fSAndroid Build Coastguard Worker ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE, PackHalfFrom16},
3564*3ac0a46fSAndroid Build Coastguard Worker #endif
3565*3ac0a46fSAndroid Build Coastguard Worker
3566*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(1)|BYTES_SH(1), ANYSPACE, Pack1Byte},
3567*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(1), ANYSPACE, Pack1ByteSkip1},
3568*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack1ByteSkip1SwapFirst},
3569*3ac0a46fSAndroid Build Coastguard Worker
3570*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Pack1ByteReversed},
3571*3ac0a46fSAndroid Build Coastguard Worker
3572*3ac0a46fSAndroid Build Coastguard Worker { TYPE_LabV2_8, 0, PackLabV2_8 },
3573*3ac0a46fSAndroid Build Coastguard Worker { TYPE_ALabV2_8, 0, PackALabV2_8 },
3574*3ac0a46fSAndroid Build Coastguard Worker { TYPE_LabV2_16, 0, PackLabV2_16 },
3575*3ac0a46fSAndroid Build Coastguard Worker
3576*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|BYTES_SH(1)|OPTIMIZED_SH(1), ANYSPACE, Pack3BytesOptimized},
3577*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|OPTIMIZED_SH(1), ANYSPACE, Pack3BytesAndSkip1Optimized},
3578*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1)|OPTIMIZED_SH(1),
3579*3ac0a46fSAndroid Build Coastguard Worker ANYSPACE, Pack3BytesAndSkip1SwapFirstOptimized},
3580*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)|OPTIMIZED_SH(1),
3581*3ac0a46fSAndroid Build Coastguard Worker ANYSPACE, Pack3BytesAndSkip1SwapSwapFirstOptimized},
3582*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|EXTRA_SH(1)|OPTIMIZED_SH(1),
3583*3ac0a46fSAndroid Build Coastguard Worker ANYSPACE, Pack3BytesAndSkip1SwapOptimized},
3584*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|OPTIMIZED_SH(1), ANYSPACE, Pack3BytesSwapOptimized},
3585*3ac0a46fSAndroid Build Coastguard Worker
3586*3ac0a46fSAndroid Build Coastguard Worker
3587*3ac0a46fSAndroid Build Coastguard Worker
3588*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|BYTES_SH(1), ANYSPACE, Pack3Bytes},
3589*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1), ANYSPACE, Pack3BytesAndSkip1},
3590*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack3BytesAndSkip1SwapFirst},
3591*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1),
3592*3ac0a46fSAndroid Build Coastguard Worker ANYSPACE, Pack3BytesAndSkip1SwapSwapFirst},
3593*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|EXTRA_SH(1), ANYSPACE, Pack3BytesAndSkip1Swap},
3594*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Pack3BytesSwap},
3595*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(4)|BYTES_SH(1), ANYSPACE, Pack4Bytes},
3596*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Pack4BytesReverse},
3597*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack4BytesSwapFirst},
3598*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Pack4BytesSwap},
3599*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack4BytesSwapSwapFirst},
3600*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(6)|BYTES_SH(1), ANYSPACE, Pack6Bytes},
3601*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(6)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Pack6BytesSwap},
3602*3ac0a46fSAndroid Build Coastguard Worker
3603*3ac0a46fSAndroid Build Coastguard Worker { BYTES_SH(1), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|
3604*3ac0a46fSAndroid Build Coastguard Worker ANYSPACE|ANYPREMUL, PackChunkyBytes},
3605*3ac0a46fSAndroid Build Coastguard Worker
3606*3ac0a46fSAndroid Build Coastguard Worker { BYTES_SH(1)|PLANAR_SH(1), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|
3607*3ac0a46fSAndroid Build Coastguard Worker ANYCHANNELS|ANYSPACE|ANYPREMUL, PackPlanarBytes},
3608*3ac0a46fSAndroid Build Coastguard Worker
3609*3ac0a46fSAndroid Build Coastguard Worker
3610*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(1)|BYTES_SH(2), ANYSPACE, Pack1Word},
3611*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(1)|BYTES_SH(2)|EXTRA_SH(1), ANYSPACE, Pack1WordSkip1},
3612*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(1)|BYTES_SH(2)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack1WordSkip1SwapFirst},
3613*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1), ANYSPACE, Pack1WordReversed},
3614*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1), ANYSPACE, Pack1WordBigEndian},
3615*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|BYTES_SH(2), ANYSPACE, Pack3Words},
3616*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Pack3WordsSwap},
3617*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1), ANYSPACE, Pack3WordsBigEndian},
3618*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1), ANYSPACE, Pack3WordsAndSkip1},
3619*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|DOSWAP_SH(1), ANYSPACE, Pack3WordsAndSkip1Swap},
3620*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack3WordsAndSkip1SwapFirst},
3621*3ac0a46fSAndroid Build Coastguard Worker
3622*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1),
3623*3ac0a46fSAndroid Build Coastguard Worker ANYSPACE, Pack3WordsAndSkip1SwapSwapFirst},
3624*3ac0a46fSAndroid Build Coastguard Worker
3625*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(4)|BYTES_SH(2), ANYSPACE, Pack4Words},
3626*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1), ANYSPACE, Pack4WordsReverse},
3627*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Pack4WordsSwap},
3628*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1), ANYSPACE, Pack4WordsBigEndian},
3629*3ac0a46fSAndroid Build Coastguard Worker
3630*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(6)|BYTES_SH(2), ANYSPACE, Pack6Words},
3631*3ac0a46fSAndroid Build Coastguard Worker { CHANNELS_SH(6)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Pack6WordsSwap},
3632*3ac0a46fSAndroid Build Coastguard Worker
3633*3ac0a46fSAndroid Build Coastguard Worker { BYTES_SH(2), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYENDIAN|
3634*3ac0a46fSAndroid Build Coastguard Worker ANYEXTRA|ANYCHANNELS|ANYSPACE|ANYPREMUL, PackChunkyWords},
3635*3ac0a46fSAndroid Build Coastguard Worker { BYTES_SH(2)|PLANAR_SH(1), ANYFLAVOR|ANYENDIAN|ANYSWAP|ANYEXTRA|
3636*3ac0a46fSAndroid Build Coastguard Worker ANYCHANNELS|ANYSPACE|ANYPREMUL, PackPlanarWords}
3637*3ac0a46fSAndroid Build Coastguard Worker
3638*3ac0a46fSAndroid Build Coastguard Worker };
3639*3ac0a46fSAndroid Build Coastguard Worker
3640*3ac0a46fSAndroid Build Coastguard Worker
3641*3ac0a46fSAndroid Build Coastguard Worker static const cmsFormattersFloat OutputFormattersFloat[] = {
3642*3ac0a46fSAndroid Build Coastguard Worker // Type Mask Function
3643*3ac0a46fSAndroid Build Coastguard Worker // ---------------------------- --------------------------------------------------- ----------------------------
3644*3ac0a46fSAndroid Build Coastguard Worker { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, PackLabFloatFromFloat},
3645*3ac0a46fSAndroid Build Coastguard Worker { TYPE_XYZ_FLT, ANYPLANAR|ANYEXTRA, PackXYZFloatFromFloat},
3646*3ac0a46fSAndroid Build Coastguard Worker
3647*3ac0a46fSAndroid Build Coastguard Worker { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, PackLabDoubleFromFloat},
3648*3ac0a46fSAndroid Build Coastguard Worker { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, PackXYZDoubleFromFloat},
3649*3ac0a46fSAndroid Build Coastguard Worker
3650*3ac0a46fSAndroid Build Coastguard Worker { FLOAT_SH(1)|BYTES_SH(4), ANYPLANAR|
3651*3ac0a46fSAndroid Build Coastguard Worker ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackFloatsFromFloat },
3652*3ac0a46fSAndroid Build Coastguard Worker { FLOAT_SH(1)|BYTES_SH(0), ANYPLANAR|
3653*3ac0a46fSAndroid Build Coastguard Worker ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackDoublesFromFloat },
3654*3ac0a46fSAndroid Build Coastguard Worker #ifndef CMS_NO_HALF_SUPPORT
3655*3ac0a46fSAndroid Build Coastguard Worker { FLOAT_SH(1)|BYTES_SH(2),
3656*3ac0a46fSAndroid Build Coastguard Worker ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackHalfFromFloat },
3657*3ac0a46fSAndroid Build Coastguard Worker #endif
3658*3ac0a46fSAndroid Build Coastguard Worker
3659*3ac0a46fSAndroid Build Coastguard Worker };
3660*3ac0a46fSAndroid Build Coastguard Worker
3661*3ac0a46fSAndroid Build Coastguard Worker
3662*3ac0a46fSAndroid Build Coastguard Worker // Bit fields set to one in the mask are not compared
3663*3ac0a46fSAndroid Build Coastguard Worker static
_cmsGetStockOutputFormatter(cmsUInt32Number dwInput,cmsUInt32Number dwFlags)3664*3ac0a46fSAndroid Build Coastguard Worker cmsFormatter _cmsGetStockOutputFormatter(cmsUInt32Number dwInput, cmsUInt32Number dwFlags)
3665*3ac0a46fSAndroid Build Coastguard Worker {
3666*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number i;
3667*3ac0a46fSAndroid Build Coastguard Worker cmsFormatter fr;
3668*3ac0a46fSAndroid Build Coastguard Worker
3669*3ac0a46fSAndroid Build Coastguard Worker // Optimization is only a hint
3670*3ac0a46fSAndroid Build Coastguard Worker dwInput &= ~OPTIMIZED_SH(1);
3671*3ac0a46fSAndroid Build Coastguard Worker
3672*3ac0a46fSAndroid Build Coastguard Worker switch (dwFlags)
3673*3ac0a46fSAndroid Build Coastguard Worker {
3674*3ac0a46fSAndroid Build Coastguard Worker
3675*3ac0a46fSAndroid Build Coastguard Worker case CMS_PACK_FLAGS_16BITS: {
3676*3ac0a46fSAndroid Build Coastguard Worker
3677*3ac0a46fSAndroid Build Coastguard Worker for (i=0; i < sizeof(OutputFormatters16) / sizeof(cmsFormatters16); i++) {
3678*3ac0a46fSAndroid Build Coastguard Worker const cmsFormatters16* f = OutputFormatters16 + i;
3679*3ac0a46fSAndroid Build Coastguard Worker
3680*3ac0a46fSAndroid Build Coastguard Worker if ((dwInput & ~f ->Mask) == f ->Type) {
3681*3ac0a46fSAndroid Build Coastguard Worker fr.Fmt16 = f ->Frm;
3682*3ac0a46fSAndroid Build Coastguard Worker return fr;
3683*3ac0a46fSAndroid Build Coastguard Worker }
3684*3ac0a46fSAndroid Build Coastguard Worker }
3685*3ac0a46fSAndroid Build Coastguard Worker }
3686*3ac0a46fSAndroid Build Coastguard Worker break;
3687*3ac0a46fSAndroid Build Coastguard Worker
3688*3ac0a46fSAndroid Build Coastguard Worker case CMS_PACK_FLAGS_FLOAT: {
3689*3ac0a46fSAndroid Build Coastguard Worker
3690*3ac0a46fSAndroid Build Coastguard Worker for (i=0; i < sizeof(OutputFormattersFloat) / sizeof(cmsFormattersFloat); i++) {
3691*3ac0a46fSAndroid Build Coastguard Worker const cmsFormattersFloat* f = OutputFormattersFloat + i;
3692*3ac0a46fSAndroid Build Coastguard Worker
3693*3ac0a46fSAndroid Build Coastguard Worker if ((dwInput & ~f ->Mask) == f ->Type) {
3694*3ac0a46fSAndroid Build Coastguard Worker fr.FmtFloat = f ->Frm;
3695*3ac0a46fSAndroid Build Coastguard Worker return fr;
3696*3ac0a46fSAndroid Build Coastguard Worker }
3697*3ac0a46fSAndroid Build Coastguard Worker }
3698*3ac0a46fSAndroid Build Coastguard Worker }
3699*3ac0a46fSAndroid Build Coastguard Worker break;
3700*3ac0a46fSAndroid Build Coastguard Worker
3701*3ac0a46fSAndroid Build Coastguard Worker default:;
3702*3ac0a46fSAndroid Build Coastguard Worker
3703*3ac0a46fSAndroid Build Coastguard Worker }
3704*3ac0a46fSAndroid Build Coastguard Worker
3705*3ac0a46fSAndroid Build Coastguard Worker fr.Fmt16 = NULL;
3706*3ac0a46fSAndroid Build Coastguard Worker return fr;
3707*3ac0a46fSAndroid Build Coastguard Worker }
3708*3ac0a46fSAndroid Build Coastguard Worker
3709*3ac0a46fSAndroid Build Coastguard Worker
3710*3ac0a46fSAndroid Build Coastguard Worker typedef struct _cms_formatters_factory_list {
3711*3ac0a46fSAndroid Build Coastguard Worker
3712*3ac0a46fSAndroid Build Coastguard Worker cmsFormatterFactory Factory;
3713*3ac0a46fSAndroid Build Coastguard Worker struct _cms_formatters_factory_list *Next;
3714*3ac0a46fSAndroid Build Coastguard Worker
3715*3ac0a46fSAndroid Build Coastguard Worker } cmsFormattersFactoryList;
3716*3ac0a46fSAndroid Build Coastguard Worker
3717*3ac0a46fSAndroid Build Coastguard Worker _cmsFormattersPluginChunkType _cmsFormattersPluginChunk = { NULL };
3718*3ac0a46fSAndroid Build Coastguard Worker
3719*3ac0a46fSAndroid Build Coastguard Worker
3720*3ac0a46fSAndroid Build Coastguard Worker // Duplicates the zone of memory used by the plug-in in the new context
3721*3ac0a46fSAndroid Build Coastguard Worker static
DupFormatterFactoryList(struct _cmsContext_struct * ctx,const struct _cmsContext_struct * src)3722*3ac0a46fSAndroid Build Coastguard Worker void DupFormatterFactoryList(struct _cmsContext_struct* ctx,
3723*3ac0a46fSAndroid Build Coastguard Worker const struct _cmsContext_struct* src)
3724*3ac0a46fSAndroid Build Coastguard Worker {
3725*3ac0a46fSAndroid Build Coastguard Worker _cmsFormattersPluginChunkType newHead = { NULL };
3726*3ac0a46fSAndroid Build Coastguard Worker cmsFormattersFactoryList* entry;
3727*3ac0a46fSAndroid Build Coastguard Worker cmsFormattersFactoryList* Anterior = NULL;
3728*3ac0a46fSAndroid Build Coastguard Worker _cmsFormattersPluginChunkType* head = (_cmsFormattersPluginChunkType*) src->chunks[FormattersPlugin];
3729*3ac0a46fSAndroid Build Coastguard Worker
3730*3ac0a46fSAndroid Build Coastguard Worker _cmsAssert(head != NULL);
3731*3ac0a46fSAndroid Build Coastguard Worker
3732*3ac0a46fSAndroid Build Coastguard Worker // Walk the list copying all nodes
3733*3ac0a46fSAndroid Build Coastguard Worker for (entry = head->FactoryList;
3734*3ac0a46fSAndroid Build Coastguard Worker entry != NULL;
3735*3ac0a46fSAndroid Build Coastguard Worker entry = entry ->Next) {
3736*3ac0a46fSAndroid Build Coastguard Worker
3737*3ac0a46fSAndroid Build Coastguard Worker cmsFormattersFactoryList *newEntry = ( cmsFormattersFactoryList *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(cmsFormattersFactoryList));
3738*3ac0a46fSAndroid Build Coastguard Worker
3739*3ac0a46fSAndroid Build Coastguard Worker if (newEntry == NULL)
3740*3ac0a46fSAndroid Build Coastguard Worker return;
3741*3ac0a46fSAndroid Build Coastguard Worker
3742*3ac0a46fSAndroid Build Coastguard Worker // We want to keep the linked list order, so this is a little bit tricky
3743*3ac0a46fSAndroid Build Coastguard Worker newEntry -> Next = NULL;
3744*3ac0a46fSAndroid Build Coastguard Worker if (Anterior)
3745*3ac0a46fSAndroid Build Coastguard Worker Anterior -> Next = newEntry;
3746*3ac0a46fSAndroid Build Coastguard Worker
3747*3ac0a46fSAndroid Build Coastguard Worker Anterior = newEntry;
3748*3ac0a46fSAndroid Build Coastguard Worker
3749*3ac0a46fSAndroid Build Coastguard Worker if (newHead.FactoryList == NULL)
3750*3ac0a46fSAndroid Build Coastguard Worker newHead.FactoryList = newEntry;
3751*3ac0a46fSAndroid Build Coastguard Worker }
3752*3ac0a46fSAndroid Build Coastguard Worker
3753*3ac0a46fSAndroid Build Coastguard Worker ctx ->chunks[FormattersPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsFormattersPluginChunkType));
3754*3ac0a46fSAndroid Build Coastguard Worker }
3755*3ac0a46fSAndroid Build Coastguard Worker
3756*3ac0a46fSAndroid Build Coastguard Worker // The interpolation plug-in memory chunk allocator/dup
_cmsAllocFormattersPluginChunk(struct _cmsContext_struct * ctx,const struct _cmsContext_struct * src)3757*3ac0a46fSAndroid Build Coastguard Worker void _cmsAllocFormattersPluginChunk(struct _cmsContext_struct* ctx,
3758*3ac0a46fSAndroid Build Coastguard Worker const struct _cmsContext_struct* src)
3759*3ac0a46fSAndroid Build Coastguard Worker {
3760*3ac0a46fSAndroid Build Coastguard Worker _cmsAssert(ctx != NULL);
3761*3ac0a46fSAndroid Build Coastguard Worker
3762*3ac0a46fSAndroid Build Coastguard Worker if (src != NULL) {
3763*3ac0a46fSAndroid Build Coastguard Worker
3764*3ac0a46fSAndroid Build Coastguard Worker // Duplicate the LIST
3765*3ac0a46fSAndroid Build Coastguard Worker DupFormatterFactoryList(ctx, src);
3766*3ac0a46fSAndroid Build Coastguard Worker }
3767*3ac0a46fSAndroid Build Coastguard Worker else {
3768*3ac0a46fSAndroid Build Coastguard Worker static _cmsFormattersPluginChunkType FormattersPluginChunk = { NULL };
3769*3ac0a46fSAndroid Build Coastguard Worker ctx ->chunks[FormattersPlugin] = _cmsSubAllocDup(ctx ->MemPool, &FormattersPluginChunk, sizeof(_cmsFormattersPluginChunkType));
3770*3ac0a46fSAndroid Build Coastguard Worker }
3771*3ac0a46fSAndroid Build Coastguard Worker }
3772*3ac0a46fSAndroid Build Coastguard Worker
3773*3ac0a46fSAndroid Build Coastguard Worker
3774*3ac0a46fSAndroid Build Coastguard Worker
3775*3ac0a46fSAndroid Build Coastguard Worker // Formatters management
_cmsRegisterFormattersPlugin(cmsContext ContextID,cmsPluginBase * Data)3776*3ac0a46fSAndroid Build Coastguard Worker cmsBool _cmsRegisterFormattersPlugin(cmsContext ContextID, cmsPluginBase* Data)
3777*3ac0a46fSAndroid Build Coastguard Worker {
3778*3ac0a46fSAndroid Build Coastguard Worker _cmsFormattersPluginChunkType* ctx = ( _cmsFormattersPluginChunkType*) _cmsContextGetClientChunk(ContextID, FormattersPlugin);
3779*3ac0a46fSAndroid Build Coastguard Worker cmsPluginFormatters* Plugin = (cmsPluginFormatters*) Data;
3780*3ac0a46fSAndroid Build Coastguard Worker cmsFormattersFactoryList* fl ;
3781*3ac0a46fSAndroid Build Coastguard Worker
3782*3ac0a46fSAndroid Build Coastguard Worker // Reset to built-in defaults
3783*3ac0a46fSAndroid Build Coastguard Worker if (Data == NULL) {
3784*3ac0a46fSAndroid Build Coastguard Worker
3785*3ac0a46fSAndroid Build Coastguard Worker ctx ->FactoryList = NULL;
3786*3ac0a46fSAndroid Build Coastguard Worker return TRUE;
3787*3ac0a46fSAndroid Build Coastguard Worker }
3788*3ac0a46fSAndroid Build Coastguard Worker
3789*3ac0a46fSAndroid Build Coastguard Worker fl = (cmsFormattersFactoryList*) _cmsPluginMalloc(ContextID, sizeof(cmsFormattersFactoryList));
3790*3ac0a46fSAndroid Build Coastguard Worker if (fl == NULL) return FALSE;
3791*3ac0a46fSAndroid Build Coastguard Worker
3792*3ac0a46fSAndroid Build Coastguard Worker fl ->Factory = Plugin ->FormattersFactory;
3793*3ac0a46fSAndroid Build Coastguard Worker
3794*3ac0a46fSAndroid Build Coastguard Worker fl ->Next = ctx -> FactoryList;
3795*3ac0a46fSAndroid Build Coastguard Worker ctx ->FactoryList = fl;
3796*3ac0a46fSAndroid Build Coastguard Worker
3797*3ac0a46fSAndroid Build Coastguard Worker return TRUE;
3798*3ac0a46fSAndroid Build Coastguard Worker }
3799*3ac0a46fSAndroid Build Coastguard Worker
_cmsGetFormatter(cmsContext ContextID,cmsUInt32Number Type,cmsFormatterDirection Dir,cmsUInt32Number dwFlags)3800*3ac0a46fSAndroid Build Coastguard Worker cmsFormatter CMSEXPORT _cmsGetFormatter(cmsContext ContextID,
3801*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Type, // Specific type, i.e. TYPE_RGB_8
3802*3ac0a46fSAndroid Build Coastguard Worker cmsFormatterDirection Dir,
3803*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number dwFlags)
3804*3ac0a46fSAndroid Build Coastguard Worker {
3805*3ac0a46fSAndroid Build Coastguard Worker _cmsFormattersPluginChunkType* ctx = ( _cmsFormattersPluginChunkType*) _cmsContextGetClientChunk(ContextID, FormattersPlugin);
3806*3ac0a46fSAndroid Build Coastguard Worker cmsFormattersFactoryList* f;
3807*3ac0a46fSAndroid Build Coastguard Worker
3808*3ac0a46fSAndroid Build Coastguard Worker if (T_CHANNELS(Type) == 0) {
3809*3ac0a46fSAndroid Build Coastguard Worker static const cmsFormatter nullFormatter = { 0 };
3810*3ac0a46fSAndroid Build Coastguard Worker return nullFormatter;
3811*3ac0a46fSAndroid Build Coastguard Worker }
3812*3ac0a46fSAndroid Build Coastguard Worker
3813*3ac0a46fSAndroid Build Coastguard Worker for (f =ctx->FactoryList; f != NULL; f = f ->Next) {
3814*3ac0a46fSAndroid Build Coastguard Worker
3815*3ac0a46fSAndroid Build Coastguard Worker cmsFormatter fn = f ->Factory(Type, Dir, dwFlags);
3816*3ac0a46fSAndroid Build Coastguard Worker if (fn.Fmt16 != NULL) return fn;
3817*3ac0a46fSAndroid Build Coastguard Worker }
3818*3ac0a46fSAndroid Build Coastguard Worker
3819*3ac0a46fSAndroid Build Coastguard Worker // Revert to default
3820*3ac0a46fSAndroid Build Coastguard Worker if (Dir == cmsFormatterInput)
3821*3ac0a46fSAndroid Build Coastguard Worker return _cmsGetStockInputFormatter(Type, dwFlags);
3822*3ac0a46fSAndroid Build Coastguard Worker else
3823*3ac0a46fSAndroid Build Coastguard Worker return _cmsGetStockOutputFormatter(Type, dwFlags);
3824*3ac0a46fSAndroid Build Coastguard Worker }
3825*3ac0a46fSAndroid Build Coastguard Worker
3826*3ac0a46fSAndroid Build Coastguard Worker
3827*3ac0a46fSAndroid Build Coastguard Worker // Return whatever given formatter refers to float values
_cmsFormatterIsFloat(cmsUInt32Number Type)3828*3ac0a46fSAndroid Build Coastguard Worker cmsBool _cmsFormatterIsFloat(cmsUInt32Number Type)
3829*3ac0a46fSAndroid Build Coastguard Worker {
3830*3ac0a46fSAndroid Build Coastguard Worker return T_FLOAT(Type) ? TRUE : FALSE;
3831*3ac0a46fSAndroid Build Coastguard Worker }
3832*3ac0a46fSAndroid Build Coastguard Worker
3833*3ac0a46fSAndroid Build Coastguard Worker // Return whatever given formatter refers to 8 bits
_cmsFormatterIs8bit(cmsUInt32Number Type)3834*3ac0a46fSAndroid Build Coastguard Worker cmsBool _cmsFormatterIs8bit(cmsUInt32Number Type)
3835*3ac0a46fSAndroid Build Coastguard Worker {
3836*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Bytes = T_BYTES(Type);
3837*3ac0a46fSAndroid Build Coastguard Worker
3838*3ac0a46fSAndroid Build Coastguard Worker return (Bytes == 1);
3839*3ac0a46fSAndroid Build Coastguard Worker }
3840*3ac0a46fSAndroid Build Coastguard Worker
3841*3ac0a46fSAndroid Build Coastguard Worker // Build a suitable formatter for the colorspace of this profile
cmsFormatterForColorspaceOfProfile(cmsHPROFILE hProfile,cmsUInt32Number nBytes,cmsBool lIsFloat)3842*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number CMSEXPORT cmsFormatterForColorspaceOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat)
3843*3ac0a46fSAndroid Build Coastguard Worker {
3844*3ac0a46fSAndroid Build Coastguard Worker
3845*3ac0a46fSAndroid Build Coastguard Worker cmsColorSpaceSignature ColorSpace = cmsGetColorSpace(hProfile);
3846*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number ColorSpaceBits = (cmsUInt32Number) _cmsLCMScolorSpace(ColorSpace);
3847*3ac0a46fSAndroid Build Coastguard Worker cmsInt32Number nOutputChans = cmsChannelsOfColorSpace(ColorSpace);
3848*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Float = lIsFloat ? 1U : 0;
3849*3ac0a46fSAndroid Build Coastguard Worker
3850*3ac0a46fSAndroid Build Coastguard Worker // Unsupported color space?
3851*3ac0a46fSAndroid Build Coastguard Worker if (nOutputChans < 0) return 0;
3852*3ac0a46fSAndroid Build Coastguard Worker
3853*3ac0a46fSAndroid Build Coastguard Worker // Create a fake formatter for result
3854*3ac0a46fSAndroid Build Coastguard Worker return FLOAT_SH(Float) | COLORSPACE_SH(ColorSpaceBits) | BYTES_SH(nBytes) | CHANNELS_SH(nOutputChans);
3855*3ac0a46fSAndroid Build Coastguard Worker }
3856*3ac0a46fSAndroid Build Coastguard Worker
3857*3ac0a46fSAndroid Build Coastguard Worker // Build a suitable formatter for the colorspace of this profile
cmsFormatterForPCSOfProfile(cmsHPROFILE hProfile,cmsUInt32Number nBytes,cmsBool lIsFloat)3858*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number CMSEXPORT cmsFormatterForPCSOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat)
3859*3ac0a46fSAndroid Build Coastguard Worker {
3860*3ac0a46fSAndroid Build Coastguard Worker
3861*3ac0a46fSAndroid Build Coastguard Worker cmsColorSpaceSignature ColorSpace = cmsGetPCS(hProfile);
3862*3ac0a46fSAndroid Build Coastguard Worker
3863*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number ColorSpaceBits = (cmsUInt32Number) _cmsLCMScolorSpace(ColorSpace);
3864*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number nOutputChans = cmsChannelsOf(ColorSpace);
3865*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Float = lIsFloat ? 1U : 0;
3866*3ac0a46fSAndroid Build Coastguard Worker
3867*3ac0a46fSAndroid Build Coastguard Worker // Create a fake formatter for result
3868*3ac0a46fSAndroid Build Coastguard Worker return FLOAT_SH(Float) | COLORSPACE_SH(ColorSpaceBits) | BYTES_SH(nBytes) | CHANNELS_SH(nOutputChans);
3869*3ac0a46fSAndroid Build Coastguard Worker }
3870*3ac0a46fSAndroid Build Coastguard Worker
3871