📄 cmspack.c
字号:
// Little cms// Copyright (C) 1998-2005 Marti Maria//// 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 "lcms.h"// This module handles all formats supported by lcms// ---------------------------------------------------------------------------// This macro return words stored as big endian#define CHANGE_ENDIAN(w) (WORD) ((WORD) ((w)<<8)|((w)>>8))// These macros handles reversing (negative)#define REVERSE_FLAVOR_8(x) ((BYTE) (0xff-(x)))#define REVERSE_FLAVOR_16(x) ((WORD)(0xffff-(x)))// Supress waning about info never being used#ifdef __BORLANDC__#pragma warn -par#endif#ifdef _MSC_VER#pragma warning(disable : 4100)#endif// -------------------------------------------------------- Unpacking routines.staticLPBYTE UnrollAnyBytes(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ int nChan = T_CHANNELS(info -> InputFormat); register int i; for (i=0; i < nChan; i++) { wIn[i] = RGB_8_TO_16(*accum); accum++; } return accum + T_EXTRA(info -> InputFormat);}staticLPBYTE Unroll4Bytes(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[0] = RGB_8_TO_16(*accum); accum++; // C wIn[1] = RGB_8_TO_16(*accum); accum++; // M wIn[2] = RGB_8_TO_16(*accum); accum++; // Y wIn[3] = RGB_8_TO_16(*accum); accum++; // K return accum;}staticLPBYTE Unroll4BytesReverse(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[0] = RGB_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // C wIn[1] = RGB_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // M wIn[2] = RGB_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // Y wIn[3] = RGB_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // K return accum;}staticLPBYTE Unroll4BytesSwapFirst(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[3] = RGB_8_TO_16(*accum); accum++; // K wIn[0] = RGB_8_TO_16(*accum); accum++; // C wIn[1] = RGB_8_TO_16(*accum); accum++; // M wIn[2] = RGB_8_TO_16(*accum); accum++; // Y return accum;}// KYMCstaticLPBYTE Unroll4BytesSwap(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[3] = RGB_8_TO_16(*accum); accum++; // K wIn[2] = RGB_8_TO_16(*accum); accum++; // Y wIn[1] = RGB_8_TO_16(*accum); accum++; // M wIn[0] = RGB_8_TO_16(*accum); accum++; // C return accum;}staticLPBYTE Unroll4BytesSwapSwapFirst(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[2] = RGB_8_TO_16(*accum); accum++; // K wIn[1] = RGB_8_TO_16(*accum); accum++; // Y wIn[0] = RGB_8_TO_16(*accum); accum++; // M wIn[3] = RGB_8_TO_16(*accum); accum++; // C return accum;}staticLPBYTE UnrollAnyWords(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ int nChan = T_CHANNELS(info -> InputFormat); register int i; for (i=0; i < nChan; i++) { wIn[i] = *(LPWORD) accum; accum += 2; } return accum + T_EXTRA(info -> InputFormat) * sizeof(WORD); }staticLPBYTE Unroll4Words(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[0] = *(LPWORD) accum; accum+= 2; // C wIn[1] = *(LPWORD) accum; accum+= 2; // M wIn[2] = *(LPWORD) accum; accum+= 2; // Y wIn[3] = *(LPWORD) accum; accum+= 2; // K return accum;}staticLPBYTE Unroll4WordsReverse(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[0] = REVERSE_FLAVOR_16(*(LPWORD) accum); accum+= 2; // C wIn[1] = REVERSE_FLAVOR_16(*(LPWORD) accum); accum+= 2; // M wIn[2] = REVERSE_FLAVOR_16(*(LPWORD) accum); accum+= 2; // Y wIn[3] = REVERSE_FLAVOR_16(*(LPWORD) accum); accum+= 2; // K return accum;}staticLPBYTE Unroll4WordsSwapFirst(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[3] = *(LPWORD) accum; accum+= 2; // K wIn[0] = *(LPWORD) accum; accum+= 2; // C wIn[1] = *(LPWORD) accum; accum+= 2; // M wIn[2] = *(LPWORD) accum; accum+= 2; // Y return accum;}// KYMCstaticLPBYTE Unroll4WordsSwap(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[3] = *(LPWORD) accum; accum+= 2; // K wIn[2] = *(LPWORD) accum; accum+= 2; // Y wIn[1] = *(LPWORD) accum; accum+= 2; // M wIn[0] = *(LPWORD) accum; accum+= 2; // C return accum;}staticLPBYTE Unroll4WordsSwapSwapFirst(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[2] = *(LPWORD) accum; accum+= 2; // K wIn[1] = *(LPWORD) accum; accum+= 2; // Y wIn[0] = *(LPWORD) accum; accum+= 2; // M wIn[3] = *(LPWORD) accum; accum+= 2; // C return accum;}staticLPBYTE Unroll4WordsBigEndian(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[0] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2; //C wIn[1] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2; //M wIn[2] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2; //Y wIn[3] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2; //K return accum;}staticLPBYTE Unroll4WordsBigEndianReverse(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[0] = REVERSE_FLAVOR_16(CHANGE_ENDIAN(*(LPWORD) accum)); accum+= 2; //C wIn[1] = REVERSE_FLAVOR_16(CHANGE_ENDIAN(*(LPWORD) accum)); accum+= 2; //M wIn[2] = REVERSE_FLAVOR_16(CHANGE_ENDIAN(*(LPWORD) accum)); accum+= 2; //Y wIn[3] = REVERSE_FLAVOR_16(CHANGE_ENDIAN(*(LPWORD) accum)); accum+= 2; //K return accum;}// KYMCstaticLPBYTE Unroll4WordsSwapBigEndian(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[3] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2; //K wIn[2] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2; //Y wIn[1] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2; //M wIn[0] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2; //C return accum;}staticLPBYTE Unroll3Bytes(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[0] = RGB_8_TO_16(*accum); accum++; // R wIn[1] = RGB_8_TO_16(*accum); accum++; // G wIn[2] = RGB_8_TO_16(*accum); accum++; // B return accum;}// Lab8 encoding using v2 PCSstaticLPBYTE Unroll3BytesLab(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[0] = (WORD) ((*accum) << 8); accum++; wIn[1] = (WORD) ((*accum) << 8); accum++; wIn[2] = (WORD) ((*accum) << 8); accum++; return accum;}// BRGstaticLPBYTE Unroll3BytesSwap(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[2] = RGB_8_TO_16(*accum); accum++; // B wIn[1] = RGB_8_TO_16(*accum); accum++; // G wIn[0] = RGB_8_TO_16(*accum); accum++; // R return accum;}staticLPBYTE Unroll3Words(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[0] = *(LPWORD) accum; accum+= 2; // C R wIn[1] = *(LPWORD) accum; accum+= 2; // M G wIn[2] = *(LPWORD) accum; accum+= 2; // Y B return accum;}staticLPBYTE Unroll3WordsSwap(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[2] = *(LPWORD) accum; accum+= 2; // C R wIn[1] = *(LPWORD) accum; accum+= 2; // M G wIn[0] = *(LPWORD) accum; accum+= 2; // Y B return accum;}staticLPBYTE Unroll3WordsBigEndian(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[0] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2; wIn[1] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2; wIn[2] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2; return accum;}staticLPBYTE Unroll3WordsSwapBigEndian(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[2] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2; wIn[1] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2; wIn[0] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2; return accum;}// Monochrome duplicates L into RGB for null-transformsstaticLPBYTE Unroll1Byte(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[0] = wIn[1] = wIn[2] = RGB_8_TO_16(*accum); accum++; // L return accum;}staticLPBYTE Unroll1ByteSkip2(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[0] = wIn[1] = wIn[2] = RGB_8_TO_16(*accum); accum++; // L accum += 2; return accum;}staticLPBYTE Unroll1ByteReversed(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[0] = wIn[1] = wIn[2] = REVERSE_FLAVOR_16(RGB_8_TO_16(*accum)); accum++; // L return accum;}staticLPBYTE Unroll1Word(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[0] = wIn[1] = wIn[2] = *(LPWORD) accum; accum+= 2; // L return accum;}staticLPBYTE Unroll1WordReversed(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[0] = wIn[1] = wIn[2] = REVERSE_FLAVOR_16(*(LPWORD) accum); accum+= 2; return accum;}staticLPBYTE Unroll1WordBigEndian(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[0] = wIn[1] = wIn[2] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2; return accum;}staticLPBYTE Unroll1WordSkip3(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[0] = wIn[1] = wIn[2] = *(LPWORD) accum; accum += 8; return accum;}// Monochrome + alpha. Alpha is loststaticLPBYTE Unroll2Byte(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[0] = wIn[1] = wIn[2] = RGB_8_TO_16(*accum); accum++; // L wIn[3] = RGB_8_TO_16(*accum); accum++; // alpha return accum;}staticLPBYTE Unroll2ByteSwapFirst(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[3] = RGB_8_TO_16(*accum); accum++; // alpha wIn[0] = wIn[1] = wIn[2] = RGB_8_TO_16(*accum); accum++; // L return accum;}staticLPBYTE Unroll2Word(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[0] = wIn[1] = wIn[2] = *(LPWORD) accum; accum+= 2; // L wIn[3] = *(LPWORD) accum; accum += 2; // alpha return accum;}staticLPBYTE Unroll2WordSwapFirst(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[3] = *(LPWORD) accum; accum += 2; // alpha wIn[0] = wIn[1] = wIn[2] = *(LPWORD) accum; accum+= 2; // L return accum;}staticLPBYTE Unroll2WordBigEndian(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ wIn[0] = wIn[1] = wIn[2] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2; wIn[3] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2; return accum;}staticLPBYTE UnrollPlanarBytes(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ int nChan = T_CHANNELS(info -> InputFormat); register int i; LPBYTE Init = accum; for (i=0; i < nChan; i++) { wIn[i] = RGB_8_TO_16(*accum); accum += info -> StrideIn; } return (Init + 1);}staticLPBYTE UnrollPlanarWords(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ int nChan = T_CHANNELS(info -> InputFormat); register int i; LPBYTE Init = accum; for (i=0; i < nChan; i++) { wIn[i] = *(LPWORD) accum; accum += (info -> StrideIn * sizeof(WORD)); } return (Init + sizeof(WORD));}staticLPBYTE UnrollPlanarWordsBigEndian(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ int nChan = T_CHANNELS(info -> InputFormat); register int i; LPBYTE Init = accum; for (i=0; i < nChan; i++) { wIn[i] = CHANGE_ENDIAN(*(LPWORD) accum); accum += (info -> StrideIn * sizeof(WORD)); } return (Init + sizeof(WORD));}// floating pointstaticLPBYTE UnrollLabDouble(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum){ if (T_PLANAR(info -> InputFormat)) { double* Pt = (double*) accum; cmsCIELab Lab; Lab.L = Pt[0]; Lab.a = Pt[info->StrideIn]; Lab.b = Pt[info->StrideIn*2]; if (info ->lInputV4Lab) cmsFloat2LabEncoded4(wIn, &Lab); else cmsFloat2LabEncoded(wIn, &Lab); return accum + sizeof(double); } else { if (info ->lInputV4Lab) cmsFloat2LabEncoded4(wIn, (LPcmsCIELab) accum); else cmsFloat2LabEncoded(wIn, (LPcmsCIELab) accum); accum += sizeof(cmsCIELab); return accum;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -