xref: /aosp_15_r20/external/pdfium/third_party/lcms/src/cmspack.c (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
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