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