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