6821031: Upgrade OpenJDK's LittleCMS version to 1.18
Reviewed-by: bae, igor
This commit is contained in:
parent
4db0a48b10
commit
312ee333ac
@ -374,6 +374,10 @@ JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_getTagData
|
||||
return;
|
||||
}
|
||||
|
||||
// Modify data for a tag in a profile
|
||||
LCMSBOOL LCMSEXPORT _cmsModifyTagData(cmsHPROFILE hProfile,
|
||||
icTagSignature sig, void *data, size_t size);
|
||||
|
||||
/*
|
||||
* Class: sun_java2d_cmm_lcms_LCMS
|
||||
* Method: setTagData
|
||||
@ -561,10 +565,10 @@ JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_initLCMS
|
||||
PF_ID_fID = (*env)->GetFieldID (env, Pf, "ID", "J");
|
||||
}
|
||||
|
||||
BOOL _cmsModifyTagData(cmsHPROFILE hProfile, icTagSignature sig,
|
||||
LCMSBOOL _cmsModifyTagData(cmsHPROFILE hProfile, icTagSignature sig,
|
||||
void *data, size_t size)
|
||||
{
|
||||
BOOL isNew;
|
||||
LCMSBOOL isNew;
|
||||
int i, idx, delta, count;
|
||||
LPBYTE padChars[3] = {0, 0, 0};
|
||||
LPBYTE beforeBuf, afterBuf, ptr;
|
||||
|
@ -29,7 +29,7 @@
|
||||
//
|
||||
//
|
||||
// Little cms
|
||||
// Copyright (C) 1998-2006 Marti Maria
|
||||
// Copyright (C) 1998-2007 Marti Maria
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the "Software"),
|
||||
@ -51,7 +51,7 @@
|
||||
|
||||
|
||||
|
||||
// CIECAM 02 appearance model
|
||||
// CIECAM 02 appearance model. Many thanks to Jordi Vilar for the debugging.
|
||||
|
||||
#include "lcms.h"
|
||||
|
||||
@ -196,6 +196,10 @@ CAM02COLOR NonlinearCompression(CAM02COLOR clr, LPcmsCIECAM02 pMod)
|
||||
clr.RGBpa[i] = (400.0 * temp) / (temp + 27.13) + 0.1;
|
||||
}
|
||||
}
|
||||
|
||||
clr.A = (((2.0 * clr.RGBpa[0]) + clr.RGBpa[1] +
|
||||
(clr.RGBpa[2] / 20.0)) - 0.305) * pMod->Nbb;
|
||||
|
||||
return clr;
|
||||
}
|
||||
|
||||
@ -249,9 +253,6 @@ CAM02COLOR ComputeCorrelates(CAM02COLOR clr, LPcmsCIECAM02 pMod)
|
||||
clr.H = 300 + ((100*((clr.h - 237.53)/1.2)) / temp);
|
||||
}
|
||||
|
||||
clr.A = (((2.0 * clr.RGBpa[0]) + clr.RGBpa[1] +
|
||||
(clr.RGBpa[2] / 20.0)) - 0.305) * pMod->Nbb;
|
||||
|
||||
clr.J = 100.0 * pow((clr.A / pMod->adoptedWhite.A),
|
||||
(pMod->c * pMod->z));
|
||||
|
||||
@ -395,7 +396,7 @@ LCMSHANDLE LCMSEXPORT cmsCIECAM02Init(LPcmsViewingConditions pVC)
|
||||
LPcmsCIECAM02 lpMod;
|
||||
|
||||
|
||||
if((lpMod = (LPcmsCIECAM02) malloc(sizeof(cmsCIECAM02))) == NULL) {
|
||||
if((lpMod = (LPcmsCIECAM02) _cmsMalloc(sizeof(cmsCIECAM02))) == NULL) {
|
||||
return (LCMSHANDLE) NULL;
|
||||
}
|
||||
|
||||
@ -449,14 +450,19 @@ LCMSHANDLE LCMSEXPORT cmsCIECAM02Init(LPcmsViewingConditions pVC)
|
||||
lpMod -> z = compute_z(lpMod);
|
||||
lpMod -> Nbb = computeNbb(lpMod);
|
||||
lpMod -> FL = computeFL(lpMod);
|
||||
|
||||
if (lpMod -> D == D_CALCULATE ||
|
||||
lpMod -> D == D_CALCULATE_DISCOUNT) {
|
||||
|
||||
lpMod -> D = computeD(lpMod);
|
||||
}
|
||||
|
||||
lpMod -> Ncb = lpMod -> Nbb;
|
||||
|
||||
lpMod -> adoptedWhite = XYZtoCAT02(lpMod -> adoptedWhite);
|
||||
lpMod -> adoptedWhite = ChromaticAdaptation(lpMod -> adoptedWhite, lpMod);
|
||||
lpMod -> adoptedWhite = CAT02toHPE(lpMod -> adoptedWhite);
|
||||
lpMod -> adoptedWhite = NonlinearCompression(lpMod -> adoptedWhite, lpMod);
|
||||
lpMod -> adoptedWhite = ComputeCorrelates(lpMod -> adoptedWhite, lpMod);
|
||||
|
||||
return (LCMSHANDLE) lpMod;
|
||||
|
||||
@ -465,7 +471,7 @@ LCMSHANDLE LCMSEXPORT cmsCIECAM02Init(LPcmsViewingConditions pVC)
|
||||
void LCMSEXPORT cmsCIECAM02Done(LCMSHANDLE hModel)
|
||||
{
|
||||
LPcmsCIECAM02 lpMod = (LPcmsCIECAM02) (LPSTR) hModel;
|
||||
if (lpMod) free(lpMod);
|
||||
if (lpMod) _cmsFree(lpMod);
|
||||
}
|
||||
|
||||
|
||||
@ -510,3 +516,4 @@ void LCMSEXPORT cmsCIECAM02Reverse(LCMSHANDLE hModel, LPcmsJCh pIn, LPcmsCIEXYZ
|
||||
pOut ->Z = clr.XYZ[2];
|
||||
|
||||
}
|
||||
|
||||
|
@ -29,7 +29,7 @@
|
||||
//
|
||||
//
|
||||
// Little cms
|
||||
// Copyright (C) 1998-2006 Marti Maria
|
||||
// Copyright (C) 1998-2007 Marti Maria
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the "Software"),
|
||||
@ -174,7 +174,7 @@ typedef struct {
|
||||
LCMSAPI void LCMSEXPORT cmsCIECAM97sDone(LCMSHANDLE hModel)
|
||||
{
|
||||
LPcmsCIECAM97s lpMod = (LPcmsCIECAM97s) (LPSTR) hModel;
|
||||
if (lpMod) free(lpMod);
|
||||
if (lpMod) _cmsFree(lpMod);
|
||||
}
|
||||
|
||||
// Partial discounting for adaptation degree computation
|
||||
@ -331,7 +331,7 @@ LCMSAPI LCMSHANDLE LCMSEXPORT cmsCIECAM97sInit(LPcmsViewingConditions pVC)
|
||||
LPcmsCIECAM97s lpMod;
|
||||
VEC3 tmp;
|
||||
|
||||
if((lpMod = (LPcmsCIECAM97s) malloc(sizeof(cmsCIECAM97s))) == NULL) {
|
||||
if((lpMod = (LPcmsCIECAM97s) _cmsMalloc(sizeof(cmsCIECAM97s))) == NULL) {
|
||||
return (LCMSHANDLE) NULL;
|
||||
}
|
||||
|
||||
@ -449,7 +449,7 @@ LCMSAPI LCMSHANDLE LCMSEXPORT cmsCIECAM97sInit(LPcmsViewingConditions pVC)
|
||||
|
||||
// RGB_subw = [MlamRigg][WP/YWp]
|
||||
#ifdef USE_CIECAM97s2
|
||||
MAT3eval(&lpMod -> RGB_subw, &lpMod -> MlamRigg, (LPVEC3) &lpMod -> WP);
|
||||
MAT3eval(&lpMod -> RGB_subw, &lpMod -> MlamRigg, &lpMod -> WP);
|
||||
#else
|
||||
VEC3divK(&tmp, (LPVEC3) &lpMod -> WP, lpMod->WP.Y);
|
||||
MAT3eval(&lpMod -> RGB_subw, &lpMod -> MlamRigg, &tmp);
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -29,7 +29,7 @@
|
||||
//
|
||||
//
|
||||
// Little cms
|
||||
// Copyright (C) 1998-2006 Marti Maria
|
||||
// Copyright (C) 1998-2007 Marti Maria
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the "Software"),
|
||||
@ -256,7 +256,7 @@ void ComputeBlackPointCompensationFactors(LPcmsCIEXYZ BlackPointIn,
|
||||
// Return TRUE if both m and of are empy -- "m" being identity and "of" being 0
|
||||
|
||||
static
|
||||
BOOL IdentityParameters(LPWMAT3 m, LPWVEC3 of)
|
||||
LCMSBOOL IdentityParameters(LPWMAT3 m, LPWVEC3 of)
|
||||
{
|
||||
WVEC3 wv0;
|
||||
|
||||
@ -661,3 +661,6 @@ int cmsChooseCnvrt(int Absolute,
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -29,7 +29,7 @@
|
||||
//
|
||||
//
|
||||
// Little cms
|
||||
// Copyright (C) 1998-2006 Marti Maria
|
||||
// Copyright (C) 1998-2007 Marti Maria
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the "Software"),
|
||||
@ -57,6 +57,7 @@
|
||||
// errors.
|
||||
|
||||
void cdecl cmsSignalError(int ErrorCode, const char *ErrorText, ...);
|
||||
|
||||
int LCMSEXPORT cmsErrorAction(int lAbort);
|
||||
void LCMSEXPORT cmsSetErrorHandler(cmsErrorHandlerFunction Fn);
|
||||
|
||||
@ -96,7 +97,7 @@ void cmsSignalError(int ErrorCode, const char *ErrorText, ...)
|
||||
|
||||
char Buffer[1024];
|
||||
|
||||
vsprintf(Buffer, ErrorText, args);
|
||||
vsnprintf(Buffer, 1023, ErrorText, args);
|
||||
va_end(args);
|
||||
|
||||
if (UserErrorHandler(ErrorCode, Buffer)) {
|
||||
@ -118,8 +119,8 @@ void cmsSignalError(int ErrorCode, const char *ErrorText, ...)
|
||||
char Buffer1[1024];
|
||||
char Buffer2[256];
|
||||
|
||||
sprintf(Buffer1, "Error #%x; ", ErrorCode);
|
||||
vsprintf(Buffer2, ErrorText, args);
|
||||
snprintf(Buffer1, 767, "Error #%x; ", ErrorCode);
|
||||
vsnprintf(Buffer2, 255, ErrorText, args);
|
||||
strcat(Buffer1, Buffer2);
|
||||
MessageBox(NULL, Buffer1, "Little cms",
|
||||
MB_OK|MB_ICONSTOP|MB_TASKMODAL);
|
||||
|
@ -29,7 +29,7 @@
|
||||
//
|
||||
//
|
||||
// Little cms
|
||||
// Copyright (C) 1998-2006 Marti Maria
|
||||
// Copyright (C) 1998-2007 Marti Maria
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the "Software"),
|
||||
@ -63,9 +63,9 @@ LPGAMMATABLE LCMSEXPORT cmsReverseGamma(int nResultSamples, LPGAMMATABLE InGamma
|
||||
LPGAMMATABLE LCMSEXPORT cmsBuildParametricGamma(int nEntries, int Type, double Params[]);
|
||||
LPGAMMATABLE LCMSEXPORT cmsJoinGamma(LPGAMMATABLE InGamma, LPGAMMATABLE OutGamma);
|
||||
LPGAMMATABLE LCMSEXPORT cmsJoinGammaEx(LPGAMMATABLE InGamma, LPGAMMATABLE OutGamma, int nPoints);
|
||||
BOOL LCMSEXPORT cmsSmoothGamma(LPGAMMATABLE Tab, double lambda);
|
||||
LCMSBOOL LCMSEXPORT cmsSmoothGamma(LPGAMMATABLE Tab, double lambda);
|
||||
|
||||
BOOL cdecl _cmsSmoothEndpoints(LPWORD Table, int nPoints);
|
||||
LCMSBOOL cdecl _cmsSmoothEndpoints(LPWORD Table, int nPoints);
|
||||
|
||||
|
||||
// Sampled curves
|
||||
@ -74,7 +74,7 @@ LPSAMPLEDCURVE cdecl cmsAllocSampledCurve(int nItems);
|
||||
void cdecl cmsFreeSampledCurve(LPSAMPLEDCURVE p);
|
||||
void cdecl cmsEndpointsOfSampledCurve(LPSAMPLEDCURVE p, double* Min, double* Max);
|
||||
void cdecl cmsClampSampledCurve(LPSAMPLEDCURVE p, double Min, double Max);
|
||||
BOOL cdecl cmsSmoothSampledCurve(LPSAMPLEDCURVE Tab, double SmoothingLambda);
|
||||
LCMSBOOL cdecl cmsSmoothSampledCurve(LPSAMPLEDCURVE Tab, double SmoothingLambda);
|
||||
void cdecl cmsRescaleSampledCurve(LPSAMPLEDCURVE p, double Min, double Max, int nPoints);
|
||||
|
||||
LPSAMPLEDCURVE cdecl cmsJoinSampledCurves(LPSAMPLEDCURVE X, LPSAMPLEDCURVE Y, int nResultingPoints);
|
||||
@ -84,7 +84,6 @@ double LCMSEXPORT cmsEstimateGammaEx(LPWORD GammaTable, int nEntries, double The
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
|
||||
// #define DEBUG 1
|
||||
|
||||
#define MAX_KNOTS 4096
|
||||
typedef float vec[MAX_KNOTS+1];
|
||||
@ -144,14 +143,14 @@ LPGAMMATABLE LCMSEXPORT cmsAllocGamma(int nEntries)
|
||||
LPGAMMATABLE p;
|
||||
size_t size;
|
||||
|
||||
if (nEntries > 65530) {
|
||||
cmsSignalError(LCMS_ERRC_WARNING, "Couldn't create gammatable of more than 65530 entries; 65530 assumed");
|
||||
nEntries = 65530;
|
||||
if (nEntries > 65530 || nEntries <= 0) {
|
||||
cmsSignalError(LCMS_ERRC_ABORTED, "Couldn't create gammatable of more than 65530 entries");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
size = sizeof(GAMMATABLE) + (sizeof(WORD) * (nEntries-1));
|
||||
|
||||
p = (LPGAMMATABLE) malloc(size);
|
||||
p = (LPGAMMATABLE) _cmsMalloc(size);
|
||||
if (!p) return NULL;
|
||||
|
||||
ZeroMemory(p, size);
|
||||
@ -164,7 +163,7 @@ LPGAMMATABLE LCMSEXPORT cmsAllocGamma(int nEntries)
|
||||
|
||||
void LCMSEXPORT cmsFreeGamma(LPGAMMATABLE Gamma)
|
||||
{
|
||||
if (Gamma) free(Gamma);
|
||||
if (Gamma) _cmsFree(Gamma);
|
||||
}
|
||||
|
||||
|
||||
@ -278,6 +277,15 @@ LPGAMMATABLE LCMSEXPORT cmsReverseGamma(int nResultSamples, LPGAMMATABLE InGamma
|
||||
LPWORD InPtr;
|
||||
LPGAMMATABLE p;
|
||||
|
||||
// Try to reverse it analytically whatever possible
|
||||
if (InGamma -> Seed.Type > 0 && InGamma -> Seed.Type <= 5 &&
|
||||
_cmsCrc32OfGammaTable(InGamma) == InGamma -> Seed.Crc32) {
|
||||
|
||||
return cmsBuildParametricGamma(nResultSamples, -(InGamma -> Seed.Type), InGamma ->Seed.Params);
|
||||
}
|
||||
|
||||
|
||||
// Nope, reverse the table
|
||||
p = cmsAllocGamma(nResultSamples);
|
||||
if (!p) return NULL;
|
||||
|
||||
@ -528,7 +536,7 @@ void smooth2(vec w, vec y, vec z, float lambda, int m)
|
||||
|
||||
// Smooths a curve sampled at regular intervals
|
||||
|
||||
BOOL LCMSEXPORT cmsSmoothGamma(LPGAMMATABLE Tab, double lambda)
|
||||
LCMSBOOL LCMSEXPORT cmsSmoothGamma(LPGAMMATABLE Tab, double lambda)
|
||||
|
||||
{
|
||||
vec w, y, z;
|
||||
@ -640,13 +648,13 @@ LPSAMPLEDCURVE cmsAllocSampledCurve(int nItems)
|
||||
{
|
||||
LPSAMPLEDCURVE pOut;
|
||||
|
||||
pOut = (LPSAMPLEDCURVE) malloc(sizeof(SAMPLEDCURVE));
|
||||
pOut = (LPSAMPLEDCURVE) _cmsMalloc(sizeof(SAMPLEDCURVE));
|
||||
if (pOut == NULL)
|
||||
return NULL;
|
||||
|
||||
if((pOut->Values = (double *) malloc(nItems * sizeof(double))) == NULL)
|
||||
if((pOut->Values = (double *) _cmsMalloc(nItems * sizeof(double))) == NULL)
|
||||
{
|
||||
free(pOut);
|
||||
_cmsFree(pOut);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -659,8 +667,8 @@ LPSAMPLEDCURVE cmsAllocSampledCurve(int nItems)
|
||||
|
||||
void cmsFreeSampledCurve(LPSAMPLEDCURVE p)
|
||||
{
|
||||
free((LPVOID) p -> Values);
|
||||
free((LPVOID) p);
|
||||
_cmsFree((LPVOID) p -> Values);
|
||||
_cmsFree((LPVOID) p);
|
||||
}
|
||||
|
||||
|
||||
@ -731,7 +739,7 @@ void cmsClampSampledCurve(LPSAMPLEDCURVE p, double Min, double Max)
|
||||
|
||||
// Smooths a curve sampled at regular intervals
|
||||
|
||||
BOOL cmsSmoothSampledCurve(LPSAMPLEDCURVE Tab, double lambda)
|
||||
LCMSBOOL cmsSmoothSampledCurve(LPSAMPLEDCURVE Tab, double lambda)
|
||||
{
|
||||
vec w, y, z;
|
||||
int i, nItems;
|
||||
@ -915,14 +923,11 @@ LPSAMPLEDCURVE cmsConvertGammaToSampledCurve(LPGAMMATABLE Gamma, int nPoints)
|
||||
|
||||
// Smooth endpoints (used in Black/White compensation)
|
||||
|
||||
BOOL _cmsSmoothEndpoints(LPWORD Table, int nEntries)
|
||||
LCMSBOOL _cmsSmoothEndpoints(LPWORD Table, int nEntries)
|
||||
{
|
||||
vec w, y, z;
|
||||
int i, Zeros, Poles;
|
||||
|
||||
#ifdef DEBUG
|
||||
ASAVE(Table, nEntries, "nonsmt.txt");
|
||||
#endif
|
||||
|
||||
|
||||
if (cmsIsLinear(Table, nEntries)) return FALSE; // Nothing to do
|
||||
|
@ -29,7 +29,7 @@
|
||||
//
|
||||
//
|
||||
// Little cms
|
||||
// Copyright (C) 1998-2006 Marti Maria
|
||||
// Copyright (C) 1998-2007 Marti Maria
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the "Software"),
|
||||
@ -66,7 +66,7 @@ to use highlights, then it will be lost.
|
||||
*/
|
||||
|
||||
|
||||
BOOL _cmsEndPointsBySpace(icColorSpaceSignature Space, WORD **White, WORD **Black,
|
||||
LCMSBOOL _cmsEndPointsBySpace(icColorSpaceSignature Space, WORD **White, WORD **Black,
|
||||
int *nOutputs)
|
||||
{
|
||||
// Only most common spaces
|
||||
@ -376,7 +376,6 @@ double LCMSEXPORT cmsCIE2000DeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2,
|
||||
double bs = Lab2 ->b;
|
||||
double Cs = sqrt( Sqr(as) + Sqr(bs) );
|
||||
|
||||
|
||||
double G = 0.5 * ( 1 - sqrt(pow((C + Cs) / 2 , 7.0) / (pow((C + Cs) / 2, 7.0) + pow(25.0, 7.0) ) ));
|
||||
|
||||
double a_p = (1 + G ) * a1;
|
||||
@ -390,15 +389,21 @@ double LCMSEXPORT cmsCIE2000DeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2,
|
||||
double C_ps = sqrt(Sqr(a_ps) + Sqr(b_ps));
|
||||
double h_ps = atan2deg(a_ps, b_ps);
|
||||
|
||||
|
||||
|
||||
double meanC_p =(C_p + C_ps) / 2;
|
||||
|
||||
double meanh_p = fabs(h_ps-h_p) <= 180 ? (h_ps + h_p)/2 : (h_ps+h_p-360)/2;
|
||||
double hps_plus_hp = h_ps + h_p;
|
||||
double hps_minus_hp = h_ps - h_p;
|
||||
|
||||
double meanh_p = fabs(hps_minus_hp) <= 180.000001 ? (hps_plus_hp)/2 :
|
||||
(hps_plus_hp) < 360 ? (hps_plus_hp + 360)/2 :
|
||||
(hps_plus_hp - 360)/2;
|
||||
|
||||
double delta_h = (hps_minus_hp) <= -180.000001 ? (hps_minus_hp + 360) :
|
||||
(hps_minus_hp) > 180 ? (hps_minus_hp - 360) :
|
||||
(hps_minus_hp);
|
||||
double delta_L = (Ls - L1);
|
||||
double delta_C = (C_ps - C_p );
|
||||
|
||||
double delta_h = fabs(h_p - h_ps) <= 180 ? fabs(h_p - h_ps) : 360 - fabs(h_p - h_ps);
|
||||
double delta_L = fabs(L1 - Ls);
|
||||
double delta_C = fabs(C_p - C_ps);
|
||||
|
||||
double delta_H =2 * sqrt(C_ps*C_p) * sin(RADIANES(delta_h) / 2);
|
||||
|
||||
@ -1065,7 +1070,7 @@ void SlopeLimiting(WORD Table[], int nEntries)
|
||||
// Check for monotonicity.
|
||||
|
||||
static
|
||||
BOOL IsMonotonic(LPGAMMATABLE t)
|
||||
LCMSBOOL IsMonotonic(LPGAMMATABLE t)
|
||||
{
|
||||
int n = t -> nEntries;
|
||||
int i, last;
|
||||
@ -1088,7 +1093,7 @@ BOOL IsMonotonic(LPGAMMATABLE t)
|
||||
// Check for endpoints
|
||||
|
||||
static
|
||||
BOOL HasProperEndpoints(LPGAMMATABLE t)
|
||||
LCMSBOOL HasProperEndpoints(LPGAMMATABLE t)
|
||||
{
|
||||
if (t ->GammaTable[0] != 0) return FALSE;
|
||||
if (t ->GammaTable[t ->nEntries-1] != 0xFFFF) return FALSE;
|
||||
@ -1109,7 +1114,7 @@ void _cmsComputePrelinearizationTablesFromXFORM(cmsHTRANSFORM h[], int nTransfor
|
||||
unsigned int t, i, v;
|
||||
int j;
|
||||
WORD In[MAXCHANNELS], Out[MAXCHANNELS];
|
||||
BOOL lIsSuitable;
|
||||
LCMSBOOL lIsSuitable;
|
||||
_LPcmsTRANSFORM InputXForm = (_LPcmsTRANSFORM) h[0];
|
||||
_LPcmsTRANSFORM OutputXForm = (_LPcmsTRANSFORM) h[nTransforms-1];
|
||||
|
||||
@ -1126,10 +1131,10 @@ void _cmsComputePrelinearizationTablesFromXFORM(cmsHTRANSFORM h[], int nTransfor
|
||||
}
|
||||
|
||||
|
||||
// Do nothing on all but RGB to RGB transforms
|
||||
// Do nothing on all but Gray/RGB to Gray/RGB transforms
|
||||
|
||||
if ((InputXForm ->EntryColorSpace != icSigRgbData) ||
|
||||
(OutputXForm->ExitColorSpace != icSigRgbData)) return;
|
||||
if (((InputXForm ->EntryColorSpace != icSigRgbData) && (InputXForm ->EntryColorSpace != icSigGrayData)) ||
|
||||
((OutputXForm->ExitColorSpace != icSigRgbData) && (OutputXForm->ExitColorSpace != icSigGrayData))) return;
|
||||
|
||||
|
||||
for (t = 0; t < Grid -> InputChan; t++)
|
||||
@ -1169,10 +1174,13 @@ void _cmsComputePrelinearizationTablesFromXFORM(cmsHTRANSFORM h[], int nTransfor
|
||||
if (!HasProperEndpoints(Trans[t]))
|
||||
lIsSuitable = FALSE;
|
||||
|
||||
/*
|
||||
// Exclude if transfer function is not smooth enough
|
||||
// to be modelled as a gamma function, or the gamma is reversed
|
||||
|
||||
if (cmsEstimateGamma(Trans[t]) < 1.0)
|
||||
lIsSuitable = FALSE;
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
|
@ -29,7 +29,7 @@
|
||||
//
|
||||
//
|
||||
// Little cms
|
||||
// Copyright (C) 1998-2006 Marti Maria
|
||||
// Copyright (C) 1998-2007 Marti Maria
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the "Software"),
|
||||
@ -282,7 +282,7 @@ void Eval8Inputs(WORD StageABC[], WORD StageLMN[], WORD LutTable[], LPL16PARAMS
|
||||
// Fills optimization parameters
|
||||
|
||||
void cmsCalcCLUT16ParamsEx(int nSamples, int InputChan, int OutputChan,
|
||||
BOOL lUseTetrahedral, LPL16PARAMS p)
|
||||
LCMSBOOL lUseTetrahedral, LPL16PARAMS p)
|
||||
{
|
||||
int clutPoints;
|
||||
|
||||
@ -579,7 +579,7 @@ WORD cmsReverseLinearInterpLUT16(WORD Value, WORD LutTable[], LPL16PARAMS p)
|
||||
|
||||
// Identify if value fall downto 0 or FFFF zone
|
||||
if (Value == 0) return 0;
|
||||
if (Value == 0xFFFF) return 0xFFFF;
|
||||
// if (Value == 0xFFFF) return 0xFFFF;
|
||||
|
||||
// else restrict to valid zone
|
||||
|
||||
@ -631,7 +631,7 @@ WORD cmsReverseLinearInterpLUT16(WORD Value, WORD LutTable[], LPL16PARAMS p)
|
||||
a = (y1 - y0) / (x1 - x0);
|
||||
b = y0 - a * x0;
|
||||
|
||||
if (a == 0) return (WORD) x;
|
||||
if (fabs(a) < 0.01) return (WORD) x;
|
||||
|
||||
f = ((Value - b) / a);
|
||||
|
||||
@ -1131,3 +1131,4 @@ void cmsTetrahedralInterp8(WORD Input[],
|
||||
}
|
||||
|
||||
#undef DENS
|
||||
|
||||
|
@ -29,7 +29,7 @@
|
||||
//
|
||||
//
|
||||
// Little cms
|
||||
// Copyright (C) 1998-2006 Marti Maria
|
||||
// Copyright (C) 1998-2007 Marti Maria
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the "Software"),
|
||||
@ -62,7 +62,7 @@
|
||||
typedef struct {
|
||||
LPBYTE Block; // Points to allocated memory
|
||||
size_t Size; // Size of allocated memory
|
||||
int Pointer; // Points to current location
|
||||
size_t Pointer; // Points to current location
|
||||
int FreeBlockOnClose; // As title
|
||||
|
||||
} FILEMEM;
|
||||
@ -70,18 +70,19 @@ typedef struct {
|
||||
static
|
||||
LPVOID MemoryOpen(LPBYTE Block, size_t Size, char Mode)
|
||||
{
|
||||
FILEMEM* fm = (FILEMEM*) malloc(sizeof(FILEMEM));
|
||||
FILEMEM* fm = (FILEMEM*) _cmsMalloc(sizeof(FILEMEM));
|
||||
if (fm == NULL) return NULL;
|
||||
|
||||
ZeroMemory(fm, sizeof(FILEMEM));
|
||||
|
||||
if (Mode == 'r') {
|
||||
|
||||
fm ->Block = (LPBYTE) malloc(Size);
|
||||
fm ->Block = (LPBYTE) _cmsMalloc(Size);
|
||||
if (fm ->Block == NULL) {
|
||||
free(fm);
|
||||
_cmsFree(fm);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
CopyMemory(fm->Block, Block, Size);
|
||||
fm ->FreeBlockOnClose = TRUE;
|
||||
}
|
||||
@ -103,13 +104,27 @@ size_t MemoryRead(LPVOID buffer, size_t size, size_t count, struct _lcms_iccprof
|
||||
FILEMEM* ResData = (FILEMEM*) Icc ->stream;
|
||||
LPBYTE Ptr;
|
||||
size_t len = size * count;
|
||||
size_t extent = ResData -> Pointer + len;
|
||||
|
||||
if (len == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ResData -> Pointer + len > ResData -> Size){
|
||||
if (len / size != count) {
|
||||
cmsSignalError(LCMS_ERRC_ABORTED, "Read from memory error. Integer overflow with count / size.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (extent < len || extent < ResData -> Pointer) {
|
||||
cmsSignalError(LCMS_ERRC_ABORTED, "Read from memory error. Integer overflow with len.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ResData -> Pointer + len > ResData -> Size) {
|
||||
|
||||
len = (ResData -> Size - ResData -> Pointer);
|
||||
cmsSignalError(LCMS_ERRC_WARNING, "Read from memory error. Got %d bytes, block should be of %d bytes", len * size, count * size);
|
||||
|
||||
cmsSignalError(LCMS_ERRC_ABORTED, "Read from memory error. Got %d bytes, block should be of %d bytes", len * size, count * size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Ptr = ResData -> Block;
|
||||
@ -123,7 +138,7 @@ size_t MemoryRead(LPVOID buffer, size_t size, size_t count, struct _lcms_iccprof
|
||||
// SEEK_CUR is assumed
|
||||
|
||||
static
|
||||
BOOL MemorySeek(struct _lcms_iccprofile_struct* Icc, size_t offset)
|
||||
LCMSBOOL MemorySeek(struct _lcms_iccprofile_struct* Icc, size_t offset)
|
||||
{
|
||||
FILEMEM* ResData = (FILEMEM*) Icc ->stream;
|
||||
|
||||
@ -147,10 +162,10 @@ size_t MemoryTell(struct _lcms_iccprofile_struct* Icc)
|
||||
}
|
||||
|
||||
|
||||
// Writes data to memory, also keeps used space for further reference
|
||||
// Writes data to memory, also keeps used space for further reference. NO CHECK IS PERFORMED
|
||||
|
||||
static
|
||||
BOOL MemoryWrite(struct _lcms_iccprofile_struct* Icc, size_t size, void *Ptr)
|
||||
LCMSBOOL MemoryWrite(struct _lcms_iccprofile_struct* Icc, size_t size, void *Ptr)
|
||||
{
|
||||
FILEMEM* ResData = (FILEMEM*) Icc ->stream;
|
||||
|
||||
@ -167,11 +182,17 @@ BOOL MemoryWrite(struct _lcms_iccprofile_struct* Icc, size_t size, void *Ptr)
|
||||
|
||||
|
||||
static
|
||||
BOOL MemoryGrow(struct _lcms_iccprofile_struct* Icc, size_t size)
|
||||
LCMSBOOL MemoryGrow(struct _lcms_iccprofile_struct* Icc, size_t size)
|
||||
{
|
||||
FILEMEM* ResData = (FILEMEM*) Icc->stream;
|
||||
|
||||
void* newBlock = realloc(ResData->Block, ResData->Size + size);
|
||||
void* newBlock = NULL;
|
||||
|
||||
/* Follow same policies as functions in lcms.h */
|
||||
if (ResData->Size + size < 0) return NULL;
|
||||
if (ResData->Size + size > (size_t)1024*1024*500))) return NULL;
|
||||
|
||||
newBlock = realloc(ResData->Block, ResData->Size + size);
|
||||
|
||||
if (!newBlock) {
|
||||
return FALSE;
|
||||
@ -183,15 +204,15 @@ BOOL MemoryGrow(struct _lcms_iccprofile_struct* Icc, size_t size)
|
||||
|
||||
|
||||
static
|
||||
BOOL MemoryClose(struct _lcms_iccprofile_struct* Icc)
|
||||
LCMSBOOL MemoryClose(struct _lcms_iccprofile_struct* Icc)
|
||||
{
|
||||
FILEMEM* ResData = (FILEMEM*) Icc ->stream;
|
||||
|
||||
if (ResData ->FreeBlockOnClose) {
|
||||
|
||||
if (ResData ->Block) free(ResData ->Block);
|
||||
if (ResData ->Block) _cmsFree(ResData ->Block);
|
||||
}
|
||||
free(ResData);
|
||||
_cmsFree(ResData);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -209,7 +230,7 @@ size_t FileRead(void *buffer, size_t size, size_t count, struct _lcms_iccprofile
|
||||
{
|
||||
size_t nReaded = fread(buffer, size, count, (FILE*) Icc->stream);
|
||||
if (nReaded != count) {
|
||||
cmsSignalError(LCMS_ERRC_WARNING, "Read error. Got %d bytes, block should be of %d bytes", nReaded * size, count * size);
|
||||
cmsSignalError(LCMS_ERRC_ABORTED, "Read error. Got %d bytes, block should be of %d bytes", nReaded * size, count * size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -218,7 +239,7 @@ size_t FileRead(void *buffer, size_t size, size_t count, struct _lcms_iccprofile
|
||||
|
||||
|
||||
static
|
||||
BOOL FileSeek(struct _lcms_iccprofile_struct* Icc, size_t offset)
|
||||
LCMSBOOL FileSeek(struct _lcms_iccprofile_struct* Icc, size_t offset)
|
||||
{
|
||||
if (fseek((FILE*) Icc ->stream, (long) offset, SEEK_SET) != 0) {
|
||||
|
||||
@ -240,7 +261,7 @@ size_t FileTell(struct _lcms_iccprofile_struct* Icc)
|
||||
|
||||
|
||||
static
|
||||
BOOL FileWrite(struct _lcms_iccprofile_struct* Icc, size_t size, LPVOID Ptr)
|
||||
LCMSBOOL FileWrite(struct _lcms_iccprofile_struct* Icc, size_t size, LPVOID Ptr)
|
||||
{
|
||||
if (size == 0) return TRUE;
|
||||
|
||||
@ -256,14 +277,14 @@ BOOL FileWrite(struct _lcms_iccprofile_struct* Icc, size_t size, LPVOID Ptr)
|
||||
|
||||
|
||||
static
|
||||
BOOL FileGrow(struct _lcms_iccprofile_struct* Icc, size_t size)
|
||||
LCMSBOOL FileGrow(struct _lcms_iccprofile_struct* Icc, size_t size)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
static
|
||||
BOOL FileClose(struct _lcms_iccprofile_struct* Icc)
|
||||
LCMSBOOL FileClose(struct _lcms_iccprofile_struct* Icc)
|
||||
{
|
||||
return fclose((FILE*) Icc ->stream);
|
||||
}
|
||||
@ -276,7 +297,7 @@ BOOL FileClose(struct _lcms_iccprofile_struct* Icc)
|
||||
cmsHPROFILE _cmsCreateProfilePlaceholder(void)
|
||||
{
|
||||
|
||||
LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) malloc(sizeof(LCMSICCPROFILE));
|
||||
LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) _cmsMalloc(sizeof(LCMSICCPROFILE));
|
||||
if (Icc == NULL) return NULL;
|
||||
|
||||
// Empty values
|
||||
@ -314,7 +335,7 @@ icTagSignature LCMSEXPORT cmsGetTagSignature(cmsHPROFILE hProfile, icInt32Number
|
||||
// Search for a specific tag in tag dictionary
|
||||
// Returns position or -1 if tag not found
|
||||
|
||||
icInt32Number _cmsSearchTag(LPLCMSICCPROFILE Profile, icTagSignature sig, BOOL lSignalError)
|
||||
icInt32Number _cmsSearchTag(LPLCMSICCPROFILE Profile, icTagSignature sig, LCMSBOOL lSignalError)
|
||||
{
|
||||
icInt32Number i;
|
||||
|
||||
@ -335,7 +356,7 @@ icInt32Number _cmsSearchTag(LPLCMSICCPROFILE Profile, icTagSignature sig, BOOL l
|
||||
|
||||
// Check existance
|
||||
|
||||
BOOL LCMSEXPORT cmsIsTag(cmsHPROFILE hProfile, icTagSignature sig)
|
||||
LCMSBOOL LCMSEXPORT cmsIsTag(cmsHPROFILE hProfile, icTagSignature sig)
|
||||
{
|
||||
LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
|
||||
return _cmsSearchTag(Icc, sig, FALSE) >= 0;
|
||||
@ -354,7 +375,7 @@ LPVOID _cmsInitTag(LPLCMSICCPROFILE Icc, icTagSignature sig, size_t size, const
|
||||
|
||||
if (i >=0) {
|
||||
|
||||
if (Icc -> TagPtrs[i]) free(Icc -> TagPtrs[i]);
|
||||
if (Icc -> TagPtrs[i]) _cmsFree(Icc -> TagPtrs[i]);
|
||||
}
|
||||
else {
|
||||
|
||||
@ -365,11 +386,14 @@ LPVOID _cmsInitTag(LPLCMSICCPROFILE Icc, icTagSignature sig, size_t size, const
|
||||
|
||||
cmsSignalError(LCMS_ERRC_ABORTED, "Too many tags (%d)", MAX_TABLE_TAG);
|
||||
Icc ->TagCount = MAX_TABLE_TAG-1;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Ptr = malloc(size);
|
||||
Ptr = _cmsMalloc(size);
|
||||
if (Ptr == NULL) return NULL;
|
||||
|
||||
CopyMemory(Ptr, Init, size);
|
||||
|
||||
Icc ->TagNames[i] = sig;
|
||||
@ -400,6 +424,8 @@ LPLCMSICCPROFILE _cmsCreateProfileFromFilePlaceholder(const char* FileName)
|
||||
if (NewIcc == NULL) return NULL;
|
||||
|
||||
strncpy(NewIcc -> PhysicalFile, FileName, MAX_PATH-1);
|
||||
NewIcc -> PhysicalFile[MAX_PATH-1] = 0;
|
||||
|
||||
NewIcc ->stream = ICCfile;
|
||||
|
||||
NewIcc ->Read = FileRead;
|
||||
@ -502,7 +528,7 @@ void _cmsSetSaveToMemory(LPLCMSICCPROFILE Icc, LPVOID MemPtr, size_t dwSize)
|
||||
|
||||
|
||||
|
||||
BOOL LCMSEXPORT cmsTakeMediaWhitePoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile)
|
||||
LCMSBOOL LCMSEXPORT cmsTakeMediaWhitePoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile)
|
||||
{
|
||||
LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
|
||||
*Dest = Icc -> MediaWhitePoint;
|
||||
@ -510,14 +536,14 @@ BOOL LCMSEXPORT cmsTakeMediaWhitePoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile)
|
||||
}
|
||||
|
||||
|
||||
BOOL LCMSEXPORT cmsTakeMediaBlackPoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile)
|
||||
LCMSBOOL LCMSEXPORT cmsTakeMediaBlackPoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile)
|
||||
{
|
||||
LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
|
||||
*Dest = Icc -> MediaBlackPoint;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL LCMSEXPORT cmsTakeIluminant(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile)
|
||||
LCMSBOOL LCMSEXPORT cmsTakeIluminant(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile)
|
||||
{
|
||||
LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
|
||||
*Dest = Icc -> Illuminant;
|
||||
@ -575,7 +601,7 @@ void LCMSEXPORT cmsSetProfileID(cmsHPROFILE hProfile, LPBYTE ProfileID)
|
||||
}
|
||||
|
||||
|
||||
BOOL LCMSEXPORT cmsTakeCreationDateTime(struct tm *Dest, cmsHPROFILE hProfile)
|
||||
LCMSBOOL LCMSEXPORT cmsTakeCreationDateTime(struct tm *Dest, cmsHPROFILE hProfile)
|
||||
{
|
||||
LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
|
||||
CopyMemory(Dest, &Icc ->Created, sizeof(struct tm));
|
||||
@ -596,23 +622,18 @@ void LCMSEXPORT cmsSetPCS(cmsHPROFILE hProfile, icColorSpaceSignature pcs)
|
||||
Icc -> PCS = pcs;
|
||||
}
|
||||
|
||||
|
||||
|
||||
icColorSpaceSignature LCMSEXPORT cmsGetColorSpace(cmsHPROFILE hProfile)
|
||||
{
|
||||
LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
|
||||
return Icc -> ColorSpace;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void LCMSEXPORT cmsSetColorSpace(cmsHPROFILE hProfile, icColorSpaceSignature sig)
|
||||
{
|
||||
LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
|
||||
Icc -> ColorSpace = sig;
|
||||
}
|
||||
|
||||
|
||||
icProfileClassSignature LCMSEXPORT cmsGetDeviceClass(cmsHPROFILE hProfile)
|
||||
{
|
||||
LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
|
||||
@ -625,7 +646,6 @@ DWORD LCMSEXPORT cmsGetProfileICCversion(cmsHPROFILE hProfile)
|
||||
return (DWORD) Icc -> Version;
|
||||
}
|
||||
|
||||
|
||||
void LCMSEXPORT cmsSetProfileICCversion(cmsHPROFILE hProfile, DWORD Version)
|
||||
{
|
||||
LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
|
||||
@ -664,7 +684,7 @@ LPVOID DupBlock(LPLCMSICCPROFILE Icc, LPVOID Block, size_t size)
|
||||
|
||||
// This is tricky, since LUT structs does have pointers
|
||||
|
||||
BOOL LCMSEXPORT _cmsAddLUTTag(cmsHPROFILE hProfile, icTagSignature sig, const void* lut)
|
||||
LCMSBOOL LCMSEXPORT _cmsAddLUTTag(cmsHPROFILE hProfile, icTagSignature sig, const void* lut)
|
||||
{
|
||||
LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
|
||||
LPLUT Orig, Stored;
|
||||
@ -692,7 +712,7 @@ BOOL LCMSEXPORT _cmsAddLUTTag(cmsHPROFILE hProfile, icTagSignature sig, const vo
|
||||
}
|
||||
|
||||
|
||||
BOOL LCMSEXPORT _cmsAddXYZTag(cmsHPROFILE hProfile, icTagSignature sig, const cmsCIEXYZ* XYZ)
|
||||
LCMSBOOL LCMSEXPORT _cmsAddXYZTag(cmsHPROFILE hProfile, icTagSignature sig, const cmsCIEXYZ* XYZ)
|
||||
{
|
||||
LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
|
||||
|
||||
@ -701,7 +721,7 @@ BOOL LCMSEXPORT _cmsAddXYZTag(cmsHPROFILE hProfile, icTagSignature sig, const cm
|
||||
}
|
||||
|
||||
|
||||
BOOL LCMSEXPORT _cmsAddTextTag(cmsHPROFILE hProfile, icTagSignature sig, const char* Text)
|
||||
LCMSBOOL LCMSEXPORT _cmsAddTextTag(cmsHPROFILE hProfile, icTagSignature sig, const char* Text)
|
||||
{
|
||||
LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
|
||||
|
||||
@ -709,7 +729,7 @@ BOOL LCMSEXPORT _cmsAddTextTag(cmsHPROFILE hProfile, icTagSignature sig, const c
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL LCMSEXPORT _cmsAddGammaTag(cmsHPROFILE hProfile, icTagSignature sig, LPGAMMATABLE TransferFunction)
|
||||
LCMSBOOL LCMSEXPORT _cmsAddGammaTag(cmsHPROFILE hProfile, icTagSignature sig, LPGAMMATABLE TransferFunction)
|
||||
{
|
||||
LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
|
||||
|
||||
@ -718,7 +738,7 @@ BOOL LCMSEXPORT _cmsAddGammaTag(cmsHPROFILE hProfile, icTagSignature sig, LPGAMM
|
||||
}
|
||||
|
||||
|
||||
BOOL LCMSEXPORT _cmsAddChromaticityTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsCIExyYTRIPLE Chrm)
|
||||
LCMSBOOL LCMSEXPORT _cmsAddChromaticityTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsCIExyYTRIPLE Chrm)
|
||||
{
|
||||
LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
|
||||
|
||||
@ -727,7 +747,7 @@ BOOL LCMSEXPORT _cmsAddChromaticityTag(cmsHPROFILE hProfile, icTagSignature sig,
|
||||
}
|
||||
|
||||
|
||||
BOOL LCMSEXPORT _cmsAddSequenceDescriptionTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsSEQ pseq)
|
||||
LCMSBOOL LCMSEXPORT _cmsAddSequenceDescriptionTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsSEQ pseq)
|
||||
{
|
||||
LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
|
||||
|
||||
@ -737,28 +757,40 @@ BOOL LCMSEXPORT _cmsAddSequenceDescriptionTag(cmsHPROFILE hProfile, icTagSignatu
|
||||
}
|
||||
|
||||
|
||||
BOOL LCMSEXPORT _cmsAddNamedColorTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc)
|
||||
LCMSBOOL LCMSEXPORT _cmsAddNamedColorTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc)
|
||||
{
|
||||
LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
|
||||
|
||||
_cmsInitTag(Icc, sig, sizeof(cmsNAMEDCOLORLIST) + (nc ->nColors - 1) * sizeof(cmsNAMEDCOLOR), nc);
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
BOOL LCMSEXPORT _cmsAddDateTimeTag(cmsHPROFILE hProfile, icTagSignature sig, struct tm *DateTime)
|
||||
LCMSBOOL LCMSEXPORT _cmsAddDateTimeTag(cmsHPROFILE hProfile, icTagSignature sig, struct tm *DateTime)
|
||||
{
|
||||
LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
|
||||
|
||||
_cmsInitTag(Icc, sig, sizeof(struct tm), DateTime);
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
BOOL LCMSEXPORT _cmsAddColorantTableTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc)
|
||||
LCMSBOOL LCMSEXPORT _cmsAddColorantTableTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc)
|
||||
{
|
||||
LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
|
||||
|
||||
_cmsInitTag(Icc, sig, sizeof(cmsNAMEDCOLORLIST) + (nc ->nColors - 1) * sizeof(cmsNAMEDCOLOR), nc);
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
LCMSBOOL LCMSEXPORT _cmsAddChromaticAdaptationTag(cmsHPROFILE hProfile, icTagSignature sig, const cmsCIEXYZ* mat)
|
||||
{
|
||||
LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
|
||||
|
||||
_cmsInitTag(Icc, sig, 3*sizeof(cmsCIEXYZ), mat);
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -29,7 +29,7 @@
|
||||
//
|
||||
//
|
||||
// Little cms
|
||||
// Copyright (C) 1998-2006 Marti Maria
|
||||
// Copyright (C) 1998-2007 Marti Maria
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the "Software"),
|
||||
@ -118,7 +118,7 @@ LPLUT LCMSEXPORT cmsAllocLUT(void)
|
||||
{
|
||||
LPLUT NewLUT;
|
||||
|
||||
NewLUT = (LPLUT) malloc(sizeof(LUT));
|
||||
NewLUT = (LPLUT) _cmsMalloc(sizeof(LUT));
|
||||
if (NewLUT)
|
||||
ZeroMemory(NewLUT, sizeof(LUT));
|
||||
|
||||
@ -171,9 +171,10 @@ void LCMSEXPORT cmsFreeLUT(LPLUT Lut)
|
||||
static
|
||||
LPVOID DupBlockTab(LPVOID Org, size_t size)
|
||||
{
|
||||
LPVOID mem = malloc(size);
|
||||
|
||||
LPVOID mem = _cmsMalloc(size);
|
||||
if (mem != NULL)
|
||||
CopyMemory(mem, Org, size);
|
||||
|
||||
return mem;
|
||||
}
|
||||
|
||||
@ -211,6 +212,37 @@ unsigned int UIpow(unsigned int a, unsigned int b)
|
||||
}
|
||||
|
||||
|
||||
LCMSBOOL _cmsValidateLUT(LPLUT NewLUT)
|
||||
{
|
||||
unsigned int calc = 1;
|
||||
unsigned int oldCalc;
|
||||
unsigned int power = NewLUT -> InputChan;
|
||||
|
||||
if (NewLUT -> cLutPoints > 100) return FALSE;
|
||||
if (NewLUT -> InputChan > MAXCHANNELS) return FALSE;
|
||||
if (NewLUT -> OutputChan > MAXCHANNELS) return FALSE;
|
||||
|
||||
if (NewLUT -> cLutPoints == 0) return TRUE;
|
||||
|
||||
for (; power > 0; power--) {
|
||||
|
||||
oldCalc = calc;
|
||||
calc *= NewLUT -> cLutPoints;
|
||||
|
||||
if (calc / NewLUT -> cLutPoints != oldCalc) {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
oldCalc = calc;
|
||||
calc *= NewLUT -> OutputChan;
|
||||
if (NewLUT -> OutputChan && calc / NewLUT -> OutputChan != oldCalc) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
LPLUT LCMSEXPORT cmsAlloc3DGrid(LPLUT NewLUT, int clutPoints, int inputChan, int outputChan)
|
||||
{
|
||||
DWORD nTabSize;
|
||||
@ -220,12 +252,17 @@ LPLUT LCMSEXPORT cmsAlloc3DGrid(LPLUT NewLUT, int clutPoints, int inputChan, int
|
||||
NewLUT -> InputChan = inputChan;
|
||||
NewLUT -> OutputChan = outputChan;
|
||||
|
||||
if (!_cmsValidateLUT(NewLUT)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
nTabSize = (NewLUT -> OutputChan * UIpow(NewLUT->cLutPoints,
|
||||
NewLUT->InputChan)
|
||||
* sizeof(WORD));
|
||||
nTabSize = NewLUT -> OutputChan * UIpow(NewLUT->cLutPoints,
|
||||
NewLUT->InputChan);
|
||||
|
||||
NewLUT -> T = (LPWORD) _cmsCalloc(sizeof(WORD), nTabSize);
|
||||
nTabSize *= sizeof(WORD);
|
||||
if (NewLUT -> T == NULL) return NULL;
|
||||
|
||||
NewLUT -> T = (LPWORD) malloc(nTabSize);
|
||||
ZeroMemory(NewLUT -> T, nTabSize);
|
||||
NewLUT ->Tsize = nTabSize;
|
||||
|
||||
@ -254,7 +291,9 @@ LPLUT LCMSEXPORT cmsAllocLinearTable(LPLUT NewLUT, LPGAMMATABLE Tables[], int nT
|
||||
|
||||
for (i=0; i < NewLUT -> InputChan; i++) {
|
||||
|
||||
PtrW = (LPWORD) malloc(sizeof(WORD) * NewLUT -> InputEntries);
|
||||
PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * NewLUT -> InputEntries);
|
||||
if (PtrW == NULL) return NULL;
|
||||
|
||||
NewLUT -> L1[i] = PtrW;
|
||||
CopyMemory(PtrW, Tables[i]->GammaTable, sizeof(WORD) * NewLUT -> InputEntries);
|
||||
CopyMemory(&NewLUT -> LCurvesSeed[0][i], &Tables[i] -> Seed, sizeof(LCMSGAMMAPARAMS));
|
||||
@ -268,7 +307,9 @@ LPLUT LCMSEXPORT cmsAllocLinearTable(LPLUT NewLUT, LPGAMMATABLE Tables[], int nT
|
||||
NewLUT -> OutputEntries = Tables[0] -> nEntries;
|
||||
for (i=0; i < NewLUT -> OutputChan; i++) {
|
||||
|
||||
PtrW = (LPWORD) malloc(sizeof(WORD) * NewLUT -> OutputEntries);
|
||||
PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * NewLUT -> OutputEntries);
|
||||
if (PtrW == NULL) return NULL;
|
||||
|
||||
NewLUT -> L2[i] = PtrW;
|
||||
CopyMemory(PtrW, Tables[i]->GammaTable, sizeof(WORD) * NewLUT -> OutputEntries);
|
||||
CopyMemory(&NewLUT -> LCurvesSeed[1][i], &Tables[i] -> Seed, sizeof(LCMSGAMMAPARAMS));
|
||||
@ -285,7 +326,9 @@ LPLUT LCMSEXPORT cmsAllocLinearTable(LPLUT NewLUT, LPGAMMATABLE Tables[], int nT
|
||||
|
||||
for (i=0; i < NewLUT -> InputChan; i++) {
|
||||
|
||||
PtrW = (LPWORD) malloc(sizeof(WORD) * NewLUT -> L3Entries);
|
||||
PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * NewLUT -> L3Entries);
|
||||
if (PtrW == NULL) return NULL;
|
||||
|
||||
NewLUT -> L3[i] = PtrW;
|
||||
CopyMemory(PtrW, Tables[i]->GammaTable, sizeof(WORD) * NewLUT -> L3Entries);
|
||||
CopyMemory(&NewLUT -> LCurvesSeed[2][i], &Tables[i] -> Seed, sizeof(LCMSGAMMAPARAMS));
|
||||
@ -298,7 +341,9 @@ LPLUT LCMSEXPORT cmsAllocLinearTable(LPLUT NewLUT, LPGAMMATABLE Tables[], int nT
|
||||
NewLUT -> L4Entries = Tables[0] -> nEntries;
|
||||
for (i=0; i < NewLUT -> OutputChan; i++) {
|
||||
|
||||
PtrW = (LPWORD) malloc(sizeof(WORD) * NewLUT -> L4Entries);
|
||||
PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * NewLUT -> L4Entries);
|
||||
if (PtrW == NULL) return NULL;
|
||||
|
||||
NewLUT -> L4[i] = PtrW;
|
||||
CopyMemory(PtrW, Tables[i]->GammaTable, sizeof(WORD) * NewLUT -> L4Entries);
|
||||
CopyMemory(&NewLUT -> LCurvesSeed[3][i], &Tables[i] -> Seed, sizeof(LCMSGAMMAPARAMS));
|
||||
@ -580,7 +625,7 @@ LPLUT _cmsBlessLUT8(LPLUT Lut)
|
||||
LPL16PARAMS p = &Lut ->CLut16params;
|
||||
|
||||
|
||||
p8 = (LPL8PARAMS) malloc(sizeof(L8PARAMS));
|
||||
p8 = (LPL8PARAMS) _cmsMalloc(sizeof(L8PARAMS));
|
||||
if (p8 == NULL) return NULL;
|
||||
|
||||
// values comes * 257, so we can safely take first byte (x << 8 + x)
|
||||
@ -593,8 +638,8 @@ LPLUT _cmsBlessLUT8(LPLUT Lut)
|
||||
if (Lut ->wFlags & LUT_HASTL1) {
|
||||
|
||||
for (j=0; j < 3; j++)
|
||||
StageABC[i] = cmsLinearInterpLUT16(StageABC[i],
|
||||
Lut -> L1[i],
|
||||
StageABC[j] = cmsLinearInterpLUT16(StageABC[j],
|
||||
Lut -> L1[j],
|
||||
&Lut -> In16params);
|
||||
Lut ->wFlags &= ~LUT_HASTL1;
|
||||
}
|
||||
@ -822,3 +867,6 @@ LCMSAPI double LCMSEXPORT cmsEvalLUTreverse(LPLUT Lut, WORD Target[], WORD Resul
|
||||
return LastError;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -29,7 +29,7 @@
|
||||
//
|
||||
//
|
||||
// Little cms
|
||||
// Copyright (C) 1998-2006 Marti Maria
|
||||
// Copyright (C) 1998-2007 Marti Maria
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the "Software"),
|
||||
@ -62,6 +62,7 @@
|
||||
// data yet in fixed point, so no additional process is required.
|
||||
// Then, we obtain data on 15.16, so we need to shift >> by 1 to
|
||||
// obtain 1.15 PCS format.
|
||||
|
||||
// On OUTPUT profiles, things are inverse, we must first expand 1 bit
|
||||
// by shifting left, and then convert result between 0 and 1.000 to
|
||||
// RGB, so FromFixedDomain() must be called before pass values to
|
||||
@ -71,6 +72,7 @@
|
||||
// input is encoded from 0 to 0xffff, we must first use the shaper and
|
||||
// then the matrix, an additional FromFixedDomain() must be used to
|
||||
// accomodate output values.
|
||||
|
||||
// For a sake of simplicity, I will handle this three behaviours
|
||||
// with different routines, so the flags MATSHAPER_INPUT and MATSHAPER_OUTPUT
|
||||
// can be conbined to signal smelted matrix-shapers
|
||||
@ -89,7 +91,7 @@ int ComputeTables(LPGAMMATABLE Table[3], LPWORD Out[3], LPL16PARAMS p16)
|
||||
{
|
||||
LPWORD PtrW;
|
||||
|
||||
PtrW = (LPWORD) malloc(sizeof(WORD) * p16 -> nSamples);
|
||||
PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * p16 -> nSamples);
|
||||
|
||||
if (PtrW == NULL) return -1; // Signal error
|
||||
|
||||
@ -119,7 +121,7 @@ LPMATSHAPER cmsAllocMatShaper2(LPMAT3 Matrix, LPGAMMATABLE In[], LPGAMMATABLE Ou
|
||||
LPMATSHAPER NewMatShaper;
|
||||
int rc;
|
||||
|
||||
NewMatShaper = (LPMATSHAPER) malloc(sizeof(MATSHAPER));
|
||||
NewMatShaper = (LPMATSHAPER) _cmsMalloc(sizeof(MATSHAPER));
|
||||
if (NewMatShaper)
|
||||
ZeroMemory(NewMatShaper, sizeof(MATSHAPER));
|
||||
|
||||
@ -171,7 +173,13 @@ LPMATSHAPER cmsAllocMatShaper(LPMAT3 Matrix, LPGAMMATABLE Tables[], DWORD Behavi
|
||||
LPMATSHAPER NewMatShaper;
|
||||
int i, AllLinear;
|
||||
|
||||
NewMatShaper = (LPMATSHAPER) malloc(sizeof(MATSHAPER));
|
||||
if (Matrix == NULL) return NULL;
|
||||
for (i=0; i < 3; i++) {
|
||||
|
||||
if (Tables[i] == NULL) return NULL;
|
||||
}
|
||||
|
||||
NewMatShaper = (LPMATSHAPER) _cmsMalloc(sizeof(MATSHAPER));
|
||||
if (NewMatShaper)
|
||||
ZeroMemory(NewMatShaper, sizeof(MATSHAPER));
|
||||
|
||||
@ -187,17 +195,16 @@ LPMATSHAPER cmsAllocMatShaper(LPMAT3 Matrix, LPGAMMATABLE Tables[], DWORD Behavi
|
||||
NewMatShaper -> dwFlags |= MATSHAPER_HASMATRIX;
|
||||
|
||||
// Now, on the table characteristics
|
||||
|
||||
cmsCalcL16Params(Tables[0] -> nEntries, &NewMatShaper -> p16);
|
||||
|
||||
// Copy tables
|
||||
|
||||
AllLinear = 0;
|
||||
for (i=0; i < 3; i++)
|
||||
{
|
||||
for (i=0; i < 3; i++) {
|
||||
|
||||
LPWORD PtrW;
|
||||
|
||||
PtrW = (LPWORD) malloc(sizeof(WORD) * NewMatShaper -> p16.nSamples);
|
||||
PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * NewMatShaper -> p16.nSamples);
|
||||
|
||||
if (PtrW == NULL) {
|
||||
cmsFreeMatShaper(NewMatShaper);
|
||||
@ -235,11 +242,11 @@ void cmsFreeMatShaper(LPMATSHAPER MatShaper)
|
||||
|
||||
for (i=0; i < 3; i++)
|
||||
{
|
||||
if (MatShaper -> L[i]) free(MatShaper ->L[i]);
|
||||
if (MatShaper -> L2[i]) free(MatShaper ->L2[i]);
|
||||
if (MatShaper -> L[i]) _cmsFree(MatShaper ->L[i]);
|
||||
if (MatShaper -> L2[i]) _cmsFree(MatShaper ->L2[i]);
|
||||
}
|
||||
|
||||
free(MatShaper);
|
||||
_cmsFree(MatShaper);
|
||||
}
|
||||
|
||||
|
||||
|
@ -29,7 +29,7 @@
|
||||
//
|
||||
//
|
||||
// Little cms
|
||||
// Copyright (C) 1998-2006 Marti Maria
|
||||
// Copyright (C) 1998-2007 Marti Maria
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the "Software"),
|
||||
@ -74,7 +74,7 @@ double cdecl VEC3distance(LPVEC3 a, LPVEC3 b);
|
||||
void cdecl MAT3identity(LPMAT3 a);
|
||||
void cdecl MAT3per(LPMAT3 r, LPMAT3 a, LPMAT3 b);
|
||||
int cdecl MAT3inverse(LPMAT3 a, LPMAT3 b);
|
||||
BOOL cdecl MAT3solve(LPVEC3 x, LPMAT3 a, LPVEC3 b);
|
||||
LCMSBOOL cdecl MAT3solve(LPVEC3 x, LPMAT3 a, LPVEC3 b);
|
||||
double cdecl MAT3det(LPMAT3 m);
|
||||
void cdecl MAT3eval(LPVEC3 r, LPMAT3 a, LPVEC3 v);
|
||||
void cdecl MAT3toFix(LPWMAT3 r, LPMAT3 v);
|
||||
@ -345,13 +345,13 @@ void VEC3minus(LPVEC3 r, LPVEC3 a, LPVEC3 b)
|
||||
// Check id two vectors are the same, allowing tolerance
|
||||
|
||||
static
|
||||
BOOL RangeCheck(double l, double h, double v)
|
||||
LCMSBOOL RangeCheck(double l, double h, double v)
|
||||
{
|
||||
return (v >= l && v <= h);
|
||||
}
|
||||
|
||||
|
||||
BOOL VEC3equal(LPWVEC3 a, LPWVEC3 b, double Tolerance)
|
||||
LCMSBOOL VEC3equal(LPWVEC3 a, LPWVEC3 b, double Tolerance)
|
||||
{
|
||||
int i;
|
||||
double c;
|
||||
@ -367,7 +367,7 @@ BOOL VEC3equal(LPWVEC3 a, LPWVEC3 b, double Tolerance)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL VEC3equalF(LPVEC3 a, LPVEC3 b, double Tolerance)
|
||||
LCMSBOOL VEC3equalF(LPVEC3 a, LPVEC3 b, double Tolerance)
|
||||
{
|
||||
int i;
|
||||
double c;
|
||||
@ -462,7 +462,7 @@ void MAT3identity(LPMAT3 a)
|
||||
|
||||
// Check if matrix is Identity. Allow a tolerance as %
|
||||
|
||||
BOOL MAT3isIdentity(LPWMAT3 a, double Tolerance)
|
||||
LCMSBOOL MAT3isIdentity(LPWMAT3 a, double Tolerance)
|
||||
{
|
||||
int i;
|
||||
MAT3 Idd;
|
||||
@ -545,7 +545,7 @@ int MAT3inverse(LPMAT3 a, LPMAT3 b)
|
||||
|
||||
// Solve a system in the form Ax = b
|
||||
|
||||
BOOL MAT3solve(LPVEC3 x, LPMAT3 a, LPVEC3 b)
|
||||
LCMSBOOL MAT3solve(LPVEC3 x, LPMAT3 a, LPVEC3 b)
|
||||
{
|
||||
MAT3 m, a_1;
|
||||
|
||||
@ -839,3 +839,7 @@ void MAT3scaleAndCut(LPWMAT3 r, LPMAT3 v, double d)
|
||||
VEC3scaleAndCut(&r -> v[1], &v -> v[1], d);
|
||||
VEC3scaleAndCut(&r -> v[2], &v -> v[2], d);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -29,7 +29,7 @@
|
||||
//
|
||||
//
|
||||
// Little cms
|
||||
// Copyright (C) 1998-2006 Marti Maria
|
||||
// Copyright (C) 1998-2007 Marti Maria
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the "Software"),
|
||||
@ -74,7 +74,7 @@ LPcmsNAMEDCOLORLIST GrowNamedColorList(LPcmsNAMEDCOLORLIST v, int ByElements)
|
||||
NewElements *= 2;
|
||||
|
||||
size = sizeof(cmsNAMEDCOLORLIST) + (sizeof(cmsNAMEDCOLOR) * NewElements);
|
||||
TheNewList = (LPcmsNAMEDCOLORLIST) malloc(size);
|
||||
TheNewList = (LPcmsNAMEDCOLORLIST) _cmsMalloc(size);
|
||||
|
||||
|
||||
if (TheNewList == NULL) {
|
||||
@ -86,7 +86,7 @@ LPcmsNAMEDCOLORLIST GrowNamedColorList(LPcmsNAMEDCOLORLIST v, int ByElements)
|
||||
CopyMemory(TheNewList, v, sizeof(cmsNAMEDCOLORLIST) + (v ->nColors - 1) * sizeof(cmsNAMEDCOLOR));
|
||||
TheNewList -> Allocated = NewElements;
|
||||
|
||||
free(v);
|
||||
_cmsFree(v);
|
||||
return TheNewList;
|
||||
}
|
||||
}
|
||||
@ -99,7 +99,7 @@ LPcmsNAMEDCOLORLIST cmsAllocNamedColorList(int n)
|
||||
{
|
||||
size_t size = sizeof(cmsNAMEDCOLORLIST) + (n - 1) * sizeof(cmsNAMEDCOLOR);
|
||||
|
||||
LPcmsNAMEDCOLORLIST v = (LPcmsNAMEDCOLORLIST) malloc(size);
|
||||
LPcmsNAMEDCOLORLIST v = (LPcmsNAMEDCOLORLIST) _cmsMalloc(size);
|
||||
|
||||
|
||||
if (v == NULL) {
|
||||
@ -124,10 +124,10 @@ void cmsFreeNamedColorList(LPcmsNAMEDCOLORLIST v)
|
||||
return;
|
||||
}
|
||||
|
||||
free(v);
|
||||
_cmsFree(v);
|
||||
}
|
||||
|
||||
BOOL cmsAppendNamedColor(cmsHTRANSFORM xform, const char* Name, WORD PCS[3], WORD Colorant[MAXCHANNELS])
|
||||
LCMSBOOL cmsAppendNamedColor(cmsHTRANSFORM xform, const char* Name, WORD PCS[3], WORD Colorant[MAXCHANNELS])
|
||||
{
|
||||
_LPcmsTRANSFORM v = (_LPcmsTRANSFORM) xform;
|
||||
LPcmsNAMEDCOLORLIST List;
|
||||
@ -146,6 +146,7 @@ BOOL cmsAppendNamedColor(cmsHTRANSFORM xform, const char* Name, WORD PCS[3], WOR
|
||||
List ->List[List ->nColors].PCS[i] = PCS[i];
|
||||
|
||||
strncpy(List ->List[List ->nColors].Name, Name, MAX_PATH-1);
|
||||
List ->List[List ->nColors].Name[MAX_PATH-1] = 0;
|
||||
|
||||
List ->nColors++;
|
||||
return TRUE;
|
||||
@ -164,18 +165,17 @@ int LCMSEXPORT cmsNamedColorCount(cmsHTRANSFORM xform)
|
||||
}
|
||||
|
||||
|
||||
BOOL LCMSEXPORT cmsNamedColorInfo(cmsHTRANSFORM xform, int nColor, char* Name, char* Prefix, char* Suffix)
|
||||
LCMSBOOL LCMSEXPORT cmsNamedColorInfo(cmsHTRANSFORM xform, int nColor, char* Name, char* Prefix, char* Suffix)
|
||||
{
|
||||
_LPcmsTRANSFORM v = (_LPcmsTRANSFORM) xform;
|
||||
|
||||
|
||||
if (v ->NamedColorList == NULL) return FALSE;
|
||||
|
||||
if (nColor < 0 || nColor >= cmsNamedColorCount(xform)) return FALSE;
|
||||
|
||||
if (Name) strncpy(Name, v ->NamedColorList->List[nColor].Name, 31);
|
||||
if (Prefix) strncpy(Prefix, v ->NamedColorList->Prefix, 31);
|
||||
if (Suffix) strncpy(Suffix, v ->NamedColorList->Suffix, 31);
|
||||
if (Name) { strncpy(Name, v ->NamedColorList->List[nColor].Name, 31); Name[31] = 0; }
|
||||
if (Prefix) { strncpy(Prefix, v ->NamedColorList->Prefix, 31); Prefix[31] = 0; }
|
||||
if (Suffix) { strncpy(Suffix, v ->NamedColorList->Suffix, 31); Suffix[31] = 0; }
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@ -196,3 +196,5 @@ int LCMSEXPORT cmsNamedColorIndex(cmsHTRANSFORM xform, const char* Name)
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
|
@ -28,7 +28,7 @@
|
||||
// file:
|
||||
//
|
||||
// Little cms
|
||||
// Copyright (C) 1998-2006 Marti Maria
|
||||
// Copyright (C) 1998-2007 Marti Maria
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the "Software"),
|
||||
@ -639,9 +639,81 @@ LPBYTE UnrollDouble(register _LPcmsTRANSFORM info, register WORD wIn[], register
|
||||
|
||||
|
||||
|
||||
static
|
||||
LPBYTE UnrollDouble1Chan(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
|
||||
{
|
||||
double* Inks = (double*) accum;
|
||||
double v;
|
||||
|
||||
|
||||
v = floor(Inks[0] * 65535.0 + 0.5);
|
||||
|
||||
if (v > 65535.0) v = 65535.0;
|
||||
if (v < 0) v = 0;
|
||||
|
||||
|
||||
wIn[0] = wIn[1] = wIn[2] = (WORD) v;
|
||||
|
||||
return accum + sizeof(double);
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------------------------- Packing routines
|
||||
|
||||
|
||||
// Generic N-bytes plus dither 16-to-8 conversion. Currently is just a quick hack
|
||||
|
||||
static int err[MAXCHANNELS];
|
||||
|
||||
static
|
||||
LPBYTE PackNBytesDither(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
|
||||
{
|
||||
int nChan = T_CHANNELS(info -> OutputFormat);
|
||||
register int i;
|
||||
unsigned int n, pe, pf;
|
||||
|
||||
for (i=0; i < nChan; i++) {
|
||||
|
||||
n = wOut[i] + err[i]; // Value
|
||||
|
||||
pe = (n / 257); // Whole part
|
||||
pf = (n % 257); // Fractional part
|
||||
|
||||
err[i] = pf; // Store it for next pixel
|
||||
|
||||
*output++ = (BYTE) pe;
|
||||
}
|
||||
|
||||
return output + T_EXTRA(info ->OutputFormat);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static
|
||||
LPBYTE PackNBytesSwapDither(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
|
||||
{
|
||||
int nChan = T_CHANNELS(info -> OutputFormat);
|
||||
register int i;
|
||||
unsigned int n, pe, pf;
|
||||
|
||||
for (i=nChan-1; i >= 0; --i) {
|
||||
|
||||
n = wOut[i] + err[i]; // Value
|
||||
|
||||
pe = (n / 257); // Whole part
|
||||
pf = (n % 257); // Fractional part
|
||||
|
||||
err[i] = pf; // Store it for next pixel
|
||||
|
||||
*output++ = (BYTE) pe;
|
||||
}
|
||||
|
||||
|
||||
return output + T_EXTRA(info ->OutputFormat);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Generic chunky for byte
|
||||
|
||||
static
|
||||
@ -1486,6 +1558,9 @@ _cmsFIXFN _cmsIdentifyInputFormat(_LPcmsTRANSFORM xform, DWORD dwInput)
|
||||
case PT_HSV:
|
||||
case PT_HLS:
|
||||
case PT_Yxy:
|
||||
if (T_CHANNELS(dwInput) == 1)
|
||||
FromInput = UnrollDouble1Chan;
|
||||
else
|
||||
FromInput = UnrollDouble;
|
||||
break;
|
||||
|
||||
@ -1749,6 +1824,9 @@ _cmsFIXFN _cmsIdentifyOutputFormat(_LPcmsTRANSFORM xform, DWORD dwOutput)
|
||||
switch (T_CHANNELS(dwOutput))
|
||||
{
|
||||
case 1:
|
||||
if (T_DITHER(dwOutput))
|
||||
ToOutput = PackNBytesDither;
|
||||
else
|
||||
ToOutput = Pack1Byte;
|
||||
if (T_EXTRA(dwOutput) == 1) {
|
||||
if (T_SWAPFIRST(dwOutput))
|
||||
@ -1766,8 +1844,12 @@ _cmsFIXFN _cmsIdentifyOutputFormat(_LPcmsTRANSFORM xform, DWORD dwOutput)
|
||||
else
|
||||
if (T_COLORSPACE(dwOutput) == PT_Lab)
|
||||
ToOutput = Pack3BytesLab;
|
||||
else {
|
||||
if (T_DITHER(dwOutput))
|
||||
ToOutput = PackNBytesDither;
|
||||
else
|
||||
ToOutput = Pack3Bytes;
|
||||
}
|
||||
break;
|
||||
|
||||
case 1: // TODO: ALab8 should be handled here
|
||||
@ -1793,12 +1875,22 @@ _cmsFIXFN _cmsIdentifyOutputFormat(_LPcmsTRANSFORM xform, DWORD dwOutput)
|
||||
|
||||
case 4: if (T_EXTRA(dwOutput) == 0) {
|
||||
|
||||
|
||||
if (T_DOSWAP(dwOutput)) {
|
||||
|
||||
if (T_SWAPFIRST(dwOutput))
|
||||
|
||||
if (T_SWAPFIRST(dwOutput)) {
|
||||
ToOutput = Pack4BytesSwapSwapFirst;
|
||||
else
|
||||
}
|
||||
else {
|
||||
|
||||
if (T_DITHER(dwOutput)) {
|
||||
ToOutput = PackNBytesSwapDither;
|
||||
}
|
||||
else {
|
||||
ToOutput = Pack4BytesSwap;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (T_SWAPFIRST(dwOutput))
|
||||
@ -1807,11 +1899,15 @@ _cmsFIXFN _cmsIdentifyOutputFormat(_LPcmsTRANSFORM xform, DWORD dwOutput)
|
||||
|
||||
if (T_FLAVOR(dwOutput))
|
||||
ToOutput = Pack4BytesReverse;
|
||||
else {
|
||||
if (T_DITHER(dwOutput))
|
||||
ToOutput = PackNBytesDither;
|
||||
else
|
||||
ToOutput = Pack4Bytes;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (!T_DOSWAP(dwOutput) && !T_SWAPFIRST(dwOutput))
|
||||
ToOutput = PackNBytes;
|
||||
@ -1849,9 +1945,14 @@ _cmsFIXFN _cmsIdentifyOutputFormat(_LPcmsTRANSFORM xform, DWORD dwOutput)
|
||||
{
|
||||
if (T_DOSWAP(dwOutput))
|
||||
ToOutput = PackNBytesSwap;
|
||||
else {
|
||||
|
||||
if (T_DITHER(dwOutput))
|
||||
ToOutput = PackNBytesDither;
|
||||
else
|
||||
ToOutput = PackNBytes;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:;
|
||||
|
@ -29,7 +29,7 @@
|
||||
//
|
||||
//
|
||||
// Little cms
|
||||
// Copyright (C) 1998-2006 Marti Maria
|
||||
// Copyright (C) 1998-2007 Marti Maria
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the "Software"),
|
||||
@ -624,3 +624,7 @@ void LCMSEXPORT cmsXYZEncoded2Float(LPcmsCIEXYZ fXYZ, const WORD XYZ[3])
|
||||
fXYZ -> Z = XYZ2float(XYZ[2]);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -29,7 +29,7 @@
|
||||
//
|
||||
//
|
||||
// Little cms
|
||||
// Copyright (C) 1998-2006 Marti Maria
|
||||
// Copyright (C) 1998-2007 Marti Maria
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the "Software"),
|
||||
@ -144,6 +144,8 @@ LCMSAPI DWORD LCMSEXPORT cmsGetPostScriptCRDEx(cmsHPROFILE hProfile, int Intent,
|
||||
/Table [ p p p [<...>]]
|
||||
/RangeABC [ 0 1 0 1 0 1]
|
||||
/DecodeABC[ <postlinearization> ]
|
||||
/RangeLMN [ -0.236 1.254 0 1 -0.635 1.640 ]
|
||||
% -128/500 1+127/500 0 1 -127/200 1+128/200
|
||||
/MatrixABC [ 1 1 1 1 0 0 0 0 -1]
|
||||
/WhitePoint [D50]
|
||||
/BlackPoint [BP]
|
||||
@ -347,7 +349,8 @@ typedef struct {
|
||||
static
|
||||
LPMEMSTREAM CreateMemStream(LPBYTE Buffer, DWORD dwMax, int MaxCols)
|
||||
{
|
||||
LPMEMSTREAM m = (LPMEMSTREAM) malloc(sizeof(MEMSTREAM));
|
||||
LPMEMSTREAM m = (LPMEMSTREAM) _cmsMalloc(sizeof(MEMSTREAM));
|
||||
if (m == NULL) return NULL;
|
||||
|
||||
ZeroMemory(m, sizeof(MEMSTREAM));
|
||||
|
||||
@ -387,7 +390,6 @@ BYTE L2Byte(WORD w)
|
||||
static
|
||||
void WriteRawByte(LPMEMSTREAM m, BYTE b)
|
||||
{
|
||||
|
||||
if (m -> dwUsed + 1 > m -> dwMax) {
|
||||
m -> HasError = 1;
|
||||
}
|
||||
@ -422,7 +424,7 @@ void WriteByte(LPMEMSTREAM m, BYTE b)
|
||||
|
||||
}
|
||||
|
||||
// Does write a formatted string
|
||||
// Does write a formatted string. Guaranteed to be 2048 bytes at most.
|
||||
static
|
||||
void Writef(LPMEMSTREAM m, const char *frm, ...)
|
||||
{
|
||||
@ -432,7 +434,7 @@ void Writef(LPMEMSTREAM m, const char *frm, ...)
|
||||
|
||||
va_start(args, frm);
|
||||
|
||||
vsprintf((char*) Buffer, frm, args);
|
||||
vsnprintf((char*) Buffer, 2048, frm, args);
|
||||
|
||||
for (pt = Buffer; *pt; pt++) {
|
||||
|
||||
@ -562,7 +564,7 @@ void EmitLab2XYZ(LPMEMSTREAM m)
|
||||
Writef(m, "{255 mul 128 sub 200 div } bind\n");
|
||||
Writef(m, "]\n");
|
||||
Writef(m, "/MatrixABC [ 1 1 1 1 0 0 0 0 -1]\n");
|
||||
Writef(m, "/RangeLMN [ 0.0 0.9642 0.0 1.0000 0.0 0.8249 ]\n");
|
||||
Writef(m, "/RangeLMN [ -0.236 1.254 0 1 -0.635 1.640 ]\n");
|
||||
Writef(m, "/DecodeLMN [\n");
|
||||
Writef(m, "{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.964200 mul} bind\n");
|
||||
Writef(m, "{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse } bind\n");
|
||||
@ -584,7 +586,11 @@ void Emit1Gamma(LPMEMSTREAM m, LPWORD Table, int nEntries)
|
||||
if (nEntries <= 0) return; // Empty table
|
||||
|
||||
// Suppress whole if identity
|
||||
if (cmsIsLinear(Table, nEntries)) return;
|
||||
if (cmsIsLinear(Table, nEntries)) {
|
||||
Writef(m, "{} ");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Check if is really an exponential. If so, emit "exp"
|
||||
gamma = cmsEstimateGammaEx(Table, nEntries, 0.001);
|
||||
@ -646,7 +652,7 @@ void Emit1Gamma(LPMEMSTREAM m, LPWORD Table, int nEntries)
|
||||
// Compare gamma table
|
||||
|
||||
static
|
||||
BOOL GammaTableEquals(LPWORD g1, LPWORD g2, int nEntries)
|
||||
LCMSBOOL GammaTableEquals(LPWORD g1, LPWORD g2, int nEntries)
|
||||
{
|
||||
return memcmp(g1, g2, nEntries* sizeof(WORD)) == 0;
|
||||
}
|
||||
@ -676,7 +682,7 @@ void EmitNGamma(LPMEMSTREAM m, int n, LPWORD g[], int nEntries)
|
||||
// Check whatever a profile has CLUT tables (only on input)
|
||||
|
||||
static
|
||||
BOOL IsLUTbased(cmsHPROFILE hProfile, int Intent)
|
||||
LCMSBOOL IsLUTbased(cmsHPROFILE hProfile, int Intent)
|
||||
{
|
||||
icTagSignature Tag;
|
||||
|
||||
@ -718,10 +724,10 @@ int OutputValueSampler(register WORD In[], register WORD Out[], register LPVOID
|
||||
|
||||
if (sc -> FixWhite) {
|
||||
|
||||
if (In[0] == 0xFFFF) { // Only in L* = 100
|
||||
if (In[0] == 0xFFFF) { // Only in L* = 100, ab = [-8..8]
|
||||
|
||||
if ((In[1] >= 0x8000 && In[1] <= 0x87FF) ||
|
||||
(In[2] >= 0x8000 && In[2] <= 0x87FF)) {
|
||||
if ((In[1] >= 0x7800 && In[1] <= 0x8800) &&
|
||||
(In[2] >= 0x7800 && In[2] <= 0x8800)) {
|
||||
|
||||
WORD* Black;
|
||||
WORD* White;
|
||||
@ -830,7 +836,7 @@ void WriteCLUT(LPMEMSTREAM m, LPLUT Lut, int bps, const char* PreMaj,
|
||||
sc.PostMaj= PostMaj;
|
||||
|
||||
sc.PreMin = PreMin;
|
||||
sc.PostMin= PostMin;
|
||||
sc.PostMin = PostMin;
|
||||
sc.lIsInput = lIsInput;
|
||||
sc.FixWhite = FixWhite;
|
||||
sc.ColorSpace = ColorSpace;
|
||||
@ -1231,7 +1237,7 @@ DWORD LCMSEXPORT cmsGetPostScriptCSA(cmsHPROFILE hProfile,
|
||||
|
||||
if (!WriteNamedColorCSA(mem, hProfile, Intent)) {
|
||||
|
||||
free((void*) mem);
|
||||
_cmsFree((void*) mem);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -1246,7 +1252,7 @@ DWORD LCMSEXPORT cmsGetPostScriptCSA(cmsHPROFILE hProfile,
|
||||
ColorSpace != icSigLabData) {
|
||||
|
||||
cmsSignalError(LCMS_ERRC_ABORTED, "Invalid output color space");
|
||||
free((void*) mem);
|
||||
_cmsFree((void*) mem);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1256,7 +1262,7 @@ DWORD LCMSEXPORT cmsGetPostScriptCSA(cmsHPROFILE hProfile,
|
||||
// Yes, so handle as LUT-based
|
||||
if (!WriteInputLUT(mem, hProfile, Intent)) {
|
||||
|
||||
free((void*) mem);
|
||||
_cmsFree((void*) mem);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -1266,7 +1272,7 @@ DWORD LCMSEXPORT cmsGetPostScriptCSA(cmsHPROFILE hProfile,
|
||||
|
||||
if (!WriteInputMatrixShaper(mem, hProfile)) {
|
||||
|
||||
free((void*) mem); // Something went wrong
|
||||
_cmsFree((void*) mem); // Something went wrong
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -1277,7 +1283,7 @@ DWORD LCMSEXPORT cmsGetPostScriptCSA(cmsHPROFILE hProfile,
|
||||
dwBytesUsed = mem ->dwUsed;
|
||||
|
||||
// Get rid of memory stream
|
||||
free((void*) mem);
|
||||
_cmsFree((void*) mem);
|
||||
|
||||
// Finally, return used byte count
|
||||
return dwBytesUsed;
|
||||
@ -1350,27 +1356,40 @@ DWORD LCMSEXPORT cmsGetPostScriptCSA(cmsHPROFILE hProfile,
|
||||
|
||||
|
||||
static
|
||||
void EmitPQRStage(LPMEMSTREAM m, int DoBPC, int lIsAbsolute)
|
||||
void EmitPQRStage(LPMEMSTREAM m, cmsHPROFILE hProfile, int DoBPC, int lIsAbsolute)
|
||||
{
|
||||
|
||||
|
||||
if (lIsAbsolute) {
|
||||
|
||||
// For absolute colorimetric intent, encode back to relative
|
||||
// and generate a relative LUT
|
||||
|
||||
// Relative encoding is obtained across XYZpcs*(D50/WhitePoint)
|
||||
|
||||
cmsCIEXYZ White;
|
||||
|
||||
cmsTakeMediaWhitePoint(&White, hProfile);
|
||||
|
||||
Writef(m,"/MatrixPQR [1 0 0 0 1 0 0 0 1 ]\n");
|
||||
Writef(m,"/RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]\n");
|
||||
|
||||
Writef(m, "%% Absolute colorimetric -- encode to relative to maximize LUT usage\n"
|
||||
"/TransformPQR [\n"
|
||||
"{0.9642 mul %g div exch pop exch pop exch pop exch pop} bind\n"
|
||||
"{1.0000 mul %g div exch pop exch pop exch pop exch pop} bind\n"
|
||||
"{0.8249 mul %g div exch pop exch pop exch pop exch pop} bind\n]\n",
|
||||
White.X, White.Y, White.Z);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Writef(m,"%% Bradford Cone Space\n"
|
||||
"/MatrixPQR [0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296 ] \n");
|
||||
|
||||
Writef(m, "/RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]\n");
|
||||
|
||||
|
||||
if (lIsAbsolute) {
|
||||
|
||||
// For absolute colorimetric intent, do nothing
|
||||
|
||||
Writef(m, "%% Absolute colorimetric -- no transformation\n"
|
||||
"/TransformPQR [\n"
|
||||
"{exch pop exch pop exch pop exch pop} bind dup dup]\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// No BPC
|
||||
|
||||
if (!DoBPC) {
|
||||
@ -1414,6 +1433,7 @@ void EmitPQRStage(LPMEMSTREAM m, int DoBPC, int lIsAbsolute)
|
||||
static
|
||||
void EmitXYZ2Lab(LPMEMSTREAM m)
|
||||
{
|
||||
Writef(m, "/RangeLMN [ -0.635 2.0 0 2 -0.635 2.0 ]\n");
|
||||
Writef(m, "/EncodeLMN [\n");
|
||||
Writef(m, "{ 0.964200 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n");
|
||||
Writef(m, "{ 1.000000 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n");
|
||||
@ -1423,18 +1443,11 @@ void EmitXYZ2Lab(LPMEMSTREAM m)
|
||||
Writef(m, "/EncodeABC [\n");
|
||||
|
||||
|
||||
|
||||
Writef(m, "{ 116 mul 16 sub 100 div } bind\n");
|
||||
Writef(m, "{ 500 mul 128 add 255 div } bind\n");
|
||||
Writef(m, "{ 200 mul 128 add 255 div } bind\n");
|
||||
Writef(m, "{ 500 mul 128 add 256 div } bind\n");
|
||||
Writef(m, "{ 200 mul 128 add 256 div } bind\n");
|
||||
|
||||
|
||||
/*
|
||||
Writef(m, "{ 116 mul 16 sub 256 mul 25700 div } bind\n");
|
||||
Writef(m, "{ 500 mul 128 add 256 mul 65535 div } bind\n");
|
||||
Writef(m, "{ 200 mul 128 add 256 mul 65535 div } bind\n");
|
||||
*/
|
||||
|
||||
Writef(m, "]\n");
|
||||
|
||||
|
||||
@ -1458,20 +1471,27 @@ int WriteOutputLUT(LPMEMSTREAM m, cmsHPROFILE hProfile, int Intent, DWORD dwFlag
|
||||
LPLUT DeviceLink;
|
||||
cmsHPROFILE Profiles[3];
|
||||
cmsCIEXYZ BlackPointAdaptedToD50;
|
||||
BOOL lFreeDeviceLink = FALSE;
|
||||
BOOL lDoBPC = (dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION);
|
||||
LCMSBOOL lFreeDeviceLink = FALSE;
|
||||
LCMSBOOL lDoBPC = (dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION);
|
||||
LCMSBOOL lFixWhite = !(dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP);
|
||||
int RelativeEncodingIntent;
|
||||
|
||||
|
||||
// Trick our v4 profile as it were v2. This prevents the ajusting done
|
||||
// in perceptual & saturation. We only neew v4 encoding!
|
||||
|
||||
hLab = cmsCreateLab4Profile(NULL);
|
||||
cmsSetProfileICCversion(hLab, 0);
|
||||
hLab = cmsCreateLabProfile(NULL);
|
||||
|
||||
ColorSpace = cmsGetColorSpace(hProfile);
|
||||
nChannels = _cmsChannelsOf(ColorSpace);
|
||||
OutputFormat = CHANNELS_SH(nChannels) | BYTES_SH(2);
|
||||
|
||||
// For absolute colorimetric, the LUT is encoded as relative
|
||||
// in order to preserve precission.
|
||||
|
||||
RelativeEncodingIntent = Intent;
|
||||
if (RelativeEncodingIntent == INTENT_ABSOLUTE_COLORIMETRIC)
|
||||
RelativeEncodingIntent = INTENT_RELATIVE_COLORIMETRIC;
|
||||
|
||||
|
||||
// Is a devicelink profile?
|
||||
if (cmsGetDeviceClass(hProfile) == icSigLinkClass) {
|
||||
|
||||
@ -1479,13 +1499,14 @@ int WriteOutputLUT(LPMEMSTREAM m, cmsHPROFILE hProfile, int Intent, DWORD dwFlag
|
||||
|
||||
if (ColorSpace == icSigLabData) {
|
||||
|
||||
// adjust input to Lab to out v4
|
||||
// adjust input to Lab to our v4
|
||||
|
||||
Profiles[0] = hLab;
|
||||
Profiles[1] = hProfile;
|
||||
|
||||
xform = cmsCreateMultiprofileTransform(Profiles, 2, TYPE_Lab_DBL,
|
||||
OutputFormat, Intent, cmsFLAGS_NOPRELINEARIZATION);
|
||||
OutputFormat, RelativeEncodingIntent,
|
||||
dwFlags|cmsFLAGS_NOWHITEONWHITEFIXUP|cmsFLAGS_NOPRELINEARIZATION);
|
||||
|
||||
}
|
||||
else {
|
||||
@ -1499,7 +1520,7 @@ int WriteOutputLUT(LPMEMSTREAM m, cmsHPROFILE hProfile, int Intent, DWORD dwFlag
|
||||
|
||||
// This is a normal profile
|
||||
xform = cmsCreateTransform(hLab, TYPE_Lab_DBL, hProfile,
|
||||
OutputFormat, Intent, cmsFLAGS_NOPRELINEARIZATION);
|
||||
OutputFormat, RelativeEncodingIntent, dwFlags|cmsFLAGS_NOWHITEONWHITEFIXUP|cmsFLAGS_NOPRELINEARIZATION);
|
||||
}
|
||||
|
||||
if (xform == NULL) {
|
||||
@ -1515,7 +1536,7 @@ int WriteOutputLUT(LPMEMSTREAM m, cmsHPROFILE hProfile, int Intent, DWORD dwFlag
|
||||
|
||||
if (!DeviceLink) {
|
||||
|
||||
DeviceLink = _cmsPrecalculateDeviceLink(xform, 0);
|
||||
DeviceLink = _cmsPrecalculateDeviceLink(xform, cmsFLAGS_NOPRELINEARIZATION);
|
||||
lFreeDeviceLink = TRUE;
|
||||
}
|
||||
|
||||
@ -1527,7 +1548,7 @@ int WriteOutputLUT(LPMEMSTREAM m, cmsHPROFILE hProfile, int Intent, DWORD dwFlag
|
||||
|
||||
// Emit headers, etc.
|
||||
EmitWhiteBlackD50(m, &BlackPointAdaptedToD50);
|
||||
EmitPQRStage(m, lDoBPC, Intent == INTENT_ABSOLUTE_COLORIMETRIC);
|
||||
EmitPQRStage(m, hProfile, lDoBPC, Intent == INTENT_ABSOLUTE_COLORIMETRIC);
|
||||
EmitXYZ2Lab(m);
|
||||
|
||||
if (DeviceLink ->wFlags & LUT_HASTL1) {
|
||||
@ -1544,10 +1565,13 @@ int WriteOutputLUT(LPMEMSTREAM m, cmsHPROFILE hProfile, int Intent, DWORD dwFlag
|
||||
// zero. This would sacrifice a bit of highlights, but failure to do so would cause
|
||||
// scum dot. Ouch.
|
||||
|
||||
if (Intent == INTENT_ABSOLUTE_COLORIMETRIC)
|
||||
lFixWhite = FALSE;
|
||||
|
||||
Writef(m, "/RenderTable ");
|
||||
|
||||
WriteCLUT(m, DeviceLink, 8, "<", ">\n", "", "", FALSE,
|
||||
(Intent != INTENT_ABSOLUTE_COLORIMETRIC), ColorSpace);
|
||||
lFixWhite, ColorSpace);
|
||||
|
||||
Writef(m, " %d {} bind ", nChannels);
|
||||
|
||||
@ -1582,6 +1606,9 @@ void BuildColorantList(char *Colorant, int nColorant, WORD Out[])
|
||||
int j;
|
||||
|
||||
Colorant[0] = 0;
|
||||
if (nColorant > MAXCHANNELS)
|
||||
nColorant = MAXCHANNELS;
|
||||
|
||||
for (j=0; j < nColorant; j++) {
|
||||
|
||||
sprintf(Buff, "%.3f", Out[j] / 65535.0);
|
||||
@ -1677,7 +1704,7 @@ DWORD LCMSEXPORT cmsGetPostScriptCRDEx(cmsHPROFILE hProfile,
|
||||
|
||||
if (!WriteNamedColorCRD(mem, hProfile, Intent, dwFlags)) {
|
||||
|
||||
free((void*) mem);
|
||||
_cmsFree((void*) mem);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -1687,7 +1714,7 @@ DWORD LCMSEXPORT cmsGetPostScriptCRDEx(cmsHPROFILE hProfile,
|
||||
|
||||
|
||||
if (!WriteOutputLUT(mem, hProfile, Intent, dwFlags)) {
|
||||
free((void*) mem);
|
||||
_cmsFree((void*) mem);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -1702,7 +1729,7 @@ DWORD LCMSEXPORT cmsGetPostScriptCRDEx(cmsHPROFILE hProfile,
|
||||
dwBytesUsed = mem ->dwUsed;
|
||||
|
||||
// Get rid of memory stream
|
||||
free((void*) mem);
|
||||
_cmsFree((void*) mem);
|
||||
|
||||
// Finally, return used byte count
|
||||
return dwBytesUsed;
|
||||
|
@ -29,7 +29,7 @@
|
||||
//
|
||||
//
|
||||
// Little cms
|
||||
// Copyright (C) 1998-2006 Marti Maria
|
||||
// Copyright (C) 1998-2007 Marti Maria
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the "Software"),
|
||||
@ -120,7 +120,7 @@ int ComponentOf(int n, int clut, int nColorant)
|
||||
// This routine does a sweep on whole input space, and calls its callback
|
||||
// function on knots. returns TRUE if all ok, FALSE otherwise.
|
||||
|
||||
BOOL LCMSEXPORT cmsSample3DGrid(LPLUT Lut, _cmsSAMPLER Sampler, LPVOID Cargo, DWORD dwFlags)
|
||||
LCMSBOOL LCMSEXPORT cmsSample3DGrid(LPLUT Lut, _cmsSAMPLER Sampler, LPVOID Cargo, DWORD dwFlags)
|
||||
{
|
||||
int i, t, nTotalPoints, Colorant, index;
|
||||
WORD In[MAXCHANNELS], Out[MAXCHANNELS];
|
||||
@ -145,12 +145,16 @@ BOOL LCMSEXPORT cmsSample3DGrid(LPLUT Lut, _cmsSAMPLER Sampler, LPVOID Cargo, DW
|
||||
&Lut -> In16params);
|
||||
}
|
||||
|
||||
|
||||
// if (dwFlags & SAMPLER_INSPECT) {
|
||||
|
||||
for (t=0; t < (int) Lut -> OutputChan; t++)
|
||||
Out[t] = Lut->T[index + t];
|
||||
// }
|
||||
|
||||
if (dwFlags & SAMPLER_HASTL2) {
|
||||
|
||||
for (t=0; t < (int) Lut -> OutputChan; t++)
|
||||
Out[t] = cmsLinearInterpLUT16(Out[t],
|
||||
Lut -> L2[t],
|
||||
&Lut -> Out16params);
|
||||
}
|
||||
|
||||
|
||||
if (!Sampler(In, Out, Cargo))
|
||||
@ -255,9 +259,11 @@ LPLUT _cmsPrecalculateDeviceLink(cmsHTRANSFORM h, DWORD dwFlags)
|
||||
LPLUT Grid;
|
||||
int nGridPoints;
|
||||
DWORD dwFormatIn, dwFormatOut;
|
||||
DWORD SaveFormatIn, SaveFormatOut;
|
||||
int ChannelsIn, ChannelsOut;
|
||||
LPLUT SaveGamutLUT;
|
||||
|
||||
|
||||
// Remove any gamut checking
|
||||
SaveGamutLUT = p ->Gamut;
|
||||
p ->Gamut = NULL;
|
||||
@ -276,6 +282,11 @@ LPLUT _cmsPrecalculateDeviceLink(cmsHTRANSFORM h, DWORD dwFlags)
|
||||
dwFormatIn = (CHANNELS_SH(ChannelsIn)|BYTES_SH(2));
|
||||
dwFormatOut = (CHANNELS_SH(ChannelsOut)|BYTES_SH(2));
|
||||
|
||||
SaveFormatIn = p ->InputFormat;
|
||||
SaveFormatOut = p ->OutputFormat;
|
||||
|
||||
p -> InputFormat = dwFormatIn;
|
||||
p -> OutputFormat = dwFormatOut;
|
||||
p -> FromInput = _cmsIdentifyInputFormat(p, dwFormatIn);
|
||||
p -> ToOutput = _cmsIdentifyOutputFormat(p, dwFormatOut);
|
||||
|
||||
@ -289,7 +300,6 @@ LPLUT _cmsPrecalculateDeviceLink(cmsHTRANSFORM h, DWORD dwFlags)
|
||||
_cmsComputePrelinearizationTablesFromXFORM(hOne, 1, Grid);
|
||||
}
|
||||
|
||||
|
||||
// Attention to this typecast! we can take the luxury to
|
||||
// do this since cmsHTRANSFORM is only an alias to a pointer
|
||||
// to the transform struct.
|
||||
@ -297,11 +307,13 @@ LPLUT _cmsPrecalculateDeviceLink(cmsHTRANSFORM h, DWORD dwFlags)
|
||||
if (!cmsSample3DGrid(Grid, XFormSampler, (LPVOID) p, Grid -> wFlags)) {
|
||||
|
||||
cmsFreeLUT(Grid);
|
||||
return NULL;
|
||||
Grid = NULL;
|
||||
}
|
||||
|
||||
|
||||
p ->Gamut = SaveGamutLUT;
|
||||
p ->InputFormat = SaveFormatIn;
|
||||
p ->OutputFormat = SaveFormatOut;
|
||||
|
||||
return Grid;
|
||||
}
|
||||
|
||||
@ -348,7 +360,7 @@ int BlackPreservingGrayOnlySampler(register WORD In[], register WORD Out[], regi
|
||||
|
||||
|
||||
|
||||
// That is our K-preserving callback.
|
||||
// Preserve all K plane.
|
||||
static
|
||||
int BlackPreservingSampler(register WORD In[], register WORD Out[], register LPVOID Cargo)
|
||||
{
|
||||
@ -469,6 +481,7 @@ int LCMSEXPORT cmsSetCMYKPreservationStrategy(int n)
|
||||
return OldVal;
|
||||
}
|
||||
|
||||
#pragma warning(disable: 4550)
|
||||
|
||||
// Get a pointer to callback on depending of strategy
|
||||
static
|
||||
@ -504,11 +517,10 @@ LPLUT _cmsPrecalculateBlackPreservingDeviceLink(cmsHTRANSFORM hCMYK2CMYK, DWORD
|
||||
if (p -> dwOriginalFlags & cmsFLAGS_BLACKPOINTCOMPENSATION)
|
||||
LocalFlags |= cmsFLAGS_BLACKPOINTCOMPENSATION;
|
||||
|
||||
|
||||
// Fill in cargo struct
|
||||
Cargo.cmyk2cmyk = hCMYK2CMYK;
|
||||
|
||||
// Compute tone curve
|
||||
// Compute tone curve.
|
||||
Cargo.KTone = _cmsBuildKToneCurve(hCMYK2CMYK, 256);
|
||||
if (Cargo.KTone == NULL) return NULL;
|
||||
cmsCalcL16Params(Cargo.KTone ->nEntries, &Cargo.KToneParams);
|
||||
@ -654,7 +666,7 @@ void PatchLUT(LPLUT Grid, WORD At[], WORD Value[],
|
||||
|
||||
|
||||
|
||||
BOOL _cmsFixWhiteMisalignment(_LPcmsTRANSFORM p)
|
||||
LCMSBOOL _cmsFixWhiteMisalignment(_LPcmsTRANSFORM p)
|
||||
{
|
||||
|
||||
WORD *WhitePointIn, *WhitePointOut, *BlackPointIn, *BlackPointOut;
|
||||
@ -682,3 +694,4 @@ BOOL _cmsFixWhiteMisalignment(_LPcmsTRANSFORM p)
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -29,7 +29,7 @@
|
||||
//
|
||||
//
|
||||
// Little cms
|
||||
// Copyright (C) 1998-2006 Marti Maria
|
||||
// Copyright (C) 1998-2007 Marti Maria
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the "Software"),
|
||||
@ -320,7 +320,7 @@ cmsHPROFILE LCMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, DWORD d
|
||||
cmsHPROFILE hICC;
|
||||
_LPcmsTRANSFORM v = (_LPcmsTRANSFORM) hTransform;
|
||||
LPLUT Lut;
|
||||
BOOL MustFreeLUT;
|
||||
LCMSBOOL MustFreeLUT;
|
||||
LPcmsNAMEDCOLORLIST InputColorant = NULL;
|
||||
LPcmsNAMEDCOLORLIST OutputColorant = NULL;
|
||||
|
||||
@ -373,10 +373,8 @@ cmsHPROFILE LCMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, DWORD d
|
||||
|
||||
if (cmsGetDeviceClass(hICC) == icSigOutputClass) {
|
||||
|
||||
|
||||
cmsAddTag(hICC, icSigBToA0Tag, (LPVOID) Lut);
|
||||
}
|
||||
|
||||
else
|
||||
cmsAddTag(hICC, icSigAToB0Tag, (LPVOID) Lut);
|
||||
|
||||
@ -446,6 +444,7 @@ cmsHPROFILE LCMSEXPORT cmsCreateLinearizationDeviceLink(icColorSpaceSignature Co
|
||||
|
||||
// Creates a LUT with prelinearization step only
|
||||
Lut = cmsAllocLUT();
|
||||
if (Lut == NULL) return NULL;
|
||||
|
||||
// Set up channels
|
||||
Lut ->InputChan = Lut ->OutputChan = _cmsChannelsOf(ColorSpace);
|
||||
@ -548,6 +547,10 @@ cmsHPROFILE LCMSEXPORT cmsCreateInkLimitingDeviceLink(icColorSpaceSignature Colo
|
||||
|
||||
// Creates a LUT with 3D grid only
|
||||
Lut = cmsAllocLUT();
|
||||
if (Lut == NULL) {
|
||||
cmsCloseProfile(hICC);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
cmsAlloc3DGrid(Lut, 17, _cmsChannelsOf(ColorSpace),
|
||||
@ -584,8 +587,9 @@ static
|
||||
LPLUT Create3x3EmptyLUT(void)
|
||||
{
|
||||
LPLUT AToB0 = cmsAllocLUT();
|
||||
AToB0 -> InputChan = AToB0 -> OutputChan = 3;
|
||||
if (AToB0 == NULL) return NULL;
|
||||
|
||||
AToB0 -> InputChan = AToB0 -> OutputChan = 3;
|
||||
return AToB0;
|
||||
}
|
||||
|
||||
@ -597,8 +601,8 @@ cmsHPROFILE LCMSEXPORT cmsCreateLabProfile(LPcmsCIExyY WhitePoint)
|
||||
cmsHPROFILE hProfile;
|
||||
LPLUT Lut;
|
||||
|
||||
|
||||
hProfile = cmsCreateRGBProfile(WhitePoint == NULL ? cmsD50_xyY() : WhitePoint, NULL, NULL);
|
||||
if (hProfile == NULL) return NULL;
|
||||
|
||||
cmsSetDeviceClass(hProfile, icSigAbstractClass);
|
||||
cmsSetColorSpace(hProfile, icSigLabData);
|
||||
@ -611,7 +615,10 @@ cmsHPROFILE LCMSEXPORT cmsCreateLabProfile(LPcmsCIExyY WhitePoint)
|
||||
|
||||
// An empty LUTs is all we need
|
||||
Lut = Create3x3EmptyLUT();
|
||||
if (Lut == NULL) return NULL;
|
||||
if (Lut == NULL) {
|
||||
cmsCloseProfile(hProfile);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cmsAddTag(hProfile, icSigAToB0Tag, (LPVOID) Lut);
|
||||
cmsAddTag(hProfile, icSigBToA0Tag, (LPVOID) Lut);
|
||||
@ -628,8 +635,8 @@ cmsHPROFILE LCMSEXPORT cmsCreateLab4Profile(LPcmsCIExyY WhitePoint)
|
||||
cmsHPROFILE hProfile;
|
||||
LPLUT Lut;
|
||||
|
||||
|
||||
hProfile = cmsCreateRGBProfile(WhitePoint == NULL ? cmsD50_xyY() : WhitePoint, NULL, NULL);
|
||||
if (hProfile == NULL) return NULL;
|
||||
|
||||
cmsSetProfileICCversion(hProfile, 0x4000000);
|
||||
|
||||
@ -644,7 +651,10 @@ cmsHPROFILE LCMSEXPORT cmsCreateLab4Profile(LPcmsCIExyY WhitePoint)
|
||||
|
||||
// An empty LUTs is all we need
|
||||
Lut = Create3x3EmptyLUT();
|
||||
if (Lut == NULL) return NULL;
|
||||
if (Lut == NULL) {
|
||||
cmsCloseProfile(hProfile);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Lut -> wFlags |= LUT_V4_INPUT_EMULATE_V2;
|
||||
cmsAddTag(hProfile, icSigAToB0Tag, (LPVOID) Lut);
|
||||
@ -666,6 +676,7 @@ cmsHPROFILE LCMSEXPORT cmsCreateXYZProfile(void)
|
||||
LPLUT Lut;
|
||||
|
||||
hProfile = cmsCreateRGBProfile(cmsD50_xyY(), NULL, NULL);
|
||||
if (hProfile == NULL) return NULL;
|
||||
|
||||
cmsSetDeviceClass(hProfile, icSigAbstractClass);
|
||||
cmsSetColorSpace(hProfile, icSigXYZData);
|
||||
@ -677,15 +688,16 @@ cmsHPROFILE LCMSEXPORT cmsCreateXYZProfile(void)
|
||||
|
||||
// An empty LUTs is all we need
|
||||
Lut = Create3x3EmptyLUT();
|
||||
if (Lut == NULL) return NULL;
|
||||
if (Lut == NULL) {
|
||||
cmsCloseProfile(hProfile);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cmsAddTag(hProfile, icSigAToB0Tag, (LPVOID) Lut);
|
||||
cmsAddTag(hProfile, icSigBToA0Tag, (LPVOID) Lut);
|
||||
cmsAddTag(hProfile, icSigPreview0Tag, (LPVOID) Lut);
|
||||
|
||||
cmsFreeLUT(Lut);
|
||||
|
||||
|
||||
return hProfile;
|
||||
}
|
||||
|
||||
@ -723,6 +735,7 @@ LPGAMMATABLE Build_sRGBGamma(void)
|
||||
return cmsBuildParametricGamma(1024, 4, Parameters);
|
||||
}
|
||||
|
||||
// Create the ICC virtual profile for sRGB space
|
||||
cmsHPROFILE LCMSEXPORT cmsCreate_sRGBProfile(void)
|
||||
{
|
||||
cmsCIExyY D65;
|
||||
@ -739,6 +752,7 @@ cmsHPROFILE LCMSEXPORT cmsCreate_sRGBProfile(void)
|
||||
|
||||
hsRGB = cmsCreateRGBProfile(&D65, &Rec709Primaries, Gamma22);
|
||||
cmsFreeGamma(Gamma22[0]);
|
||||
if (hsRGB == NULL) return NULL;
|
||||
|
||||
|
||||
cmsAddTag(hsRGB, icSigDeviceMfgDescTag, (LPVOID) "(lcms internal)");
|
||||
@ -750,7 +764,6 @@ cmsHPROFILE LCMSEXPORT cmsCreate_sRGBProfile(void)
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
double Brightness;
|
||||
double Contrast;
|
||||
@ -793,7 +806,6 @@ int bchswSampler(register WORD In[], register WORD Out[], register LPVOID Cargo)
|
||||
|
||||
cmsFloat2LabEncoded(Out, &LabOut);
|
||||
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -839,7 +851,10 @@ cmsHPROFILE LCMSEXPORT cmsCreateBCHSWabstractProfile(int nLUTPoints,
|
||||
|
||||
// Creates a LUT with 3D grid only
|
||||
Lut = cmsAllocLUT();
|
||||
|
||||
if (Lut == NULL) {
|
||||
cmsCloseProfile(hICC);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cmsAlloc3DGrid(Lut, nLUTPoints, 3, 3);
|
||||
|
||||
@ -890,7 +905,10 @@ cmsHPROFILE LCMSEXPORT cmsCreateNULLProfile(void)
|
||||
|
||||
// An empty LUTs is all we need
|
||||
Lut = cmsAllocLUT();
|
||||
if (Lut == NULL) return NULL;
|
||||
if (Lut == NULL) {
|
||||
cmsCloseProfile(hProfile);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Lut -> InputChan = 3;
|
||||
Lut -> OutputChan = 1;
|
||||
|
@ -29,7 +29,7 @@
|
||||
//
|
||||
//
|
||||
// Little cms
|
||||
// Copyright (C) 1998-2006 Marti Maria
|
||||
// Copyright (C) 1998-2007 Marti Maria
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the "Software"),
|
||||
@ -51,10 +51,6 @@
|
||||
|
||||
#include "lcms.h"
|
||||
|
||||
// Uncomment this line if you want lcms to use the black point tag in profile,
|
||||
// if commented, lcms will compute the black point by its own.
|
||||
// It is safer to leve it commented out
|
||||
// #define HONOR_BLACK_POINT_TAG
|
||||
|
||||
// Conversions
|
||||
|
||||
@ -79,10 +75,9 @@ void LCMSEXPORT cmsxyY2XYZ(LPcmsCIEXYZ Dest, const cmsCIExyY* Source)
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Obtains WhitePoint from Temperature
|
||||
|
||||
BOOL LCMSEXPORT cmsWhitePointFromTemp(int TempK, LPcmsCIExyY WhitePoint)
|
||||
LCMSBOOL LCMSEXPORT cmsWhitePointFromTemp(int TempK, LPcmsCIExyY WhitePoint)
|
||||
{
|
||||
double x, y;
|
||||
double T, T2, T3;
|
||||
@ -147,7 +142,7 @@ BOOL LCMSEXPORT cmsWhitePointFromTemp(int TempK, LPcmsCIExyY WhitePoint)
|
||||
// - Then, I apply these coeficients to the original matrix
|
||||
|
||||
|
||||
BOOL LCMSEXPORT cmsBuildRGB2XYZtransferMatrix(LPMAT3 r, LPcmsCIExyY WhitePt,
|
||||
LCMSBOOL LCMSEXPORT cmsBuildRGB2XYZtransferMatrix(LPMAT3 r, LPcmsCIExyY WhitePt,
|
||||
LPcmsCIExyYTRIPLE Primrs)
|
||||
{
|
||||
VEC3 WhitePoint, Coef;
|
||||
@ -169,14 +164,12 @@ BOOL LCMSEXPORT cmsBuildRGB2XYZtransferMatrix(LPMAT3 r, LPcmsCIExyY WhitePt,
|
||||
|
||||
|
||||
// Build Primaries matrix
|
||||
|
||||
VEC3init(&Primaries.v[0], xr, xg, xb);
|
||||
VEC3init(&Primaries.v[1], yr, yg, yb);
|
||||
VEC3init(&Primaries.v[2], (1-xr-yr), (1-xg-yg), (1-xb-yb));
|
||||
|
||||
|
||||
// Result = Primaries ^ (-1) inverse matrix
|
||||
|
||||
if (!MAT3inverse(&Primaries, &Result))
|
||||
return FALSE;
|
||||
|
||||
@ -184,11 +177,9 @@ BOOL LCMSEXPORT cmsBuildRGB2XYZtransferMatrix(LPMAT3 r, LPcmsCIExyY WhitePt,
|
||||
VEC3init(&WhitePoint, xn/yn, 1.0, (1.0-xn-yn)/yn);
|
||||
|
||||
// Across inverse primaries ...
|
||||
|
||||
MAT3eval(&Coef, &Result, &WhitePoint);
|
||||
|
||||
// Give us the Coefs, then I build transformation matrix
|
||||
|
||||
VEC3init(&r -> v[0], Coef.n[VX]*xr, Coef.n[VY]*xg, Coef.n[VZ]*xb);
|
||||
VEC3init(&r -> v[1], Coef.n[VX]*yr, Coef.n[VY]*yg, Coef.n[VZ]*yb);
|
||||
VEC3init(&r -> v[2], Coef.n[VX]*(1.0-xr-yr), Coef.n[VY]*(1.0-xg-yg), Coef.n[VZ]*(1.0-xb-yb));
|
||||
@ -246,7 +237,7 @@ void ComputeChromaticAdaptation(LPMAT3 Conversion,
|
||||
// Returns the final chrmatic adaptation from illuminant FromIll to Illuminant ToIll
|
||||
// The cone matrix can be specified in ConeMatrix. If NULL, Bradford is assumed
|
||||
|
||||
BOOL cmsAdaptationMatrix(LPMAT3 r, LPMAT3 ConeMatrix, LPcmsCIEXYZ FromIll, LPcmsCIEXYZ ToIll)
|
||||
LCMSBOOL cmsAdaptationMatrix(LPMAT3 r, LPMAT3 ConeMatrix, LPcmsCIEXYZ FromIll, LPcmsCIEXYZ ToIll)
|
||||
{
|
||||
MAT3 LamRigg = {{ // Bradford matrix
|
||||
{{ 0.8951, 0.2664, -0.1614 }},
|
||||
@ -265,7 +256,7 @@ BOOL cmsAdaptationMatrix(LPMAT3 r, LPMAT3 ConeMatrix, LPcmsCIEXYZ FromIll, LPcms
|
||||
|
||||
// Same as anterior, but assuming D50 destination. White point is given in xyY
|
||||
|
||||
BOOL cmsAdaptMatrixToD50(LPMAT3 r, LPcmsCIExyY SourceWhitePt)
|
||||
LCMSBOOL cmsAdaptMatrixToD50(LPMAT3 r, LPcmsCIExyY SourceWhitePt)
|
||||
{
|
||||
cmsCIEXYZ Dn;
|
||||
MAT3 Bradford;
|
||||
@ -284,7 +275,7 @@ BOOL cmsAdaptMatrixToD50(LPMAT3 r, LPcmsCIExyY SourceWhitePt)
|
||||
|
||||
// Same as anterior, but assuming D50 source. White point is given in xyY
|
||||
|
||||
BOOL cmsAdaptMatrixFromD50(LPMAT3 r, LPcmsCIExyY DestWhitePt)
|
||||
LCMSBOOL cmsAdaptMatrixFromD50(LPMAT3 r, LPcmsCIExyY DestWhitePt)
|
||||
{
|
||||
cmsCIEXYZ Dn;
|
||||
MAT3 Bradford;
|
||||
@ -304,7 +295,7 @@ BOOL cmsAdaptMatrixFromD50(LPMAT3 r, LPcmsCIExyY DestWhitePt)
|
||||
// Adapts a color to a given illuminant. Original color is expected to have
|
||||
// a SourceWhitePt white point.
|
||||
|
||||
BOOL LCMSEXPORT cmsAdaptToIlluminant(LPcmsCIEXYZ Result,
|
||||
LCMSBOOL LCMSEXPORT cmsAdaptToIlluminant(LPcmsCIEXYZ Result,
|
||||
LPcmsCIEXYZ SourceWhitePt,
|
||||
LPcmsCIEXYZ Illuminant,
|
||||
LPcmsCIEXYZ Value)
|
||||
@ -404,8 +395,6 @@ double Robertson(LPcmsCIExyY v)
|
||||
|
||||
dj = ((vs - vj) - tj * (us - uj)) / sqrt(1 + tj*tj);
|
||||
|
||||
|
||||
|
||||
if ((j!=0) && (di/dj < 0.0)) {
|
||||
Tc = 1000000.0 / (mi + (di / (di - dj)) * (mj - mi));
|
||||
break;
|
||||
@ -423,7 +412,7 @@ double Robertson(LPcmsCIExyY v)
|
||||
|
||||
|
||||
static
|
||||
BOOL InRange(LPcmsCIExyY a, LPcmsCIExyY b, double tolerance)
|
||||
LCMSBOOL InRange(LPcmsCIExyY a, LPcmsCIExyY b, double tolerance)
|
||||
{
|
||||
double dist_x, dist_y;
|
||||
|
||||
@ -458,6 +447,7 @@ int FromD40toD150(LPWHITEPOINTS pts)
|
||||
}
|
||||
|
||||
|
||||
// To be removed in future versions
|
||||
void _cmsIdentifyWhitePoint(char *Buffer, LPcmsCIEXYZ WhitePt)
|
||||
{
|
||||
int i, n;
|
||||
@ -518,7 +508,6 @@ int BlackPointAsDarkerColorant(cmsHPROFILE hInput,
|
||||
cmsCIEXYZ BlackXYZ, MediaWhite;
|
||||
|
||||
// If the profile does not support input direction, assume Black point 0
|
||||
|
||||
if (!cmsIsIntentSupported(hInput, Intent, LCMS_USED_AS_INPUT)) {
|
||||
|
||||
BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
|
||||
@ -527,7 +516,6 @@ int BlackPointAsDarkerColorant(cmsHPROFILE hInput,
|
||||
|
||||
|
||||
// Try to get black by using black colorant
|
||||
|
||||
Space = cmsGetColorSpace(hInput);
|
||||
|
||||
if (!_cmsEndPointsBySpace(Space, &White, &Black, &nChannels)) {
|
||||
@ -576,7 +564,7 @@ int BlackPointAsDarkerColorant(cmsHPROFILE hInput,
|
||||
|
||||
|
||||
// Get a black point of output CMYK profile, discounting any ink-limiting embedded
|
||||
// in the profile. Fou doing that, use perceptual intent in input direction:
|
||||
// in the profile. For doing that, use perceptual intent in input direction:
|
||||
// Lab (0, 0, 0) -> [Perceptual] Profile -> CMYK -> [Rel. colorimetric] Profile -> Lab
|
||||
|
||||
static
|
||||
@ -651,6 +639,8 @@ int GetV4PerceptualBlack(LPcmsCIEXYZ BlackPoint, cmsHPROFILE hProfile, DWORD dwF
|
||||
D50BlackPoint.X = PERCEPTUAL_BLACK_X;
|
||||
D50BlackPoint.Y = PERCEPTUAL_BLACK_Y;
|
||||
D50BlackPoint.Z = PERCEPTUAL_BLACK_Z;
|
||||
|
||||
// Obtain the absolute XYZ. Adapt perceptual black back from D50 to whatever media white
|
||||
cmsAdaptToIlluminant(BlackPoint, cmsD50_XYZ(), &MediaWhite, &D50BlackPoint);
|
||||
}
|
||||
|
||||
@ -662,26 +652,24 @@ int GetV4PerceptualBlack(LPcmsCIEXYZ BlackPoint, cmsHPROFILE hProfile, DWORD dwF
|
||||
// This function shouldn't exist at all -- there is such quantity of broken
|
||||
// profiles on black point tag, that we must somehow fix chromaticity to
|
||||
// avoid huge tint when doing Black point compensation. This function does
|
||||
// just that. If BP is specified, then forces it to neutral and uses only L
|
||||
// component. If does not exist, computes it by taking 400% of ink or RGB=0 This
|
||||
// works well on relative intent and is undefined on perceptual & saturation.
|
||||
// However, I will support all intents for tricking & trapping.
|
||||
|
||||
// just that. There is a special flag for using black point tag, but turned
|
||||
// off by default because it is bogus on most profiles. The detection algorithm
|
||||
// involves to turn BP to neutral and to use only L component.
|
||||
|
||||
int cmsDetectBlackPoint(LPcmsCIEXYZ BlackPoint, cmsHPROFILE hProfile, int Intent, DWORD dwFlags)
|
||||
{
|
||||
|
||||
// v4 + perceptual & saturation intents does have its own black point
|
||||
// v4 + perceptual & saturation intents does have its own black point, and it is
|
||||
// well specified enough to use it.
|
||||
|
||||
if ((cmsGetProfileICCversion(hProfile) >= 0x4000000) &&
|
||||
(Intent == INTENT_PERCEPTUAL || Intent == INTENT_SATURATION)) {
|
||||
|
||||
// Matrix shaper share MRC & perceptual intents
|
||||
|
||||
if (_cmsIsMatrixShaper(hProfile))
|
||||
return BlackPointAsDarkerColorant(hProfile, INTENT_RELATIVE_COLORIMETRIC, BlackPoint, cmsFLAGS_NOTPRECALC);
|
||||
|
||||
// Get fixed value
|
||||
// CLUT based - Get perceptual black point (fixed value)
|
||||
return GetV4PerceptualBlack(BlackPoint, hProfile, dwFlags);
|
||||
}
|
||||
|
||||
@ -701,7 +689,6 @@ int cmsDetectBlackPoint(LPcmsCIEXYZ BlackPoint, cmsHPROFILE hProfile, int Intent
|
||||
cmsTakeMediaWhitePoint(&MediaWhite, hProfile);
|
||||
|
||||
// Black point is absolute XYZ, so adapt to D50 to get PCS value
|
||||
|
||||
cmsAdaptToIlluminant(&UntrustedBlackPoint, &MediaWhite, cmsD50_XYZ(), &BlackXYZ);
|
||||
|
||||
// Force a=b=0 to get rid of any chroma
|
||||
@ -713,7 +700,6 @@ int cmsDetectBlackPoint(LPcmsCIEXYZ BlackPoint, cmsHPROFILE hProfile, int Intent
|
||||
cmsLab2XYZ(NULL, &TrustedBlackPoint, &Lab);
|
||||
|
||||
// Return BP as D50 relative or absolute XYZ (depends on flags)
|
||||
|
||||
if (!(dwFlags & LCMS_BPFLAGS_D50_ADAPTED))
|
||||
cmsAdaptToIlluminant(BlackPoint, cmsD50_XYZ(), &MediaWhite, &TrustedBlackPoint);
|
||||
else
|
||||
@ -724,15 +710,15 @@ int cmsDetectBlackPoint(LPcmsCIEXYZ BlackPoint, cmsHPROFILE hProfile, int Intent
|
||||
|
||||
#endif
|
||||
|
||||
// If output profile, discount ink-limiting
|
||||
// That is about v2 profiles.
|
||||
|
||||
// If output profile, discount ink-limiting and that's all
|
||||
if (Intent == INTENT_RELATIVE_COLORIMETRIC &&
|
||||
(cmsGetDeviceClass(hProfile) == icSigOutputClass) &&
|
||||
(cmsGetColorSpace(hProfile) == icSigCmykData))
|
||||
return BlackPointUsingPerceptualBlack(BlackPoint, hProfile, dwFlags);
|
||||
|
||||
// Nope, compute BP using current intent.
|
||||
|
||||
return BlackPointAsDarkerColorant(hProfile, Intent, BlackPoint, dwFlags);
|
||||
|
||||
}
|
||||
|
@ -29,7 +29,7 @@
|
||||
//
|
||||
//
|
||||
// Little cms
|
||||
// Copyright (C) 1998-2006 Marti Maria
|
||||
// Copyright (C) 1998-2007 Marti Maria
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the "Software"),
|
||||
@ -52,7 +52,6 @@
|
||||
|
||||
#include "lcms.h"
|
||||
|
||||
// #define DEBUG 1
|
||||
|
||||
// Transformations stuff
|
||||
// -----------------------------------------------------------------------
|
||||
@ -85,7 +84,7 @@ void LCMSEXPORT cmsDoTransform(cmsHTRANSFORM Transform,
|
||||
|
||||
void LCMSEXPORT cmsGetAlarmCodes(int *r, int *g, int *b);
|
||||
void LCMSEXPORT cmsSetAlarmCodes(int r, int g, int b);
|
||||
BOOL LCMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile,
|
||||
LCMSBOOL LCMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile,
|
||||
int Intent, int UsedDirection);
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
@ -635,6 +634,8 @@ LPMATSHAPER cmsBuildGrayInputMatrixShaper(cmsHPROFILE hProfile)
|
||||
MAT3 Scale;
|
||||
|
||||
GrayTRC = cmsReadICCGamma(hProfile, icSigGrayTRCTag); // Y
|
||||
if (GrayTRC == NULL) return NULL;
|
||||
|
||||
cmsTakeIluminant(&Illuminant, hProfile);
|
||||
|
||||
if (cmsGetPCS(hProfile) == icSigLabData) {
|
||||
@ -789,6 +790,10 @@ LPMATSHAPER cmsBuildOutputMatrixShaper(cmsHPROFILE OutputProfile)
|
||||
InverseShapes[1] = cmsReadICCGammaReversed(OutputProfile, icSigGreenTRCTag);
|
||||
InverseShapes[2] = cmsReadICCGammaReversed(OutputProfile, icSigBlueTRCTag);
|
||||
|
||||
if (InverseShapes[0] == NULL ||
|
||||
InverseShapes[1] == NULL ||
|
||||
InverseShapes[2] == NULL) return NULL;
|
||||
|
||||
OutMatSh = cmsAllocMatShaper(&DoubleInv, InverseShapes, MATSHAPER_OUTPUT);
|
||||
|
||||
cmsFreeGammaTriple(InverseShapes);
|
||||
@ -801,7 +806,7 @@ LPMATSHAPER cmsBuildOutputMatrixShaper(cmsHPROFILE OutputProfile)
|
||||
// This function builds a transform matrix chaining parameters
|
||||
|
||||
static
|
||||
BOOL cmsBuildSmeltMatShaper(_LPcmsTRANSFORM p)
|
||||
LCMSBOOL cmsBuildSmeltMatShaper(_LPcmsTRANSFORM p)
|
||||
{
|
||||
MAT3 From, To, ToInv, Transfer;
|
||||
LPGAMMATABLE In[3], InverseOut[3];
|
||||
@ -814,7 +819,6 @@ BOOL cmsBuildSmeltMatShaper(_LPcmsTRANSFORM p)
|
||||
if (!cmsReadICCMatrixRGB2XYZ(&To, p -> OutputProfile))
|
||||
return FALSE;
|
||||
|
||||
|
||||
// invert dest
|
||||
|
||||
if (MAT3inverse(&To, &ToInv) < 0)
|
||||
@ -838,10 +842,14 @@ BOOL cmsBuildSmeltMatShaper(_LPcmsTRANSFORM p)
|
||||
InverseOut[1] = cmsReadICCGammaReversed(p -> OutputProfile, icSigGreenTRCTag);
|
||||
InverseOut[2] = cmsReadICCGammaReversed(p -> OutputProfile, icSigBlueTRCTag);
|
||||
|
||||
if (!InverseOut[0] || !InverseOut[1] || !InverseOut[2]) {
|
||||
cmsFreeGammaTriple(In);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
p -> SmeltMatShaper = cmsAllocMatShaper2(&Transfer, In, InverseOut, MATSHAPER_ALLSMELTED);
|
||||
|
||||
cmsFreeGammaTriple(In);
|
||||
|
||||
cmsFreeGammaTriple(InverseOut);
|
||||
|
||||
return (p -> SmeltMatShaper != NULL);
|
||||
@ -1029,7 +1037,7 @@ void TakeConversionRoutines(_LPcmsTRANSFORM p, int DoBPC)
|
||||
// Check colorspace
|
||||
|
||||
static
|
||||
BOOL IsProperColorSpace(cmsHPROFILE hProfile, DWORD dwFormat, BOOL lUsePCS)
|
||||
LCMSBOOL IsProperColorSpace(cmsHPROFILE hProfile, DWORD dwFormat, LCMSBOOL lUsePCS)
|
||||
{
|
||||
int Space = T_COLORSPACE(dwFormat);
|
||||
|
||||
@ -1049,10 +1057,10 @@ _LPcmsTRANSFORM AllocEmptyTransform(void)
|
||||
{
|
||||
// Allocate needed memory
|
||||
|
||||
_LPcmsTRANSFORM p = (_LPcmsTRANSFORM) malloc(sizeof(_cmsTRANSFORM));
|
||||
_LPcmsTRANSFORM p = (_LPcmsTRANSFORM) _cmsMalloc(sizeof(_cmsTRANSFORM));
|
||||
if (!p) {
|
||||
|
||||
cmsSignalError(LCMS_ERRC_ABORTED, "cmsCreateTransform: malloc() failed");
|
||||
cmsSignalError(LCMS_ERRC_ABORTED, "cmsCreateTransform: _cmsMalloc() failed");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -1269,10 +1277,10 @@ _LPcmsTRANSFORM PickTransformRoutine(_LPcmsTRANSFORM p,
|
||||
else {
|
||||
// Can we optimize matrix-shaper only transform?
|
||||
|
||||
if (*FromTagPtr == 0 &&
|
||||
*ToTagPtr == 0 &&
|
||||
!p->PreviewProfile &&
|
||||
p -> Intent != INTENT_ABSOLUTE_COLORIMETRIC &&
|
||||
if ((*FromTagPtr == 0) &&
|
||||
(*ToTagPtr == 0) &&
|
||||
(!p->PreviewProfile) &&
|
||||
(p -> Intent != INTENT_ABSOLUTE_COLORIMETRIC) &&
|
||||
(p -> EntryColorSpace == icSigRgbData) &&
|
||||
(p -> ExitColorSpace == icSigRgbData) &&
|
||||
!(p -> dwOriginalFlags & cmsFLAGS_BLACKPOINTCOMPENSATION)) {
|
||||
@ -1530,7 +1538,6 @@ cmsHTRANSFORM LCMSEXPORT cmsCreateProofingTransform(cmsHPROFILE InputProfile,
|
||||
|
||||
TakeConversionRoutines(p, dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION);
|
||||
|
||||
|
||||
if (!(p -> dwOriginalFlags & cmsFLAGS_NOTPRECALC)) {
|
||||
|
||||
LPLUT DeviceLink;
|
||||
@ -1553,7 +1560,8 @@ cmsHTRANSFORM LCMSEXPORT cmsCreateProofingTransform(cmsHPROFILE InputProfile,
|
||||
DeviceLink = _cmsPrecalculateDeviceLink((cmsHTRANSFORM) p, dwFlags);
|
||||
}
|
||||
|
||||
if (p -> dwOriginalFlags & cmsFLAGS_GAMUTCHECK) {
|
||||
// Allow to specify cmsFLAGS_GAMUTCHECK, even if no proofing profile is given
|
||||
if ((p ->PreviewProfile != NULL) && (p -> dwOriginalFlags & cmsFLAGS_GAMUTCHECK)) {
|
||||
|
||||
GamutCheck = _cmsPrecalculateGamutCheck((cmsHTRANSFORM) p);
|
||||
}
|
||||
@ -1561,7 +1569,6 @@ cmsHTRANSFORM LCMSEXPORT cmsCreateProofingTransform(cmsHPROFILE InputProfile,
|
||||
// If input colorspace is Rgb, Cmy, then use tetrahedral interpolation
|
||||
// for speed reasons (it only works well on spaces on Luma is diagonal, and
|
||||
// not if luma is in separate channel)
|
||||
|
||||
if (p ->EntryColorSpace == icSigRgbData ||
|
||||
p ->EntryColorSpace == icSigCmyData) {
|
||||
|
||||
@ -1668,7 +1675,7 @@ void LCMSEXPORT cmsDeleteTransform(cmsHTRANSFORM hTransform)
|
||||
|
||||
LCMS_FREE_LOCK(&p->rwlock);
|
||||
|
||||
free((void *) p);
|
||||
_cmsFree((void *) p);
|
||||
}
|
||||
|
||||
|
||||
@ -1704,7 +1711,7 @@ void LCMSEXPORT cmsGetAlarmCodes(int *r, int *g, int *b)
|
||||
|
||||
// Returns TRUE if the profile is implemented as matrix-shaper
|
||||
|
||||
BOOL LCMSEXPORT _cmsIsMatrixShaper(cmsHPROFILE hProfile)
|
||||
LCMSBOOL LCMSEXPORT _cmsIsMatrixShaper(cmsHPROFILE hProfile)
|
||||
{
|
||||
switch (cmsGetColorSpace(hProfile)) {
|
||||
|
||||
@ -1728,7 +1735,7 @@ BOOL LCMSEXPORT _cmsIsMatrixShaper(cmsHPROFILE hProfile)
|
||||
}
|
||||
|
||||
|
||||
BOOL LCMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile,
|
||||
LCMSBOOL LCMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile,
|
||||
int Intent, int UsedDirection)
|
||||
{
|
||||
|
||||
@ -1774,6 +1781,16 @@ int MultiprofileSampler(register WORD In[], register WORD Out[], register LPVOID
|
||||
}
|
||||
|
||||
|
||||
static
|
||||
int IsAllowedInSingleXform(icProfileClassSignature aClass)
|
||||
{
|
||||
return (aClass == icSigInputClass) ||
|
||||
(aClass == icSigDisplayClass) ||
|
||||
(aClass == icSigOutputClass) ||
|
||||
(aClass == icSigColorSpaceClass);
|
||||
}
|
||||
|
||||
|
||||
// A multiprofile transform does chain several profiles into a single
|
||||
// devicelink. It couls also be used to merge named color profiles into
|
||||
// a single database.
|
||||
@ -1805,10 +1822,16 @@ cmsHTRANSFORM LCMSEXPORT cmsCreateMultiprofileTransform(cmsHPROFILE hProfiles[],
|
||||
// There is a simple case with just two profiles, try to catch it in order of getting
|
||||
// black preservation to work on this function, at least with two profiles.
|
||||
|
||||
|
||||
if (nProfiles == 2) {
|
||||
|
||||
if ((cmsGetDeviceClass(hProfiles[0]) != icSigLinkClass) &&
|
||||
(cmsGetDeviceClass(hProfiles[1]) != icSigLinkClass))
|
||||
icProfileClassSignature Class1 = cmsGetDeviceClass(hProfiles[0]);
|
||||
icProfileClassSignature Class2 = cmsGetDeviceClass(hProfiles[1]);
|
||||
|
||||
// Only input, output and display are allowed
|
||||
|
||||
if (IsAllowedInSingleXform(Class1) &&
|
||||
IsAllowedInSingleXform(Class2))
|
||||
return cmsCreateTransform(hProfiles[0], dwInput, hProfiles[1], dwOutput, Intent, dwFlags);
|
||||
}
|
||||
|
||||
@ -1984,6 +2007,14 @@ cmsHTRANSFORM LCMSEXPORT cmsCreateMultiprofileTransform(cmsHPROFILE hProfiles[],
|
||||
if (hLab) cmsCloseProfile(hLab);
|
||||
if (hXYZ) cmsCloseProfile(hXYZ);
|
||||
|
||||
|
||||
if (p ->EntryColorSpace == icSigRgbData ||
|
||||
p ->EntryColorSpace == icSigCmyData) {
|
||||
|
||||
p->DeviceLink -> CLut16params.Interp3D = cmsTetrahedralInterp16;
|
||||
}
|
||||
|
||||
|
||||
if ((Intent != INTENT_ABSOLUTE_COLORIMETRIC) &&
|
||||
!(dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP))
|
||||
_cmsFixWhiteMisalignment(p);
|
||||
|
@ -206,6 +206,11 @@ typedef __int32_t icInt64Number[2];
|
||||
|
||||
#if defined(__sun) || defined(__hpux) || defined (__MINGW) || defined(__MINGW32__)
|
||||
|
||||
#if defined (__MINGW) || defined(__MINGW32__)
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
|
||||
|
||||
typedef uint8_t icUInt8Number;
|
||||
typedef uint16_t icUInt16Number;
|
||||
typedef uint32_t icUInt32Number;
|
||||
|
@ -29,7 +29,7 @@
|
||||
//
|
||||
//
|
||||
// Little cms
|
||||
// Copyright (C) 1998-2006 Marti Maria
|
||||
// Copyright (C) 1998-2007 Marti Maria
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the "Software"),
|
||||
@ -49,8 +49,8 @@
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
// Version 1.16
|
||||
#undef DEBUG
|
||||
// Version 1.18
|
||||
|
||||
#ifndef __cms_H
|
||||
|
||||
// ********** Configuration toggles ****************************************
|
||||
@ -62,13 +62,8 @@
|
||||
// virtually any machine.
|
||||
|
||||
//#define USE_FLOAT 1
|
||||
#ifdef _WIN64
|
||||
#define USE_C 1
|
||||
#undef USE_ASSEMBLER
|
||||
#else
|
||||
#undef USE_C
|
||||
// #define USE_C 1
|
||||
#define USE_ASSEMBLER 1
|
||||
#endif
|
||||
|
||||
// Define this if you are using this package as a DLL (windows only)
|
||||
|
||||
@ -77,15 +72,11 @@
|
||||
|
||||
// Uncomment if you are trying the engine in a non-windows environment
|
||||
// like linux, SGI, VAX, FreeBSD, BeOS, etc.
|
||||
#if !defined(_WIN32) || !defined(_WIN64)
|
||||
#define NON_WINDOWS 1
|
||||
#endif
|
||||
|
||||
// Uncomment this one if you are using big endian machines (only meaningful
|
||||
// when NON_WINDOWS is used)
|
||||
#ifndef _LITTLE_ENDIAN
|
||||
#define USE_BIG_ENDIAN 1
|
||||
#endif
|
||||
// #define USE_BIG_ENDIAN 1
|
||||
|
||||
// Uncomment this one if your compiler/machine does support the
|
||||
// "long long" type This will speedup fixed point math. (USE_C only)
|
||||
@ -104,19 +95,25 @@
|
||||
// Uncomment this line on multithreading environments
|
||||
// #define USE_PTHREADS 1
|
||||
|
||||
// Uncomment this line if you want lcms to use the black point tag in profile,
|
||||
// if commented, lcms will compute the black point by its own.
|
||||
// It is safer to leve it commented out
|
||||
// #define HONOR_BLACK_POINT_TAG 1
|
||||
|
||||
// ********** End of configuration toggles ******************************
|
||||
|
||||
#define LCMS_VERSION 116
|
||||
#define LCMS_VERSION 118
|
||||
|
||||
// Microsoft VisualC++
|
||||
|
||||
// Deal with Microsoft's attempt at deprecating C standard runtime functions
|
||||
|
||||
#ifdef _MSC_VER
|
||||
# undef NON_WINDOWS
|
||||
# if (_MSC_VER >= 1400)
|
||||
# ifndef _CRT_SECURE_NO_DEPRECATE
|
||||
# define _CRT_SECURE_NO_DEPRECATE 1
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
// Borland C
|
||||
@ -125,7 +122,6 @@
|
||||
# undef NON_WINDOWS
|
||||
#endif
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
@ -134,11 +130,11 @@
|
||||
#include <time.h>
|
||||
|
||||
// Metroworks CodeWarrior
|
||||
|
||||
#ifdef __MWERKS__
|
||||
# define unlink remove
|
||||
# if WIN32
|
||||
# define USE_CUSTOM_SWAB 1
|
||||
# undef NON_WINDOWS
|
||||
# else
|
||||
# define NON_WINDOWS 1
|
||||
# endif
|
||||
@ -172,15 +168,21 @@ typedef pthread_rwlock_t LCMS_RWLOCK_T;
|
||||
# define USE_BIG_ENDIAN 1
|
||||
#endif
|
||||
|
||||
#if defined(__sgi__) || defined(__sgi) || defined(__powerpc__) || defined(sparc) || defined(__ppc__)
|
||||
#if defined(__sgi__) || defined(__sgi) || defined(__powerpc__) || defined(sparc) || defined(__ppc__) || defined(__s390__) || defined(__s390x__)
|
||||
# define USE_BIG_ENDIAN 1
|
||||
#endif
|
||||
|
||||
#ifdef TARGET_CPU_PPC
|
||||
#if TARGET_CPU_PPC
|
||||
# define USE_BIG_ENDIAN 1
|
||||
#endif
|
||||
|
||||
#ifdef macintosh
|
||||
#if macintosh
|
||||
# ifndef __LITTLE_ENDIAN__
|
||||
# define USE_BIG_ENDIAN 1
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef __BIG_ENDIAN__
|
||||
# define USE_BIG_ENDIAN 1
|
||||
#endif
|
||||
|
||||
@ -217,11 +219,8 @@ typedef pthread_rwlock_t LCMS_RWLOCK_T;
|
||||
typedef unsigned char BYTE, *LPBYTE;
|
||||
typedef unsigned short WORD, *LPWORD;
|
||||
typedef unsigned long DWORD, *LPDWORD;
|
||||
typedef int BOOL;
|
||||
typedef char *LPSTR;
|
||||
typedef void *LPVOID;
|
||||
typedef void* LCMSHANDLE;
|
||||
|
||||
|
||||
#define ZeroMemory(p,l) memset((p),0,(l))
|
||||
#define CopyMemory(d,s,l) memcpy((d),(s),(l))
|
||||
@ -263,8 +262,12 @@ typedef void* LCMSHANDLE;
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
typedef HANDLE LCMSHANDLE;
|
||||
|
||||
#ifdef _WIN64
|
||||
# ifdef USE_ASSEMBLER
|
||||
# undef USE_ASSEMBLER
|
||||
# define USE_C 1
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef USE_INT64
|
||||
# ifndef LCMSULONGLONG
|
||||
@ -296,6 +299,10 @@ typedef int LCMS_RWLOCK_T;
|
||||
# define LCMS_UNLOCK(x)
|
||||
#endif
|
||||
|
||||
// Base types
|
||||
|
||||
typedef int LCMSBOOL;
|
||||
typedef void* LCMSHANDLE;
|
||||
|
||||
#include "icc34.h" // ICC header file
|
||||
|
||||
@ -322,16 +329,10 @@ typedef int LCMS_RWLOCK_T;
|
||||
#define icSigMCHEData ((icColorSpaceSignature) 0x4d434845L) // MCHE
|
||||
#define icSigMCHFData ((icColorSpaceSignature) 0x4d434846L) // MCHF
|
||||
|
||||
#define icSigCAM97JABData ((icColorSpaceSignature) 0x4A616231L) // 'Jab1' H. Zeng
|
||||
#define icSigCAM02JABData ((icColorSpaceSignature) 0x4A616232L) // 'Jab2' H. Zeng
|
||||
#define icSigCAM02JCHData ((icColorSpaceSignature) 0x4A636A32L) // 'Jch2' H. Zeng
|
||||
|
||||
#define icSigChromaticityTag ((icTagSignature) 0x6368726dL) // As per Addendum 2 to Spec. ICC.1:1998-09
|
||||
#define icSigChromaticAdaptationTag ((icTagSignature) 0x63686164L) // 'chad'
|
||||
#define icSigColorantTableTag ((icTagSignature) 0x636c7274L) // 'clrt'
|
||||
#define icSigColorantTableOutTag ((icTagSignature) 0x636c6f74L) // 'clot'
|
||||
#define icSigHPGamutDescTag ((icTagSignature) 0x676D7441L) // 'gmtA' H. Zeng
|
||||
|
||||
|
||||
#define icSigParametricCurveType ((icTagTypeSignature) 0x70617261L) // parametric (ICC 4.0)
|
||||
#define icSigMultiLocalizedUnicodeType ((icTagTypeSignature) 0x6D6C7563L)
|
||||
@ -340,7 +341,6 @@ typedef int LCMS_RWLOCK_T;
|
||||
#define icSiglutAtoBType ((icTagTypeSignature) 0x6d414220L) // mAB
|
||||
#define icSiglutBtoAType ((icTagTypeSignature) 0x6d424120L) // mBA
|
||||
#define icSigColorantTableType ((icTagTypeSignature) 0x636c7274L) // clrt
|
||||
#define icSigHPGamutDescType ((icTagTypeSignature) 0x676D7441L) // gmtA H. Zeng
|
||||
|
||||
|
||||
typedef struct {
|
||||
@ -438,9 +438,6 @@ extern "C" {
|
||||
#ifndef itoa
|
||||
# define itoa _itoa
|
||||
#endif
|
||||
#ifndef filelength
|
||||
# define filelength _filelength
|
||||
#endif
|
||||
#ifndef fileno
|
||||
# define fileno _fileno
|
||||
#endif
|
||||
@ -450,6 +447,14 @@ extern "C" {
|
||||
#ifndef hypot
|
||||
# define hypot _hypot
|
||||
#endif
|
||||
#ifndef snprintf
|
||||
# define snprintf _snprintf
|
||||
#endif
|
||||
#ifndef vsnprintf
|
||||
# define vsnprintf _vsnprintf
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@ -470,8 +475,9 @@ typedef LCMSHANDLE cmsHTRANSFORM;
|
||||
|
||||
// Format of pixel is defined by one DWORD, using bit fields as follows
|
||||
//
|
||||
// TTTTT U Y F P X S EEE CCCC BBB
|
||||
// D TTTTT U Y F P X S EEE CCCC BBB
|
||||
//
|
||||
// D: Use dither (8 bits only)
|
||||
// T: Pixeltype
|
||||
// F: Flavor 0=MinIsBlack(Chocolate) 1=MinIsWhite(Vanilla)
|
||||
// P: Planar? 0=Chunky, 1=Planar
|
||||
@ -483,6 +489,7 @@ typedef LCMSHANDLE cmsHTRANSFORM;
|
||||
// Y: Swap first - changes ABGR to BGRA and KCMY to CMYK
|
||||
|
||||
|
||||
#define DITHER_SH(s) ((s) << 22)
|
||||
#define COLORSPACE_SH(s) ((s) << 16)
|
||||
#define SWAPFIRST_SH(s) ((s) << 14)
|
||||
#define FLAVOR_SH(s) ((s) << 13)
|
||||
@ -858,7 +865,7 @@ LCMSAPI LPcmsCIExyY LCMSEXPORT cmsD50_xyY(void);
|
||||
|
||||
LCMSAPI cmsHPROFILE LCMSEXPORT cmsOpenProfileFromFile(const char *ICCProfile, const char *sAccess);
|
||||
LCMSAPI cmsHPROFILE LCMSEXPORT cmsOpenProfileFromMem(LPVOID MemPtr, DWORD dwSize);
|
||||
LCMSAPI BOOL LCMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile);
|
||||
|
||||
// Predefined run-time profiles
|
||||
|
||||
@ -915,14 +922,14 @@ LCMSAPI double LCMSEXPORT cmsCIE2000DeltaE(LPcmsCIELab Lab1, LPcmsCIELab
|
||||
|
||||
LCMSAPI void LCMSEXPORT cmsClampLab(LPcmsCIELab Lab, double amax, double amin, double bmax, double bmin);
|
||||
|
||||
LCMSAPI BOOL LCMSEXPORT cmsWhitePointFromTemp(int TempK, LPcmsCIExyY WhitePoint);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsWhitePointFromTemp(int TempK, LPcmsCIExyY WhitePoint);
|
||||
|
||||
LCMSAPI BOOL LCMSEXPORT cmsAdaptToIlluminant(LPcmsCIEXYZ Result,
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsAdaptToIlluminant(LPcmsCIEXYZ Result,
|
||||
LPcmsCIEXYZ SourceWhitePt,
|
||||
LPcmsCIEXYZ Illuminant,
|
||||
LPcmsCIEXYZ Value);
|
||||
|
||||
LCMSAPI BOOL LCMSEXPORT cmsBuildRGB2XYZtransferMatrix(LPMAT3 r,
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsBuildRGB2XYZtransferMatrix(LPMAT3 r,
|
||||
LPcmsCIExyY WhitePoint,
|
||||
LPcmsCIExyYTRIPLE Primaries);
|
||||
|
||||
@ -976,7 +983,7 @@ LCMSAPI LPGAMMATABLE LCMSEXPORT cmsDupGamma(LPGAMMATABLE Src);
|
||||
LCMSAPI LPGAMMATABLE LCMSEXPORT cmsReverseGamma(int nResultSamples, LPGAMMATABLE InGamma);
|
||||
LCMSAPI LPGAMMATABLE LCMSEXPORT cmsJoinGamma(LPGAMMATABLE InGamma, LPGAMMATABLE OutGamma);
|
||||
LCMSAPI LPGAMMATABLE LCMSEXPORT cmsJoinGammaEx(LPGAMMATABLE InGamma, LPGAMMATABLE OutGamma, int nPoints);
|
||||
LCMSAPI BOOL LCMSEXPORT cmsSmoothGamma(LPGAMMATABLE Tab, double lambda);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsSmoothGamma(LPGAMMATABLE Tab, double lambda);
|
||||
LCMSAPI double LCMSEXPORT cmsEstimateGamma(LPGAMMATABLE t);
|
||||
LCMSAPI double LCMSEXPORT cmsEstimateGammaEx(LPWORD Table, int nEntries, double Thereshold);
|
||||
LCMSAPI LPGAMMATABLE LCMSEXPORT cmsReadICCGamma(cmsHPROFILE hProfile, icTagSignature sig);
|
||||
@ -984,14 +991,14 @@ LCMSAPI LPGAMMATABLE LCMSEXPORT cmsReadICCGammaReversed(cmsHPROFILE hProfile, i
|
||||
|
||||
// Access to Profile data.
|
||||
|
||||
LCMSAPI BOOL LCMSEXPORT cmsTakeMediaWhitePoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile);
|
||||
LCMSAPI BOOL LCMSEXPORT cmsTakeMediaBlackPoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile);
|
||||
LCMSAPI BOOL LCMSEXPORT cmsTakeIluminant(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile);
|
||||
LCMSAPI BOOL LCMSEXPORT cmsTakeColorants(LPcmsCIEXYZTRIPLE Dest, cmsHPROFILE hProfile);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsTakeMediaWhitePoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsTakeMediaBlackPoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsTakeIluminant(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsTakeColorants(LPcmsCIEXYZTRIPLE Dest, cmsHPROFILE hProfile);
|
||||
LCMSAPI DWORD LCMSEXPORT cmsTakeHeaderFlags(cmsHPROFILE hProfile);
|
||||
LCMSAPI DWORD LCMSEXPORT cmsTakeHeaderAttributes(cmsHPROFILE hProfile);
|
||||
|
||||
LCMSAPI void LCMSEXPORT cmsSetLanguage(int LanguageCode, int CountryCode);
|
||||
LCMSAPI void LCMSEXPORT cmsSetLanguage(const char LanguageCode[4], const char CountryCode[4]);
|
||||
LCMSAPI const char* LCMSEXPORT cmsTakeProductName(cmsHPROFILE hProfile);
|
||||
LCMSAPI const char* LCMSEXPORT cmsTakeProductDesc(cmsHPROFILE hProfile);
|
||||
LCMSAPI const char* LCMSEXPORT cmsTakeProductInfo(cmsHPROFILE hProfile);
|
||||
@ -1000,13 +1007,13 @@ LCMSAPI const char* LCMSEXPORT cmsTakeModel(cmsHPROFILE hProfile);
|
||||
LCMSAPI const char* LCMSEXPORT cmsTakeCopyright(cmsHPROFILE hProfile);
|
||||
LCMSAPI const BYTE* LCMSEXPORT cmsTakeProfileID(cmsHPROFILE hProfile);
|
||||
|
||||
LCMSAPI BOOL LCMSEXPORT cmsTakeCreationDateTime(struct tm *Dest, cmsHPROFILE hProfile);
|
||||
LCMSAPI BOOL LCMSEXPORT cmsTakeCalibrationDateTime(struct tm *Dest, cmsHPROFILE hProfile);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsTakeCreationDateTime(struct tm *Dest, cmsHPROFILE hProfile);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsTakeCalibrationDateTime(struct tm *Dest, cmsHPROFILE hProfile);
|
||||
|
||||
LCMSAPI BOOL LCMSEXPORT cmsIsTag(cmsHPROFILE hProfile, icTagSignature sig);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsIsTag(cmsHPROFILE hProfile, icTagSignature sig);
|
||||
LCMSAPI int LCMSEXPORT cmsTakeRenderingIntent(cmsHPROFILE hProfile);
|
||||
|
||||
LCMSAPI BOOL LCMSEXPORT cmsTakeCharTargetData(cmsHPROFILE hProfile, char** Data, size_t* len);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsTakeCharTargetData(cmsHPROFILE hProfile, char** Data, size_t* len);
|
||||
|
||||
LCMSAPI int LCMSEXPORT cmsReadICCTextEx(cmsHPROFILE hProfile, icTagSignature sig, char *Text, size_t size);
|
||||
LCMSAPI int LCMSEXPORT cmsReadICCText(cmsHPROFILE hProfile, icTagSignature sig, char *Text);
|
||||
@ -1038,50 +1045,18 @@ LCMSAPI LPcmsSEQ LCMSEXPORT cmsReadProfileSequenceDescription(cmsHPROFILE h
|
||||
LCMSAPI void LCMSEXPORT cmsFreeProfileSequenceDescription(LPcmsSEQ pseq);
|
||||
|
||||
|
||||
// Extended gamut tag -- an HP extension
|
||||
|
||||
#define LCMSGAMUTMETHOD_SEGMENTMAXIMA 0
|
||||
#define LCMSGAMUTMETHOD_CONVEXHULL 1
|
||||
#define LCMSGAMUTMETHOD_ALPHASHAPE 2
|
||||
|
||||
|
||||
#define LCMSGAMUT_PHYSICAL 0
|
||||
#define LCMSGAMUT_HP1 1
|
||||
#define LCMSGAMUT_HP2 2
|
||||
|
||||
typedef struct {
|
||||
|
||||
icColorSpaceSignature CoordSig; // Gamut coordinates signature
|
||||
icUInt16Number Method; // Method used to generate gamut
|
||||
icUInt16Number Usage; // Gamut usage or intent
|
||||
|
||||
char Description[LCMS_DESC_MAX]; // Textual description
|
||||
|
||||
cmsViewingConditions Vc; // The viewing conditions
|
||||
|
||||
icUInt32Number Count; // Number of entries
|
||||
double Data[1]; // The current data
|
||||
|
||||
} cmsGAMUTEX, FAR* LPcmsGAMUTEX;
|
||||
|
||||
|
||||
LCMSAPI LPcmsGAMUTEX LCMSEXPORT cmsReadExtendedGamut(cmsHPROFILE hProfile, int index);
|
||||
LCMSAPI void LCMSEXPORT cmsFreeExtendedGamut(LPcmsGAMUTEX gex);
|
||||
|
||||
|
||||
|
||||
|
||||
// Translate form/to our notation to ICC
|
||||
LCMSAPI icColorSpaceSignature LCMSEXPORT _cmsICCcolorSpace(int OurNotation);
|
||||
LCMSAPI int LCMSEXPORT _cmsLCMScolorSpace(icColorSpaceSignature ProfileSpace);
|
||||
LCMSAPI int LCMSEXPORT _cmsChannelsOf(icColorSpaceSignature ColorSpace);
|
||||
LCMSAPI BOOL LCMSEXPORT _cmsIsMatrixShaper(cmsHPROFILE hProfile);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT _cmsIsMatrixShaper(cmsHPROFILE hProfile);
|
||||
|
||||
// How profiles may be used
|
||||
#define LCMS_USED_AS_INPUT 0
|
||||
#define LCMS_USED_AS_OUTPUT 1
|
||||
#define LCMS_USED_AS_PROOF 2
|
||||
|
||||
LCMSAPI BOOL LCMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, int Intent, int UsedDirection);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, int Intent, int UsedDirection);
|
||||
|
||||
LCMSAPI icColorSpaceSignature LCMSEXPORT cmsGetPCS(cmsHPROFILE hProfile);
|
||||
LCMSAPI icColorSpaceSignature LCMSEXPORT cmsGetColorSpace(cmsHPROFILE hProfile);
|
||||
@ -1141,7 +1116,7 @@ LCMSAPI void LCMSEXPORT cmsSetProfileID(cmsHPROFILE hProfile, LPBYTE Pr
|
||||
|
||||
// CRD special
|
||||
|
||||
#define cmsFLAGS_NODEFAULTRESOURCEDEF 0x00010000
|
||||
#define cmsFLAGS_NODEFAULTRESOURCEDEF 0x01000000
|
||||
|
||||
// Gridpoints
|
||||
|
||||
@ -1221,7 +1196,7 @@ typedef struct {
|
||||
// Named color support
|
||||
|
||||
LCMSAPI int LCMSEXPORT cmsNamedColorCount(cmsHTRANSFORM xform);
|
||||
LCMSAPI BOOL LCMSEXPORT cmsNamedColorInfo(cmsHTRANSFORM xform, int nColor, char* Name, char* Prefix, char* Suffix);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsNamedColorInfo(cmsHTRANSFORM xform, int nColor, char* Name, char* Prefix, char* Suffix);
|
||||
LCMSAPI int LCMSEXPORT cmsNamedColorIndex(cmsHTRANSFORM xform, const char* Name);
|
||||
|
||||
// Colorant tables
|
||||
@ -1230,7 +1205,7 @@ LCMSAPI LPcmsNAMEDCOLORLIST LCMSEXPORT cmsReadColorantTable(cmsHPROFILE hProfile
|
||||
|
||||
// Profile creation
|
||||
|
||||
LCMSAPI BOOL LCMSEXPORT cmsAddTag(cmsHPROFILE hProfile, icTagSignature sig, const void* data);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsAddTag(cmsHPROFILE hProfile, icTagSignature sig, const void* data);
|
||||
|
||||
// Converts a transform to a devicelink profile
|
||||
LCMSAPI cmsHPROFILE LCMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, DWORD dwFlags);
|
||||
@ -1240,8 +1215,8 @@ LCMSAPI void LCMSEXPORT _cmsSetLUTdepth(cmsHPROFILE hProfile, int depth);
|
||||
|
||||
|
||||
// Save profile
|
||||
LCMSAPI BOOL LCMSEXPORT _cmsSaveProfile(cmsHPROFILE hProfile, const char* FileName);
|
||||
LCMSAPI BOOL LCMSEXPORT _cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr,
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT _cmsSaveProfile(cmsHPROFILE hProfile, const char* FileName);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT _cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr,
|
||||
size_t* BytesNeeded);
|
||||
|
||||
|
||||
@ -1286,6 +1261,7 @@ LCMSAPI double LCMSEXPORT cmsEvalLUTreverse(LPLUT Lut, WORD Target[], WORD Resul
|
||||
LCMSAPI LPLUT LCMSEXPORT cmsReadICCLut(cmsHPROFILE hProfile, icTagSignature sig);
|
||||
LCMSAPI LPLUT LCMSEXPORT cmsDupLUT(LPLUT Orig);
|
||||
|
||||
|
||||
// LUT Sampling
|
||||
|
||||
typedef int (* _cmsSAMPLER)(register WORD In[],
|
||||
@ -1325,35 +1301,37 @@ LCMSAPI int LCMSEXPORT cmsIT8SetTable(LCMSHANDLE IT8, int nTable);
|
||||
// Persistence
|
||||
LCMSAPI LCMSHANDLE LCMSEXPORT cmsIT8LoadFromFile(const char* cFileName);
|
||||
LCMSAPI LCMSHANDLE LCMSEXPORT cmsIT8LoadFromMem(void *Ptr, size_t len);
|
||||
LCMSAPI BOOL LCMSEXPORT cmsIT8SaveToFile(LCMSHANDLE IT8, const char* cFileName);
|
||||
LCMSAPI BOOL LCMSEXPORT cmsIT8SaveToMem(LCMSHANDLE hIT8, void *MemPtr, size_t* BytesNeeded);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SaveToFile(LCMSHANDLE IT8, const char* cFileName);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SaveToMem(LCMSHANDLE hIT8, void *MemPtr, size_t* BytesNeeded);
|
||||
|
||||
// Properties
|
||||
LCMSAPI const char* LCMSEXPORT cmsIT8GetSheetType(LCMSHANDLE hIT8);
|
||||
LCMSAPI BOOL LCMSEXPORT cmsIT8SetSheetType(LCMSHANDLE hIT8, const char* Type);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetSheetType(LCMSHANDLE hIT8, const char* Type);
|
||||
|
||||
LCMSAPI BOOL LCMSEXPORT cmsIT8SetComment(LCMSHANDLE hIT8, const char* cComment);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetComment(LCMSHANDLE hIT8, const char* cComment);
|
||||
|
||||
LCMSAPI BOOL LCMSEXPORT cmsIT8SetPropertyStr(LCMSHANDLE hIT8, const char* cProp, const char *Str);
|
||||
LCMSAPI BOOL LCMSEXPORT cmsIT8SetPropertyDbl(LCMSHANDLE hIT8, const char* cProp, double Val);
|
||||
LCMSAPI BOOL LCMSEXPORT cmsIT8SetPropertyHex(LCMSHANDLE hIT8, const char* cProp, int Val);
|
||||
|
||||
LCMSAPI BOOL LCMSEXPORT cmsIT8SetPropertyUncooked(LCMSHANDLE hIT8, const char* Key, const char* Buffer);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetPropertyStr(LCMSHANDLE hIT8, const char* cProp, const char *Str);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetPropertyDbl(LCMSHANDLE hIT8, const char* cProp, double Val);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetPropertyHex(LCMSHANDLE hIT8, const char* cProp, int Val);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetPropertyMulti(LCMSHANDLE hIT8, const char* cProp, const char* cSubProp, const char *Val);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetPropertyUncooked(LCMSHANDLE hIT8, const char* Key, const char* Buffer);
|
||||
|
||||
|
||||
LCMSAPI const char* LCMSEXPORT cmsIT8GetProperty(LCMSHANDLE hIT8, const char* cProp);
|
||||
LCMSAPI double LCMSEXPORT cmsIT8GetPropertyDbl(LCMSHANDLE hIT8, const char* cProp);
|
||||
LCMSAPI int LCMSEXPORT cmsIT8EnumProperties(LCMSHANDLE IT8, char ***PropertyNames);
|
||||
LCMSAPI const char* LCMSEXPORT cmsIT8GetPropertyMulti(LCMSHANDLE hIT8, const char* cProp, const char *cSubProp);
|
||||
LCMSAPI int LCMSEXPORT cmsIT8EnumProperties(LCMSHANDLE hIT8, const char ***PropertyNames);
|
||||
LCMSAPI int LCMSEXPORT cmsIT8EnumPropertyMulti(LCMSHANDLE hIT8, const char* cProp, const char*** SubpropertyNames);
|
||||
|
||||
// Datasets
|
||||
|
||||
LCMSAPI const char* LCMSEXPORT cmsIT8GetDataRowCol(LCMSHANDLE IT8, int row, int col);
|
||||
LCMSAPI double LCMSEXPORT cmsIT8GetDataRowColDbl(LCMSHANDLE IT8, int row, int col);
|
||||
|
||||
LCMSAPI BOOL LCMSEXPORT cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col,
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col,
|
||||
const char* Val);
|
||||
|
||||
LCMSAPI BOOL LCMSEXPORT cmsIT8SetDataRowColDbl(LCMSHANDLE hIT8, int row, int col,
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetDataRowColDbl(LCMSHANDLE hIT8, int row, int col,
|
||||
double Val);
|
||||
|
||||
LCMSAPI const char* LCMSEXPORT cmsIT8GetData(LCMSHANDLE IT8, const char* cPatch, const char* cSample);
|
||||
@ -1361,25 +1339,28 @@ LCMSAPI const char* LCMSEXPORT cmsIT8GetData(LCMSHANDLE IT8, const char* cPa
|
||||
|
||||
LCMSAPI double LCMSEXPORT cmsIT8GetDataDbl(LCMSHANDLE IT8, const char* cPatch, const char* cSample);
|
||||
|
||||
LCMSAPI BOOL LCMSEXPORT cmsIT8SetData(LCMSHANDLE IT8, const char* cPatch,
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetData(LCMSHANDLE IT8, const char* cPatch,
|
||||
const char* cSample,
|
||||
const char *Val);
|
||||
|
||||
LCMSAPI BOOL LCMSEXPORT cmsIT8SetDataDbl(LCMSHANDLE hIT8, const char* cPatch,
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetDataDbl(LCMSHANDLE hIT8, const char* cPatch,
|
||||
const char* cSample,
|
||||
double Val);
|
||||
|
||||
LCMSAPI int LCMSEXPORT cmsIT8GetDataFormat(LCMSHANDLE hIT8, const char* cSample);
|
||||
LCMSAPI BOOL LCMSEXPORT cmsIT8SetDataFormat(LCMSHANDLE IT8, int n, const char *Sample);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetDataFormat(LCMSHANDLE IT8, int n, const char *Sample);
|
||||
LCMSAPI int LCMSEXPORT cmsIT8EnumDataFormat(LCMSHANDLE IT8, char ***SampleNames);
|
||||
|
||||
|
||||
LCMSAPI const char* LCMSEXPORT cmsIT8GetPatchName(LCMSHANDLE hIT8, int nPatch, char* buffer);
|
||||
LCMSAPI int LCMSEXPORT cmsIT8GetPatchByName(LCMSHANDLE hIT8, const char *cSample);
|
||||
|
||||
// The LABEL extension
|
||||
|
||||
LCMSAPI int LCMSEXPORT cmsIT8SetTableByLabel(LCMSHANDLE hIT8, const char* cSet, const char* cField, const char* ExpectedType);
|
||||
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetIndexColumn(LCMSHANDLE hIT8, const char* cSample);
|
||||
|
||||
// Formatter for double
|
||||
LCMSAPI void LCMSEXPORT cmsIT8DefineDblFormat(LCMSHANDLE IT8, const char* Formatter);
|
||||
|
||||
@ -1405,15 +1386,16 @@ LCMSAPI void LCMSEXPORT cmsFloat2XYZEncoded(WORD XYZ[3], const cmsCIEXY
|
||||
|
||||
// Profiling Extensions --- Would be removed from API in future revisions
|
||||
|
||||
LCMSAPI BOOL LCMSEXPORT _cmsAddTextTag(cmsHPROFILE hProfile, icTagSignature sig, const char* Text);
|
||||
LCMSAPI BOOL LCMSEXPORT _cmsAddXYZTag(cmsHPROFILE hProfile, icTagSignature sig, const cmsCIEXYZ* XYZ);
|
||||
LCMSAPI BOOL LCMSEXPORT _cmsAddLUTTag(cmsHPROFILE hProfile, icTagSignature sig, const void* lut);
|
||||
LCMSAPI BOOL LCMSEXPORT _cmsAddGammaTag(cmsHPROFILE hProfile, icTagSignature sig, LPGAMMATABLE TransferFunction);
|
||||
LCMSAPI BOOL LCMSEXPORT _cmsAddChromaticityTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsCIExyYTRIPLE Chrm);
|
||||
LCMSAPI BOOL LCMSEXPORT _cmsAddSequenceDescriptionTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsSEQ PSeq);
|
||||
LCMSAPI BOOL LCMSEXPORT _cmsAddNamedColorTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc);
|
||||
LCMSAPI BOOL LCMSEXPORT _cmsAddDateTimeTag(cmsHPROFILE hProfile, icTagSignature sig, struct tm *DateTime);
|
||||
LCMSAPI BOOL LCMSEXPORT _cmsAddColorantTableTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT _cmsAddTextTag(cmsHPROFILE hProfile, icTagSignature sig, const char* Text);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT _cmsAddXYZTag(cmsHPROFILE hProfile, icTagSignature sig, const cmsCIEXYZ* XYZ);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT _cmsAddLUTTag(cmsHPROFILE hProfile, icTagSignature sig, const void* lut);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT _cmsAddGammaTag(cmsHPROFILE hProfile, icTagSignature sig, LPGAMMATABLE TransferFunction);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT _cmsAddChromaticityTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsCIExyYTRIPLE Chrm);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT _cmsAddSequenceDescriptionTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsSEQ PSeq);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT _cmsAddNamedColorTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT _cmsAddDateTimeTag(cmsHPROFILE hProfile, icTagSignature sig, struct tm *DateTime);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT _cmsAddColorantTableTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc);
|
||||
LCMSAPI LCMSBOOL LCMSEXPORT _cmsAddChromaticAdaptationTag(cmsHPROFILE hProfile, icTagSignature sig, const cmsCIEXYZ* mat);
|
||||
|
||||
// --------------------------------------------------------------------------------------------------- Inline functions
|
||||
|
||||
@ -1455,6 +1437,38 @@ LCMS_INLINE WORD _cmsClampWord(int in)
|
||||
return (WORD) in;
|
||||
}
|
||||
|
||||
#ifndef LCMS_USER_ALLOC
|
||||
|
||||
// Low-level alloc hook
|
||||
|
||||
LCMS_INLINE void* _cmsMalloc(size_t size)
|
||||
{
|
||||
if (size > ((size_t) 1024*1024*500)) return NULL; // Never allow over 500Mb
|
||||
if (size < 0) return NULL; // Prevent signed size_t exploits
|
||||
|
||||
return (void*) malloc(size);
|
||||
}
|
||||
|
||||
LCMS_INLINE void* _cmsCalloc(size_t nmemb, size_t size)
|
||||
{
|
||||
size_t alloc = nmemb * size;
|
||||
|
||||
if (size == 0) {
|
||||
return _cmsMalloc(0);
|
||||
}
|
||||
if (alloc / size != nmemb) {
|
||||
return NULL;
|
||||
}
|
||||
return _cmsMalloc(alloc);
|
||||
}
|
||||
|
||||
LCMS_INLINE void _cmsFree(void *Ptr)
|
||||
{
|
||||
if (Ptr) free(Ptr);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
// ------------------------------------------------------------------------------------------- end of inline functions
|
||||
|
||||
// Signal error from inside lcms code
|
||||
@ -1541,8 +1555,8 @@ void cdecl VEC3divK(LPVEC3 r, LPVEC3 v, double d);
|
||||
void cdecl VEC3perK(LPVEC3 r, LPVEC3 v, double d);
|
||||
void cdecl VEC3minus(LPVEC3 r, LPVEC3 a, LPVEC3 b);
|
||||
void cdecl VEC3perComp(LPVEC3 r, LPVEC3 a, LPVEC3 b);
|
||||
BOOL cdecl VEC3equal(LPWVEC3 a, LPWVEC3 b, double Tolerance);
|
||||
BOOL cdecl VEC3equalF(LPVEC3 a, LPVEC3 b, double Tolerance);
|
||||
LCMSBOOL cdecl VEC3equal(LPWVEC3 a, LPWVEC3 b, double Tolerance);
|
||||
LCMSBOOL cdecl VEC3equalF(LPVEC3 a, LPVEC3 b, double Tolerance);
|
||||
void cdecl VEC3scaleAndCut(LPWVEC3 r, LPVEC3 v, double d);
|
||||
void cdecl VEC3cross(LPVEC3 r, LPVEC3 u, LPVEC3 v);
|
||||
void cdecl VEC3saturate(LPVEC3 v);
|
||||
@ -1553,13 +1567,13 @@ void cdecl MAT3identity(LPMAT3 a);
|
||||
void cdecl MAT3per(LPMAT3 r, LPMAT3 a, LPMAT3 b);
|
||||
void cdecl MAT3perK(LPMAT3 r, LPMAT3 v, double d);
|
||||
int cdecl MAT3inverse(LPMAT3 a, LPMAT3 b);
|
||||
BOOL cdecl MAT3solve(LPVEC3 x, LPMAT3 a, LPVEC3 b);
|
||||
LCMSBOOL cdecl MAT3solve(LPVEC3 x, LPMAT3 a, LPVEC3 b);
|
||||
double cdecl MAT3det(LPMAT3 m);
|
||||
void cdecl MAT3eval(LPVEC3 r, LPMAT3 a, LPVEC3 v);
|
||||
void cdecl MAT3toFix(LPWMAT3 r, LPMAT3 v);
|
||||
void cdecl MAT3fromFix(LPMAT3 r, LPWMAT3 v);
|
||||
void cdecl MAT3evalW(LPWVEC3 r, LPWMAT3 a, LPWVEC3 v);
|
||||
BOOL cdecl MAT3isIdentity(LPWMAT3 a, double Tolerance);
|
||||
LCMSBOOL cdecl MAT3isIdentity(LPWMAT3 a, double Tolerance);
|
||||
void cdecl MAT3scaleAndCut(LPWMAT3 r, LPMAT3 v, double d);
|
||||
|
||||
// Is a table linear?
|
||||
@ -1608,7 +1622,7 @@ typedef struct _lcms_l16params_struc { // Used on 16 bits interpolations
|
||||
void cdecl cmsCalcL16Params(int nSamples, LPL16PARAMS p);
|
||||
void cdecl cmsCalcCLUT16Params(int nSamples, int InputChan, int OutputChan, LPL16PARAMS p);
|
||||
void cdecl cmsCalcCLUT16ParamsEx(int nSamples, int InputChan, int OutputChan,
|
||||
BOOL lUseTetrahedral, LPL16PARAMS p);
|
||||
LCMSBOOL lUseTetrahedral, LPL16PARAMS p);
|
||||
|
||||
WORD cdecl cmsLinearInterpLUT16(WORD Value, WORD LutTable[], LPL16PARAMS p);
|
||||
Fixed32 cdecl cmsLinearInterpFixed(WORD Value1, WORD LutTable[], LPL16PARAMS p);
|
||||
@ -1692,7 +1706,7 @@ struct _lcms_LUT_struc {
|
||||
|
||||
// Gray axes fixup. Only on v2 8-bit Lab LUT
|
||||
|
||||
BOOL FixGrayAxes;
|
||||
LCMSBOOL FixGrayAxes;
|
||||
|
||||
|
||||
// Parameters used for curve creation
|
||||
@ -1703,7 +1717,7 @@ struct _lcms_LUT_struc {
|
||||
}; // LUT, FAR* LPLUT;
|
||||
|
||||
|
||||
BOOL cdecl _cmsSmoothEndpoints(LPWORD Table, int nEntries);
|
||||
LCMSBOOL cdecl _cmsSmoothEndpoints(LPWORD Table, int nEntries);
|
||||
|
||||
|
||||
// CRC of gamma tables
|
||||
@ -1721,7 +1735,7 @@ LPGAMMATABLE cdecl cmsConvertSampledCurveToGamma(LPSAMPLEDCURVE Sampled, doubl
|
||||
|
||||
void cdecl cmsEndpointsOfSampledCurve(LPSAMPLEDCURVE p, double* Min, double* Max);
|
||||
void cdecl cmsClampSampledCurve(LPSAMPLEDCURVE p, double Min, double Max);
|
||||
BOOL cdecl cmsSmoothSampledCurve(LPSAMPLEDCURVE Tab, double SmoothingLambda);
|
||||
LCMSBOOL cdecl cmsSmoothSampledCurve(LPSAMPLEDCURVE Tab, double SmoothingLambda);
|
||||
void cdecl cmsRescaleSampledCurve(LPSAMPLEDCURVE p, double Min, double Max, int nPoints);
|
||||
|
||||
LPSAMPLEDCURVE cdecl cmsJoinSampledCurves(LPSAMPLEDCURVE X, LPSAMPLEDCURVE Y, int nResultingPoints);
|
||||
@ -1755,7 +1769,7 @@ LPMATSHAPER cdecl cmsAllocMatShaper2(LPMAT3 matrix, LPGAMMATABLE In[], LPGAMMATA
|
||||
void cdecl cmsFreeMatShaper(LPMATSHAPER MatShaper);
|
||||
void cdecl cmsEvalMatShaper(LPMATSHAPER MatShaper, WORD In[], WORD Out[]);
|
||||
|
||||
BOOL cdecl cmsReadICCMatrixRGB2XYZ(LPMAT3 r, cmsHPROFILE hProfile);
|
||||
LCMSBOOL cdecl cmsReadICCMatrixRGB2XYZ(LPMAT3 r, cmsHPROFILE hProfile);
|
||||
|
||||
LPMATSHAPER cdecl cmsBuildInputMatrixShaper(cmsHPROFILE InputProfile);
|
||||
LPMATSHAPER cdecl cmsBuildOutputMatrixShaper(cmsHPROFILE OutputProfile);
|
||||
@ -1763,11 +1777,11 @@ LPMATSHAPER cdecl cmsBuildOutputMatrixShaper(cmsHPROFILE OutputProfile);
|
||||
|
||||
|
||||
// White Point & Primary chromas handling
|
||||
BOOL cdecl cmsAdaptationMatrix(LPMAT3 r, LPMAT3 ConeMatrix, LPcmsCIEXYZ FromIll, LPcmsCIEXYZ ToIll);
|
||||
BOOL cdecl cmsAdaptMatrixToD50(LPMAT3 r, LPcmsCIExyY SourceWhitePt);
|
||||
BOOL cdecl cmsAdaptMatrixFromD50(LPMAT3 r, LPcmsCIExyY DestWhitePt);
|
||||
LCMSBOOL cdecl cmsAdaptationMatrix(LPMAT3 r, LPMAT3 ConeMatrix, LPcmsCIEXYZ FromIll, LPcmsCIEXYZ ToIll);
|
||||
LCMSBOOL cdecl cmsAdaptMatrixToD50(LPMAT3 r, LPcmsCIExyY SourceWhitePt);
|
||||
LCMSBOOL cdecl cmsAdaptMatrixFromD50(LPMAT3 r, LPcmsCIExyY DestWhitePt);
|
||||
|
||||
BOOL cdecl cmsReadChromaticAdaptationMatrix(LPMAT3 r, cmsHPROFILE hProfile);
|
||||
LCMSBOOL cdecl cmsReadChromaticAdaptationMatrix(LPMAT3 r, cmsHPROFILE hProfile);
|
||||
|
||||
// Inter-PCS conversion routines. They assume D50 as white point.
|
||||
void cdecl cmsXYZ2LabEncoded(WORD XYZ[3], WORD Lab[3]);
|
||||
@ -1782,7 +1796,7 @@ WORD cdecl _cmsQuantizeVal(double i, int MaxSamples);
|
||||
LPcmsNAMEDCOLORLIST cdecl cmsAllocNamedColorList(int n);
|
||||
int cdecl cmsReadICCnamedColorList(cmsHTRANSFORM xform, cmsHPROFILE hProfile, icTagSignature sig);
|
||||
void cdecl cmsFreeNamedColorList(LPcmsNAMEDCOLORLIST List);
|
||||
BOOL cdecl cmsAppendNamedColor(cmsHTRANSFORM xform, const char* Name, WORD PCS[3], WORD Colorant[MAXCHANNELS]);
|
||||
LCMSBOOL cdecl cmsAppendNamedColor(cmsHTRANSFORM xform, const char* Name, WORD PCS[3], WORD Colorant[MAXCHANNELS]);
|
||||
|
||||
|
||||
// I/O
|
||||
@ -1826,8 +1840,8 @@ typedef struct _lcms_iccprofile_struct {
|
||||
|
||||
char PhysicalFile[MAX_PATH];
|
||||
|
||||
BOOL IsWrite;
|
||||
BOOL SaveAs8Bits;
|
||||
LCMSBOOL IsWrite;
|
||||
LCMSBOOL SaveAs8Bits;
|
||||
|
||||
struct tm Created;
|
||||
|
||||
@ -1835,14 +1849,14 @@ typedef struct _lcms_iccprofile_struct {
|
||||
|
||||
size_t (* Read)(void *buffer, size_t size, size_t count, struct _lcms_iccprofile_struct* Icc);
|
||||
|
||||
BOOL (* Seek)(struct _lcms_iccprofile_struct* Icc, size_t offset);
|
||||
BOOL (* Close)(struct _lcms_iccprofile_struct* Icc);
|
||||
LCMSBOOL (* Seek)(struct _lcms_iccprofile_struct* Icc, size_t offset);
|
||||
LCMSBOOL (* Close)(struct _lcms_iccprofile_struct* Icc);
|
||||
size_t (* Tell)(struct _lcms_iccprofile_struct* Icc);
|
||||
BOOL (* Grow)(struct _lcms_iccprofile_struct* Icc, size_t amount);
|
||||
LCMSBOOL (* Grow)(struct _lcms_iccprofile_struct* Icc, size_t amount);
|
||||
|
||||
// Writting
|
||||
|
||||
BOOL (* Write)(struct _lcms_iccprofile_struct* Icc, size_t size, LPVOID Ptr);
|
||||
LCMSBOOL (* Write)(struct _lcms_iccprofile_struct* Icc, size_t size, LPVOID Ptr);
|
||||
|
||||
size_t UsedSpace;
|
||||
|
||||
@ -1854,7 +1868,7 @@ typedef struct _lcms_iccprofile_struct {
|
||||
cmsHPROFILE cdecl _cmsCreateProfilePlaceholder(void);
|
||||
|
||||
// Search into tag dictionary
|
||||
icInt32Number cdecl _cmsSearchTag(LPLCMSICCPROFILE Profile, icTagSignature sig, BOOL lSignalError);
|
||||
icInt32Number cdecl _cmsSearchTag(LPLCMSICCPROFILE Profile, icTagSignature sig, LCMSBOOL lSignalError);
|
||||
|
||||
// Search for a particular tag, replace if found or add new one else
|
||||
LPVOID _cmsInitTag(LPLCMSICCPROFILE Icc, icTagSignature sig, size_t size, const void* Init);
|
||||
@ -1870,6 +1884,7 @@ void _cmsSetSaveToMemory(LPLCMSICCPROFILE Icc, LPVOID MemPtr, size_t dwSize);
|
||||
|
||||
// These macros unpack format specifiers into integers
|
||||
|
||||
#define T_DITHER(s) (((s)>>22)&1)
|
||||
#define T_COLORSPACE(s) (((s)>>16)&31)
|
||||
#define T_SWAPFIRST(s) (((s)>>14)&1)
|
||||
#define T_FLAVOR(s) (((s)>>13)&1)
|
||||
@ -1966,7 +1981,7 @@ typedef struct _cmstransform_struct {
|
||||
|
||||
// Flag for transform involving v4 profiles
|
||||
|
||||
BOOL lInputV4Lab, lOutputV4Lab;
|
||||
LCMSBOOL lInputV4Lab, lOutputV4Lab;
|
||||
|
||||
|
||||
// 1-pixel cache
|
||||
@ -2013,7 +2028,7 @@ int cdecl cmsChooseCnvrt(int Absolute,
|
||||
|
||||
// Clamping & Gamut handling
|
||||
|
||||
BOOL cdecl _cmsEndPointsBySpace(icColorSpaceSignature Space,
|
||||
LCMSBOOL cdecl _cmsEndPointsBySpace(icColorSpaceSignature Space,
|
||||
WORD **White, WORD **Black, int *nOutputs);
|
||||
|
||||
WORD * cdecl _cmsWhiteBySpace(icColorSpaceSignature Space);
|
||||
@ -2042,7 +2057,7 @@ LPLUT _cmsPrecalculateBlackPreservingDeviceLink(cmsHTRANSFORM hCMYK2CMYK, DWORD
|
||||
LPLUT cdecl _cmsPrecalculateGamutCheck(cmsHTRANSFORM h);
|
||||
|
||||
// Hot fixes bad profiles
|
||||
BOOL cdecl _cmsFixWhiteMisalignment(_LPcmsTRANSFORM p);
|
||||
LCMSBOOL cdecl _cmsFixWhiteMisalignment(_LPcmsTRANSFORM p);
|
||||
|
||||
// Marks LUT as 8 bit on input
|
||||
LPLUT cdecl _cmsBlessLUT8(LPLUT Lut);
|
||||
@ -2060,6 +2075,10 @@ void cdecl _cmsComputePrelinearizationTablesFromXFORM(cmsHTRANSFORM h[], int nTr
|
||||
// Build a tone curve for K->K' if possible (only works on CMYK)
|
||||
LPGAMMATABLE _cmsBuildKToneCurve(cmsHTRANSFORM hCMYK2CMYK, int nPoints);
|
||||
|
||||
// Validates a LUT
|
||||
LCMSBOOL cdecl _cmsValidateLUT(LPLUT NewLUT);
|
||||
|
||||
|
||||
// These are two VITAL macros, from converting between 8 and 16 bit
|
||||
// representation.
|
||||
|
||||
@ -2077,3 +2096,4 @@ LPGAMMATABLE _cmsBuildKToneCurve(cmsHTRANSFORM hCMYK2CMYK, int nPoints);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user