00001 
#include "generic.h"
00002 
#include "icmstr.h"
00003 
00004 
#pragma code_seg(_ICM3SEG)
00005 
00006 #define MAXCOLOR8  255
00007 
00008 
#pragma optimize("", off)
00009 
00010 
static SINT
00011 
CreateHostInputOutputArray (MEMPTR lpMem, PMEMPTR ppArray,
00012        SINT numChan, SINT tableSize, SINT Offset, CSIG Tag, MEMPTR Buff);
00013 
static BOOL
00014 
CheckInputOutputTable(LPHOSTCLUT lpHostClut, 
float far *fTemp, BOOL, BOOL);
00015 
BOOL
00016 
GetHostCSA_Intent (CHANDLE cp, MEMPTR lpBuffer, LPDWORD lpcbSize,
00017        CSIG Intent, 
int Type);
00018 
static BOOL
00019 
CheckColorLookupTable(LPHOSTCLUT lpHostClut, 
float far *fTemp);
00020 
static BOOL
00021 
DoHostConversionCRD (LPHOSTCLUT lpHostCRD, LPHOSTCLUT lpHostCSA,
00022        
float far *Input, 
float far *Output, 
00023        CSIG ColorSpace, BOOL bCheckOutputTable);
00024 
static BOOL
00025 
DoHostConversionCSA (LPHOSTCLUT lpHostClut, 
float far *Input, 
float far *Output);
00026 
static BOOL
00027 
GetCRDInputOutputArraySize(CHANDLE cp, DWORD Intent, 
00028        LPSINT lpInTbSize, LPSINT lpOutTbSize, 
00029        LPCSIG lpIntentTag, LPSINT lpGrids);
00030 
static void
00031 
LabToXYZ(
float far *Input, 
float far *Output, 
float far *whitePoint);
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
static SINT
00053 CreateHostInputOutputArray (MEMPTR lpMem, PMEMPTR ppArray,
00054                             SINT numChan, SINT tableSize, 
00055                             SINT Offset, CSIG Tag, MEMPTR Buff)
00056 {
00057     
SINT    i, j;
00058     
PUSHORT lpMemPtr16;
00059     
MEMPTR  lpMemPtr8;
00060     
MEMPTR  lpTable;
00061 
00062     
if (Tag == 
icSigLut8Type)
00063         lpMemPtr8 = lpMem;
00064     
else
00065         lpMemPtr16 = (
PUSHORT)lpMem;
00066 
00067     
for (i = 0; i < numChan; i++)
00068     {
00069         
if (Tag == 
icSigLut8Type)
00070         {
00071             ppArray[i] = lpMemPtr8;
00072             lpTable = (
MEMPTR) (((
lpcpLut8Type) Buff)->lut.data) +
00073                 
Offset +
00074                 tableSize * i;
00075             MemCopy(lpMemPtr8, lpTable, tableSize);
00076                 lpMemPtr8 += tableSize;
00077         }
00078         
else
00079         {
00080             ppArray[i] = (
MEMPTR)lpMemPtr16;
00081             lpTable = (
MEMPTR) (((
lpcpLut16Type) Buff)->lut.data) +
00082                 2 * 
Offset +
00083                 2 * tableSize * i;
00084             
for (j = 0; j < tableSize; j++)
00085             {
00086                 *lpMemPtr16++ = (
USHORT) 
ui16toSINT (lpTable);
00087                 lpTable += 
sizeof (
icUInt16Number);
00088             }
00089         }
00090     }
00091     
if (Tag == 
icSigLut8Type)
00092         
return ((
SINT) ((
MEMPTR)lpMemPtr8 - lpMem));
00093     
else
00094         
return ((
SINT) ((
MEMPTR)lpMemPtr16 - lpMem));
00095 
00096 }
00097 
00098 
VOID
00099 GetCLUTinfo(CSIG LutTag, MEMPTR lpLut, LPSINT nInputCh, LPSINT nOutputCh, 
00100             LPSINT nGrids, LPSINT nInputTable, LPSINT nOutputTable, LPSINT size)
00101 {
00102     
if (LutTag == 
icSigLut8Type)
00103     {
00104         *nInputCh = 
ui8toSINT (((
lpcpLut8Type) lpLut)->lut.inputChan);
00105         *nOutputCh = 
ui8toSINT (((
lpcpLut8Type) lpLut)->lut.outputChan);
00106         *nGrids = 
ui8toSINT (((
lpcpLut8Type) lpLut)->lut.clutPoints);
00107         *nInputTable = 256
L;
00108         *nOutputTable = 256
L;
00109         *size = 1;  
00110     } 
else
00111     {
00112         *nInputCh = 
ui8toSINT (((
lpcpLut16Type) lpLut)->lut.inputChan);
00113         *nOutputCh = 
ui8toSINT (((
lpcpLut16Type) lpLut)->lut.outputChan);
00114         *nGrids = 
ui8toSINT (((
lpcpLut16Type) lpLut)->lut.clutPoints);
00115         *nInputTable = 
ui16toSINT (((
lpcpLut16Type) lpLut)->lut.inputEnt);
00116         *nOutputTable = 
ui16toSINT (((
lpcpLut16Type) lpLut)->lut.outputEnt);
00117         *size = 2;  
00118     }
00119 }
00120 
00121 
00122 
00123 
00124 
00125 
00126 
00127 
00128 
00129 
00130 
00131 
00132 
00133 
00134 
00135 
00136 
00137 
static BOOL
00138 GetHostCSA (CHANDLE cp, MEMPTR lpMem, LPDWORD lpcbSize,
00139             CSIG InputIntent, SINT Index, 
int Type)
00140 {
00141     
CSIG    PCS, LutTag;
00142     
CSIG    IntentSig;
00143     
SINT    nInputCh, nOutputCh, nGrids, SecondGrids;
00144     
SINT    nInputTable, nOutputTable, nNumbers;
00145     
SINT    i, j, k;
00146     
MEMPTR  lpTable;
00147     
MEMPTR  lpOldMem = lpMem;
00148     
MEMPTR  lpLut = 
NULL;
00149     HGLOBAL hLut = 0;
00150     
SINT    LutSize;
00151     
LPHOSTCLUT lpHostClut;
00152 
00153     
00154     
00155     
if (!
GetCPConnSpace (cp, (
LPCSIG) & PCS) ||
00156         (PCS != 
icSigLabData) && (PCS != 
icSigXYZData) ||
00157         !
GetCPTagSig (cp, 
Index, (
LPCSIG) & IntentSig))
00158     {
00159         
return (
FALSE);
00160     }
00161     
if (!
GetCPElementType (cp, 
Index, (
LPCSIG) & LutTag) ||
00162         ((LutTag != 
icSigLut8Type) && (LutTag != 
icSigLut16Type)) ||
00163         !
GetCPElementSize (cp, 
Index, (
LPSINT) & LutSize) ||
00164         !
MemAlloc (LutSize, (HGLOBAL 
FAR *) &hLut, (
LPMEMPTR) & lpLut) ||
00165         !
GetCPElement (cp, 
Index, lpLut, LutSize))
00166     {
00167         
if (0 != hLut)
00168         {
00169             
MemFree (hLut);
00170         }
00171         
return (
FALSE);
00172     }
00173 
00174     
00175     
GetCLUTinfo(LutTag, lpLut, &nInputCh, &nOutputCh, 
00176                 &nGrids, &nInputTable, &nOutputTable, &i);
00177 
00178     
if (!(nOutputCh == 3) ||
00179         !((nInputCh == 3) && (Type == 
TYPE_CIEBASEDDEF)) &&
00180         !((nInputCh == 4) && (Type == 
TYPE_CIEBASEDDEFG)))
00181     {
00182         
SetCPLastError (
CP_POSTSCRIPT_ERR);
00183         
MemFree (hLut);
00184         
return (
FALSE);
00185     }
00186     
00187     
00188     
if (lpMem == 
NULL)                  
00189     {
00190         
if (Type == 
TYPE_CIEBASEDDEFG)
00191             *lpcbSize = nOutputCh * nGrids * nGrids * nGrids * nGrids;
00192         
else
00193             *lpcbSize = nOutputCh * nGrids * nGrids * nGrids;
00194         *lpcbSize = *lpcbSize             +   
00195             nInputCh * nInputTable * i    +   
00196             nOutputCh * nOutputTable * i  +   
00197             
sizeof(
HOSTCLUT) + 1024;          
00198         
MemFree (hLut);
00199         
return (
TRUE);
00200     }
00201 
00202     
00203     lpHostClut = (
LPHOSTCLUT)lpMem;
00204     lpMem += 
sizeof(
HOSTCLUT);
00205     lpHostClut->size = 
sizeof(
HOSTCLUT);
00206     lpHostClut->pcs = PCS;
00207     lpHostClut->intent = InputIntent;
00208     lpHostClut->lutBits = (LutTag == 
icSigLut8Type)? 8:16;
00209 
00210     
00211     
GetCPWhitePoint (cp, (
LPSFLOAT)lpHostClut->whitePoint);          
00212 
00213     lpHostClut->inputChan = (
unsigned char)nInputCh;
00214     lpHostClut->outputChan = (
unsigned char)nOutputCh;
00215     lpHostClut->clutPoints = (
unsigned char)nGrids;
00216     lpHostClut->inputEnt = (
USHORT)nInputTable;
00217     lpHostClut->outputEnt = (
USHORT)nOutputTable;
00218     
00219     lpMem += 
CreateHostInputOutputArray (lpMem, lpHostClut->inputArray, 
00220              nInputCh, nInputTable, 0, LutTag, lpLut);
00221 
00222     
if (Type == 
TYPE_CIEBASEDDEFG)
00223     {
00224         i = nInputTable * nInputCh +
00225             nGrids * nGrids * nGrids * nGrids * nOutputCh;
00226     } 
else
00227     {
00228         i = nInputTable * nInputCh +
00229             nGrids * nGrids * nGrids * nOutputCh;
00230     }
00231     
00232     lpMem += 
CreateHostInputOutputArray (lpMem, lpHostClut->outputArray, 
00233              nOutputCh, nOutputTable, i, LutTag, lpLut);
00234  
00235 
00236     lpHostClut->clut = lpMem;
00237     nNumbers = nGrids * nGrids * nOutputCh;
00238     SecondGrids = 1;
00239     
if (Type == 
TYPE_CIEBASEDDEFG)
00240     {
00241         SecondGrids = nGrids;
00242     }
00243     
for (i = 0; i < nGrids; i++)        
00244     {
00245         
for (k = 0; k < SecondGrids; k++)
00246         {
00247             
if (LutTag == 
icSigLut8Type)
00248             {
00249                 lpTable = (
MEMPTR) (((
lpcpLut8Type) lpLut)->lut.data) +
00250                     nInputTable * nInputCh +
00251                     nNumbers * (i * SecondGrids + k);
00252             } 
else
00253             {
00254                 lpTable = (
MEMPTR) (((
lpcpLut16Type) lpLut)->lut.data) +
00255                     2 * nInputTable * nInputCh +
00256                     2 * nNumbers * (i * SecondGrids + k);
00257             }
00258 
00259             
if (LutTag == 
icSigLut8Type)
00260             {
00261                 
00262                 MemCopy(lpMem, lpTable, nNumbers);
00263                 lpMem += nNumbers;
00264             }
00265             
else
00266             {
00267                 
00268                 
for (j = 0; j < nNumbers; j++)
00269                 {
00270                     *lpMem++ = (
BYTE)(
ui16toSINT (lpTable) / 256);
00271                     lpTable += 
sizeof (
icUInt16Number);
00272                 }
00273             }
00274         }
00275     }
00276 
00277     *lpcbSize = (
DWORD) (lpMem - lpOldMem);
00278 
00279     
MemFree (hLut);
00280     
return (
TRUE);
00281 }
00282 
00283 
00284 HGLOBAL 
GetTRCData(CHANDLE cp,
00285         LPMEMPTR lpRed,  LPMEMPTR lpGreen,  LPMEMPTR lpBlue,
00286         LPSINT   lpnRed, LPSINT   lpnGreen, LPSINT   lpnBlue)
00287 {
00288     
SINT     RedTRCIndex, GreenTRCIndex, BlueTRCIndex;
00289     
SINT     RedTRCSize = 0, GreenTRCSize = 0, BlueTRCSize = 0;
00290     
SINT     MemSize;
00291     HGLOBAL  hMem;
00292 
00293  
00294     
if (!
GetTRCElementSize(cp, 
icSigRedTRCTag, &RedTRCIndex, &RedTRCSize) ||
00295         !
GetTRCElementSize(cp, 
icSigGreenTRCTag, &GreenTRCIndex, &GreenTRCSize) ||
00296         !
GetTRCElementSize(cp, 
icSigBlueTRCTag, &BlueTRCIndex, &BlueTRCSize))
00297     {
00298          
return 0;
00299     }
00300     MemSize = RedTRCSize + GreenTRCSize + BlueTRCSize;
00301     
if (!
MemAlloc (MemSize, (HGLOBAL 
FAR *)&hMem, (
LPMEMPTR) lpRed))
00302         
return 0;
00303 
00304     *lpGreen = *lpRed + RedTRCSize;
00305     *lpBlue = *lpGreen + GreenTRCSize;
00306     
if (!
GetCPElement (cp, RedTRCIndex, *lpRed, RedTRCSize) ||
00307         !
GetCPElement (cp, GreenTRCIndex, *lpGreen, GreenTRCSize ) ||
00308         !
GetCPElement (cp, BlueTRCIndex, *lpBlue, BlueTRCSize ))
00309     {
00310         
MemFree (hMem);
00311         
return (
NULL);
00312     }
00313     *lpnRed = 
ui32toSINT (((
lpcpCurveType) *lpRed)->curve.count);
00314     *lpnGreen = 
ui32toSINT (((
lpcpCurveType) *lpGreen)->curve.count);
00315     *lpnBlue = 
ui32toSINT (((
lpcpCurveType) *lpBlue)->curve.count);
00316 
00317     
return (hMem);
00318 }
00319 
00320 
00321 
static SINT
00322 CreateHostTRCInputTable(MEMPTR lpMem, LPHOSTCLUT lpHostClut,
00323                         MEMPTR lpRed, MEMPTR lpGreen, MEMPTR lpBlue)
00324 {
00325     
SINT    i;
00326     
PUSHORT lpPtr16;
00327     
MEMPTR  lpTable;
00328 
00329     lpPtr16 = (
PUSHORT)lpMem;
00330    
00331     lpHostClut->inputArray[0] = (
MEMPTR)lpPtr16;
00332     lpTable = (
MEMPTR)(((
lpcpCurveType) lpRed)->curve.data);
00333     
for (i = 0; i < (
SINT)(lpHostClut->inputEnt); i++)
00334     {
00335         *lpPtr16++ = (
USHORT) 
ui16toSINT(lpTable);
00336         lpTable += 
sizeof(
icUInt16Number);
00337     }
00338 
00339     lpHostClut->inputArray[1] = (
MEMPTR)lpPtr16;
00340     lpTable = (
MEMPTR)(((
lpcpCurveType) lpGreen)->curve.data);
00341     
for (i = 0; i < (
SINT)(lpHostClut->inputEnt); i++)
00342     {
00343         *lpPtr16++ = (
USHORT) 
ui16toSINT(lpTable);
00344         lpTable += 
sizeof(
icUInt16Number);
00345     }
00346 
00347     lpHostClut->inputArray[2] = (
MEMPTR)lpPtr16;
00348     lpTable = (
MEMPTR)(((
lpcpCurveType) lpBlue)->curve.data);
00349     
for (i = 0; i < (
SINT)(lpHostClut->inputEnt); i++)
00350     {
00351         *lpPtr16++ = (
USHORT) 
ui16toSINT(lpTable);
00352         lpTable += 
sizeof(
icUInt16Number);
00353     }
00354     
return ((
MEMPTR)lpPtr16 - lpMem);
00355 }
00356 
00357 
static SINT
00358 CreateHostRevTRCInputTable(MEMPTR lpMem, LPHOSTCLUT lpHostClut,
00359                            MEMPTR lpRed, MEMPTR lpGreen, MEMPTR lpBlue)
00360 {
00361     HGLOBAL   hTemp;
00362     
MEMPTR    lpTemp;
00363 
00364     
if (!
MemAlloc (lpHostClut->outputEnt * (
REVCURVE_RATIO + 1) * 2 ,
00365                   (HGLOBAL 
FAR *) &hTemp, (
LPMEMPTR) &lpTemp))
00366     {
00367         
return (0);
00368     }
00369 
00370     lpHostClut->outputArray[0] = lpMem;
00371     
GetRevCurve (lpRed, lpTemp, lpHostClut->outputArray[0]);
00372     lpHostClut->outputArray[1] = lpHostClut->outputArray[0] +
00373                                 2 * 
REVCURVE_RATIO * lpHostClut->outputEnt;
00374     
GetRevCurve (lpGreen, lpTemp, lpHostClut->outputArray[1]);
00375     lpHostClut->outputArray[2] = lpHostClut->outputArray[1] +
00376                                 2 * 
REVCURVE_RATIO * lpHostClut->outputEnt;
00377     
GetRevCurve (lpBlue, lpTemp, lpHostClut->outputArray[2]);
00378 
00379     
MemFree (hTemp);
00380     
return ( 2 * 
REVCURVE_RATIO * lpHostClut->outputEnt * 3);
00381 }
00382 
00383 
static BOOL
00384 GetHostMatrixCSAorCRD(CHANDLE cp, MEMPTR lpMem, LPDWORD lpcbSize, BOOL bCSA)
00385 {
00386     
SINT     nRedCount, nGreenCount, nBlueCount;
00387     
MEMPTR   lpRed = 
NULL,lpGreen, lpBlue;
00388     HGLOBAL  hMem;
00389     
LPHOSTCLUT lpHostClut;
00390     
MEMPTR   lpOldMem = lpMem;
00391     
double   pArray[9], pRevArray[9], pTemp[9];
00392     
SINT     i;
00393 
00394     hMem = 
GetTRCData(cp,
00395         (
LPMEMPTR)&lpRed, (
LPMEMPTR)&lpGreen, (
LPMEMPTR)&lpBlue,
00396         (
LPSINT)&nRedCount,(
LPSINT)&nGreenCount, (
LPSINT)&nBlueCount);
00397 
00398     
00399     *lpcbSize = (nRedCount + nGreenCount + nBlueCount) * 2 +
00400            
sizeof(
HOSTCLUT) + 1024;      
00401 
00402     
if (lpMem == 
NULL)                   
00403     {
00404         
MemFree (hMem);
00405         
return TRUE;
00406     }
00407 
00408     lpHostClut = (
LPHOSTCLUT)lpMem;
00409     lpMem += 
sizeof(
HOSTCLUT);
00410     lpHostClut->size = 
sizeof(
HOSTCLUT);
00411     lpHostClut->dataType = 
DATA_matrix;
00412     lpHostClut->clutPoints = 2;
00413     lpHostClut->pcs = 
icSigXYZData;
00414     
GetCPWhitePoint(cp, (
LPSFLOAT)lpHostClut->whitePoint);
00415 
00416     
if (bCSA)
00417     {
00418         lpHostClut->inputEnt = (
USHORT)nRedCount;
00419         lpHostClut->inputChan = 3;
00420         lpMem += 
CreateHostTRCInputTable(lpMem, lpHostClut,
00421                                          lpRed, lpGreen, lpBlue);
00422     }
00423     
else
00424     {
00425         lpHostClut->outputEnt = (
USHORT)nRedCount;
00426         lpHostClut->outputChan = 3;
00427         lpMem += 
CreateHostRevTRCInputTable(lpMem, lpHostClut,
00428                                             lpRed, lpGreen, lpBlue);
00429     }
00430 
00431     
MemFree (hMem);
00432     *lpcbSize = (
DWORD) (lpMem - lpOldMem);
00433 
00434     
if (!
CreateColorantArray(cp, &pTemp[0], 
icSigRedColorantTag) ||
00435         !
CreateColorantArray(cp, &pTemp[3], 
icSigGreenColorantTag) ||
00436         !
CreateColorantArray(cp, &pTemp[6], 
icSigBlueColorantTag))
00437     {
00438        
return (
FALSE);
00439     }
00440 
00441     
for (i = 0; i < 9; i++)
00442     {
00443         pArray[i] = pTemp[i/8*8 + i*3%8];
00444     }
00445 
00446     
if (bCSA)
00447     {
00448         
for (i = 0; i < 9; i++)
00449             lpHostClut->e[i] = (
float)pArray[i];
00450     }
00451     
else
00452     {
00453         
InvertMatrix(pArray, pRevArray);
00454         
for (i = 0; i < 9; i++)
00455             lpHostClut->e[i] = (
float)pRevArray[i];
00456     }
00457 
00458     
return TRUE;
00459 }
00460 
00461 
00462 
00463 
00464 
00465 
00466 
00467 
00468 
00469 
00470 
00471 
00472 
00473 
00474 
00475 
00476 
00477 
00478 
BOOL
00479 
GetHostCSA_Intent (CHANDLE cp, MEMPTR lpBuffer, LPDWORD lpcbSize,
00480                    CSIG Intent, 
int Type)
00481 {
00482     
SINT Index;
00483     
BOOL Success = 
FALSE;
00484     
CSIG AToBxTag;
00485 
00486     
switch (
Intent)
00487     {
00488         
case icPerceptual:
00489             AToBxTag = 
icSigAToB0Tag;
00490             
break;
00491         
case icRelativeColorimetric:
00492         
case icAbsoluteColorimetric:
00493             
00494             AToBxTag = 
icSigAToB1Tag;
00495             
break;
00496         
case icSaturation:
00497             AToBxTag = 
icSigAToB2Tag;
00498             
break;
00499         
default:
00500             
return FALSE;
00501             
break;
00502     }
00503     
if (
DoesCPTagExist (cp, AToBxTag) &&
00504         
GetCPTagIndex (cp, AToBxTag, (LPSINT) & Index))
00505     {
00506         Success = 
GetHostCSA(cp, lpBuffer, lpcbSize, Intent, Index, Type);
00507     }
00508     
else if ((
DoesTRCAndColorantTagExist(cp)) &&
00509             (Type == 
TYPE_CIEBASEDDEF))
00510     {
00511         Success = 
GetHostMatrixCSAorCRD(cp, lpBuffer, lpcbSize, TRUE);
00512     }
00513 
00514     
return Success;
00515 }
00516 
00517 
00518 
00519 
00520 
00521 
00522 
00523 
00524 
00525 
00526 
00527 
00528 
00529 
00530 
00531 
static BOOL
00532 GetHostColorSpaceArray (CHANDLE cp, DWORD InputIntent,
00533                        MEMPTR  lpBuffer, LPDWORD lpcbSize)
00534 {
00535     
CSIG ColorSpace, 
Intent;
00536     
BOOL Success = 
FALSE;
00537 
00538     
if (!cp)
00539         
return Success;
00540 
00541     
if (!
GetCPDevSpace (cp, (
LPCSIG) & ColorSpace) ||
00542         !
GetCPRenderIntent (cp, (
LPCSIG) & 
Intent))
00543     {
00544         
return Success;
00545     }
00546     
if (InputIntent == 
icUseRenderingIntent)
00547         InputIntent = (
DWORD)
Intent;
00548 
00549     
if (!Success)
00550     {
00551         
switch (ColorSpace)
00552         {
00553             
case icSigRgbData:
00554                 Success = 
GetHostCSA_Intent (cp, lpBuffer, lpcbSize,
00555                           (
CSIG) InputIntent, 
TYPE_CIEBASEDDEF);
00556                 
break;
00557             
case icSigCmykData:
00558                 Success = 
GetHostCSA_Intent (cp, lpBuffer, lpcbSize,
00559                           (
CSIG) InputIntent, 
TYPE_CIEBASEDDEFG);
00560                 
break;
00561             
default:
00562                 
break;
00563         }
00564     }
00565     
return Success;
00566 }
00567 
00568 
00569 
00570 
00571 
00572 
00573 
00574 
00575 
00576 
00577 
00578 
00579 
00580 
00581 
00582 
00583 
00584 
00585 
00586 
static SINT 
00587 CreateHostLutCRD (CHANDLE cp, SINT Index, MEMPTR lpMem, DWORD InputIntent)
00588 {
00589     
SINT     nInputCh, nOutputCh, nGrids;
00590     
SINT     nInputTable, nOutputTable, nNumbers;
00591     
CSIG     Tag, PCS;
00592     
CSIG     IntentSig;
00593 
00594     
SINT     Ret;
00595     
SINT     i, j;
00596     
MEMPTR   lpTable;
00597 
00598     
MEMPTR   Buff = 
NULL;
00599     
SINT     MemSize = 0;
00600     
MEMPTR   lpOldMem = lpMem;
00601     HGLOBAL  hMem;
00602     
LPHOSTCLUT  lpHostClut;
00603 
00604     
00605     
if (!
GetCPTagSig (cp, 
Index, (
LPCSIG) & IntentSig) ||
00606         !
GetCPElementType (cp, 
Index, (
LPCSIG) & Tag) ||
00607         ((Tag != 
icSigLut8Type) && (Tag != 
icSigLut16Type)) ||
00608         !
GetCPConnSpace (cp, (
LPCSIG) & PCS) ||
00609         !
GetCPElementSize (cp, 
Index, (
LPSINT) & MemSize) ||
00610         !
MemAlloc (MemSize, (HGLOBAL 
FAR *)&hMem, (
LPMEMPTR) & Buff) ||
00611         !
GetCPElement (cp, 
Index, Buff, MemSize))
00612     {
00613         
if (
NULL != Buff)
00614         {
00615             
MemFree (hMem);
00616         }
00617         
return (0);
00618     }
00619 
00620     
GetCLUTinfo(Tag, Buff, &nInputCh, &nOutputCh, 
00621                 &nGrids, &nInputTable, &nOutputTable, &i);
00622 
00623     
if (((nOutputCh != 3) && (nOutputCh != 4)) ||
00624         (nInputCh != 3))
00625     {
00626         
SetCPLastError (
CP_POSTSCRIPT_ERR);
00627         
MemFree (hMem);
00628         
return (0);
00629     }
00630 
00631     
00632     
if (lpMem == 
NULL)       
00633     {
00634         Ret = nInputCh * nInputTable * i         +  
00635             nOutputCh * nOutputTable * i         +  
00636             nOutputCh * nGrids * nGrids * nGrids +  
00637             
sizeof(
HOSTCLUT)                     +  
00638             1024;                                   
00639 
00640         
MemFree (hMem);
00641         
return (Ret);
00642     }
00643      
00644     
00645     lpHostClut = (
LPHOSTCLUT)lpMem;
00646     lpMem += 
sizeof(
HOSTCLUT);
00647     lpHostClut->size = 
sizeof(
HOSTCLUT);
00648     lpHostClut->pcs = PCS;
00649     lpHostClut->intent = InputIntent;
00650     lpHostClut->lutBits = (Tag == 
icSigLut8Type)? 8:16;
00651 
00652     
GetCPWhitePoint (cp, (
LPSFLOAT)lpHostClut->whitePoint);          
00653 
00654     
00655     
if (!
GetCPMediaWhitePoint (cp, (
LPSFLOAT)lpHostClut->mediaWP)) 
00656     {
00657         lpHostClut->mediaWP[0] = lpHostClut->whitePoint[0];
00658         lpHostClut->mediaWP[1] = lpHostClut->whitePoint[1];
00659         lpHostClut->mediaWP[2] = lpHostClut->whitePoint[2];
00660     }
00661     lpHostClut->inputChan = (
unsigned char)nInputCh;
00662     lpHostClut->outputChan = (
unsigned char)nOutputCh;
00663     lpHostClut->clutPoints = (
unsigned char)nGrids;
00664     lpHostClut->inputEnt = (
USHORT)nInputTable;
00665     lpHostClut->outputEnt = (
USHORT)nOutputTable;
00666 
00667 
00668     lpMem += 
CreateHostInputOutputArray (lpMem, lpHostClut->inputArray, 
00669              nInputCh, nInputTable, 0, Tag, Buff);
00670 
00671     i = nInputTable * nInputCh +
00672         nGrids * nGrids * nGrids * nOutputCh;
00673 
00674     lpMem += 
CreateHostInputOutputArray (lpMem, lpHostClut->outputArray, 
00675              nOutputCh, nOutputTable, i, Tag, Buff);
00676 
00677     
if (PCS == 
icSigXYZData)
00678     {
00679         
if (Tag == 
icSigLut8Type)
00680         {
00681             lpTable = (
MEMPTR) & ((
lpcpLut8Type) Buff)->lut.e00;
00682         } 
else
00683         {
00684             lpTable = (
MEMPTR) & ((
lpcpLut16Type) Buff)->lut.e00;
00685         }
00686         
for (i = 0; i < 9; i++)
00687         {
00688             lpHostClut->e[i] = (
float)((
si16f16toSFLOAT (lpTable)) / 
CIEXYZRange);
00689             lpTable += 
sizeof (
icS15Fixed16Number);
00690         }
00691     }
00692 
00693     nNumbers = nGrids * nGrids * nOutputCh;
00694     lpHostClut->clut = lpMem;
00695     
for (i = 0; i < nGrids; i++)        
00696     {
00697         
if (Tag == 
icSigLut8Type)
00698         {
00699             lpTable = (
MEMPTR) (((
lpcpLut8Type) Buff)->lut.data) +
00700                 nInputTable * nInputCh +
00701                 nNumbers * i;
00702         } 
else
00703         {
00704             lpTable = (
MEMPTR) (((
lpcpLut16Type) Buff)->lut.data) +
00705                 2 * nInputTable * nInputCh +
00706                 2 * nNumbers * i;
00707         }
00708         
if (Tag == 
icSigLut8Type)
00709         {
00710             MemCopy(lpMem, lpTable, nNumbers);
00711             lpMem += nNumbers;
00712         }
00713         
else
00714         {
00715             
for (j = 0; j < nNumbers; j++)
00716             {
00717                 *lpMem++ = (
BYTE)(
ui16toSINT (lpTable) / 256);
00718                 lpTable += 
sizeof (
icUInt16Number);
00719             }
00720         }
00721     }
00722 
00723     
MemFree (hMem);
00724     
return ((
SINT) ((
unsigned long) (lpMem - lpOldMem)));
00725 }
00726 
00727 
00728 
00729 
00730 
00731 
00732 
00733 
00734 
00735 
00736 
00737 
00738 
00739 
00740 
00741 
00742 
00743 
00744 
static BOOL
00745 GetHostColorRenderingDictionary (CHANDLE cp, DWORD Intent,
00746                                 MEMPTR lpMem, LPDWORD lpcbSize)
00747 {
00748     
SINT Index;
00749     
CSIG BToAxTag;
00750 
00751     
if (!cp)
00752         
return FALSE;
00753 
00754     
if ((lpMem == 
NULL) || (*lpcbSize == 0))
00755     {
00756         lpMem = 
NULL;
00757         *lpcbSize = 0;
00758     }
00759 
00760     
switch (
Intent)
00761     {
00762         
case icPerceptual:
00763             BToAxTag = 
icSigBToA0Tag;
00764             
break;
00765 
00766         
case icRelativeColorimetric:
00767         
case icAbsoluteColorimetric:
00768             
00769             BToAxTag = 
icSigBToA1Tag;
00770             
break;
00771 
00772         
case icSaturation:
00773             BToAxTag = 
icSigBToA2Tag;
00774             
break;
00775 
00776         
default:
00777            *lpcbSize = (
DWORD) 0;
00778             
return FALSE;
00779     }
00780 
00781     
if (
DoesCPTagExist (cp, BToAxTag) &&
00782         
GetCPTagIndex (cp, BToAxTag, (
LPSINT) & 
Index))
00783     {
00784         *lpcbSize = 
CreateHostLutCRD (cp, 
Index, lpMem, 
Intent);
00785     }
00786     
else if(
DoesTRCAndColorantTagExist(cp))
00787     {
00788         
GetHostMatrixCSAorCRD(cp, lpMem, lpcbSize, 
FALSE);
00789     }
00790     
return (*lpcbSize > 0);
00791 }
00792 
00793 
00794 
00795 
00796 
00797 
00798 
00799 
00800 
00801 
00802 
00803 
00804 
00805 
00806 static float g(
float f)
00807 {
00808     
float frc;
00809     
if (f >= (6/29))
00810     {
00811         frc = f * f * f;
00812     }
00813     
else
00814     {
00815         frc = f - (4.0f / 29.0f) * (108.0f / 841.0f);
00816     }
00817     
return frc;
00818 }
00819 
00820 
00821 
00822 
00823 
00824 
00825 
00826 
00827 
00828 
00829 static float inverse_g(
float f)
00830 {
00831     
double frc;
00832     
if (f >= (6.0*6.0*6.0)/(29.0*29.0*29.0))
00833     {
00834         frc = pow(f, 1.0 / 3.0);
00835     }
00836     
else
00837     {
00838         frc = f * (841.0 / 108.0) + (4.0 / 29.0);
00839     }
00840     
return (
float)frc;
00841 }
00842 
00843 
00844 
00845 
static BOOL
00846 TableInterp3(LPHOSTCLUT lpHostClut, 
float far *fTemp)
00847 {
00848     
int    tmpA, tmpBC;
00849     
int    cellA, cellB, cellC;
00850     
float  a, b, 
c;
00851     
short  Grids;
00852     
short  outputChan;
00853     
MEMPTR v000, v001, v010, v011;
00854     
MEMPTR v100, v101, v110, v111;
00855     
float  vx0x, vx1x;
00856     
float  v0xx, v1xx;
00857     
int    idx;
00858 
00859     cellA = (
int)(fTemp[0]);
00860     a = fTemp[0] - cellA;
00861 
00862     cellB = (
int)(fTemp[1]);
00863     b = fTemp[1] - cellB;
00864 
00865     cellC = (
int)(fTemp[2]);
00866     
c = fTemp[2] - cellC;
00867 
00868     Grids = lpHostClut->clutPoints;
00869     outputChan = lpHostClut->outputChan;
00870     tmpA  = outputChan * Grids * Grids; 
00871     tmpBC = outputChan * (Grids * cellB + cellC);
00872 
00873     
00874     v000 = lpHostClut->clut + tmpA * cellA + tmpBC;
00875     v001 = (cellC < (Grids - 1))? v000 + outputChan : v000;
00876     v010 = (cellB < (Grids - 1))? v000 + outputChan * Grids : v000;
00877     v011 = (cellC < (Grids - 1))? v010 + outputChan : v010 ;
00878 
00879     v100 = (cellA < (Grids - 1))? v000 + tmpA : v000;
00880     v101 = (cellC < (Grids - 1))? v100 + outputChan : v100;
00881     v110 = (cellB < (Grids - 1))? v100 + outputChan * Grids : v100;
00882     v111 = (cellC < (Grids - 1))? v110 + outputChan : v110;
00883 
00884     
for (idx = 0; idx < outputChan; idx++)
00885     {
00886         
00887         vx0x = *v000 + 
c * (
int)((
int)*v001 - (
int)*v000);
00888         vx1x = *v010 + 
c * (
int)((
int)*v011 - (
int)*v010);
00889         v0xx = vx0x + b * (vx1x - vx0x);
00890 
00891         
00892         vx0x = *v100 + 
c * (
int)((
int)*v101 - (
int)*v100);
00893         vx1x = *v110 + 
c * (
int)((
int)*v111 - (
int)*v110);
00894         v1xx = vx0x + b * (vx1x - vx0x);
00895 
00896         
00897         fTemp[idx] = (v0xx + a * (v1xx - v0xx)) / 
MAXCOLOR8;
00898 
00899         
if ( idx < (outputChan - 1))
00900         {
00901             v000++;
00902             v001++;
00903             v010++;
00904             v011++;
00905             v100++;
00906             v101++;
00907             v110++;
00908             v111++;
00909         }
00910     }
00911 
00912     
return TRUE;
00913 }
00914 
00915 
static BOOL
00916 TableInterp4(LPHOSTCLUT lpHostClut, 
float far *fTemp)
00917 {
00918     
int    tmpH, tmpI, tmpJK;
00919     
int    cellH, cellI, cellJ, cellK;
00920     
float  h, i, j, k;
00921     
short  Grids;
00922     
short  outputChan;
00923     
MEMPTR v0000, v0001, v0010, v0011;
00924     
MEMPTR v0100, v0101, v0110, v0111;
00925     
MEMPTR v1000, v1001, v1010, v1011;
00926     
MEMPTR v1100, v1101, v1110, v1111;
00927     
float  vxx0x, vxx1x;
00928     
float  vx0xx, vx1xx;
00929     
float  v0xxx, v1xxx;
00930     
int    idx;
00931 
00932     cellH = (
int)(fTemp[0]);
00933     h = fTemp[0] - cellH;
00934 
00935     cellI = (
int)(fTemp[1]);
00936     i = fTemp[1] - cellI;
00937 
00938     cellJ = (
int)(fTemp[2]);
00939     j = fTemp[2] - cellJ;
00940 
00941     cellK = (
int)(fTemp[3]);
00942     k = fTemp[3] - cellK;
00943 
00944     Grids = lpHostClut->clutPoints;
00945     outputChan = lpHostClut->outputChan;
00946     tmpI  = outputChan * Grids * Grids;
00947     tmpH  = tmpI * Grids; 
00948     tmpJK = outputChan * (Grids * cellJ + cellK);
00949 
00950     
00951     v0000 = lpHostClut->clut + tmpH * cellH + tmpI * cellI + tmpJK;
00952     v0001 = (cellK < (Grids - 1))? v0000 + outputChan : v0000;
00953     v0010 = (cellJ < (Grids - 1))? v0000 + outputChan * Grids : v0000;
00954     v0011 = (cellK < (Grids - 1))? v0010 + outputChan : v0010;
00955 
00956     v0100 = (cellI < (Grids - 1))? v0000 + tmpI : v0000;
00957     v0101 = (cellK < (Grids - 1))? v0100 + outputChan : v0100;
00958     v0110 = (cellJ < (Grids - 1))? v0100 + outputChan * Grids : v0100;
00959     v0111 = (cellK < (Grids - 1))? v0110 + outputChan : v0110;
00960 
00961     v1000 = (cellH < (Grids - 1))? v0000 + tmpH : v0000;
00962     v1001 = (cellK < (Grids - 1))? v1000 + outputChan : v1000;
00963     v1010 = (cellJ < (Grids - 1))? v1000 + outputChan * Grids : v1000;
00964     v1011 = (cellK < (Grids - 1))? v1010 + outputChan : v1010;
00965 
00966     v1100 = (cellI < (Grids - 1))? v1000 + tmpI : v1000;
00967     v1101 = (cellK < (Grids - 1))? v1100 + outputChan : v1100;
00968     v1110 = (cellJ < (Grids - 1))? v1100 + outputChan * Grids : v1100;
00969     v1111 = (cellK < (Grids - 1))? v1110 + outputChan : v1110;
00970 
00971     
for (idx = 0; idx < outputChan; idx++)
00972     {
00973         
00974         vxx0x = *v0000 + k * (
int)((
int)*v0001 - (
int)*v0000);
00975         vxx1x = *v0010 + k * (
int)((
int)*v0011 - (
int)*v0010);
00976         vx0xx = vxx0x + j * (vxx1x - vxx0x);
00977         vxx0x = *v0100 + k * (
int)((
int)*v0101 - (
int)*v0100);
00978         vxx1x = *v0110 + k * (
int)((
int)*v0111 - (
int)*v0110);
00979         vx1xx = vxx0x + j * (vxx1x - vxx0x);
00980         v0xxx = vx0xx + i * (vx1xx - vx0xx);
00981 
00982         
00983         vxx0x = *v1000 + k * (
int)((
int)*v1001 - (
int)*v1000);
00984         vxx1x = *v1010 + k * (
int)((
int)*v1011 - (
int)*v1010);
00985         vx0xx = vxx0x + j * (vxx1x - vxx0x);
00986         vxx0x = *v1100 + k * (
int)((
int)*v1101 - (
int)*v1100);
00987         vxx1x = *v1110 + k * (
int)((
int)*v1111 - (
int)*v1110);
00988         vx1xx = vxx0x + j * (vxx1x - vxx0x);
00989         v1xxx = vx0xx + i * (vx1xx - vx0xx);
00990 
00991         
00992         fTemp[idx] = (v0xxx + h * (v1xxx - v0xxx)) / 
MAXCOLOR8;
00993 
00994         
if ( idx < (outputChan - 1))
00995         {
00996             v0000++;
00997             v0001++;
00998             v0010++;
00999             v0011++;
01000             v0100++;
01001             v0101++;
01002             v0110++;
01003             v0111++;
01004             v1000++;
01005             v1001++;
01006             v1010++;
01007             v1011++;
01008             v1100++;
01009             v1101++;
01010             v1110++;
01011             v1111++;
01012         }
01013     }
01014 
01015     
return TRUE;
01016 }
01017 
01018 
01019 
01020 
01021 
01022 
01023 
01024 
01025 
01026 
01027 
01028 
01029 
01030 
01031 
static BOOL
01032 CheckColorLookupTable(LPHOSTCLUT lpHostClut, 
float far *fTemp) 
01033 {
01034     
if (lpHostClut->inputChan == 3)
01035     {
01036         
TableInterp3(lpHostClut, fTemp);
01037     }
01038     
else if(lpHostClut->inputChan == 4)
01039     {
01040         
TableInterp4(lpHostClut, fTemp);
01041     }
01042     
return TRUE;
01043 }
01044 
01045 
01046 
01047 
01048 
01049 
01050 
01051 
01052 
01053 
01054 
01055 
static BOOL
01056 CheckInputOutputTable(LPHOSTCLUT lpHostClut, 
float far *fTemp, 
01057                       BOOL bCSA, BOOL bInputTable) 
01058 {
01059     
int     i;
01060     
short   Grids;
01061     
USHORT  floor1, ceiling1;
01062     
float   fIndex;
01063     
int     numChan;
01064     
int     numEnt;
01065     
PMEMPTR ppArray;
01066 
01067     
if (bInputTable)
01068     {
01069         numChan = lpHostClut->inputChan;
01070         numEnt = lpHostClut->inputEnt - 1;
01071         ppArray = lpHostClut->inputArray;
01072     }
01073     
else
01074     {
01075         numChan = lpHostClut->outputChan;
01076         numEnt = lpHostClut->outputEnt - 1;
01077         ppArray = lpHostClut->outputArray;
01078     }
01079 
01080     Grids = lpHostClut->clutPoints;
01081     
for (i = 0; (i <= 
MAXCHANNELS) && (i < numChan); i++)
01082     {
01083         fTemp[i] = (fTemp[i] < 0)? 0: ((fTemp[i] > 1)? 1: fTemp[i]);
01084         fIndex = fTemp[i] * numEnt;
01085         
if (lpHostClut->lutBits == 8)
01086         {
01087             floor1 = ppArray[i][(
int)fIndex];
01088             ceiling1 = ppArray[i][((
int)fIndex) + 1];
01089             fTemp[i] = (
float)(floor1 + (ceiling1 - floor1) * (fIndex - floor(fIndex)));
01090             
if (bCSA && !bInputTable)
01091                 fTemp[i] = (
float)(fTemp[i] / 127.0);
01092             
else
01093                 fTemp[i] = (
float)(fTemp[i] / 255.0);
01094         }
01095         
else
01096         {
01097             floor1 = ((
PUSHORT)(ppArray[i]))[(
int)fIndex];
01098             ceiling1 = ((
PUSHORT)(ppArray[i]))[((
int)fIndex) + 1];
01099             fTemp[i] = (
float)(floor1 + (ceiling1 - floor1) * (fIndex - floor(fIndex)));
01100             
if (bCSA && !bInputTable)
01101                 fTemp[i] = (
float)(fTemp[i] / 32767.0);
01102             
else
01103                 fTemp[i] = (
float)(fTemp[i] / 65535.0);
01104 
01105         }
01106         
if (bInputTable)
01107         {
01108             fTemp[i] *= (Grids - 1);
01109             
if (fTemp[i] > (Grids - 1))
01110                 fTemp[i] = (
float)(Grids - 1);
01111         }
01112     }
01113     
return TRUE;
01114 }
01115 
01116 
static void
01117 LabToXYZ(
float far *Input, 
float far *Output, 
float far *whitePoint)
01118 {
01119     
float   fL, fa, fb;
01120 
01121     fL = (Input[0] * 50 + 16) / 116;
01122     fa = (Input[1] * 128 - 128) / 500;
01123     fb = (Input[2] * 128 - 128) / 200;
01124     Output[0] = whitePoint[0] * 
g(fL + fa);
01125     Output[1] = whitePoint[1] * 
g(fL);
01126     Output[2] = whitePoint[2] * 
g(fL - fb);
01127 }
01128 
01129 
static void
01130 XYZToLab(
float far *Input, 
float far *Output, 
float far *whitePoint)
01131 {
01132     
float   fL, fa, fb;
01133 
01134     fL = 
inverse_g(Input[0] / whitePoint[0]);
01135     fa = 
inverse_g(Input[1] / whitePoint[1]);
01136     fb = 
inverse_g(Input[2] / whitePoint[2]);
01137     Output[0] = (fa * 116 - 16) / 100;
01138     Output[1] = (fL * 500 - fa * 500 + 128) / 255;
01139     Output[2] = (fa * 200 - fb * 200 + 128) / 255;
01140 }
01141 
01142 
static void
01143 ApplyMatrix(PFLOAT e, 
float far *Input, 
float far *Output)
01144 {
01145     
SINT  i, j;
01146 
01147     
for (i = 0; i < 3; i++)
01148     {
01149         j = i*3;
01150         Output[i] = e[j ]    * Input[0] +
01151                     e[j + 1] * Input[1] +
01152                     e[j + 2] * Input[2];
01153     }
01154 }
01155 
01156 
01157 
01158 
01159 
01160 
01161 
01162 
01163 
01164 
01165 
01166 
01167 
01168 
static BOOL
01169 DoHostConversionCRD (LPHOSTCLUT lpHostCRD, LPHOSTCLUT lpHostCSA,
01170                      
float far *Input, 
float far *Output,
01171                      CSIG ColorSpace, BOOL bCheckOutputTable)
01172 {
01173     
float   fTemp[
MAXCHANNELS];
01174     
float   fTemp1[
MAXCHANNELS];
01175     
int     i;
01176 
01180     
01181     
01182     
01183     
if (lpHostCSA)
01184     {
01185         
01186         
if ((lpHostCRD->pcs == 
icSigXYZData) && 
01187             (lpHostCSA->pcs == 
icSigLabData))
01188         {
01189             
LabToXYZ(Input, fTemp1, lpHostCRD->whitePoint);
01190         }
01191         
01192         
else if ((lpHostCRD->pcs == 
icSigLabData) && 
01193                  (lpHostCSA->pcs == 
icSigXYZData))
01194         {
01195             
XYZToLab(Input, fTemp, lpHostCSA->whitePoint);
01196         }
01197         
01198         
else if ((lpHostCRD->pcs == 
icSigLabData) && 
01199                  (lpHostCSA->pcs == 
icSigLabData))
01200         {
01201             
for (i = 0; i < 3; i++)
01202                 fTemp[i] = Input[i] / 2;
01203         }
01204         
01205         
else
01206         {   
01207             
01208             
01209             
for (i = 0; i < 3; i++)
01210                 fTemp1[i] = Input[i] * lpHostCRD->whitePoint[i] / lpHostCSA->whitePoint[i];
01211         }
01212  
01213         
01214         
if (lpHostCRD->pcs == 
icSigXYZData)
01215         {
01216             
ApplyMatrix(lpHostCRD->e, fTemp1, fTemp);
01217         }
01218      
01219         
if (lpHostCRD->dataType != 
DATA_matrix)
01220         {
01221             
01222             
CheckInputOutputTable(lpHostCRD, fTemp, 0, 1);
01223         }
01224     }
01225     
01226     
01227     
else
01228     {
01229         
short   Grids;
01230         Grids = lpHostCRD->clutPoints;
01231         
01232         
01233         
01234 
01235         
if (lpHostCRD->dataType == 
DATA_matrix)
01236         {
01237             
for (i = 0; i < 3; i++)
01238             {
01239                 fTemp[i] = Input[i];
01240             }
01241         }
01242         
else
01243         {
01244             
for (i = 0; i < 3; i++)
01245             {
01246                 fTemp[i] = Input[i]* (Grids - 1);
01247                 
if (fTemp[i] > (Grids - 1))
01248                     fTemp[i] = (
float)(Grids - 1);
01249             }
01250         }
01251     }   
01252 
01253     
if (lpHostCRD->dataType != 
DATA_matrix)
01254     {
01255         
01256         
CheckColorLookupTable(lpHostCRD, fTemp);
01257 
01261     }
01262     
if (bCheckOutputTable)
01263     {
01264         
01265         
CheckInputOutputTable(lpHostCRD, fTemp, 0, 0);
01266     }
01267     
for (i = 0; (i <= 
MAXCHANNELS) && (i < lpHostCRD->outputChan); i++)
01268     {
01269         Output[i] = fTemp[i];
01270     }
01271 
01272    
return TRUE;
01273 }
01274 
01275 
01276 
01277 
01278 
01279 
01280 
01281 
01282 
01283 
01284 
01285 
01286 
01287 
static BOOL
01288 DoHostConversionCSA (LPHOSTCLUT lpHostClut, 
float far *Input, 
float far *Output)
01289 {
01290     
float   fTemp[
MAXCHANNELS];
01291     
int     i;
01292 
01296     
for (i = 0; (i <= 
MAXCHANNELS) && (i < lpHostClut->inputChan); i++)
01297     {
01298         fTemp[i] = Input[i];
01299     }
01300 
01301     
if (lpHostClut->dataType == 
DATA_matrix)
01302     {
01303         
01304         
CheckInputOutputTable(lpHostClut, fTemp, 1, 1);
01305         
ApplyMatrix(lpHostClut->e, fTemp, Output);
01306     }
01307     
else
01308     {
01309         
01310         
CheckInputOutputTable(lpHostClut, fTemp, 1, 1);
01311 
01312         
01313         
CheckColorLookupTable(lpHostClut, fTemp);
01314 
01315         
01316         
CheckInputOutputTable(lpHostClut, fTemp, 1, 0 );
01317 
01321         
for (i = 0; (i <= 
MAXCHANNELS) && (i < lpHostClut->outputChan); i++)
01322         {
01323             Output[i] = fTemp[i];
01324         }
01325     }
01326 
01327     
return TRUE;
01328 }               
01329 
01330 
static BOOL
01331 GetCRDInputOutputArraySize(CHANDLE cp, DWORD Intent, 
01332     LPSINT lpInTbSize, LPSINT lpOutTbSize, 
01333     LPCSIG lpIntentTag, LPSINT lpGrids)
01334 {
01335     
CSIG    Tag;
01336     
SINT    Index;
01337     
SINT    Ret = 0;
01338     
MEMPTR  Buff = 
NULL;
01339     
SINT    MemSize = 0;
01340     HGLOBAL hMem;
01341     
SINT    outputChan, outputEnt;
01342     
SINT    inputChan, inputEnt;
01343     
SINT    Grids;
01344     
SINT    i;
01345 
01346     
switch (
Intent)
01347     {
01348         
case icPerceptual:
01349             *lpIntentTag = 
icSigBToA0Tag;
01350             
break;
01351 
01352         
case icRelativeColorimetric:
01353         
case icAbsoluteColorimetric:
01354             *lpIntentTag = 
icSigBToA1Tag;
01355             
break;
01356 
01357         
case icSaturation:
01358             *lpIntentTag = 
icSigBToA2Tag;
01359             
break;
01360 
01361         
default:
01362             
return FALSE;
01363     }
01364     
if (!
DoesCPTagExist (cp, *lpIntentTag) ||
01365         !
GetCPTagIndex (cp, *lpIntentTag, (
LPSINT) & 
Index) ||
01366         !
GetCPElementType (cp, 
Index, (
LPCSIG) & Tag) ||
01367         ((Tag != 
icSigLut8Type) && (Tag != 
icSigLut16Type)) ||
01368         !
GetCPElementSize (cp, 
Index, (
LPSINT) & MemSize) ||
01369         !
MemAlloc (MemSize, (HGLOBAL 
FAR *)&hMem, (
LPMEMPTR) & Buff) ||
01370         !
GetCPElement (cp, 
Index, Buff, MemSize))
01371     {
01372         
BOOL retVal = 
FALSE;
01373 
01374         
if (
NULL != Buff)
01375         {
01376             
MemFree (hMem);
01377         }
01378 
01379         
01380 
01381         *lpGrids = 2;
01382         
if (lpInTbSize)
01383         {
01384             retVal = 
GetHostCSA_Intent (cp, 
NULL, lpInTbSize,
01385                           (
CSIG) 
Intent, 
TYPE_CIEBASEDDEF);
01386             *lpInTbSize = *lpInTbSize * 3;
01387         }
01388         
if (lpOutTbSize)
01389         {
01390             retVal = 
GetHostCSA_Intent (cp, 
NULL, lpOutTbSize,
01391                           (
CSIG) 
Intent, 
TYPE_CIEBASEDDEF);
01392             *lpOutTbSize = *lpOutTbSize * 3;
01393         }
01394         
return retVal;
01395     }
01396 
01397     
if (lpInTbSize)
01398     {
01399         
GetCLUTinfo(Tag, Buff, &inputChan, &outputChan, 
01400                 &Grids, &inputEnt, &outputEnt, &i);
01401 
01402         
if (inputChan != 3)
01403         {
01404             
MemFree (hMem);
01405             
return FALSE;
01406         }
01407 
01408         *lpInTbSize = inputChan * inputEnt * 6;  
01409         *lpGrids = Grids;
01410     }
01411 
01412     
if (lpOutTbSize)
01413     {
01414         
GetCLUTinfo(Tag, Buff, &inputChan, &outputChan, 
01415                 &Grids, &inputEnt, &outputEnt, &i);
01416 
01417         
if ((outputChan != 3) && (outputChan != 4))
01418         {
01419             
MemFree (hMem);
01420             
return FALSE;
01421         }
01422         *lpOutTbSize = outputChan * outputEnt * 6; 
01423         *lpGrids = Grids;
01424     }
01425 
01426     
MemFree (hMem);
01427     
return TRUE;
01428 }
01429 
01430 
01431 
01432 
01433 
01434 
01435 
01436 
01437 
01438 
01439 
01440 
01441 
01442 
01443 
01444 
01445 
01446 
01447 
01448 
01449 
01450 
01451 
SINT
01452 CreateOutputArray (MEMPTR lpMem, SINT nOutputCh, 
01453     SINT nOutputTable, SINT Offset, MEMPTR Intent, 
01454     CSIG Tag, MEMPTR Buff, BOOL AllowBinary, MEMPTR lpHostClut)
01455 {
01456     
SINT i, j;
01457     
MEMPTR lpOldMem;
01458     
MEMPTR lpTable;
01459     
MEMPTR lpLineStart;
01460     lpOldMem = lpMem;
01461 
01462     
if (lpHostClut)
01463     {
01464         nOutputCh = (
SINT)(((
LPHOSTCLUT)lpHostClut)->outputChan);
01465         nOutputTable = (
SINT)(((
LPHOSTCLUT)lpHostClut)->outputEnt);
01466         Tag = (((
LPHOSTCLUT)lpHostClut)->lutBits == 8)? 
01467               
icSigLut8Type : 
icSigLut16Type;
01468     }
01469 
01470     
for (i = 0; i < nOutputCh; i++)
01471     {
01472         lpLineStart = lpMem;
01473         lpMem += 
WriteNewLineObject (lpMem, 
Slash);
01474         
if (lpHostClut)
01475             lpMem += 
WriteObject (lpMem, 
PreViewOutArray);
01476         
else
01477             lpMem += 
WriteObject (lpMem, 
OutputArray);
01478         lpMem += 
WriteObjectN (lpMem, 
Intent, lstrlen (
Intent));
01479         lpMem += 
WriteInt (lpMem, i);
01480         
01481         
if (lpHostClut)
01482             lpTable = ((
LPHOSTCLUT)lpHostClut)->outputArray[i];
01483         
else
01484         {
01485             
if (Tag == 
icSigLut8Type)
01486                 lpTable = (
MEMPTR) (((
lpcpLut8Type) Buff)->lut.data) +
01487                     
Offset +
01488                     nOutputTable * i;
01489             
else
01490                 lpTable = (
MEMPTR) (((
lpcpLut16Type) Buff)->lut.data) +
01491                     2 * 
Offset +
01492                     2 * nOutputTable * i;
01493         }
01494 
01495         
if (!
AllowBinary)               
01496         {
01497             
if (Tag == 
icSigLut8Type)
01498             {
01499                 lpMem += 
WriteObject (lpMem, 
BeginString);
01500                 lpMem += 
WriteHexBuffer (lpMem, lpTable, lpLineStart, nOutputTable);
01501                 lpMem += 
WriteObject (lpMem, 
EndString);
01502             } 
else
01503             {
01504                 lpMem += 
WriteObject (lpMem, 
BeginArray);
01505                 
for (j = 0; j < nOutputTable; j++)
01506                 {
01507                     
if (lpHostClut)
01508                         lpMem += 
WriteInt (lpMem, *((
PUSHORT)lpTable));
01509                     
else
01510                         lpMem += 
WriteInt (lpMem, 
ui16toSINT (lpTable));
01511                     lpTable += 
sizeof (
icUInt16Number);
01512                     
if (((
SINT) (lpMem - lpLineStart)) > 
MAX_LINELENG)
01513                     {
01514                         lpLineStart = lpMem;
01515                         lpMem += 
WriteObject (lpMem, 
NewLine);
01516                     }
01517                 }
01518                 lpMem += 
WriteObject (lpMem, 
EndArray);
01519             }
01520         } 
else
01521         {                               
01522             
if (Tag == 
icSigLut8Type)
01523             {
01524                 lpMem += 
WriteStringToken (lpMem, 143, 256);
01525                 lpMem += 
WriteByteString (lpMem, lpTable, 256
L);
01526             } 
else
01527             {
01528                 lpMem += 
WriteHNAToken (lpMem, 149, nOutputTable);
01529                 
if (lpHostClut)
01530                     lpMem += 
WriteIntStringU2S_L (lpMem, lpTable, nOutputTable);
01531                 
else
01532                     lpMem += 
WriteIntStringU2S (lpMem, lpTable, nOutputTable);
01533             }
01534         }
01535         lpMem += 
WriteObject (lpMem, 
DefOp);
01536     }
01537 
01538     
return ((
SINT) (lpMem - lpOldMem));
01539 }
01540 
01541 
01542 
01543 
01544 
01545 
01546 
01547 
01548 
01549 
01550 
01551 
01552 
01553 
01554 
01555 
01556 
01557 
01558 
01559 
01560 
01561 
01562 
SINT
01563 CreateInputArray (MEMPTR lpMem, SINT nInputCh, 
01564     SINT nInputTable, MEMPTR Intent, CSIG Tag, 
01565     MEMPTR Buff, BOOL bAllowBinary, MEMPTR lpHostClut)
01566 {
01567     
SINT i, j;
01568     
MEMPTR lpOldMem;
01569     
MEMPTR lpTable;
01570     
MEMPTR lpLineStart;
01571     lpOldMem = lpMem;
01572 
01573     
if (lpHostClut)
01574     {
01575         nInputCh = (
SINT)(((
LPHOSTCLUT)lpHostClut)->inputChan);
01576         nInputTable = (
SINT)(((
LPHOSTCLUT)lpHostClut)->inputEnt);
01577         Tag = (((
LPHOSTCLUT)lpHostClut)->lutBits == 8)? 
01578                
icSigLut8Type : 
icSigLut16Type;
01579     }
01580 
01581     
for (i = 0; i < nInputCh; i++)
01582     {
01583         lpLineStart = lpMem;
01584         lpMem += 
WriteNewLineObject (lpMem, 
Slash);
01585         
if (lpHostClut)
01586             lpMem += 
WriteObject (lpMem, 
PreViewInArray);
01587         
else
01588             lpMem += 
WriteObject (lpMem, 
InputArray);
01589         lpMem += 
WriteObjectN (lpMem, 
Intent, lstrlen (
Intent));
01590         lpMem += 
WriteInt (lpMem, i);
01591 
01592         
if (lpHostClut)
01593         {
01594             lpTable = ((
LPHOSTCLUT)lpHostClut)->inputArray[i];
01595         }
01596         
else
01597         {
01598             
if (Tag == 
icSigLut8Type)
01599                 lpTable = (
MEMPTR) (((
lpcpLut8Type) Buff)->lut.data) + nInputTable * i;
01600             
else
01601                 lpTable = (
MEMPTR) (((
lpcpLut16Type) Buff)->lut.data) + 2 * nInputTable * i;
01602         }
01603         
if (!bAllowBinary)               
01604         {
01605             
if (Tag == 
icSigLut8Type)
01606             {
01607                 lpMem += 
WriteObject (lpMem, 
BeginString);
01608                 lpMem += 
WriteHexBuffer (lpMem, lpTable,lpLineStart, nInputTable);
01609                 lpMem += 
WriteObject (lpMem, 
EndString);
01610             } 
else
01611             {
01612                 lpMem += 
WriteObject (lpMem, 
BeginArray);
01613                 
for (j = 0; j < nInputTable; j++)
01614                 {
01615                     
if(lpHostClut)
01616                         lpMem += 
WriteInt (lpMem, *((
PUSHORT)lpTable));
01617                     
else
01618                         lpMem += 
WriteInt (lpMem, 
ui16toSINT (lpTable));
01619                     lpTable += 
sizeof (
icUInt16Number);
01620                     
if (((
SINT) (lpMem - lpLineStart)) > 
MAX_LINELENG)
01621                     {
01622                         lpLineStart = lpMem;
01623                         lpMem += 
WriteObject (lpMem, 
NewLine);
01624                     }
01625                 }
01626                 lpMem += 
WriteObject (lpMem, 
EndArray);
01627             }
01628         } 
else
01629         {                               
01630             
if (Tag == 
icSigLut8Type)
01631             {
01632                 lpMem += 
WriteStringToken (lpMem, 143, 256);
01633                 lpMem += 
WriteByteString (lpMem, lpTable, 256
L);
01634             } 
else
01635             {
01636                 lpMem += 
WriteHNAToken (lpMem, 149, nInputTable);
01637                 
if (lpHostClut)
01638                     lpMem += 
WriteIntStringU2S_L (lpMem, lpTable, nInputTable);
01639                 
else
01640                     lpMem += 
WriteIntStringU2S (lpMem, lpTable, nInputTable);
01641             }
01642         }
01643         lpMem += 
WriteObject (lpMem, 
DefOp);
01644     }
01645 
01646     
return ((
SINT) (lpMem - lpOldMem));
01647 }
01648 
01649 
SINT
01650 SendCRDLMN(MEMPTR lpMem, CSIG Intent, LPSFLOAT whitePoint, LPSFLOAT mediaWP, CSIG pcs)
01651 {
01652     
MEMPTR  lpOldMem;
01653     
SINT    i, j;
01654 
01655     lpOldMem = lpMem;
01656 
01657 
01658     
if (
icAbsoluteColorimetric == 
Intent)
01659     {
01660         lpMem += 
WriteNewLineObject (lpMem, 
MatrixLMNTag);
01661 
01662         lpMem += 
WriteObject (lpMem, 
BeginArray);
01663         
for (i = 0; i < 3; i++)
01664         {
01665             
for (j = 0; j < 3; j++)
01666                 lpMem += 
WriteFloat (lpMem,
01667                     (
double) (i == j) ? whitePoint[i] / mediaWP[i] : 0.0);
01668         }
01669         lpMem += 
WriteObject (lpMem, 
EndArray);
01670     }
01671  
01672     lpMem += 
WriteNewLineObject (lpMem, 
RangeLMNTag);
01673     
if (
pcs == 
icSigXYZData)
01674     {
01675         lpMem += 
WriteObject (lpMem, 
BeginArray);
01676         
for (i = 0; i < 3; i++)
01677         {
01678             lpMem += 
WriteFloat (lpMem, (
double) 0);
01679             lpMem += 
WriteFloat (lpMem, (
double) whitePoint[i]);
01680         }
01681         lpMem += 
WriteObject (lpMem, 
EndArray);
01682     } 
else
01683     {
01684         lpMem += 
WriteObject (lpMem, 
RangeLMNLab);
01685     }
01686 
01687  
01688     lpMem += 
WriteNewLineObject (lpMem, 
EncodeLMNTag);
01689     lpMem += 
WriteObject (lpMem, 
BeginArray);
01690     
for (i = 0; i < 3; i++)
01691     {
01692         lpMem += 
WriteObject (lpMem, 
BeginFunction);
01693         
if (
pcs != 
icSigXYZData)
01694         {
01695             lpMem += 
WriteFloat (lpMem, (
double)whitePoint[i]);
01696             lpMem += 
WriteObject (lpMem, 
DivOp);
01697             lpMem += 
WriteObject (lpMem, 
EncodeLMNLab);
01698         }
01699         lpMem += 
WriteObject (lpMem, 
EndFunction);
01700     }
01701     lpMem += 
WriteObject (lpMem, 
EndArray);
01702 
01703     
return (
SINT)(lpMem - lpOldMem);
01704 }
01705 
01706 
01707 
SINT
01708 SendCRDPQR(MEMPTR lpMem, CSIG Intent, LPSFLOAT whitePoint)
01709 {
01710     
MEMPTR  lpOldMem;
01711     
SINT    i;
01712 
01713     lpOldMem = lpMem;
01714 
01715     
if (
icAbsoluteColorimetric != 
Intent)
01716     {
01717      
01718         lpMem += 
WriteNewLineObject (lpMem, 
RangePQRTag);
01719         lpMem += 
WriteObject (lpMem, 
RangePQR);
01720 
01721      
01722         lpMem += 
WriteNewLineObject (lpMem, 
MatrixPQRTag);
01723         lpMem += 
WriteObject (lpMem, 
MatrixPQR);
01724     }
01725     
else
01726     {
01727     
01728         lpMem += 
WriteNewLineObject (lpMem, 
RangePQRTag);
01729         lpMem += 
WriteObject (lpMem, 
BeginArray);
01730         
for (i = 0; i < 3; i++)
01731         {
01732             lpMem += 
WriteFloat (lpMem, (
double) 0);
01733             lpMem += 
WriteFloat (lpMem, (
double)(whitePoint[i]));
01734         }
01735         lpMem += 
WriteObject (lpMem, 
EndArray);
01736     
01737         lpMem += 
WriteNewLineObject (lpMem, 
MatrixPQRTag);
01738         lpMem += 
WriteObject (lpMem, 
Identity);
01739     }
01740 
01741     lpMem += 
WriteNewLineObject (lpMem, 
TransformPQRTag);
01742     lpMem += 
WriteObject (lpMem, 
BeginArray);
01743     
for (i = 0; i < 3; i++)
01744     {
01745         lpMem += 
WriteObject (lpMem, 
BeginFunction);
01746         lpMem += 
WriteObject (lpMem,
01747             (
icAbsoluteColorimetric != 
Intent) ? 
TransformPQR[i] : 
NullOp);
01748         lpMem += 
WriteObject (lpMem, 
EndFunction);
01749     }
01750     lpMem += 
WriteObject (lpMem, 
EndArray);
01751    
01752     
return (
SINT)(lpMem - lpOldMem);
01753 } 
01754 
01755 
SINT
01756 SendCRDABC(MEMPTR lpMem, MEMPTR PublicArrayName, CSIG pcs, SINT nInputCh,
01757            MEMPTR Buff, LPSFLOAT e, CSIG LutTag, BOOL bAllowBinary)
01758 {
01759     
MEMPTR  lpOldMem;
01760     
SINT    i, j;
01761     
double TempMatrixABC[9];
01762     
MEMPTR lpTable;
01763     
MEMPTR lpLineStart;
01764     lpOldMem = lpMem;
01765 
01766  
01767     lpMem += 
WriteNewLineObject (lpMem, 
RangeABCTag);
01768     lpMem += 
WriteObject (lpMem, 
RangeABC);
01769  
01770     lpMem += 
WriteNewLineObject (lpMem, 
MatrixABCTag);
01771     
if (
pcs == 
icSigXYZData)
01772     {
01773         lpMem += 
WriteObject (lpMem, 
BeginArray);
01774         
if (e)
01775         {
01776             
for (i = 0; i < 3; i++)
01777             {
01778                 
for (j = 0; j < 3; j++)
01779                 {
01780                     lpMem += 
WriteFloat (lpMem, e[i + j * 3]);
01781                 }
01782             }
01783         }
01784         
else
01785         {
01786             
if (LutTag == 
icSigLut8Type)
01787             {
01788                 lpTable = (
MEMPTR) & ((
lpcpLut8Type) Buff)->lut.e00;
01789             } 
else
01790             {
01791                 lpTable = (
MEMPTR) & ((
lpcpLut16Type) Buff)->lut.e00;
01792             }
01793             
for (i = 0; i < 9; i++)
01794             {
01795                 TempMatrixABC[i] = ((
double) 
si16f16toSFLOAT (lpTable)) / 
CIEXYZRange;
01796                 lpTable += 
sizeof (
icS15Fixed16Number);
01797             }
01798             
for (i = 0; i < 3; i++)
01799             {
01800                 
for (j = 0; j < 3; j++)
01801                 {
01802                     lpMem += 
WriteFloat (lpMem, TempMatrixABC[i + j * 3]);
01803                 }
01804             }
01805         }
01806         lpMem += 
WriteObject (lpMem, 
EndArray);
01807     } 
else
01808     {
01809         lpMem += 
WriteObject (lpMem, 
MatrixABCLabCRD);
01810     }
01811  
01812     
if (nInputCh == 0)
01813         
return (
SINT)(lpMem - lpOldMem);
01814 
01815     lpLineStart = lpMem;
01816     lpMem += 
WriteNewLineObject (lpMem, 
EncodeABCTag);
01817     lpMem += 
WriteObject (lpMem, 
BeginArray);
01818     
for (i = 0; i < nInputCh; i++)
01819     {
01820         lpLineStart = lpMem;
01821         lpMem += 
WriteNewLineObject (lpMem, 
BeginFunction);
01822         
if (
pcs == 
icSigLabData)
01823         {
01824             lpMem += 
WriteObject (lpMem,
01825                                   (0 == i) ? 
EncodeABCLab1 : 
EncodeABCLab2);
01826         }
01827         lpMem += 
WriteObject (lpMem, 
StartClip);
01828         
if (e)
01829             lpMem += 
WriteObject (lpMem, 
PreViewInArray);
01830         
else
01831             lpMem += 
WriteObject (lpMem, 
InputArray);
01832         lpMem += 
WriteObjectN (lpMem, (
MEMPTR) PublicArrayName, lstrlen (PublicArrayName));
01833         lpMem += 
WriteInt (lpMem, i);
01834 
01835         
if (!bAllowBinary)              
01836         {
01837             lpMem += 
WriteNewLineObject (lpMem, 
IndexArray);
01838         } 
else
01839         {                               
01840             
if (LutTag == 
icSigLut8Type)
01841             {
01842                 lpMem += 
WriteObject (lpMem, 
IndexArray);
01843             } 
else
01844             {
01845                 lpMem += 
WriteObject (lpMem, 
IndexArray16b);
01846             }
01847         }
01848         lpMem += 
WriteObject (lpMem, (LutTag == 
icSigLut8Type) ? 
01849                               
Scale8 : 
Scale16);
01850         lpMem += 
WriteObject (lpMem, 
EndClip);
01851         lpMem += 
WriteObject (lpMem, 
EndFunction);
01852     }
01853     lpMem += 
WriteObject (lpMem, 
EndArray);
01854     
return (
SINT)(lpMem - lpOldMem);
01855 }
01856 
01857 
SINT
01858 SendCRDBWPoint(MEMPTR lpMem, LPSFLOAT whitePoint)
01859 {
01860     
MEMPTR  lpOldMem;
01861     
SINT    i;
01862 
01863     lpOldMem = lpMem;
01864 
01865 
01866     lpMem += 
WriteNewLineObject (lpMem, 
BlackPointTag);
01867     lpMem += 
WriteObject (lpMem, 
BlackPoint);
01868 
01869 
01870     lpMem += 
WriteNewLineObject (lpMem, 
WhitePointTag);
01871     lpMem += 
WriteObject (lpMem, 
BeginArray);
01872     
for (i = 0; i < 3; i++)
01873     {
01874         lpMem += 
WriteFloat (lpMem, (
double)(whitePoint[i]));
01875     }
01876     lpMem += 
WriteObject (lpMem, 
EndArray);
01877     
return (
SINT)(lpMem - lpOldMem);
01878 }
01879 
01880 SINT SendCRDOutputTable(MEMPTR lpMem, MEMPTR PublicArrayName, 
01881         SINT nOutputCh, CSIG LutTag, BOOL bHost, BOOL bAllowBinary)
01882 {
01883     
MEMPTR  lpOldMem;
01884     
SINT    i;
01885 
01886     lpOldMem = lpMem;
01887 
01888     
for (i = 0; i < nOutputCh; i++)
01889     {
01890         lpMem += 
WriteNewLineObject (lpMem, 
BeginFunction);
01891         lpMem += 
WriteObject (lpMem, 
Clip01);
01892         
if (bHost)
01893             lpMem += 
WriteObject (lpMem, 
PreViewOutArray);
01894         
else
01895             lpMem += 
WriteObject (lpMem, 
OutputArray);
01896         lpMem += 
WriteObjectN (lpMem, (
MEMPTR) PublicArrayName, lstrlen (PublicArrayName));
01897         lpMem += 
WriteInt (lpMem, i);
01898 
01899         
if (!bAllowBinary)               
01900         {
01901             lpMem += 
WriteObject (lpMem, 
NewLine);
01902             
if (LutTag == 
icSigLut8Type)
01903             {
01904                 lpMem += 
WriteObject (lpMem, 
TFunction8);
01905             } 
else
01906             {
01907                 lpMem += 
WriteObject (lpMem, 
IndexArray);
01908                 lpMem += 
WriteObject (lpMem, 
Scale16);
01909             }
01910         } 
else
01911         {                               
01912             
if (LutTag == 
icSigLut8Type)
01913             {
01914                 lpMem += 
WriteObject (lpMem, 
TFunction8);
01915             } 
else
01916             {
01917                 lpMem += 
WriteObject (lpMem, 
IndexArray16b);
01918                 lpMem += 
WriteObject (lpMem, 
Scale16);
01919             }
01920         }
01921 
01922         lpMem += 
WriteObject (lpMem, 
EndFunction);
01923     }
01924     
return (
SINT)(lpMem - lpOldMem);
01925 }
01926 
01927 
01928 
01929 
01930 
01931 
01932 
01933 
01934 
01935 
01936 
01937 
01938 
01939 
01940 
01941 
01942 
01943 
01944 
01945 
01946 
01947 
01948 
01949 
01950 
01951 
01952 
01953 
BOOL EXTERN
01954 GetPS2PreviewColorRenderingDictionary (CHANDLE cpDev,
01955                                 CHANDLE cpTarget,
01956                                 DWORD Intent,
01957                                 MEMPTR lpMem,
01958                                 LPDWORD lpcbSize,
01959                                 BOOL bAllowBinary)
01960 {
01961     
MEMPTR    lpTargetCRD, lpTargetCSA, lpDevCRD;
01962     
DWORD     cbTargetCRD, cbTargetCSA, cbDevCRD;
01963     HGLOBAL   hTargetCRD, hTargetCSA, hDevCRD;
01964     
BOOL      Success = 
FALSE;
01965     
float     Input[
MAXCHANNELS];
01966     
float     Output[
MAXCHANNELS];
01967     
float     Temp[
MAXCHANNELS];
01968     
int       i, j, k, l;
01969     
MEMPTR    lpLineStart;
01970     
MEMPTR    lpOldMem;
01971     
CSIG      ColorSpace;
01972     
CSIG      DevColorSpace;
01973     
static CSIG      IntentTag;
01974     
static SINT      PreviewCRDGrid;
01975     
SINT      OutArraySize, InArraySize;
01976     
char      PublicArrayName[
TempBfSize];
01977     
SINT      TargetGrids, DevGrids;
01978 
01979     
01980     
if (lpMem == 
NULL)
01981     {
01982         
SINT   dwOutArraySizr = 0;
01983 
01984         i = 3;      
01985         
if ((
GetCPDevSpace (cpDev, (
LPCSIG) & DevColorSpace)) &&
01986                           (DevColorSpace == 
icSigCmykData))
01987         {
01988             i = 4;
01989         }
01990 
01991         
01992         
if (!
GetCRDInputOutputArraySize(cpTarget, 
Intent,
01993             &InArraySize, 
NULL, &IntentTag, &TargetGrids ))
01994             
return FALSE;
01995 
01996         
01997         
if (!
GetCRDInputOutputArraySize(cpDev, 
Intent,
01998             
NULL, &OutArraySize, &IntentTag, &DevGrids ))
01999             
return FALSE;
02000 
02001         PreviewCRDGrid = (TargetGrids > DevGrids)? TargetGrids: DevGrids;
02002 
02003         
02004         
if (PreviewCRDGrid < 
PREVIEWCRDGRID)
02005             PreviewCRDGrid = 
PREVIEWCRDGRID;
02006         *lpcbSize = PreviewCRDGrid * PreviewCRDGrid * PreviewCRDGrid * 
02007                     i * 2 +           
02008                     OutArraySize +    
02009                     InArraySize  +    
02010                     4096;             
02011          
return (
TRUE);
02012     }
02013 
02014     
02015     lpOldMem = lpMem;
02016 
02017     
02018     
if (!(
GetHostColorRenderingDictionary (cpTarget, 
Intent, 
NULL, &cbTargetCRD)) ||
02019         !(
GetHostColorSpaceArray (cpTarget, 
Intent, 
NULL, &cbTargetCSA)) ||
02020         !(
GetHostColorRenderingDictionary (cpDev, 
Intent, 
NULL, &cbDevCRD)))
02021     {
02022         
return (Success);
02023     }
02024 
02025     
02026     hTargetCRD = hTargetCSA = hDevCRD = 0;
02027     
if (!
MemAlloc (cbTargetCRD, (HGLOBAL 
FAR *)&hTargetCRD, (
LPMEMPTR)&lpTargetCRD) ||
02028         !
MemAlloc (cbTargetCSA, (HGLOBAL 
FAR *)&hTargetCSA, (
LPMEMPTR)&lpTargetCSA) ||
02029         !
MemAlloc (cbDevCRD, (HGLOBAL 
FAR *)&hDevCRD, (
LPMEMPTR)&lpDevCRD))
02030     {
02031         
goto Done;
02032     }
02033 
02034     
02035     
if (!(
GetHostColorRenderingDictionary (cpTarget, 
Intent, lpTargetCRD, &cbTargetCRD)) ||
02036         !(
GetHostColorSpaceArray (cpTarget, 
Intent, lpTargetCSA, &cbTargetCSA)) ||
02037         !(
GetHostColorRenderingDictionary (cpDev, 
Intent, lpDevCRD, &cbDevCRD)))
02038     {
02039         
goto Done;
02040     }
02041 
02042 
02043 
02044 
02045 
02046 
02047 
02048     
GetPublicArrayName (cpDev, IntentTag, PublicArrayName);
02049     lpMem += 
WriteNewLineObject (lpMem, 
CRDBegin);
02050 
02051     lpMem += 
EnableGlobalDict(lpMem);
02052     lpMem += 
BeginGlobalDict(lpMem);
02053 
02054     lpMem += 
CreateInputArray (lpMem, (
SINT)0, (
SINT)0, (
MEMPTR)PublicArrayName, 
02055              (
CSIG)0, 
NULL, bAllowBinary, lpTargetCRD);
02056 
02057     lpMem += 
CreateOutputArray (lpMem, (
SINT)0, (
SINT)0, (
SINT)0, 
02058              (
MEMPTR)PublicArrayName, (
CSIG)0, 
NULL, bAllowBinary, lpDevCRD);
02059 
02060     lpMem += 
EndGlobalDict(lpMem);
02061 
02062 
02063     lpMem += 
WriteNewLineObject (lpMem, 
BeginDict);    
02064     lpMem += 
WriteObject (lpMem, 
DictType); 
02065 
02066     lpMem += 
WriteNewLineObject (lpMem, 
IntentType); 
02067     
switch (
Intent)
02068     {
02069         
case icPerceptual:
02070             lpMem += 
WriteObject (lpMem, 
IntentPer);
02071             
break;
02072 
02073         
case icSaturation:
02074             lpMem += 
WriteObject (lpMem, 
IntentSat);
02075             
break;
02076 
02077         
case icRelativeColorimetric:
02078             lpMem += 
WriteObject (lpMem, 
IntentRCol);
02079             
break;
02080 
02081         
case icAbsoluteColorimetric:
02082             lpMem += 
WriteObject (lpMem, 
IntentACol);
02083             
break;
02084     }
02085 
02086 
02087     lpMem += 
SendCRDBWPoint(lpMem, 
02088         ((
LPHOSTCLUT)lpTargetCRD)->whitePoint);
02089 
02090 
02091     lpMem += 
SendCRDPQR(lpMem, 
Intent, 
02092         ((
LPHOSTCLUT)lpTargetCRD)->whitePoint);
02093 
02094 
02095     lpMem += 
SendCRDLMN(lpMem, 
Intent, 
02096         ((
LPHOSTCLUT)lpTargetCRD)->whitePoint,
02097         ((
LPHOSTCLUT)lpTargetCRD)->mediaWP,
02098         ((
LPHOSTCLUT)lpTargetCRD)->
pcs);
02099 
02100 
02101     lpMem += 
SendCRDABC(lpMem, PublicArrayName, 
02102         ((
LPHOSTCLUT)lpTargetCRD)->
pcs,
02103         ((
LPHOSTCLUT)lpTargetCRD)->inputChan,
02104         
NULL,
02105         ((
LPHOSTCLUT)lpTargetCRD)->e,
02106         (((
LPHOSTCLUT)lpTargetCRD)->lutBits == 8)? icSigLut8Type:icSigLut16Type,
02107         bAllowBinary);
02108 
02109 
02110     lpMem += 
WriteNewLineObject (lpMem, 
RenderTableTag);
02111     lpMem += 
WriteObject (lpMem, 
BeginArray);
02112 
02113     lpMem += 
WriteInt (lpMem, PreviewCRDGrid);  
02114     lpMem += 
WriteInt (lpMem, PreviewCRDGrid);  
02115     lpMem += 
WriteInt (lpMem, PreviewCRDGrid);  
02116 
02117     lpLineStart = lpMem;
02118     lpMem += 
WriteNewLineObject (lpMem, 
BeginArray);
02119     ColorSpace = ((
LPHOSTCLUT)lpDevCRD)->pcs;
02120     
for (i = 0; i < PreviewCRDGrid; i++)        
02121     {
02122         lpMem += 
WriteObject (lpMem, 
NewLine);
02123         lpLineStart = lpMem;
02124         
if (bAllowBinary)
02125         {
02126             lpMem += 
WriteStringToken (lpMem, 143, 
02127                 PreviewCRDGrid * PreviewCRDGrid * ((
LPHOSTCLUT)lpDevCRD)->outputChan);
02128         }
02129         
else
02130         {
02131             lpMem += 
WriteObject (lpMem, 
BeginString);
02132         }
02133         Input[0] = ((
float)i) / (PreviewCRDGrid - 1);
02134         
for (j = 0; j < PreviewCRDGrid; j++)
02135         {
02136             Input[1] = ((
float)j) / (PreviewCRDGrid - 1);
02137             
for (k = 0; k < PreviewCRDGrid; k++)
02138             {
02139                 Input[2] = ((
float)k) / (PreviewCRDGrid - 1);
02140 
02141                 
DoHostConversionCRD ((
LPHOSTCLUT)lpTargetCRD, 
NULL, Input, Output, ColorSpace, 1);
02142                 
DoHostConversionCSA ((
LPHOSTCLUT)lpTargetCSA, Output, Temp);
02143                 
DoHostConversionCRD ((
LPHOSTCLUT)lpDevCRD, (
LPHOSTCLUT)lpTargetCSA, 
02144                                      Temp, Output, 0, 0);
02145                 
for (l = 0; l < ((
LPHOSTCLUT)lpDevCRD)->outputChan; l++)
02146                 {
02147                     
if (bAllowBinary)
02148                     {
02149                         *lpMem++ = (
BYTES)(Output[l]*255);
02150                     }
02151                     
else
02152                     {
02153                         lpMem += 
WriteHex (lpMem, (
USHORT)(Output[l]*255));
02154                         
if (((
SINT) (lpMem - lpLineStart)) > 
MAX_LINELENG)
02155                         {
02156                             lpLineStart = lpMem;
02157                             lpMem += 
WriteObject (lpMem, 
NewLine);
02158                         }
02159                     }
02160                 }
02161             }
02162         }
02163         
if (!bAllowBinary)
02164             lpMem += 
WriteObject (lpMem, 
EndString);
02165     }
02166     lpMem += 
WriteNewLineObject (lpMem, 
EndArray);
02167     lpMem += 
WriteInt (lpMem, ((
LPHOSTCLUT)lpDevCRD)->outputChan);
02168 
02169 
02170     lpMem += 
SendCRDOutputTable(lpMem, PublicArrayName, 
02171         ((
LPHOSTCLUT)lpDevCRD)->outputChan,
02172         (((
LPHOSTCLUT)lpDevCRD)->lutBits == 8)? icSigLut8Type:icSigLut16Type,
02173         
TRUE,
02174         bAllowBinary);
02175 
02176 
02177     lpMem += 
WriteNewLineObject (lpMem, 
EndArray);
02178     lpMem += 
WriteObject (lpMem, 
EndDict); 
02179     lpMem += 
WriteNewLineObject (lpMem, 
CRDEnd);
02180     Success = 
TRUE;
02181 
02182 Done:
02183     *lpcbSize = (
DWORD)(lpMem - lpOldMem);
02184 
02185     
if (hTargetCRD)
02186          
MemFree(hTargetCRD);
02187     
if (hTargetCSA)
02188          
MemFree(hTargetCSA);
02189     
if (hDevCRD)
02190          
MemFree(hDevCRD);
02191     
return (Success);
02192 }