diff options
Diffstat (limited to 'third_party/lcms2-2.6/src/cmspack.c')
-rw-r--r-- | third_party/lcms2-2.6/src/cmspack.c | 3369 |
1 files changed, 0 insertions, 3369 deletions
diff --git a/third_party/lcms2-2.6/src/cmspack.c b/third_party/lcms2-2.6/src/cmspack.c deleted file mode 100644 index 9323b53ec5..0000000000 --- a/third_party/lcms2-2.6/src/cmspack.c +++ /dev/null @@ -1,3369 +0,0 @@ -//--------------------------------------------------------------------------------- -// -// Little Color Management System -// Copyright (c) 1998-2010 Marti Maria Saguer -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the "Software"), -// to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, -// and/or sell copies of the Software, and to permit persons to whom the Software -// is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// -//--------------------------------------------------------------------------------- -// -#include "lcms2_internal.h" - -// This module handles all formats supported by lcms. There are two flavors, 16 bits and -// floating point. Floating point is supported only in a subset, those formats holding -// cmsFloat32Number (4 bytes per component) and double (marked as 0 bytes per component -// as special case) - -// --------------------------------------------------------------------------- - - -// This macro return words stored as big endian -#define CHANGE_ENDIAN(w) (cmsUInt16Number) ((cmsUInt16Number) ((w)<<8)|((w)>>8)) - -// These macros handles reversing (negative) -#define REVERSE_FLAVOR_8(x) ((cmsUInt8Number) (0xff-(x))) -#define REVERSE_FLAVOR_16(x) ((cmsUInt16Number)(0xffff-(x))) - -// * 0xffff / 0xff00 = (255 * 257) / (255 * 256) = 257 / 256 -cmsINLINE cmsUInt16Number FomLabV2ToLabV4(cmsUInt16Number x) -{ - int a = (x << 8 | x) >> 8; // * 257 / 256 - if ( a > 0xffff) return 0xffff; - return (cmsUInt16Number) a; -} - -// * 0xf00 / 0xffff = * 256 / 257 -cmsINLINE cmsUInt16Number FomLabV4ToLabV2(cmsUInt16Number x) -{ - return (cmsUInt16Number) (((x << 8) + 0x80) / 257); -} - - -typedef struct { - cmsUInt32Number Type; - cmsUInt32Number Mask; - cmsFormatter16 Frm; - -} cmsFormatters16; - -typedef struct { - cmsUInt32Number Type; - cmsUInt32Number Mask; - cmsFormatterFloat Frm; - -} cmsFormattersFloat; - - -#define ANYSPACE COLORSPACE_SH(31) -#define ANYCHANNELS CHANNELS_SH(15) -#define ANYEXTRA EXTRA_SH(7) -#define ANYPLANAR PLANAR_SH(1) -#define ANYENDIAN ENDIAN16_SH(1) -#define ANYSWAP DOSWAP_SH(1) -#define ANYSWAPFIRST SWAPFIRST_SH(1) -#define ANYFLAVOR FLAVOR_SH(1) - - -// Supress waning about info never being used - -#ifdef _MSC_VER -#pragma warning(disable : 4100) -#endif - -// Unpacking routines (16 bits) ---------------------------------------------------------------------------------------- - - -// Does almost everything but is slow -static -cmsUInt8Number* UnrollChunkyBytes(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - int nChan = T_CHANNELS(info -> InputFormat); - int DoSwap = T_DOSWAP(info ->InputFormat); - int Reverse = T_FLAVOR(info ->InputFormat); - int SwapFirst = T_SWAPFIRST(info -> InputFormat); - int Extra = T_EXTRA(info -> InputFormat); - int ExtraFirst = DoSwap ^ SwapFirst; - cmsUInt16Number v; - int i; - - if (ExtraFirst) { - accum += Extra; - } - - for (i=0; i < nChan; i++) { - int index = DoSwap ? (nChan - i - 1) : i; - - v = FROM_8_TO_16(*accum); - v = Reverse ? REVERSE_FLAVOR_16(v) : v; - wIn[index] = v; - accum++; - } - - if (!ExtraFirst) { - accum += Extra; - } - - if (Extra == 0 && SwapFirst) { - cmsUInt16Number tmp = wIn[0]; - - memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number)); - wIn[nChan-1] = tmp; - } - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); - -} - -// Extra channels are just ignored because come in the next planes -static -cmsUInt8Number* UnrollPlanarBytes(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - int nChan = T_CHANNELS(info -> InputFormat); - int DoSwap = T_DOSWAP(info ->InputFormat); - int SwapFirst = T_SWAPFIRST(info ->InputFormat); - int Reverse = T_FLAVOR(info ->InputFormat); - int i; - cmsUInt8Number* Init = accum; - - if (DoSwap ^ SwapFirst) { - accum += T_EXTRA(info -> InputFormat) * Stride; - } - - for (i=0; i < nChan; i++) { - - int index = DoSwap ? (nChan - i - 1) : i; - cmsUInt16Number v = FROM_8_TO_16(*accum); - - wIn[index] = Reverse ? REVERSE_FLAVOR_16(v) : v; - accum += Stride; - } - - return (Init + 1); -} - -// Special cases, provided for performance -static -cmsUInt8Number* Unroll4Bytes(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[0] = FROM_8_TO_16(*accum); accum++; // C - wIn[1] = FROM_8_TO_16(*accum); accum++; // M - wIn[2] = FROM_8_TO_16(*accum); accum++; // Y - wIn[3] = FROM_8_TO_16(*accum); accum++; // K - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Unroll4BytesReverse(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[0] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // C - wIn[1] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // M - wIn[2] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // Y - wIn[3] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // K - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Unroll4BytesSwapFirst(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[3] = FROM_8_TO_16(*accum); accum++; // K - wIn[0] = FROM_8_TO_16(*accum); accum++; // C - wIn[1] = FROM_8_TO_16(*accum); accum++; // M - wIn[2] = FROM_8_TO_16(*accum); accum++; // Y - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -// KYMC -static -cmsUInt8Number* Unroll4BytesSwap(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[3] = FROM_8_TO_16(*accum); accum++; // K - wIn[2] = FROM_8_TO_16(*accum); accum++; // Y - wIn[1] = FROM_8_TO_16(*accum); accum++; // M - wIn[0] = FROM_8_TO_16(*accum); accum++; // C - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Unroll4BytesSwapSwapFirst(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[2] = FROM_8_TO_16(*accum); accum++; // K - wIn[1] = FROM_8_TO_16(*accum); accum++; // Y - wIn[0] = FROM_8_TO_16(*accum); accum++; // M - wIn[3] = FROM_8_TO_16(*accum); accum++; // C - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Unroll3Bytes(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[0] = FROM_8_TO_16(*accum); accum++; // R - wIn[1] = FROM_8_TO_16(*accum); accum++; // G - wIn[2] = FROM_8_TO_16(*accum); accum++; // B - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Unroll3BytesSkip1Swap(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - accum++; // A - wIn[2] = FROM_8_TO_16(*accum); accum++; // B - wIn[1] = FROM_8_TO_16(*accum); accum++; // G - wIn[0] = FROM_8_TO_16(*accum); accum++; // R - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Unroll3BytesSkip1SwapSwapFirst(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[2] = FROM_8_TO_16(*accum); accum++; // B - wIn[1] = FROM_8_TO_16(*accum); accum++; // G - wIn[0] = FROM_8_TO_16(*accum); accum++; // R - accum++; // A - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Unroll3BytesSkip1SwapFirst(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - accum++; // A - wIn[0] = FROM_8_TO_16(*accum); accum++; // R - wIn[1] = FROM_8_TO_16(*accum); accum++; // G - wIn[2] = FROM_8_TO_16(*accum); accum++; // B - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - - -// BRG -static -cmsUInt8Number* Unroll3BytesSwap(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[2] = FROM_8_TO_16(*accum); accum++; // B - wIn[1] = FROM_8_TO_16(*accum); accum++; // G - wIn[0] = FROM_8_TO_16(*accum); accum++; // R - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* UnrollLabV2_8(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[0] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // L - wIn[1] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // a - wIn[2] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // b - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* UnrollALabV2_8(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - accum++; // A - wIn[0] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // L - wIn[1] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // a - wIn[2] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // b - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* UnrollLabV2_16(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[0] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // L - wIn[1] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // a - wIn[2] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // b - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -// for duplex -static -cmsUInt8Number* Unroll2Bytes(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[0] = FROM_8_TO_16(*accum); accum++; // ch1 - wIn[1] = FROM_8_TO_16(*accum); accum++; // ch2 - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - - - - -// Monochrome duplicates L into RGB for null-transforms -static -cmsUInt8Number* Unroll1Byte(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++; // L - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - - -static -cmsUInt8Number* Unroll1ByteSkip1(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++; // L - accum += 1; - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Unroll1ByteSkip2(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++; // L - accum += 2; - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Unroll1ByteReversed(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[0] = wIn[1] = wIn[2] = REVERSE_FLAVOR_16(FROM_8_TO_16(*accum)); accum++; // L - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - - -static -cmsUInt8Number* UnrollAnyWords(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - int nChan = T_CHANNELS(info -> InputFormat); - int SwapEndian = T_ENDIAN16(info -> InputFormat); - int DoSwap = T_DOSWAP(info ->InputFormat); - int Reverse = T_FLAVOR(info ->InputFormat); - int SwapFirst = T_SWAPFIRST(info -> InputFormat); - int Extra = T_EXTRA(info -> InputFormat); - int ExtraFirst = DoSwap ^ SwapFirst; - int i; - - if (ExtraFirst) { - accum += Extra * sizeof(cmsUInt16Number); - } - - for (i=0; i < nChan; i++) { - - int index = DoSwap ? (nChan - i - 1) : i; - cmsUInt16Number v = *(cmsUInt16Number*) accum; - - if (SwapEndian) - v = CHANGE_ENDIAN(v); - - wIn[index] = Reverse ? REVERSE_FLAVOR_16(v) : v; - - accum += sizeof(cmsUInt16Number); - } - - if (!ExtraFirst) { - accum += Extra * sizeof(cmsUInt16Number); - } - - if (Extra == 0 && SwapFirst) { - - cmsUInt16Number tmp = wIn[0]; - - memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number)); - wIn[nChan-1] = tmp; - } - - return accum; - - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* UnrollPlanarWords(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - int nChan = T_CHANNELS(info -> InputFormat); - int DoSwap= T_DOSWAP(info ->InputFormat); - int Reverse= T_FLAVOR(info ->InputFormat); - int SwapEndian = T_ENDIAN16(info -> InputFormat); - int i; - cmsUInt8Number* Init = accum; - - if (DoSwap) { - accum += T_EXTRA(info -> InputFormat) * Stride * sizeof(cmsUInt16Number); - } - - for (i=0; i < nChan; i++) { - - int index = DoSwap ? (nChan - i - 1) : i; - cmsUInt16Number v = *(cmsUInt16Number*) accum; - - if (SwapEndian) - v = CHANGE_ENDIAN(v); - - wIn[index] = Reverse ? REVERSE_FLAVOR_16(v) : v; - - accum += Stride * sizeof(cmsUInt16Number); - } - - return (Init + sizeof(cmsUInt16Number)); -} - - -static -cmsUInt8Number* Unroll4Words(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C - wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M - wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y - wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // K - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Unroll4WordsReverse(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[0] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // C - wIn[1] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // M - wIn[2] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // Y - wIn[3] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // K - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Unroll4WordsSwapFirst(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // K - wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C - wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M - wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -// KYMC -static -cmsUInt8Number* Unroll4WordsSwap(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // K - wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y - wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M - wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Unroll4WordsSwapSwapFirst(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // K - wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // Y - wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // M - wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // C - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Unroll3Words(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C R - wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M G - wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y B - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Unroll3WordsSwap(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // C R - wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M G - wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // Y B - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Unroll3WordsSkip1Swap(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - accum += 2; // A - wIn[2] = *(cmsUInt16Number*) accum; accum += 2; // R - wIn[1] = *(cmsUInt16Number*) accum; accum += 2; // G - wIn[0] = *(cmsUInt16Number*) accum; accum += 2; // B - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Unroll3WordsSkip1SwapFirst(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - accum += 2; // A - wIn[0] = *(cmsUInt16Number*) accum; accum += 2; // R - wIn[1] = *(cmsUInt16Number*) accum; accum += 2; // G - wIn[2] = *(cmsUInt16Number*) accum; accum += 2; // B - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Unroll1Word(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[0] = wIn[1] = wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // L - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Unroll1WordReversed(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[0] = wIn[1] = wIn[2] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Unroll1WordSkip3(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[0] = wIn[1] = wIn[2] = *(cmsUInt16Number*) accum; - - accum += 8; - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Unroll2Words(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[0] = *(cmsUInt16Number*) accum; accum += 2; // ch1 - wIn[1] = *(cmsUInt16Number*) accum; accum += 2; // ch2 - - return accum; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - - -// This is a conversion of Lab double to 16 bits -static -cmsUInt8Number* UnrollLabDoubleTo16(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - if (T_PLANAR(info -> InputFormat)) { - - cmsFloat64Number* Pt = (cmsFloat64Number*) accum; - - cmsCIELab Lab; - - Lab.L = Pt[0]; - Lab.a = Pt[Stride]; - Lab.b = Pt[Stride*2]; - - cmsFloat2LabEncoded(wIn, &Lab); - return accum + sizeof(cmsFloat64Number); - } - else { - - cmsFloat2LabEncoded(wIn, (cmsCIELab*) accum); - accum += sizeof(cmsCIELab) + T_EXTRA(info ->InputFormat) * sizeof(cmsFloat64Number); - return accum; - } -} - - -// This is a conversion of Lab float to 16 bits -static -cmsUInt8Number* UnrollLabFloatTo16(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - cmsCIELab Lab; - - if (T_PLANAR(info -> InputFormat)) { - - cmsFloat32Number* Pt = (cmsFloat32Number*) accum; - - - Lab.L = Pt[0]; - Lab.a = Pt[Stride]; - Lab.b = Pt[Stride*2]; - - cmsFloat2LabEncoded(wIn, &Lab); - return accum + sizeof(cmsFloat32Number); - } - else { - - Lab.L = ((cmsFloat32Number*) accum)[0]; - Lab.a = ((cmsFloat32Number*) accum)[1]; - Lab.b = ((cmsFloat32Number*) accum)[2]; - - cmsFloat2LabEncoded(wIn, &Lab); - accum += (3 + T_EXTRA(info ->InputFormat)) * sizeof(cmsFloat32Number); - return accum; - } -} - -// This is a conversion of XYZ double to 16 bits -static -cmsUInt8Number* UnrollXYZDoubleTo16(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - if (T_PLANAR(info -> InputFormat)) { - - cmsFloat64Number* Pt = (cmsFloat64Number*) accum; - cmsCIEXYZ XYZ; - - XYZ.X = Pt[0]; - XYZ.Y = Pt[Stride]; - XYZ.Z = Pt[Stride*2]; - cmsFloat2XYZEncoded(wIn, &XYZ); - - return accum + sizeof(cmsFloat64Number); - - } - - else { - cmsFloat2XYZEncoded(wIn, (cmsCIEXYZ*) accum); - accum += sizeof(cmsCIEXYZ) + T_EXTRA(info ->InputFormat) * sizeof(cmsFloat64Number); - - return accum; - } -} - -// This is a conversion of XYZ float to 16 bits -static -cmsUInt8Number* UnrollXYZFloatTo16(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - if (T_PLANAR(info -> InputFormat)) { - - cmsFloat32Number* Pt = (cmsFloat32Number*) accum; - cmsCIEXYZ XYZ; - - XYZ.X = Pt[0]; - XYZ.Y = Pt[Stride]; - XYZ.Z = Pt[Stride*2]; - cmsFloat2XYZEncoded(wIn, &XYZ); - - return accum + sizeof(cmsFloat32Number); - - } - - else { - cmsFloat32Number* Pt = (cmsFloat32Number*) accum; - cmsCIEXYZ XYZ; - - XYZ.X = Pt[0]; - XYZ.Y = Pt[1]; - XYZ.Z = Pt[2]; - cmsFloat2XYZEncoded(wIn, &XYZ); - - accum += 3 * sizeof(cmsFloat32Number) + T_EXTRA(info ->InputFormat) * sizeof(cmsFloat32Number); - - return accum; - } -} - -// Check if space is marked as ink -cmsINLINE cmsBool IsInkSpace(cmsUInt32Number Type) -{ - switch (T_COLORSPACE(Type)) { - - case PT_CMY: - case PT_CMYK: - case PT_MCH5: - case PT_MCH6: - case PT_MCH7: - case PT_MCH8: - case PT_MCH9: - case PT_MCH10: - case PT_MCH11: - case PT_MCH12: - case PT_MCH13: - case PT_MCH14: - case PT_MCH15: return TRUE; - - default: return FALSE; - } -} - -// Inks does come in percentage, remaining cases are between 0..1.0, again to 16 bits -static -cmsUInt8Number* UnrollDoubleTo16(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - - int nChan = T_CHANNELS(info -> InputFormat); - int DoSwap = T_DOSWAP(info ->InputFormat); - int Reverse = T_FLAVOR(info ->InputFormat); - int SwapFirst = T_SWAPFIRST(info -> InputFormat); - int Extra = T_EXTRA(info -> InputFormat); - int ExtraFirst = DoSwap ^ SwapFirst; - int Planar = T_PLANAR(info -> InputFormat); - cmsFloat64Number v; - cmsUInt16Number vi; - int i, start = 0; - cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 655.35 : 65535.0; - - - if (ExtraFirst) - start = Extra; - - for (i=0; i < nChan; i++) { - - int index = DoSwap ? (nChan - i - 1) : i; - - if (Planar) - v = (cmsFloat32Number) ((cmsFloat64Number*) accum)[(i + start) * Stride]; - else - v = (cmsFloat32Number) ((cmsFloat64Number*) accum)[i + start]; - - vi = _cmsQuickSaturateWord(v * maximum); - - if (Reverse) - vi = REVERSE_FLAVOR_16(vi); - - wIn[index] = vi; - } - - - if (Extra == 0 && SwapFirst) { - cmsUInt16Number tmp = wIn[0]; - - memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number)); - wIn[nChan-1] = tmp; - } - - if (T_PLANAR(info -> InputFormat)) - return accum + sizeof(cmsFloat64Number); - else - return accum + (nChan + Extra) * sizeof(cmsFloat64Number); -} - - - -static -cmsUInt8Number* UnrollFloatTo16(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - - int nChan = T_CHANNELS(info -> InputFormat); - int DoSwap = T_DOSWAP(info ->InputFormat); - int Reverse = T_FLAVOR(info ->InputFormat); - int SwapFirst = T_SWAPFIRST(info -> InputFormat); - int Extra = T_EXTRA(info -> InputFormat); - int ExtraFirst = DoSwap ^ SwapFirst; - int Planar = T_PLANAR(info -> InputFormat); - cmsFloat32Number v; - cmsUInt16Number vi; - int i, start = 0; - cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 655.35 : 65535.0; - - - if (ExtraFirst) - start = Extra; - - for (i=0; i < nChan; i++) { - - int index = DoSwap ? (nChan - i - 1) : i; - - if (Planar) - v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[(i + start) * Stride]; - else - v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[i + start]; - - vi = _cmsQuickSaturateWord(v * maximum); - - if (Reverse) - vi = REVERSE_FLAVOR_16(vi); - - wIn[index] = vi; - } - - - if (Extra == 0 && SwapFirst) { - cmsUInt16Number tmp = wIn[0]; - - memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number)); - wIn[nChan-1] = tmp; - } - - if (T_PLANAR(info -> InputFormat)) - return accum + sizeof(cmsFloat32Number); - else - return accum + (nChan + Extra) * sizeof(cmsFloat32Number); -} - - - - -// For 1 channel, we need to duplicate data (it comes in 0..1.0 range) -static -cmsUInt8Number* UnrollDouble1Chan(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - cmsFloat64Number* Inks = (cmsFloat64Number*) accum; - - wIn[0] = wIn[1] = wIn[2] = _cmsQuickSaturateWord(Inks[0] * 65535.0); - - return accum + sizeof(cmsFloat64Number); - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -//------------------------------------------------------------------------------------------------------------------- - -// For anything going from cmsFloat32Number -static -cmsUInt8Number* UnrollFloatsToFloat(_cmsTRANSFORM* info, - cmsFloat32Number wIn[], - cmsUInt8Number* accum, - cmsUInt32Number Stride) -{ - - int nChan = T_CHANNELS(info -> InputFormat); - int DoSwap = T_DOSWAP(info ->InputFormat); - int Reverse = T_FLAVOR(info ->InputFormat); - int SwapFirst = T_SWAPFIRST(info -> InputFormat); - int Extra = T_EXTRA(info -> InputFormat); - int ExtraFirst = DoSwap ^ SwapFirst; - int Planar = T_PLANAR(info -> InputFormat); - cmsFloat32Number v; - int i, start = 0; - cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 100.0F : 1.0F; - - - if (ExtraFirst) - start = Extra; - - for (i=0; i < nChan; i++) { - - int index = DoSwap ? (nChan - i - 1) : i; - - if (Planar) - v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[(i + start) * Stride]; - else - v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[i + start]; - - v /= maximum; - - wIn[index] = Reverse ? 1 - v : v; - } - - - if (Extra == 0 && SwapFirst) { - cmsFloat32Number tmp = wIn[0]; - - memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number)); - wIn[nChan-1] = tmp; - } - - if (T_PLANAR(info -> InputFormat)) - return accum + sizeof(cmsFloat32Number); - else - return accum + (nChan + Extra) * sizeof(cmsFloat32Number); -} - -// For anything going from double - -static -cmsUInt8Number* UnrollDoublesToFloat(_cmsTRANSFORM* info, - cmsFloat32Number wIn[], - cmsUInt8Number* accum, - cmsUInt32Number Stride) -{ - - int nChan = T_CHANNELS(info -> InputFormat); - int DoSwap = T_DOSWAP(info ->InputFormat); - int Reverse = T_FLAVOR(info ->InputFormat); - int SwapFirst = T_SWAPFIRST(info -> InputFormat); - int Extra = T_EXTRA(info -> InputFormat); - int ExtraFirst = DoSwap ^ SwapFirst; - int Planar = T_PLANAR(info -> InputFormat); - cmsFloat64Number v; - int i, start = 0; - cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 100.0 : 1.0; - - - if (ExtraFirst) - start = Extra; - - for (i=0; i < nChan; i++) { - - int index = DoSwap ? (nChan - i - 1) : i; - - if (Planar) - v = (cmsFloat64Number) ((cmsFloat64Number*) accum)[(i + start) * Stride]; - else - v = (cmsFloat64Number) ((cmsFloat64Number*) accum)[i + start]; - - v /= maximum; - - wIn[index] = (cmsFloat32Number) (Reverse ? 1.0 - v : v); - } - - - if (Extra == 0 && SwapFirst) { - cmsFloat32Number tmp = wIn[0]; - - memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number)); - wIn[nChan-1] = tmp; - } - - if (T_PLANAR(info -> InputFormat)) - return accum + sizeof(cmsFloat64Number); - else - return accum + (nChan + Extra) * sizeof(cmsFloat64Number); -} - - - -// From Lab double to cmsFloat32Number -static -cmsUInt8Number* UnrollLabDoubleToFloat(_cmsTRANSFORM* info, - cmsFloat32Number wIn[], - cmsUInt8Number* accum, - cmsUInt32Number Stride) -{ - cmsFloat64Number* Pt = (cmsFloat64Number*) accum; - - if (T_PLANAR(info -> InputFormat)) { - - wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 - wIn[1] = (cmsFloat32Number) ((Pt[Stride] + 128) / 255.0); // form -128..+127 to 0..1 - wIn[2] = (cmsFloat32Number) ((Pt[Stride*2] + 128) / 255.0); - - return accum + sizeof(cmsFloat64Number); - } - else { - - wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 - wIn[1] = (cmsFloat32Number) ((Pt[1] + 128) / 255.0); // form -128..+127 to 0..1 - wIn[2] = (cmsFloat32Number) ((Pt[2] + 128) / 255.0); - - accum += sizeof(cmsFloat64Number)*(3 + T_EXTRA(info ->InputFormat)); - return accum; - } -} - -// From Lab double to cmsFloat32Number -static -cmsUInt8Number* UnrollLabFloatToFloat(_cmsTRANSFORM* info, - cmsFloat32Number wIn[], - cmsUInt8Number* accum, - cmsUInt32Number Stride) -{ - cmsFloat32Number* Pt = (cmsFloat32Number*) accum; - - if (T_PLANAR(info -> InputFormat)) { - - wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 - wIn[1] = (cmsFloat32Number) ((Pt[Stride] + 128) / 255.0); // form -128..+127 to 0..1 - wIn[2] = (cmsFloat32Number) ((Pt[Stride*2] + 128) / 255.0); - - return accum + sizeof(cmsFloat32Number); - } - else { - - wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 - wIn[1] = (cmsFloat32Number) ((Pt[1] + 128) / 255.0); // form -128..+127 to 0..1 - wIn[2] = (cmsFloat32Number) ((Pt[2] + 128) / 255.0); - - accum += sizeof(cmsFloat32Number)*(3 + T_EXTRA(info ->InputFormat)); - return accum; - } -} - - - -// 1.15 fixed point, that means maximum value is MAX_ENCODEABLE_XYZ (0xFFFF) -static -cmsUInt8Number* UnrollXYZDoubleToFloat(_cmsTRANSFORM* info, - cmsFloat32Number wIn[], - cmsUInt8Number* accum, - cmsUInt32Number Stride) -{ - cmsFloat64Number* Pt = (cmsFloat64Number*) accum; - - if (T_PLANAR(info -> InputFormat)) { - - wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ); - wIn[1] = (cmsFloat32Number) (Pt[Stride] / MAX_ENCODEABLE_XYZ); - wIn[2] = (cmsFloat32Number) (Pt[Stride*2] / MAX_ENCODEABLE_XYZ); - - return accum + sizeof(cmsFloat64Number); - } - else { - - wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ); - wIn[1] = (cmsFloat32Number) (Pt[1] / MAX_ENCODEABLE_XYZ); - wIn[2] = (cmsFloat32Number) (Pt[2] / MAX_ENCODEABLE_XYZ); - - accum += sizeof(cmsFloat64Number)*(3 + T_EXTRA(info ->InputFormat)); - return accum; - } -} - -static -cmsUInt8Number* UnrollXYZFloatToFloat(_cmsTRANSFORM* info, - cmsFloat32Number wIn[], - cmsUInt8Number* accum, - cmsUInt32Number Stride) -{ - cmsFloat32Number* Pt = (cmsFloat32Number*) accum; - - if (T_PLANAR(info -> InputFormat)) { - - wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ); - wIn[1] = (cmsFloat32Number) (Pt[Stride] / MAX_ENCODEABLE_XYZ); - wIn[2] = (cmsFloat32Number) (Pt[Stride*2] / MAX_ENCODEABLE_XYZ); - - return accum + sizeof(cmsFloat32Number); - } - else { - - wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ); - wIn[1] = (cmsFloat32Number) (Pt[1] / MAX_ENCODEABLE_XYZ); - wIn[2] = (cmsFloat32Number) (Pt[2] / MAX_ENCODEABLE_XYZ); - - accum += sizeof(cmsFloat32Number)*(3 + T_EXTRA(info ->InputFormat)); - return accum; - } -} - - - -// Packing routines ----------------------------------------------------------------------------------------------------------- - - -// Generic chunky for byte - -static -cmsUInt8Number* PackAnyBytes(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - int nChan = T_CHANNELS(info -> OutputFormat); - int DoSwap = T_DOSWAP(info ->OutputFormat); - int Reverse = T_FLAVOR(info ->OutputFormat); - int Extra = T_EXTRA(info -> OutputFormat); - int SwapFirst = T_SWAPFIRST(info -> OutputFormat); - int ExtraFirst = DoSwap ^ SwapFirst; - cmsUInt8Number* swap1; - cmsUInt8Number v = 0; - int i; - - swap1 = output; - - if (ExtraFirst) { - output += Extra; - } - - for (i=0; i < nChan; i++) { - - int index = DoSwap ? (nChan - i - 1) : i; - - v = FROM_16_TO_8(wOut[index]); - - if (Reverse) - v = REVERSE_FLAVOR_8(v); - - *output++ = v; - } - - if (!ExtraFirst) { - output += Extra; - } - - if (Extra == 0 && SwapFirst) { - - memmove(swap1 + 1, swap1, nChan-1); - *swap1 = v; - } - - - return output; - - cmsUNUSED_PARAMETER(Stride); -} - - - -static -cmsUInt8Number* PackAnyWords(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - int nChan = T_CHANNELS(info -> OutputFormat); - int SwapEndian = T_ENDIAN16(info -> InputFormat); - int DoSwap = T_DOSWAP(info ->OutputFormat); - int Reverse = T_FLAVOR(info ->OutputFormat); - int Extra = T_EXTRA(info -> OutputFormat); - int SwapFirst = T_SWAPFIRST(info -> OutputFormat); - int ExtraFirst = DoSwap ^ SwapFirst; - cmsUInt16Number* swap1; - cmsUInt16Number v = 0; - int i; - - swap1 = (cmsUInt16Number*) output; - - if (ExtraFirst) { - output += Extra * sizeof(cmsUInt16Number); - } - - for (i=0; i < nChan; i++) { - - int index = DoSwap ? (nChan - i - 1) : i; - - v = wOut[index]; - - if (SwapEndian) - v = CHANGE_ENDIAN(v); - - if (Reverse) - v = REVERSE_FLAVOR_16(v); - - *(cmsUInt16Number*) output = v; - - output += sizeof(cmsUInt16Number); - } - - if (!ExtraFirst) { - output += Extra * sizeof(cmsUInt16Number); - } - - if (Extra == 0 && SwapFirst) { - - memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsUInt16Number)); - *swap1 = v; - } - - - return output; - - cmsUNUSED_PARAMETER(Stride); -} - - -static -cmsUInt8Number* PackPlanarBytes(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - int nChan = T_CHANNELS(info -> OutputFormat); - int DoSwap = T_DOSWAP(info ->OutputFormat); - int SwapFirst = T_SWAPFIRST(info ->OutputFormat); - int Reverse = T_FLAVOR(info ->OutputFormat); - int i; - cmsUInt8Number* Init = output; - - - if (DoSwap ^ SwapFirst) { - output += T_EXTRA(info -> OutputFormat) * Stride; - } - - - for (i=0; i < nChan; i++) { - - int index = DoSwap ? (nChan - i - 1) : i; - cmsUInt8Number v = FROM_16_TO_8(wOut[index]); - - *(cmsUInt8Number*) output = (cmsUInt8Number) (Reverse ? REVERSE_FLAVOR_8(v) : v); - output += Stride; - } - - return (Init + 1); - - cmsUNUSED_PARAMETER(Stride); -} - - -static -cmsUInt8Number* PackPlanarWords(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - int nChan = T_CHANNELS(info -> OutputFormat); - int DoSwap = T_DOSWAP(info ->OutputFormat); - int Reverse= T_FLAVOR(info ->OutputFormat); - int SwapEndian = T_ENDIAN16(info -> OutputFormat); - int i; - cmsUInt8Number* Init = output; - cmsUInt16Number v; - - if (DoSwap) { - output += T_EXTRA(info -> OutputFormat) * Stride * sizeof(cmsUInt16Number); - } - - for (i=0; i < nChan; i++) { - - int index = DoSwap ? (nChan - i - 1) : i; - - v = wOut[index]; - - if (SwapEndian) - v = CHANGE_ENDIAN(v); - - if (Reverse) - v = REVERSE_FLAVOR_16(v); - - *(cmsUInt16Number*) output = v; - output += (Stride * sizeof(cmsUInt16Number)); - } - - return (Init + sizeof(cmsUInt16Number)); -} - -// CMYKcm (unrolled for speed) - -static -cmsUInt8Number* Pack6Bytes(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *output++ = FROM_16_TO_8(wOut[0]); - *output++ = FROM_16_TO_8(wOut[1]); - *output++ = FROM_16_TO_8(wOut[2]); - *output++ = FROM_16_TO_8(wOut[3]); - *output++ = FROM_16_TO_8(wOut[4]); - *output++ = FROM_16_TO_8(wOut[5]); - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -// KCMYcm - -static -cmsUInt8Number* Pack6BytesSwap(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *output++ = FROM_16_TO_8(wOut[5]); - *output++ = FROM_16_TO_8(wOut[4]); - *output++ = FROM_16_TO_8(wOut[3]); - *output++ = FROM_16_TO_8(wOut[2]); - *output++ = FROM_16_TO_8(wOut[1]); - *output++ = FROM_16_TO_8(wOut[0]); - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -// CMYKcm -static -cmsUInt8Number* Pack6Words(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *(cmsUInt16Number*) output = wOut[0]; - output+= 2; - *(cmsUInt16Number*) output = wOut[1]; - output+= 2; - *(cmsUInt16Number*) output = wOut[2]; - output+= 2; - *(cmsUInt16Number*) output = wOut[3]; - output+= 2; - *(cmsUInt16Number*) output = wOut[4]; - output+= 2; - *(cmsUInt16Number*) output = wOut[5]; - output+= 2; - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -// KCMYcm -static -cmsUInt8Number* Pack6WordsSwap(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *(cmsUInt16Number*) output = wOut[5]; - output+= 2; - *(cmsUInt16Number*) output = wOut[4]; - output+= 2; - *(cmsUInt16Number*) output = wOut[3]; - output+= 2; - *(cmsUInt16Number*) output = wOut[2]; - output+= 2; - *(cmsUInt16Number*) output = wOut[1]; - output+= 2; - *(cmsUInt16Number*) output = wOut[0]; - output+= 2; - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - - -static -cmsUInt8Number* Pack4Bytes(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *output++ = FROM_16_TO_8(wOut[0]); - *output++ = FROM_16_TO_8(wOut[1]); - *output++ = FROM_16_TO_8(wOut[2]); - *output++ = FROM_16_TO_8(wOut[3]); - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Pack4BytesReverse(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[0])); - *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[1])); - *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[2])); - *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[3])); - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - - -static -cmsUInt8Number* Pack4BytesSwapFirst(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *output++ = FROM_16_TO_8(wOut[3]); - *output++ = FROM_16_TO_8(wOut[0]); - *output++ = FROM_16_TO_8(wOut[1]); - *output++ = FROM_16_TO_8(wOut[2]); - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -// ABGR -static -cmsUInt8Number* Pack4BytesSwap(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *output++ = FROM_16_TO_8(wOut[3]); - *output++ = FROM_16_TO_8(wOut[2]); - *output++ = FROM_16_TO_8(wOut[1]); - *output++ = FROM_16_TO_8(wOut[0]); - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Pack4BytesSwapSwapFirst(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *output++ = FROM_16_TO_8(wOut[2]); - *output++ = FROM_16_TO_8(wOut[1]); - *output++ = FROM_16_TO_8(wOut[0]); - *output++ = FROM_16_TO_8(wOut[3]); - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Pack4Words(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *(cmsUInt16Number*) output = wOut[0]; - output+= 2; - *(cmsUInt16Number*) output = wOut[1]; - output+= 2; - *(cmsUInt16Number*) output = wOut[2]; - output+= 2; - *(cmsUInt16Number*) output = wOut[3]; - output+= 2; - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Pack4WordsReverse(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[0]); - output+= 2; - *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[1]); - output+= 2; - *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[2]); - output+= 2; - *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[3]); - output+= 2; - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -// ABGR -static -cmsUInt8Number* Pack4WordsSwap(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *(cmsUInt16Number*) output = wOut[3]; - output+= 2; - *(cmsUInt16Number*) output = wOut[2]; - output+= 2; - *(cmsUInt16Number*) output = wOut[1]; - output+= 2; - *(cmsUInt16Number*) output = wOut[0]; - output+= 2; - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -// CMYK -static -cmsUInt8Number* Pack4WordsBigEndian(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[0]); - output+= 2; - *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[1]); - output+= 2; - *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[2]); - output+= 2; - *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[3]); - output+= 2; - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - - -static -cmsUInt8Number* PackLabV2_8(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[0])); - *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[1])); - *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[2])); - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* PackALabV2_8(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - output++; - *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[0])); - *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[1])); - *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[2])); - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* PackLabV2_16(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *(cmsUInt16Number*) output = FomLabV4ToLabV2(wOut[0]); - output += 2; - *(cmsUInt16Number*) output = FomLabV4ToLabV2(wOut[1]); - output += 2; - *(cmsUInt16Number*) output = FomLabV4ToLabV2(wOut[2]); - output += 2; - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Pack3Bytes(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *output++ = FROM_16_TO_8(wOut[0]); - *output++ = FROM_16_TO_8(wOut[1]); - *output++ = FROM_16_TO_8(wOut[2]); - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Pack3BytesOptimized(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *output++ = (wOut[0] & 0xFF); - *output++ = (wOut[1] & 0xFF); - *output++ = (wOut[2] & 0xFF); - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Pack3BytesSwap(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *output++ = FROM_16_TO_8(wOut[2]); - *output++ = FROM_16_TO_8(wOut[1]); - *output++ = FROM_16_TO_8(wOut[0]); - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Pack3BytesSwapOptimized(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *output++ = (wOut[2] & 0xFF); - *output++ = (wOut[1] & 0xFF); - *output++ = (wOut[0] & 0xFF); - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - - -static -cmsUInt8Number* Pack3Words(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *(cmsUInt16Number*) output = wOut[0]; - output+= 2; - *(cmsUInt16Number*) output = wOut[1]; - output+= 2; - *(cmsUInt16Number*) output = wOut[2]; - output+= 2; - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Pack3WordsSwap(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *(cmsUInt16Number*) output = wOut[2]; - output+= 2; - *(cmsUInt16Number*) output = wOut[1]; - output+= 2; - *(cmsUInt16Number*) output = wOut[0]; - output+= 2; - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Pack3WordsBigEndian(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[0]); - output+= 2; - *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[1]); - output+= 2; - *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[2]); - output+= 2; - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Pack3BytesAndSkip1(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *output++ = FROM_16_TO_8(wOut[0]); - *output++ = FROM_16_TO_8(wOut[1]); - *output++ = FROM_16_TO_8(wOut[2]); - output++; - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Pack3BytesAndSkip1Optimized(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *output++ = (wOut[0] & 0xFF); - *output++ = (wOut[1] & 0xFF); - *output++ = (wOut[2] & 0xFF); - output++; - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - - -static -cmsUInt8Number* Pack3BytesAndSkip1SwapFirst(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - output++; - *output++ = FROM_16_TO_8(wOut[0]); - *output++ = FROM_16_TO_8(wOut[1]); - *output++ = FROM_16_TO_8(wOut[2]); - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Pack3BytesAndSkip1SwapFirstOptimized(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - output++; - *output++ = (wOut[0] & 0xFF); - *output++ = (wOut[1] & 0xFF); - *output++ = (wOut[2] & 0xFF); - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Pack3BytesAndSkip1Swap(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - output++; - *output++ = FROM_16_TO_8(wOut[2]); - *output++ = FROM_16_TO_8(wOut[1]); - *output++ = FROM_16_TO_8(wOut[0]); - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Pack3BytesAndSkip1SwapOptimized(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - output++; - *output++ = (wOut[2] & 0xFF); - *output++ = (wOut[1] & 0xFF); - *output++ = (wOut[0] & 0xFF); - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - - -static -cmsUInt8Number* Pack3BytesAndSkip1SwapSwapFirst(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *output++ = FROM_16_TO_8(wOut[2]); - *output++ = FROM_16_TO_8(wOut[1]); - *output++ = FROM_16_TO_8(wOut[0]); - output++; - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Pack3BytesAndSkip1SwapSwapFirstOptimized(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *output++ = (wOut[2] & 0xFF); - *output++ = (wOut[1] & 0xFF); - *output++ = (wOut[0] & 0xFF); - output++; - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Pack3WordsAndSkip1(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *(cmsUInt16Number*) output = wOut[0]; - output+= 2; - *(cmsUInt16Number*) output = wOut[1]; - output+= 2; - *(cmsUInt16Number*) output = wOut[2]; - output+= 2; - output+= 2; - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Pack3WordsAndSkip1Swap(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - output+= 2; - *(cmsUInt16Number*) output = wOut[2]; - output+= 2; - *(cmsUInt16Number*) output = wOut[1]; - output+= 2; - *(cmsUInt16Number*) output = wOut[0]; - output+= 2; - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - - -static -cmsUInt8Number* Pack3WordsAndSkip1SwapFirst(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - output+= 2; - *(cmsUInt16Number*) output = wOut[0]; - output+= 2; - *(cmsUInt16Number*) output = wOut[1]; - output+= 2; - *(cmsUInt16Number*) output = wOut[2]; - output+= 2; - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - - -static -cmsUInt8Number* Pack3WordsAndSkip1SwapSwapFirst(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *(cmsUInt16Number*) output = wOut[2]; - output+= 2; - *(cmsUInt16Number*) output = wOut[1]; - output+= 2; - *(cmsUInt16Number*) output = wOut[0]; - output+= 2; - output+= 2; - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - - - -static -cmsUInt8Number* Pack1Byte(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *output++ = FROM_16_TO_8(wOut[0]); - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - - -static -cmsUInt8Number* Pack1ByteReversed(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *output++ = FROM_16_TO_8(REVERSE_FLAVOR_16(wOut[0])); - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - - -static -cmsUInt8Number* Pack1ByteSkip1(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *output++ = FROM_16_TO_8(wOut[0]); - output++; - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - - -static -cmsUInt8Number* Pack1ByteSkip1SwapFirst(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - output++; - *output++ = FROM_16_TO_8(wOut[0]); - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Pack1Word(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *(cmsUInt16Number*) output = wOut[0]; - output+= 2; - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - - -static -cmsUInt8Number* Pack1WordReversed(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[0]); - output+= 2; - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Pack1WordBigEndian(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[0]); - output+= 2; - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - - -static -cmsUInt8Number* Pack1WordSkip1(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - *(cmsUInt16Number*) output = wOut[0]; - output+= 4; - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - -static -cmsUInt8Number* Pack1WordSkip1SwapFirst(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - output += 2; - *(cmsUInt16Number*) output = wOut[0]; - output+= 2; - - return output; - - cmsUNUSED_PARAMETER(info); - cmsUNUSED_PARAMETER(Stride); -} - - -// Unencoded Float values -- don't try optimize speed -static -cmsUInt8Number* PackLabDoubleFrom16(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - - if (T_PLANAR(info -> OutputFormat)) { - - cmsCIELab Lab; - cmsFloat64Number* Out = (cmsFloat64Number*) output; - cmsLabEncoded2Float(&Lab, wOut); - - Out[0] = Lab.L; - Out[Stride] = Lab.a; - Out[Stride*2] = Lab.b; - - return output + sizeof(cmsFloat64Number); - } - else { - - cmsLabEncoded2Float((cmsCIELab*) output, wOut); - return output + (sizeof(cmsCIELab) + T_EXTRA(info ->OutputFormat) * sizeof(cmsFloat64Number)); - } -} - - -static -cmsUInt8Number* PackLabFloatFrom16(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - cmsCIELab Lab; - cmsLabEncoded2Float(&Lab, wOut); - - if (T_PLANAR(info -> OutputFormat)) { - - cmsFloat32Number* Out = (cmsFloat32Number*) output; - - Out[0] = (cmsFloat32Number)Lab.L; - Out[Stride] = (cmsFloat32Number)Lab.a; - Out[Stride*2] = (cmsFloat32Number)Lab.b; - - return output + sizeof(cmsFloat32Number); - } - else { - - ((cmsFloat32Number*) output)[0] = (cmsFloat32Number) Lab.L; - ((cmsFloat32Number*) output)[1] = (cmsFloat32Number) Lab.a; - ((cmsFloat32Number*) output)[2] = (cmsFloat32Number) Lab.b; - - return output + (3 + T_EXTRA(info ->OutputFormat)) * sizeof(cmsFloat32Number); - } -} - -static -cmsUInt8Number* PackXYZDoubleFrom16(register _cmsTRANSFORM* Info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - if (T_PLANAR(Info -> OutputFormat)) { - - cmsCIEXYZ XYZ; - cmsFloat64Number* Out = (cmsFloat64Number*) output; - cmsXYZEncoded2Float(&XYZ, wOut); - - Out[0] = XYZ.X; - Out[Stride] = XYZ.Y; - Out[Stride*2] = XYZ.Z; - - return output + sizeof(cmsFloat64Number); - - } - else { - - cmsXYZEncoded2Float((cmsCIEXYZ*) output, wOut); - - return output + (sizeof(cmsCIEXYZ) + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat64Number)); - } -} - -static -cmsUInt8Number* PackXYZFloatFrom16(register _cmsTRANSFORM* Info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - if (T_PLANAR(Info -> OutputFormat)) { - - cmsCIEXYZ XYZ; - cmsFloat32Number* Out = (cmsFloat32Number*) output; - cmsXYZEncoded2Float(&XYZ, wOut); - - Out[0] = (cmsFloat32Number) XYZ.X; - Out[Stride] = (cmsFloat32Number) XYZ.Y; - Out[Stride*2] = (cmsFloat32Number) XYZ.Z; - - return output + sizeof(cmsFloat32Number); - - } - else { - - cmsCIEXYZ XYZ; - cmsFloat32Number* Out = (cmsFloat32Number*) output; - cmsXYZEncoded2Float(&XYZ, wOut); - - Out[0] = (cmsFloat32Number) XYZ.X; - Out[1] = (cmsFloat32Number) XYZ.Y; - Out[2] = (cmsFloat32Number) XYZ.Z; - - return output + (3 * sizeof(cmsFloat32Number) + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat32Number)); - } -} - -static -cmsUInt8Number* PackDoubleFrom16(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - int nChan = T_CHANNELS(info -> OutputFormat); - int DoSwap = T_DOSWAP(info ->OutputFormat); - int Reverse = T_FLAVOR(info ->OutputFormat); - int Extra = T_EXTRA(info -> OutputFormat); - int SwapFirst = T_SWAPFIRST(info -> OutputFormat); - int Planar = T_PLANAR(info -> OutputFormat); - int ExtraFirst = DoSwap ^ SwapFirst; - cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 655.35 : 65535.0; - cmsFloat64Number v = 0; - cmsFloat64Number* swap1 = (cmsFloat64Number*) output; - int i, start = 0; - - if (ExtraFirst) - start = Extra; - - for (i=0; i < nChan; i++) { - - int index = DoSwap ? (nChan - i - 1) : i; - - v = (cmsFloat64Number) wOut[index] / maximum; - - if (Reverse) - v = maximum - v; - - if (Planar) - ((cmsFloat64Number*) output)[(i + start) * Stride]= v; - else - ((cmsFloat64Number*) output)[i + start] = v; - } - - if (!ExtraFirst) { - output += Extra * sizeof(cmsFloat64Number); - } - - if (Extra == 0 && SwapFirst) { - - memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat64Number)); - *swap1 = v; - } - - if (T_PLANAR(info -> OutputFormat)) - return output + sizeof(cmsFloat64Number); - else - return output + nChan * sizeof(cmsFloat64Number); - -} - - -static -cmsUInt8Number* PackFloatFrom16(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - int nChan = T_CHANNELS(info -> OutputFormat); - int DoSwap = T_DOSWAP(info ->OutputFormat); - int Reverse = T_FLAVOR(info ->OutputFormat); - int Extra = T_EXTRA(info -> OutputFormat); - int SwapFirst = T_SWAPFIRST(info -> OutputFormat); - int Planar = T_PLANAR(info -> OutputFormat); - int ExtraFirst = DoSwap ^ SwapFirst; - cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 655.35 : 65535.0; - cmsFloat64Number v = 0; - cmsFloat32Number* swap1 = (cmsFloat32Number*) output; - int i, start = 0; - - if (ExtraFirst) - start = Extra; - - for (i=0; i < nChan; i++) { - - int index = DoSwap ? (nChan - i - 1) : i; - - v = (cmsFloat64Number) wOut[index] / maximum; - - if (Reverse) - v = maximum - v; - - if (Planar) - ((cmsFloat32Number*) output)[(i + start ) * Stride]= (cmsFloat32Number) v; - else - ((cmsFloat32Number*) output)[i + start] = (cmsFloat32Number) v; - } - - if (!ExtraFirst) { - output += Extra * sizeof(cmsFloat32Number); - } - - if (Extra == 0 && SwapFirst) { - - memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat32Number)); - *swap1 = (cmsFloat32Number) v; - } - - if (T_PLANAR(info -> OutputFormat)) - return output + sizeof(cmsFloat32Number); - else - return output + nChan * sizeof(cmsFloat32Number); -} - - - -// -------------------------------------------------------------------------------------------------------- - -static -cmsUInt8Number* PackFloatsFromFloat(_cmsTRANSFORM* info, - cmsFloat32Number wOut[], - cmsUInt8Number* output, - cmsUInt32Number Stride) -{ - int nChan = T_CHANNELS(info -> OutputFormat); - int DoSwap = T_DOSWAP(info ->OutputFormat); - int Reverse = T_FLAVOR(info ->OutputFormat); - int Extra = T_EXTRA(info -> OutputFormat); - int SwapFirst = T_SWAPFIRST(info -> OutputFormat); - int Planar = T_PLANAR(info -> OutputFormat); - int ExtraFirst = DoSwap ^ SwapFirst; - cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 100.0 : 1.0; - cmsFloat32Number* swap1 = (cmsFloat32Number*) output; - cmsFloat64Number v = 0; - int i, start = 0; - - if (ExtraFirst) - start = Extra; - - for (i=0; i < nChan; i++) { - - int index = DoSwap ? (nChan - i - 1) : i; - - v = wOut[index] * maximum; - - if (Reverse) - v = maximum - v; - - if (Planar) - ((cmsFloat32Number*) output)[(i + start)* Stride]= (cmsFloat32Number) v; - else - ((cmsFloat32Number*) output)[i + start] = (cmsFloat32Number) v; - } - - if (!ExtraFirst) { - output += Extra * sizeof(cmsFloat32Number); - } - - if (Extra == 0 && SwapFirst) { - - memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat32Number)); - *swap1 = (cmsFloat32Number) v; - } - - if (T_PLANAR(info -> OutputFormat)) - return output + sizeof(cmsFloat32Number); - else - return output + nChan * sizeof(cmsFloat32Number); -} - -static -cmsUInt8Number* PackDoublesFromFloat(_cmsTRANSFORM* info, - cmsFloat32Number wOut[], - cmsUInt8Number* output, - cmsUInt32Number Stride) -{ - int nChan = T_CHANNELS(info -> OutputFormat); - int DoSwap = T_DOSWAP(info ->OutputFormat); - int Reverse = T_FLAVOR(info ->OutputFormat); - int Extra = T_EXTRA(info -> OutputFormat); - int SwapFirst = T_SWAPFIRST(info -> OutputFormat); - int Planar = T_PLANAR(info -> OutputFormat); - int ExtraFirst = DoSwap ^ SwapFirst; - cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 100.0 : 1.0; - cmsFloat64Number v = 0; - cmsFloat64Number* swap1 = (cmsFloat64Number*) output; - int i, start = 0; - - if (ExtraFirst) - start = Extra; - - for (i=0; i < nChan; i++) { - - int index = DoSwap ? (nChan - i - 1) : i; - - v = wOut[index] * maximum; - - if (Reverse) - v = maximum - v; - - if (Planar) - ((cmsFloat64Number*) output)[(i + start) * Stride] = v; - else - ((cmsFloat64Number*) output)[i + start] = v; - } - - if (!ExtraFirst) { - output += Extra * sizeof(cmsFloat64Number); - } - - if (Extra == 0 && SwapFirst) { - - memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat64Number)); - *swap1 = v; - } - - - if (T_PLANAR(info -> OutputFormat)) - return output + sizeof(cmsFloat64Number); - else - return output + nChan * sizeof(cmsFloat64Number); - -} - - - - - -static -cmsUInt8Number* PackLabFloatFromFloat(_cmsTRANSFORM* Info, - cmsFloat32Number wOut[], - cmsUInt8Number* output, - cmsUInt32Number Stride) -{ - cmsFloat32Number* Out = (cmsFloat32Number*) output; - - if (T_PLANAR(Info -> OutputFormat)) { - - Out[0] = (cmsFloat32Number) (wOut[0] * 100.0); - Out[Stride] = (cmsFloat32Number) (wOut[1] * 255.0 - 128.0); - Out[Stride*2] = (cmsFloat32Number) (wOut[2] * 255.0 - 128.0); - - return output + sizeof(cmsFloat32Number); - } - else { - - Out[0] = (cmsFloat32Number) (wOut[0] * 100.0); - Out[1] = (cmsFloat32Number) (wOut[1] * 255.0 - 128.0); - Out[2] = (cmsFloat32Number) (wOut[2] * 255.0 - 128.0); - - return output + (sizeof(cmsFloat32Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat32Number)); - } - -} - - -static -cmsUInt8Number* PackLabDoubleFromFloat(_cmsTRANSFORM* Info, - cmsFloat32Number wOut[], - cmsUInt8Number* output, - cmsUInt32Number Stride) -{ - cmsFloat64Number* Out = (cmsFloat64Number*) output; - - if (T_PLANAR(Info -> OutputFormat)) { - - Out[0] = (cmsFloat64Number) (wOut[0] * 100.0); - Out[Stride] = (cmsFloat64Number) (wOut[1] * 255.0 - 128.0); - Out[Stride*2] = (cmsFloat64Number) (wOut[2] * 255.0 - 128.0); - - return output + sizeof(cmsFloat64Number); - } - else { - - Out[0] = (cmsFloat64Number) (wOut[0] * 100.0); - Out[1] = (cmsFloat64Number) (wOut[1] * 255.0 - 128.0); - Out[2] = (cmsFloat64Number) (wOut[2] * 255.0 - 128.0); - - return output + (sizeof(cmsFloat64Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat64Number)); - } - -} - - -// From 0..1 range to 0..MAX_ENCODEABLE_XYZ -static -cmsUInt8Number* PackXYZFloatFromFloat(_cmsTRANSFORM* Info, - cmsFloat32Number wOut[], - cmsUInt8Number* output, - cmsUInt32Number Stride) -{ - cmsFloat32Number* Out = (cmsFloat32Number*) output; - - if (T_PLANAR(Info -> OutputFormat)) { - - Out[0] = (cmsFloat32Number) (wOut[0] * MAX_ENCODEABLE_XYZ); - Out[Stride] = (cmsFloat32Number) (wOut[1] * MAX_ENCODEABLE_XYZ); - Out[Stride*2] = (cmsFloat32Number) (wOut[2] * MAX_ENCODEABLE_XYZ); - - return output + sizeof(cmsFloat32Number); - } - else { - - Out[0] = (cmsFloat32Number) (wOut[0] * MAX_ENCODEABLE_XYZ); - Out[1] = (cmsFloat32Number) (wOut[1] * MAX_ENCODEABLE_XYZ); - Out[2] = (cmsFloat32Number) (wOut[2] * MAX_ENCODEABLE_XYZ); - - return output + (sizeof(cmsFloat32Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat32Number)); - } - -} - -// Same, but convert to double -static -cmsUInt8Number* PackXYZDoubleFromFloat(_cmsTRANSFORM* Info, - cmsFloat32Number wOut[], - cmsUInt8Number* output, - cmsUInt32Number Stride) -{ - cmsFloat64Number* Out = (cmsFloat64Number*) output; - - if (T_PLANAR(Info -> OutputFormat)) { - - Out[0] = (cmsFloat64Number) (wOut[0] * MAX_ENCODEABLE_XYZ); - Out[Stride] = (cmsFloat64Number) (wOut[1] * MAX_ENCODEABLE_XYZ); - Out[Stride*2] = (cmsFloat64Number) (wOut[2] * MAX_ENCODEABLE_XYZ); - - return output + sizeof(cmsFloat64Number); - } - else { - - Out[0] = (cmsFloat64Number) (wOut[0] * MAX_ENCODEABLE_XYZ); - Out[1] = (cmsFloat64Number) (wOut[1] * MAX_ENCODEABLE_XYZ); - Out[2] = (cmsFloat64Number) (wOut[2] * MAX_ENCODEABLE_XYZ); - - return output + (sizeof(cmsFloat64Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat64Number)); - } - -} - - -// ---------------------------------------------------------------------------------------------------------------- - -#ifndef CMS_NO_HALF_SUPPORT - -// Decodes an stream of half floats to wIn[] described by input format - -static -cmsUInt8Number* UnrollHalfTo16(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - - int nChan = T_CHANNELS(info -> InputFormat); - int DoSwap = T_DOSWAP(info ->InputFormat); - int Reverse = T_FLAVOR(info ->InputFormat); - int SwapFirst = T_SWAPFIRST(info -> InputFormat); - int Extra = T_EXTRA(info -> InputFormat); - int ExtraFirst = DoSwap ^ SwapFirst; - int Planar = T_PLANAR(info -> InputFormat); - cmsFloat32Number v; - int i, start = 0; - cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 655.35F : 65535.0F; - - - if (ExtraFirst) - start = Extra; - - for (i=0; i < nChan; i++) { - - int index = DoSwap ? (nChan - i - 1) : i; - - if (Planar) - v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[(i + start) * Stride] ); - else - v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[i + start] ) ; - - if (Reverse) v = maximum - v; - - wIn[index] = _cmsQuickSaturateWord(v * maximum); - } - - - if (Extra == 0 && SwapFirst) { - cmsUInt16Number tmp = wIn[0]; - - memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number)); - wIn[nChan-1] = tmp; - } - - if (T_PLANAR(info -> InputFormat)) - return accum + sizeof(cmsUInt16Number); - else - return accum + (nChan + Extra) * sizeof(cmsUInt16Number); -} - -// Decodes an stream of half floats to wIn[] described by input format - -static -cmsUInt8Number* UnrollHalfToFloat(_cmsTRANSFORM* info, - cmsFloat32Number wIn[], - cmsUInt8Number* accum, - cmsUInt32Number Stride) -{ - - int nChan = T_CHANNELS(info -> InputFormat); - int DoSwap = T_DOSWAP(info ->InputFormat); - int Reverse = T_FLAVOR(info ->InputFormat); - int SwapFirst = T_SWAPFIRST(info -> InputFormat); - int Extra = T_EXTRA(info -> InputFormat); - int ExtraFirst = DoSwap ^ SwapFirst; - int Planar = T_PLANAR(info -> InputFormat); - cmsFloat32Number v; - int i, start = 0; - cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 100.0F : 1.0F; - - - if (ExtraFirst) - start = Extra; - - for (i=0; i < nChan; i++) { - - int index = DoSwap ? (nChan - i - 1) : i; - - if (Planar) - v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[(i + start) * Stride] ); - else - v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[i + start] ) ; - - v /= maximum; - - wIn[index] = Reverse ? 1 - v : v; - } - - - if (Extra == 0 && SwapFirst) { - cmsFloat32Number tmp = wIn[0]; - - memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number)); - wIn[nChan-1] = tmp; - } - - if (T_PLANAR(info -> InputFormat)) - return accum + sizeof(cmsUInt16Number); - else - return accum + (nChan + Extra) * sizeof(cmsUInt16Number); -} - - -static -cmsUInt8Number* PackHalfFrom16(register _cmsTRANSFORM* info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - int nChan = T_CHANNELS(info -> OutputFormat); - int DoSwap = T_DOSWAP(info ->OutputFormat); - int Reverse = T_FLAVOR(info ->OutputFormat); - int Extra = T_EXTRA(info -> OutputFormat); - int SwapFirst = T_SWAPFIRST(info -> OutputFormat); - int Planar = T_PLANAR(info -> OutputFormat); - int ExtraFirst = DoSwap ^ SwapFirst; - cmsFloat32Number maximum = IsInkSpace(info ->OutputFormat) ? 655.35F : 65535.0F; - cmsFloat32Number v = 0; - cmsUInt16Number* swap1 = (cmsUInt16Number*) output; - int i, start = 0; - - if (ExtraFirst) - start = Extra; - - for (i=0; i < nChan; i++) { - - int index = DoSwap ? (nChan - i - 1) : i; - - v = (cmsFloat32Number) wOut[index] / maximum; - - if (Reverse) - v = maximum - v; - - if (Planar) - ((cmsUInt16Number*) output)[(i + start ) * Stride]= _cmsFloat2Half(v); - else - ((cmsUInt16Number*) output)[i + start] = _cmsFloat2Half(v); - } - - if (!ExtraFirst) { - output += Extra * sizeof(cmsUInt16Number); - } - - if (Extra == 0 && SwapFirst) { - - memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsUInt16Number)); - *swap1 = _cmsFloat2Half(v); - } - - if (T_PLANAR(info -> OutputFormat)) - return output + sizeof(cmsUInt16Number); - else - return output + nChan * sizeof(cmsUInt16Number); -} - - - -static -cmsUInt8Number* PackHalfFromFloat(_cmsTRANSFORM* info, - cmsFloat32Number wOut[], - cmsUInt8Number* output, - cmsUInt32Number Stride) -{ - int nChan = T_CHANNELS(info -> OutputFormat); - int DoSwap = T_DOSWAP(info ->OutputFormat); - int Reverse = T_FLAVOR(info ->OutputFormat); - int Extra = T_EXTRA(info -> OutputFormat); - int SwapFirst = T_SWAPFIRST(info -> OutputFormat); - int Planar = T_PLANAR(info -> OutputFormat); - int ExtraFirst = DoSwap ^ SwapFirst; - cmsFloat32Number maximum = IsInkSpace(info ->OutputFormat) ? 100.0F : 1.0F; - cmsUInt16Number* swap1 = (cmsUInt16Number*) output; - cmsFloat32Number v = 0; - int i, start = 0; - - if (ExtraFirst) - start = Extra; - - for (i=0; i < nChan; i++) { - - int index = DoSwap ? (nChan - i - 1) : i; - - v = wOut[index] * maximum; - - if (Reverse) - v = maximum - v; - - if (Planar) - ((cmsUInt16Number*) output)[(i + start)* Stride]= _cmsFloat2Half( v ); - else - ((cmsUInt16Number*) output)[i + start] = _cmsFloat2Half( v ); - } - - if (!ExtraFirst) { - output += Extra * sizeof(cmsUInt16Number); - } - - if (Extra == 0 && SwapFirst) { - - memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsUInt16Number)); - *swap1 = (cmsUInt16Number) _cmsFloat2Half( v ); - } - - if (T_PLANAR(info -> OutputFormat)) - return output + sizeof(cmsUInt16Number); - else - return output + nChan * sizeof(cmsUInt16Number); -} - -#endif - -// ---------------------------------------------------------------------------------------------------------------- - - -static cmsFormatters16 InputFormatters16[] = { - - // Type Mask Function - // ---------------------------- ------------------------------------ ---------------------------- - { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, UnrollLabDoubleTo16}, - { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, UnrollXYZDoubleTo16}, - { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, UnrollLabFloatTo16}, - { TYPE_XYZ_FLT, ANYPLANAR|ANYEXTRA, UnrollXYZFloatTo16}, - { TYPE_GRAY_DBL, 0, UnrollDouble1Chan}, - { FLOAT_SH(1)|BYTES_SH(0), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR| - ANYSWAP|ANYEXTRA|ANYSPACE, UnrollDoubleTo16}, - { FLOAT_SH(1)|BYTES_SH(4), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR| - ANYSWAP|ANYEXTRA|ANYSPACE, UnrollFloatTo16}, -#ifndef CMS_NO_HALF_SUPPORT - { FLOAT_SH(1)|BYTES_SH(2), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR| - ANYEXTRA|ANYSWAP|ANYSPACE, UnrollHalfTo16}, -#endif - - { CHANNELS_SH(1)|BYTES_SH(1), ANYSPACE, Unroll1Byte}, - { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(1), ANYSPACE, Unroll1ByteSkip1}, - { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(2), ANYSPACE, Unroll1ByteSkip2}, - { CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Unroll1ByteReversed}, - { COLORSPACE_SH(PT_MCH2)|CHANNELS_SH(2)|BYTES_SH(1), 0, Unroll2Bytes}, - - { TYPE_LabV2_8, 0, UnrollLabV2_8 }, - { TYPE_ALabV2_8, 0, UnrollALabV2_8 }, - { TYPE_LabV2_16, 0, UnrollLabV2_16 }, - - { CHANNELS_SH(3)|BYTES_SH(1), ANYSPACE, Unroll3Bytes}, - { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll3BytesSwap}, - { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll3BytesSkip1Swap}, - { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll3BytesSkip1SwapFirst}, - - { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), - ANYSPACE, Unroll3BytesSkip1SwapSwapFirst}, - - { CHANNELS_SH(4)|BYTES_SH(1), ANYSPACE, Unroll4Bytes}, - { CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Unroll4BytesReverse}, - { CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll4BytesSwapFirst}, - { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll4BytesSwap}, - { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll4BytesSwapSwapFirst}, - - { BYTES_SH(1)|PLANAR_SH(1), ANYFLAVOR|ANYSWAPFIRST| - ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollPlanarBytes}, - - { BYTES_SH(1), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP| - ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollChunkyBytes}, - - { CHANNELS_SH(1)|BYTES_SH(2), ANYSPACE, Unroll1Word}, - { CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1), ANYSPACE, Unroll1WordReversed}, - { CHANNELS_SH(1)|BYTES_SH(2)|EXTRA_SH(3), ANYSPACE, Unroll1WordSkip3}, - - { CHANNELS_SH(2)|BYTES_SH(2), ANYSPACE, Unroll2Words}, - { CHANNELS_SH(3)|BYTES_SH(2), ANYSPACE, Unroll3Words}, - { CHANNELS_SH(4)|BYTES_SH(2), ANYSPACE, Unroll4Words}, - - { CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Unroll3WordsSwap}, - { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll3WordsSkip1SwapFirst}, - { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll3WordsSkip1Swap}, - { CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1), ANYSPACE, Unroll4WordsReverse}, - { CHANNELS_SH(4)|BYTES_SH(2)|SWAPFIRST_SH(1), ANYSPACE, Unroll4WordsSwapFirst}, - { CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Unroll4WordsSwap}, - { CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll4WordsSwapSwapFirst}, - - - { BYTES_SH(2)|PLANAR_SH(1), ANYFLAVOR|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollPlanarWords}, - { BYTES_SH(2), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollAnyWords}, -}; - - - -static cmsFormattersFloat InputFormattersFloat[] = { - - // Type Mask Function - // ---------------------------- ------------------------------------ ---------------------------- - { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, UnrollLabDoubleToFloat}, - { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, UnrollLabFloatToFloat}, - - { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, UnrollXYZDoubleToFloat}, - { TYPE_XYZ_FLT, ANYPLANAR|ANYEXTRA, UnrollXYZFloatToFloat}, - - { FLOAT_SH(1)|BYTES_SH(4), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA| - ANYCHANNELS|ANYSPACE, UnrollFloatsToFloat}, - - { FLOAT_SH(1)|BYTES_SH(0), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA| - ANYCHANNELS|ANYSPACE, UnrollDoublesToFloat}, -#ifndef CMS_NO_HALF_SUPPORT - { FLOAT_SH(1)|BYTES_SH(2), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA| - ANYCHANNELS|ANYSPACE, UnrollHalfToFloat}, -#endif -}; - - -// Bit fields set to one in the mask are not compared -static -cmsFormatter _cmsGetStockInputFormatter(cmsUInt32Number dwInput, cmsUInt32Number dwFlags) -{ - cmsUInt32Number i; - cmsFormatter fr; - - switch (dwFlags) { - - case CMS_PACK_FLAGS_16BITS: { - for (i=0; i < sizeof(InputFormatters16) / sizeof(cmsFormatters16); i++) { - cmsFormatters16* f = InputFormatters16 + i; - - if ((dwInput & ~f ->Mask) == f ->Type) { - fr.Fmt16 = f ->Frm; - return fr; - } - } - } - break; - - case CMS_PACK_FLAGS_FLOAT: { - for (i=0; i < sizeof(InputFormattersFloat) / sizeof(cmsFormattersFloat); i++) { - cmsFormattersFloat* f = InputFormattersFloat + i; - - if ((dwInput & ~f ->Mask) == f ->Type) { - fr.FmtFloat = f ->Frm; - return fr; - } - } - } - break; - - default:; - - } - - fr.Fmt16 = NULL; - return fr; -} - -static cmsFormatters16 OutputFormatters16[] = { - // Type Mask Function - // ---------------------------- ------------------------------------ ---------------------------- - - { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, PackLabDoubleFrom16}, - { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, PackXYZDoubleFrom16}, - - { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, PackLabFloatFrom16}, - { TYPE_XYZ_FLT, ANYPLANAR|ANYEXTRA, PackXYZFloatFrom16}, - - { FLOAT_SH(1)|BYTES_SH(0), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP| - ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE, PackDoubleFrom16}, - { FLOAT_SH(1)|BYTES_SH(4), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP| - ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE, PackFloatFrom16}, -#ifndef CMS_NO_HALF_SUPPORT - { FLOAT_SH(1)|BYTES_SH(2), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP| - ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE, PackHalfFrom16}, -#endif - - { CHANNELS_SH(1)|BYTES_SH(1), ANYSPACE, Pack1Byte}, - { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(1), ANYSPACE, Pack1ByteSkip1}, - { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack1ByteSkip1SwapFirst}, - - { CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Pack1ByteReversed}, - - { TYPE_LabV2_8, 0, PackLabV2_8 }, - { TYPE_ALabV2_8, 0, PackALabV2_8 }, - { TYPE_LabV2_16, 0, PackLabV2_16 }, - - { CHANNELS_SH(3)|BYTES_SH(1)|OPTIMIZED_SH(1), ANYSPACE, Pack3BytesOptimized}, - { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|OPTIMIZED_SH(1), ANYSPACE, Pack3BytesAndSkip1Optimized}, - { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1)|OPTIMIZED_SH(1), - ANYSPACE, Pack3BytesAndSkip1SwapFirstOptimized}, - { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)|OPTIMIZED_SH(1), - ANYSPACE, Pack3BytesAndSkip1SwapSwapFirstOptimized}, - { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|EXTRA_SH(1)|OPTIMIZED_SH(1), - ANYSPACE, Pack3BytesAndSkip1SwapOptimized}, - { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|OPTIMIZED_SH(1), ANYSPACE, Pack3BytesSwapOptimized}, - - - - { CHANNELS_SH(3)|BYTES_SH(1), ANYSPACE, Pack3Bytes}, - { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1), ANYSPACE, Pack3BytesAndSkip1}, - { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack3BytesAndSkip1SwapFirst}, - { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), - ANYSPACE, Pack3BytesAndSkip1SwapSwapFirst}, - { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|EXTRA_SH(1), ANYSPACE, Pack3BytesAndSkip1Swap}, - { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Pack3BytesSwap}, - { CHANNELS_SH(6)|BYTES_SH(1), ANYSPACE, Pack6Bytes}, - { CHANNELS_SH(6)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Pack6BytesSwap}, - { CHANNELS_SH(4)|BYTES_SH(1), ANYSPACE, Pack4Bytes}, - { CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Pack4BytesReverse}, - { CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack4BytesSwapFirst}, - { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Pack4BytesSwap}, - { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack4BytesSwapSwapFirst}, - - { BYTES_SH(1), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackAnyBytes}, - { BYTES_SH(1)|PLANAR_SH(1), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackPlanarBytes}, - - { CHANNELS_SH(1)|BYTES_SH(2), ANYSPACE, Pack1Word}, - { CHANNELS_SH(1)|BYTES_SH(2)|EXTRA_SH(1), ANYSPACE, Pack1WordSkip1}, - { CHANNELS_SH(1)|BYTES_SH(2)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack1WordSkip1SwapFirst}, - { CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1), ANYSPACE, Pack1WordReversed}, - { CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1), ANYSPACE, Pack1WordBigEndian}, - { CHANNELS_SH(3)|BYTES_SH(2), ANYSPACE, Pack3Words}, - { CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Pack3WordsSwap}, - { CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1), ANYSPACE, Pack3WordsBigEndian}, - { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1), ANYSPACE, Pack3WordsAndSkip1}, - { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|DOSWAP_SH(1), ANYSPACE, Pack3WordsAndSkip1Swap}, - { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack3WordsAndSkip1SwapFirst}, - - { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), - ANYSPACE, Pack3WordsAndSkip1SwapSwapFirst}, - - { CHANNELS_SH(4)|BYTES_SH(2), ANYSPACE, Pack4Words}, - { CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1), ANYSPACE, Pack4WordsReverse}, - { CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Pack4WordsSwap}, - { CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1), ANYSPACE, Pack4WordsBigEndian}, - - { CHANNELS_SH(6)|BYTES_SH(2), ANYSPACE, Pack6Words}, - { CHANNELS_SH(6)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Pack6WordsSwap}, - - { BYTES_SH(2)|PLANAR_SH(1), ANYFLAVOR|ANYENDIAN|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackPlanarWords}, - { BYTES_SH(2), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackAnyWords} - -}; - - -static cmsFormattersFloat OutputFormattersFloat[] = { - // Type Mask Function - // ---------------------------- --------------------------------------------------- ---------------------------- - { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, PackLabFloatFromFloat}, - { TYPE_XYZ_FLT, ANYPLANAR|ANYEXTRA, PackXYZFloatFromFloat}, - - { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, PackLabDoubleFromFloat}, - { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, PackXYZDoubleFromFloat}, - - { FLOAT_SH(1)|BYTES_SH(4), ANYPLANAR| - ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackFloatsFromFloat }, - { FLOAT_SH(1)|BYTES_SH(0), ANYPLANAR| - ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackDoublesFromFloat }, -#ifndef CMS_NO_HALF_SUPPORT - { FLOAT_SH(1)|BYTES_SH(2), - ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackHalfFromFloat }, -#endif - - - -}; - - -// Bit fields set to one in the mask are not compared -static -cmsFormatter _cmsGetStockOutputFormatter(cmsUInt32Number dwInput, cmsUInt32Number dwFlags) -{ - cmsUInt32Number i; - cmsFormatter fr; - - - switch (dwFlags) - { - - case CMS_PACK_FLAGS_16BITS: { - - for (i=0; i < sizeof(OutputFormatters16) / sizeof(cmsFormatters16); i++) { - cmsFormatters16* f = OutputFormatters16 + i; - - if ((dwInput & ~f ->Mask) == f ->Type) { - fr.Fmt16 = f ->Frm; - return fr; - } - } - } - break; - - case CMS_PACK_FLAGS_FLOAT: { - - for (i=0; i < sizeof(OutputFormattersFloat) / sizeof(cmsFormattersFloat); i++) { - cmsFormattersFloat* f = OutputFormattersFloat + i; - - if ((dwInput & ~f ->Mask) == f ->Type) { - fr.FmtFloat = f ->Frm; - return fr; - } - } - } - break; - - default:; - - } - - fr.Fmt16 = NULL; - return fr; -} - - -typedef struct _cms_formatters_factory_list { - - cmsFormatterFactory Factory; - struct _cms_formatters_factory_list *Next; - -} cmsFormattersFactoryList; - -_cmsFormattersPluginChunkType _cmsFormattersPluginChunk = { NULL }; - - -// Duplicates the zone of memory used by the plug-in in the new context -static -void DupFormatterFactoryList(struct _cmsContext_struct* ctx, - const struct _cmsContext_struct* src) -{ - _cmsFormattersPluginChunkType newHead = { NULL }; - cmsFormattersFactoryList* entry; - cmsFormattersFactoryList* Anterior = NULL; - _cmsFormattersPluginChunkType* head = (_cmsFormattersPluginChunkType*) src->chunks[FormattersPlugin]; - - _cmsAssert(head != NULL); - - // Walk the list copying all nodes - for (entry = head->FactoryList; - entry != NULL; - entry = entry ->Next) { - - cmsFormattersFactoryList *newEntry = ( cmsFormattersFactoryList *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(cmsFormattersFactoryList)); - - if (newEntry == NULL) - return; - - // We want to keep the linked list order, so this is a little bit tricky - newEntry -> Next = NULL; - if (Anterior) - Anterior -> Next = newEntry; - - Anterior = newEntry; - - if (newHead.FactoryList == NULL) - newHead.FactoryList = newEntry; - } - - ctx ->chunks[FormattersPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsFormattersPluginChunkType)); -} - -// The interpolation plug-in memory chunk allocator/dup -void _cmsAllocFormattersPluginChunk(struct _cmsContext_struct* ctx, - const struct _cmsContext_struct* src) -{ - _cmsAssert(ctx != NULL); - - if (src != NULL) { - - // Duplicate the LIST - DupFormatterFactoryList(ctx, src); - } - else { - static _cmsFormattersPluginChunkType FormattersPluginChunk = { NULL }; - ctx ->chunks[FormattersPlugin] = _cmsSubAllocDup(ctx ->MemPool, &FormattersPluginChunk, sizeof(_cmsFormattersPluginChunkType)); - } -} - - - -// Formatters management -cmsBool _cmsRegisterFormattersPlugin(cmsContext ContextID, cmsPluginBase* Data) -{ - _cmsFormattersPluginChunkType* ctx = ( _cmsFormattersPluginChunkType*) _cmsContextGetClientChunk(ContextID, FormattersPlugin); - cmsPluginFormatters* Plugin = (cmsPluginFormatters*) Data; - cmsFormattersFactoryList* fl ; - - // Reset to built-in defaults - if (Data == NULL) { - - ctx ->FactoryList = NULL; - return TRUE; - } - - fl = (cmsFormattersFactoryList*) _cmsPluginMalloc(ContextID, sizeof(cmsFormattersFactoryList)); - if (fl == NULL) return FALSE; - - fl ->Factory = Plugin ->FormattersFactory; - - fl ->Next = ctx -> FactoryList; - ctx ->FactoryList = fl; - - return TRUE; -} - -cmsFormatter _cmsGetFormatter(cmsContext ContextID, - cmsUInt32Number Type, // Specific type, i.e. TYPE_RGB_8 - cmsFormatterDirection Dir, - cmsUInt32Number dwFlags) -{ - _cmsFormattersPluginChunkType* ctx = ( _cmsFormattersPluginChunkType*) _cmsContextGetClientChunk(ContextID, FormattersPlugin); - cmsFormattersFactoryList* f; - - for (f =ctx->FactoryList; f != NULL; f = f ->Next) { - - cmsFormatter fn = f ->Factory(Type, Dir, dwFlags); - if (fn.Fmt16 != NULL) return fn; - } - - // Revert to default - if (Dir == cmsFormatterInput) - return _cmsGetStockInputFormatter(Type, dwFlags); - else - return _cmsGetStockOutputFormatter(Type, dwFlags); -} - - -// Return whatever given formatter refers to float values -cmsBool _cmsFormatterIsFloat(cmsUInt32Number Type) -{ - return T_FLOAT(Type) ? TRUE : FALSE; -} - -// Return whatever given formatter refers to 8 bits -cmsBool _cmsFormatterIs8bit(cmsUInt32Number Type) -{ - int Bytes = T_BYTES(Type); - - return (Bytes == 1); -} - -// Build a suitable formatter for the colorspace of this profile -cmsUInt32Number CMSEXPORT cmsFormatterForColorspaceOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat) -{ - - cmsColorSpaceSignature ColorSpace = cmsGetColorSpace(hProfile); - cmsUInt32Number ColorSpaceBits = _cmsLCMScolorSpace(ColorSpace); - cmsUInt32Number nOutputChans = cmsChannelsOf(ColorSpace); - cmsUInt32Number Float = lIsFloat ? 1 : 0; - - // Create a fake formatter for result - return FLOAT_SH(Float) | COLORSPACE_SH(ColorSpaceBits) | BYTES_SH(nBytes) | CHANNELS_SH(nOutputChans); -} - -// Build a suitable formatter for the colorspace of this profile -cmsUInt32Number CMSEXPORT cmsFormatterForPCSOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat) -{ - - cmsColorSpaceSignature ColorSpace = cmsGetPCS(hProfile); - int ColorSpaceBits = _cmsLCMScolorSpace(ColorSpace); - cmsUInt32Number nOutputChans = cmsChannelsOf(ColorSpace); - cmsUInt32Number Float = lIsFloat ? 1 : 0; - - // Create a fake formatter for result - return FLOAT_SH(Float) | COLORSPACE_SH(ColorSpaceBits) | BYTES_SH(nBytes) | CHANNELS_SH(nOutputChans); -} |