00001 
#include "generic.h"
00002 
#include "icmstr.h"
00003 
00004 
#pragma code_seg(_ICMSEG)
00005 
00006 static char  *
DecodeABCLab[] = {
"50 mul 16 add 116 div ", 
00007                                
"128 mul 128 sub 500 div", 
00008                                
"128 mul 128 sub 200 div"};
00009 
00010 
#pragma optimize("",off)
00011 
00012 
00013 
00014 
SINT CreateColSpArray (CHANDLE cp, MEMPTR lpMem, CSIG CPTag, BOOL AllowBinary);
00015 
SINT CreateColSpProc (CHANDLE cp, MEMPTR lpMem, CSIG CPTag, BOOL AllowBinary);
00016 
SINT CreateFloatString (CHANDLE cp, MEMPTR lpMem, CSIG CPTag);
00017 
static SINT SendCSABWPoint(MEMPTR lpMem, CSIG Intent, 
00018     LPSFLOAT IlluminantWP, LPSFLOAT MediaWP);
00019 
static void GetMediaWP(CHANDLE cp, CSIG InputIntent, 
00020     LPSFLOAT IlluminantWP, LPSFLOAT MediaWP);
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
static BOOL
00039 GetDeviceRGB (
00040               MEMPTR lpMem,
00041               LPDWORD lpcbSize,
00042               DWORD InpDrvClrSp,
00043               BOOL  BackupCSA)
00044 {
00045     
MEMPTR lpOldMem = lpMem;
00046     
if ((InpDrvClrSp != 
icSigRgbData) &&
00047         (InpDrvClrSp != 
icSigDefData) &&
00048         (InpDrvClrSp != 0))
00049         
return FALSE;
00050 
00051     
if (lpMem == 
NULL)
00052     {
00053         *lpcbSize = lstrlen (
DeviceRGBTag) + 8;
00054         
return (
TRUE);
00055     }
00056 
00057     
if (BackupCSA)
00058     {
00059         lpMem += 
WriteNewLineObject (lpMem, 
NotSupportDEFG_S);
00060     }
00061 
00062     lpMem += 
WriteNewLineObject (lpMem, 
DeviceRGBTag);
00063 
00064     
if (BackupCSA)
00065     {
00066         lpMem += 
WriteNewLineObject (lpMem, 
SupportDEFG_E);
00067     }
00068 
00069     *lpcbSize = (
DWORD) (lpMem - lpOldMem);
00070     
return (
TRUE);
00071 }
00072 
00073 
00074 
00075 
00076 
00077 
00078 
00079 
00080 
00081 
00082 
00083 
00084 
00085 
00086 
00087 
00088 
00089 
static BOOL
00090 GetDeviceCMYK (
00091                MEMPTR lpMem,
00092                LPDWORD lpcbSize,
00093                DWORD InpDrvClrSp)
00094 {
00095     
MEMPTR lpOldMem = lpMem;
00096     
if ((InpDrvClrSp != 
icSigCmykData) &&
00097         (InpDrvClrSp != 0))
00098         
return FALSE;
00099     
if (lpMem == 
NULL)
00100     {
00101         *lpcbSize = lstrlen (
DeviceCMYKTag) + 8;
00102         
return (
TRUE);
00103     }
00104     lpMem += 
WriteNewLineObject (lpMem, 
DeviceCMYKTag);
00105 
00106     *lpcbSize = (
DWORD) (lpMem - lpOldMem);
00107     
return (
TRUE);
00108 
00109 }
00110 
00111 
00112 
00113 
00114 
static BOOL
00115 GetDeviceGray (
00116                MEMPTR lpMem,
00117                LPDWORD lpcbSize,
00118                DWORD InpDrvClrSp)
00119 {
00120     
MEMPTR lpOldMem = lpMem;
00121     
if ((InpDrvClrSp == 
icSigRgbData) ||
00122         (InpDrvClrSp == 
icSigDefData) ||
00123         (InpDrvClrSp == 0))
00124     {
00125         
if (lpMem == 
NULL)
00126         {
00127             *lpcbSize = lstrlen (
DeviceRGBTag) + 8;
00128             
return (
TRUE);
00129         }
00130         lpMem += 
WriteNewLineObject (lpMem, 
DeviceRGBTag);
00131 
00132         *lpcbSize = (
DWORD) (lpMem - lpOldMem);
00133         
return (
TRUE);
00134     } 
else if (InpDrvClrSp == 
icSigGrayData)
00135     {
00136         
if (lpMem == 
NULL)
00137         {
00138             *lpcbSize = lstrlen (
DeviceGrayTag) + 8;
00139             
return (
TRUE);
00140         }
00141         lpMem += 
WriteNewLineObject (lpMem, 
DeviceGrayTag);
00142 
00143         *lpcbSize = (
DWORD) (lpMem - lpOldMem);
00144         
return (
TRUE);
00145     }
00146 }
00147 
00148 
00149 
00150 
00151 
SINT
00152 GetPublicArrayName (CHANDLE cp, CSIG IntentSig, MEMPTR PublicArrayName)
00153 {
00154     
MEMPTR OldPtr;
00155     OldPtr = PublicArrayName;
00156     PublicArrayName[0] = 0;
00157     MemCopy (PublicArrayName, (
MEMPTR) & IntentSig, 
sizeof (
CSIG));
00158     PublicArrayName += 
sizeof (
CSIG);
00159     PublicArrayName[0] = 0;
00160     
return (PublicArrayName - OldPtr);
00161 }
00162 
00163 static SINT SendCSABWPoint(MEMPTR lpMem, CSIG Intent, 
00164                     LPSFLOAT IlluminantWP, LPSFLOAT MediaWP)
00165 {
00166     
SINT   i;
00167     
MEMPTR lpOldMem = lpMem;
00168 
00169  
00170     lpMem += 
WriteNewLineObject (lpMem, 
BlackPointTag);
00171     lpMem += 
WriteObject (lpMem, 
BlackPoint);
00172 
00173  
00174     lpMem += 
WriteNewLineObject (lpMem, 
WhitePointTag);
00175     lpMem += 
WriteObject (lpMem, 
BeginArray);
00176     
for (i = 0; i < 3; i++)
00177     {
00178         
if (
Intent == 
icAbsoluteColorimetric)
00179         {
00180             lpMem += 
WriteFloat (lpMem, (
double) MediaWP[i]);
00181         }
00182         
else
00183         {
00184             lpMem += 
WriteFloat (lpMem, (
double) IlluminantWP[i]);
00185         }
00186     }
00187     lpMem += 
WriteObject (lpMem, 
EndArray);
00188     
return (
SINT)(lpMem - lpOldMem);
00189 }
00190 
00191 static void GetMediaWP(CHANDLE cp, CSIG InputIntent, 
00192                        LPSFLOAT IlluminantWP, LPSFLOAT MediaWP)
00193 {
00194     
if (InputIntent == 
icAbsoluteColorimetric)
00195     {
00196         
if (!
GetCPMediaWhitePoint (cp, (
LPSFLOAT) & MediaWP)) 
00197         {
00198             MediaWP[0] = IlluminantWP[0];
00199             MediaWP[1] = IlluminantWP[1];
00200             MediaWP[2] = IlluminantWP[2];
00201         }
00202     }
00203 }
00204 
00205 SINT  BeginGlobalDict(MEMPTR lpMem)
00206 {
00207     
MEMPTR lpOldMem = lpMem;
00208 
00209     lpMem += 
WriteNewLineObject (lpMem, 
GlobalDictOp);
00210     lpMem += 
WriteObject (lpMem, 
BeginOp);
00211 
00212     
return (lpMem - lpOldMem);
00213 }
00214 
00215 SINT  EndGlobalDict(MEMPTR lpMem)
00216 {
00217     
MEMPTR lpOldMem = lpMem;
00218 
00219     lpMem += 
WriteNewLineObject (lpMem, 
EndOp);
00220     lpMem += 
WriteObject (lpMem, 
SetGlobalOp);
00221 
00222     
return (lpMem - lpOldMem);
00223 }
00224 
00225 SINT  EnableGlobalDict(MEMPTR lpMem)
00226 {
00227     
MEMPTR lpOldMem = lpMem;
00228 
00229     lpMem += 
WriteNewLineObject (lpMem, 
CurrentGlobalOp);
00230     lpMem += 
WriteObject (lpMem, 
TrueOp);
00231     lpMem += 
WriteObject (lpMem, 
SetGlobalOp);
00232     
return (lpMem - lpOldMem);
00233 }
00234 
00235 
00236 
00237 
00238 
00239 
00240 
00241 
00242 
00243 
00244 
00245 
00246 
00247 
00248 
00249 
00250 
00251 
00252 
00253 
00254 
00255 
00256 
00257 
00258 
static BOOL
00259 GetPS2CSA_DEFG (
00260                 CHANDLE cp,
00261                 MEMPTR lpMem,
00262                 LPDWORD lpcbSize,
00263                 CSIG InputIntent,
00264                 SINT Index,
00265                 
int Type,
00266                 BOOL AllowBinary)
00267 {
00268     
CSIG PCS, LutTag;
00269     
CSIG IntentSig;
00270     
SFLOAT IlluminantWP[3];
00271     
SFLOAT MediaWP[3];
00272     
SINT nInputCh, nOutputCh, nGrids, SecondGrids;
00273     
SINT nInputTable, nOutputTable, nNumbers;
00274     
SINT i, j, k;
00275     
MEMPTR lpTable;
00276     
MEMPTR lpOldMem = lpMem;
00277     
MEMPTR lpLut = 
NULL;
00278     
MEMPTR lpLineStart;
00279     HGLOBAL hLut = 0;
00280     
SINT LutSize;
00281     
char PublicArrayName[
TempBfSize];
00282  
00283  
00284  
00285  
00286     
if (!
GetCPConnSpace (cp, (
LPCSIG) & PCS) ||
00287         (PCS != 
icSigLabData) && (PCS != 
icSigXYZData) ||
00288         !
GetCPTagSig (cp, 
Index, (
LPCSIG) & IntentSig))
00289     {
00290         
return (
FALSE);
00291     }
00292     
if (!
GetCPElementType (cp, 
Index, (
LPCSIG) & LutTag) ||
00293         ((LutTag != 
icSigLut8Type) && (LutTag != 
icSigLut16Type)) ||
00294         !
GetCPElementSize (cp, 
Index, (
LPSINT) & LutSize) ||
00295         !
MemAlloc (LutSize, (HGLOBAL 
FAR *) &hLut, (
LPMEMPTR) & lpLut) ||
00296         !
GetCPElement (cp, 
Index, lpLut, LutSize))
00297     {
00298         
if (0 != hLut)
00299         {
00300             
MemFree (hLut);
00301         }
00302         
return (
FALSE);
00303     }
00304  
00305 
00306     
GetCLUTinfo(LutTag, lpLut, &nInputCh, &nOutputCh, 
00307         &nGrids, &nInputTable, &nOutputTable, &i);
00308 
00309  
00310  
00311     
if (!(nOutputCh == 3) ||
00312         !((nInputCh == 3) && (Type == 
TYPE_CIEBASEDDEF)) &&
00313         !((nInputCh == 4) && (Type == 
TYPE_CIEBASEDDEFG)))
00314     {
00315         
SetCPLastError (
CP_POSTSCRIPT_ERR);
00316         
MemFree (hLut);
00317         
return (
FALSE);
00318     }
00319     
if (lpMem == 
NULL)                  
00320     {
00321         
if (Type == 
TYPE_CIEBASEDDEFG)
00322             *lpcbSize = nOutputCh * nGrids * nGrids * nGrids * nGrids * 2;  
00323         
else
00324             *lpcbSize = nOutputCh * nGrids * nGrids * nGrids * 2;   
00325 
00326         *lpcbSize = *lpcbSize +
00327             nInputCh * nInputTable * 6 +
00328             nOutputCh * nOutputTable * 6 +  
00329             nInputCh * (lstrlen (
IndexArray) +
00330                         lstrlen (
StartClip) +
00331                         lstrlen (
EndClip)) +
00332             nOutputCh * (lstrlen (
IndexArray) +
00333                          lstrlen (
StartClip) +
00334                          lstrlen (
EndClip)) +
00335             4096;                       
00336 
00337 
00338         
return (
TRUE);
00339     }
00340  
00341     
GetCPWhitePoint (cp, (
LPSFLOAT) & IlluminantWP);          
00342 
00343  
00344     
GetMediaWP(cp, InputIntent, IlluminantWP, MediaWP);
00345 
00346  
00347     lpMem += 
WriteNewLineObject (lpMem, 
TestingDEFG);
00348 
00349  
00350     
GetPublicArrayName (cp, IntentSig, PublicArrayName);
00351     
if (Type == 
TYPE_CIEBASEDDEFG)
00352         lpMem += 
WriteNewLineObject (lpMem, 
CieBasedDEFGBegin);
00353     
else
00354         lpMem += 
WriteNewLineObject (lpMem, 
CieBasedDEFBegin);
00355 
00356     lpMem += 
EnableGlobalDict(lpMem);
00357     lpMem += 
WriteNewLineObject (lpMem, 
SupportDEFG_S);
00358     lpMem += 
BeginGlobalDict(lpMem);
00359 
00360     lpMem += 
CreateInputArray (lpMem, nInputCh, nInputTable,
00361              (
MEMPTR) PublicArrayName, LutTag, lpLut, 
AllowBinary, 
NULL);
00362 
00363     
if (Type == 
TYPE_CIEBASEDDEFG)
00364     {
00365         i = nInputTable * nInputCh +
00366             nGrids * nGrids * nGrids * nGrids * nOutputCh;
00367     } 
else
00368     {
00369         i = nInputTable * nInputCh +
00370             nGrids * nGrids * nGrids * nOutputCh;
00371     }
00372     lpMem += 
CreateOutputArray (lpMem, nOutputCh, nOutputTable, i,
00373              (
MEMPTR) PublicArrayName, LutTag, lpLut, 
AllowBinary, 
NULL);
00374 
00375     lpMem += 
WriteNewLineObject (lpMem, 
EndOp);
00376     lpMem += 
WriteNewLineObject (lpMem, 
SupportDEFG_E);
00377     lpMem += 
WriteNewLineObject (lpMem, 
SetGlobalOp);
00378     lpMem += 
WriteNewLineObject (lpMem, 
SupportDEFG_S);
00379 
00380  
00381     lpMem += 
WriteNewLineObject (lpMem, 
BeginArray);   
00382 
00383  
00384     
if (Type == 
TYPE_CIEBASEDDEFG)
00385         lpMem += 
WriteObject (lpMem, 
CIEBasedDEFGTag);
00386     
else
00387         lpMem += 
WriteObject (lpMem, 
CIEBasedDEFTag);
00388     lpMem += 
WriteObject (lpMem, 
BeginDict);    
00389 
00390  
00391     lpMem += 
SendCSABWPoint(lpMem, InputIntent, IlluminantWP, MediaWP);
00392 
00393  
00394     lpLineStart = lpMem;
00395     
if (Type == 
TYPE_CIEBASEDDEFG)
00396         lpMem += 
WriteNewLineObject (lpMem, 
DecodeDEFGTag);
00397     
else
00398         lpMem += 
WriteNewLineObject (lpMem, 
DecodeDEFTag);
00399 
00400     lpMem += 
WriteObject (lpMem, 
BeginArray);
00401     
for (i = 0; i < nInputCh; i++)
00402     {
00403         lpLineStart = lpMem;
00404 
00405         lpMem += 
WriteNewLineObject (lpMem, 
BeginFunction);
00406 
#if 0
00407 
        if (PCS == 
icSigLabData)
00408         {
00409             lpMem += 
WriteObject (lpMem,
00410                                   (0 == i) ? 
EncodeABCLab1 : 
EncodeABCLab2);
00411         }
00412 
#endif
00413 
        lpMem += 
WriteObject (lpMem, 
StartClip);
00414         lpMem += 
WriteObject (lpMem, 
InputArray);
00415         lpMem += 
WriteObjectN (lpMem, (
MEMPTR) PublicArrayName, lstrlen (PublicArrayName));
00416         lpMem += 
WriteInt (lpMem, i);
00417 
00418         
if (!
AllowBinary)               
00419         {
00420             lpMem += 
WriteObject (lpMem, 
IndexArray);
00421         } 
else
00422         {                               
00423             
if (LutTag == 
icSigLut8Type)
00424             {
00425                 lpMem += 
WriteObject (lpMem, 
IndexArray);
00426             } 
else
00427             {
00428                 lpMem += 
WriteObject (lpMem, 
IndexArray16b);
00429             }
00430         }
00431         lpMem += 
WriteObject (lpMem, (LutTag == 
icSigLut8Type) ? 
Scale8 : 
Scale16);
00432         lpMem += 
WriteObject (lpMem, 
EndClip);
00433         lpMem += 
WriteObject (lpMem, 
EndFunction);
00434     }
00435     lpMem += 
WriteObject (lpMem, 
EndArray);
00436 
00437  
00438     lpMem += 
WriteNewLineObject (lpMem, 
TableTag);
00439     lpMem += 
WriteObject (lpMem, 
BeginArray);
00440 
00441     lpMem += 
WriteInt (lpMem, nGrids);  
00442     lpMem += 
WriteInt (lpMem, nGrids);  
00443     lpMem += 
WriteInt (lpMem, nGrids);  
00444     nNumbers = nGrids * nGrids * nOutputCh;
00445     SecondGrids = 1;
00446     
if (Type == 
TYPE_CIEBASEDDEFG)
00447     {
00448         lpMem += 
WriteInt (lpMem, nGrids);  
00449 
00450         SecondGrids = nGrids;
00451     }
00452     lpMem += 
WriteNewLineObject (lpMem, 
BeginArray);
00453     
for (i = 0; i < nGrids; i++)        
00454     {
00455         
if (Type == 
TYPE_CIEBASEDDEFG)
00456         {
00457             lpMem += 
WriteNewLineObject (lpMem, 
BeginArray);
00458         }
00459         
for (k = 0; k < SecondGrids; k++)
00460         {
00461             lpLineStart = lpMem;
00462             lpMem += 
WriteObject (lpMem, 
NewLine);
00463             
if (LutTag == 
icSigLut8Type)
00464             {
00465                 lpTable = (
MEMPTR) (((
lpcpLut8Type) lpLut)->lut.data) +
00466                     nInputTable * nInputCh +
00467                     nNumbers * (i * SecondGrids + k);
00468             } 
else
00469             {
00470                 lpTable = (
MEMPTR) (((
lpcpLut16Type) lpLut)->lut.data) +
00471                     2 * nInputTable * nInputCh +
00472                     2 * nNumbers * (i * SecondGrids + k);
00473             }
00474 
00475             
if (!
AllowBinary)           
00476             {
00477                 lpMem += 
WriteObject (lpMem, 
BeginString);
00478                 
if (LutTag == 
icSigLut8Type)
00479                     lpMem += 
WriteHexBuffer (lpMem, lpTable, lpLineStart, nNumbers);
00480                 
else
00481                 {
00482                     
for (j = 0; j < nNumbers; j++)
00483                     {
00484                         lpMem += 
WriteHex (lpMem, 
ui16toSINT (lpTable) / 256);
00485                         lpTable += 
sizeof (
icUInt16Number);
00486                         
if (((
SINT) (lpMem - lpLineStart)) > 
MAX_LINELENG)
00487                         {
00488                             lpLineStart = lpMem;
00489                             lpMem += 
WriteObject (lpMem, 
NewLine);
00490                         }
00491                     }
00492                 }
00493                 lpMem += 
WriteObject (lpMem, 
EndString);
00494             } 
else
00495             {                           
00496                 lpMem += 
WriteStringToken (lpMem, 143, nNumbers);
00497                 
if (LutTag == 
icSigLut8Type)
00498                     lpMem += 
WriteByteString (lpMem, lpTable, nNumbers);
00499                 
else
00500                     lpMem += 
WriteInt2ByteString (lpMem, lpTable, nNumbers);
00501             }
00502             lpMem += 
WriteObject (lpMem, 
NewLine);
00503         }
00504         
if (Type == 
TYPE_CIEBASEDDEFG)
00505         {
00506             lpMem += 
WriteObject (lpMem, 
EndArray);
00507         }
00508     }
00509     lpMem += 
WriteObject (lpMem, 
EndArray);
00510     lpMem += 
WriteObject (lpMem, 
EndArray); 
00511 
00512  
00513     lpLineStart = lpMem;
00514     lpMem += 
WriteNewLineObject (lpMem, 
DecodeABCTag);
00515     lpMem += 
WriteObject (lpMem, 
BeginArray);
00516     
for (i = 0; i < nOutputCh; i++)
00517     {
00518         lpLineStart = lpMem;
00519         lpMem += 
WriteNewLineObject (lpMem, 
BeginFunction);
00520         lpMem += 
WriteObject (lpMem, 
Clip01);
00521         lpMem += 
WriteObject (lpMem, 
OutputArray);
00522         lpMem += 
WriteObjectN (lpMem, (
MEMPTR) PublicArrayName, lstrlen (PublicArrayName));
00523         lpMem += 
WriteInt (lpMem, i);
00524 
00525         
if (!
AllowBinary)               
00526         {
00527             lpMem += 
WriteObject (lpMem, 
NewLine);
00528 
00529             
if (LutTag == 
icSigLut8Type)
00530             {
00531                 lpMem += 
WriteObject (lpMem, 
TFunction8XYZ);
00532             } 
else
00533             {
00534                 lpMem += 
WriteObject (lpMem, 
IndexArray);
00535                 lpMem += 
WriteObject (lpMem, 
Scale16XYZ);
00536             }
00537         } 
else
00538         {                               
00539             
if (LutTag == 
icSigLut8Type)
00540             {
00541                 lpMem += 
WriteObject (lpMem, 
TFunction8XYZ);
00542             } 
else
00543             {
00544                 lpMem += 
WriteObject (lpMem, 
IndexArray16b);
00545                 lpMem += 
WriteObject (lpMem, 
Scale16XYZ);
00546             }
00547         }
00548 
00549  
00550  
00551  
00552         
if ((PCS == 
icSigXYZData) &&
00553             (InputIntent == 
icAbsoluteColorimetric))
00554         {
00555             lpMem += 
WriteFloat (lpMem, (
double)MediaWP[i]/IlluminantWP[i]);
00556             lpMem += 
WriteObject (lpMem, 
MulOp); 
00557         }
00558  
00559         
else if (PCS == 
icSigLabData)
00560             lpMem += 
WriteObject (lpMem, 
DecodeABCLab[i]);
00561         lpMem += 
WriteObject (lpMem, 
EndFunction);
00562     }
00563     lpMem += 
WriteObject (lpMem, 
EndArray);
00564 
00565     
if (PCS == 
icSigLabData)
00566     {
00567  
00568         lpMem += 
WriteNewLineObject (lpMem, 
MatrixABCTag);
00569         lpMem += 
WriteObject (lpMem, 
MatrixABCLab);
00570 
00571  
00572         lpLineStart = lpMem;
00573         lpMem += 
WriteNewLineObject (lpMem, 
DecodeLMNTag);
00574         lpMem += 
WriteObject (lpMem, 
BeginArray);
00575         
for (i = 0; i < 3; i++)
00576         {
00577             lpLineStart = lpMem;
00578             lpMem += 
WriteNewLineObject (lpMem, 
BeginFunction);
00579             lpMem += 
WriteObject (lpMem, 
DecodeLMNLab);
00580             
if (InputIntent == 
icAbsoluteColorimetric)
00581                 lpMem += 
WriteFloat (lpMem, (
double) MediaWP[i]);
00582             
else 
00583                 lpMem += 
WriteFloat (lpMem, (
double) IlluminantWP[i]);
00584             lpMem += 
WriteObject (lpMem, 
MulOp);
00585             lpMem += 
WriteObject (lpMem, 
EndFunction);
00586         }
00587         lpMem += 
WriteObject (lpMem, 
EndArray);
00588     } 
else
00589     {
00590  
00591         lpMem += 
WriteNewLineObject (lpMem, 
RangeLMNTag);
00592         lpMem += 
WriteObject (lpMem, 
RangeLMN);
00593     }
00594 
00595  
00596     lpMem += 
WriteNewLineObject (lpMem, 
EndDict);
00597     lpMem += 
WriteObject (lpMem, 
EndArray);
00598 
00599     
if (Type == 
TYPE_CIEBASEDDEFG)
00600         lpMem += 
WriteNewLineObject (lpMem, 
CieBasedDEFGEnd);
00601     
else
00602         lpMem += 
WriteNewLineObject (lpMem, 
CieBasedDEFEnd);
00603 
00604     lpMem += 
WriteNewLineObject (lpMem, 
SupportDEFG_E);
00605 
00606     *lpcbSize = (
DWORD) (lpMem - lpOldMem);
00607 
00608     
MemFree (hLut);
00609     
return (
TRUE);
00610 }
00611 
00612 
00613 
00614 
00615 
00616 
00617 
00618 
00619 
00620 
00621 
00622 
00623 
00624 
00625 
00626 
00627 
00628 
00629 
00630 
00631 
00632 
00633 
00634 
00635 
00636 
00637 
00638 
00639 
00640 
BOOL
00641 GetPS2CSA_ABC (CHANDLE cp, MEMPTR lpMem, LPDWORD lpcbSize,
00642                CSIG InputIntent, DWORD InpDrvClrSp, 
00643                BOOL AllowBinary, BOOL BackupCSA)
00644 {
00645     
CSIG PCS, Dev;
00646     
SFLOAT IlluminantWP[3];
00647     
SFLOAT MediaWP[3];
00648 
00649     
SINT i;
00650     
MEMPTR lpOldMem = lpMem;
00651     
SINT Ret = 0;
00652  
00653  
00654  
00655  
00656     
if (!
GetCPConnSpace (cp, (
LPCSIG) & PCS) ||
00657         !
GetCPDevSpace (cp, (
LPCSIG) & Dev) ||
00658         (Dev != 
icSigRgbData) ||
00659         !
DoesTRCAndColorantTagExist(cp))
00660     {
00661         
return (
FALSE);
00662     }
00663     
if ((InpDrvClrSp != 
icSigRgbData) &&
00664         (InpDrvClrSp != 
icSigDefData) &&
00665         (InpDrvClrSp != 0))
00666     {
00667         
return (
FALSE);
00668     }
00669  
00670 
00671     
if (lpMem == 
NULL)                  
00672     {
00673         *lpcbSize = 65530;
00674         
return (
TRUE);
00675     }
00676  
00677     
GetCPWhitePoint (cp, (
LPSFLOAT) & IlluminantWP);     
00678                                                          
00679  
00680     
GetMediaWP(cp, InputIntent, IlluminantWP, MediaWP);
00681 
00682  
00683     lpMem += 
WriteNewLineObject (lpMem, 
CieBasedABCBegin);
00684 
00685     lpMem += 
EnableGlobalDict(lpMem);
00686     
00687     
if (BackupCSA)
00688     {
00689         lpMem += 
WriteNewLineObject (lpMem, 
NotSupportDEFG_S);
00690     }
00691 
00692     lpMem += 
BeginGlobalDict(lpMem);
00693 
00694     lpMem += 
CreateColSpArray (cp, lpMem, 
icSigRedTRCTag, 
AllowBinary);
00695     lpMem += 
CreateColSpArray (cp, lpMem, 
icSigGreenTRCTag, 
AllowBinary);
00696     lpMem += 
CreateColSpArray (cp, lpMem, 
icSigBlueTRCTag, 
AllowBinary);
00697 
00698     lpMem += 
WriteNewLineObject (lpMem, 
EndOp);
00699 
00700     
if (BackupCSA)
00701     {
00702         lpMem += 
WriteNewLineObject (lpMem, 
SupportDEFG_E);
00703     }
00704     lpMem += 
WriteNewLineObject (lpMem, 
SetGlobalOp);
00705 
00706     
if (BackupCSA)
00707     {
00708         lpMem += 
WriteNewLineObject (lpMem, 
NotSupportDEFG_S);
00709     }
00710 
00711  
00712     lpMem += 
WriteNewLineObject (lpMem, 
BeginArray);   
00713  
00714     lpMem += 
WriteObject (lpMem, 
CIEBasedABCTag);   
00715     lpMem += 
WriteObject (lpMem, 
BeginDict);    
00716 
00717  
00718     lpMem += 
SendCSABWPoint(lpMem, InputIntent, IlluminantWP, MediaWP);
00719 
00720  
00721     lpMem += 
WriteNewLineObject (lpMem, 
DecodeABCTag);
00722     lpMem += 
WriteObject (lpMem, 
BeginArray);
00723 
00724     lpMem += 
WriteObject (lpMem, 
NewLine);
00725     lpMem += 
CreateColSpProc (cp, lpMem, 
icSigRedTRCTag, 
AllowBinary);
00726     lpMem += 
WriteObject (lpMem, 
NewLine);
00727     lpMem += 
CreateColSpProc (cp, lpMem, 
icSigGreenTRCTag, 
AllowBinary);
00728     lpMem += 
WriteObject (lpMem, 
NewLine);
00729     lpMem += 
CreateColSpProc (cp, lpMem, 
icSigBlueTRCTag, 
AllowBinary);
00730     lpMem += 
WriteObject (lpMem, 
EndArray);
00731 
00732  
00733     lpMem += 
WriteNewLineObject (lpMem, 
MatrixABCTag);
00734     lpMem += 
WriteObject (lpMem, 
BeginArray);
00735 
00736     lpMem += 
CreateFloatString (cp, lpMem, 
icSigRedColorantTag);
00737     lpMem += 
CreateFloatString (cp, lpMem, 
icSigGreenColorantTag);
00738     lpMem += 
CreateFloatString (cp, lpMem, 
icSigBlueColorantTag);
00739 
00740     lpMem += 
WriteObject (lpMem, 
EndArray);
00741 
00742  
00743     lpMem += 
WriteNewLineObject (lpMem, 
RangeLMNTag);
00744     lpMem += 
WriteObject (lpMem, 
RangeLMN);
00745 
00746  
00747     
if (InputIntent == 
icAbsoluteColorimetric)
00748     {
00749         
00750         lpMem += 
WriteNewLineObject (lpMem, 
DecodeLMNTag);
00751         lpMem += 
WriteObject (lpMem, 
BeginArray);
00752         
for (i = 0; i < 3; i ++)
00753         {
00754             lpMem += 
WriteObject (lpMem, 
BeginFunction);
00755             lpMem += 
WriteFloat (lpMem, (
double)MediaWP[i]/IlluminantWP[i]);
00756             lpMem += 
WriteObject (lpMem, 
MulOp); 
00757             lpMem += 
WriteObject (lpMem, 
EndFunction);
00758         }
00759         lpMem += 
WriteObject (lpMem, 
EndArray);
00760     }
00761 
00762  
00763     lpMem += 
WriteNewLineObject (lpMem, 
EndDict);
00764     lpMem += 
WriteObject (lpMem, 
EndArray);
00765 
00766     
if (BackupCSA)
00767     {
00768         lpMem += 
WriteNewLineObject (lpMem, 
SupportDEFG_E);
00769     }
00770 
00771     lpMem += 
WriteNewLineObject (lpMem, 
CieBasedABCEnd);
00772     *lpcbSize = (
DWORD) ((lpMem - lpOldMem));
00773     
return (
TRUE);
00774 }
00775 
00776 
00777 
00778 
00779 
00780 
00781 
00782 
00783 
00784 
00785 
00786 
00787 
00788 
00789 
00790 
00791 
00792 
00793 
00794 
00795 
00796 
00797 
00798 
00799 
00800 
BOOL
00801 GetPS2CSA_ABC_LAB (CHANDLE cp, MEMPTR lpMem, LPDWORD lpcbSize,
00802                CSIG InputIntent, DWORD InpDrvClrSp, BOOL AllowBinary)
00803 {
00804     
CSIG PCS, Dev;
00805     
SFLOAT IlluminantWP[3];
00806     
SFLOAT MediaWP[3];
00807 
00808     
SINT i;
00809     
MEMPTR lpOldMem = lpMem;
00810     
SINT Ret = 0;
00811  
00812  
00813  
00814  
00815     
if (!
GetCPConnSpace (cp, (
LPCSIG) & PCS) ||
00816         !
GetCPDevSpace (cp, (
LPCSIG) & Dev) ||
00817         (Dev != 
icSigLabData))
00818     {
00819         
return (
FALSE);
00820     }
00821     
if ((InpDrvClrSp != 
icSigLabData) &&
00822         (InpDrvClrSp != 
icSigDefData) &&
00823         (InpDrvClrSp != 0))
00824     {
00825         
return (
FALSE);
00826     }
00827  
00828 
00829     
if (lpMem == 
NULL)                  
00830     {
00831         *lpcbSize = 65530;
00832         
return (
TRUE);
00833     }
00834  
00835     
GetCPWhitePoint (cp, (
LPSFLOAT) & IlluminantWP);     
00836                                                          
00837  
00838     
GetMediaWP(cp, InputIntent, IlluminantWP, MediaWP);
00839 
00840  
00841     lpMem += 
WriteNewLineObject (lpMem, 
BeginArray);   
00842 
00843  
00844     lpMem += 
WriteObject (lpMem, 
CIEBasedABCTag);   
00845     lpMem += 
WriteObject (lpMem, 
BeginDict);    
00846 
00847  
00848     lpMem += 
SendCSABWPoint(lpMem, InputIntent, IlluminantWP, MediaWP);
00849 
00850  
00851     lpMem += 
WriteNewLineObject (lpMem, 
RangeABCTag);
00852     lpMem += 
WriteObject (lpMem, 
RangeABC_Lab);
00853 
00854  
00855     lpMem += 
WriteNewLineObject (lpMem, 
DecodeABCTag);
00856     lpMem += 
WriteObject (lpMem, 
DecodeABCLab1);
00857 
00858  
00859     lpMem += 
WriteNewLineObject (lpMem, 
MatrixABCTag);
00860     lpMem += 
WriteObject (lpMem, 
MatrixABCLab);
00861 
00862  
00863     lpMem += 
WriteNewLineObject (lpMem, 
DecodeLMNTag);
00864     lpMem += 
WriteObject (lpMem, 
BeginArray);
00865     
for (i = 0; i < 3; i ++)
00866     {
00867         lpMem += 
WriteObject (lpMem, 
BeginFunction);
00868         lpMem += 
WriteObject (lpMem, 
DecodeLMNLab);
00869         
if (InputIntent == 
icAbsoluteColorimetric)
00870         {
00871             lpMem += 
WriteFloat (lpMem, (
double) MediaWP[i]);
00872         }
00873         
else
00874         {
00875             lpMem += 
WriteFloat (lpMem, (
double) IlluminantWP[i]);
00876         }
00877         lpMem += 
WriteObject (lpMem, 
MulOp); 
00878         lpMem += 
WriteObject (lpMem, 
EndFunction);
00879         lpMem += 
WriteObject (lpMem, 
NewLine);
00880     }
00881     lpMem += 
WriteObject (lpMem, 
EndArray);
00882 
00883 
00884  
00885     lpMem += 
WriteNewLineObject (lpMem, 
EndDict);
00886     lpMem += 
WriteObject (lpMem, 
EndArray);
00887 
00888     lpMem += 
WriteNewLineObject (lpMem, 
CieBasedABCEnd);
00889     *lpcbSize = (
DWORD) ((lpMem - lpOldMem));
00890     
return (
TRUE);
00891 }
00892 
00893 
00894 
00895 
00896 
00897 
00898 
00899 
00900 
00901 
00902 
00903 
00904 
00905 
00906 
00907 
00908 
00909 
00910 
00911 
00912 
00913 
00914 
00915 
static BOOL
00916 GetPS2CSA_MONO_ABC (CHANDLE cp, MEMPTR lpMem, LPDWORD lpcbSize, 
00917                     CSIG InputIntent, BOOL AllowBinary)
00918 {
00919     
SINT nCount;
00920     
CSIG Tag, PCS;
00921     
SINT i, j, 
Index;
00922     
MEMPTR lpTable;
00923     
SFLOAT IlluminantWP[3];
00924     
SFLOAT MediaWP[3];
00925     
MEMPTR lpBuff = 
NULL;
00926     
SINT MemSize = 0;
00927     
MEMPTR lpOldMem = lpMem;
00928     HGLOBAL hBuff;
00929     
MEMPTR lpLineStart;
00930  
00931     
if (!
DoesCPTagExist (cp, 
icSigGrayTRCTag) ||
00932         !
GetCPTagIndex (cp, 
icSigGrayTRCTag, &
Index) ||
00933         !
GetCPElementType (cp, 
Index, (
LPCSIG) & Tag) ||
00934         (Tag != 
icSigCurveType) ||
00935         !
GetCPConnSpace (cp, (
LPCSIG) & PCS) ||
00936         !
GetCPElementSize (cp, 
Index, (
LPSINT) & MemSize) ||
00937         !
MemAlloc (MemSize, (HGLOBAL 
FAR *)&hBuff, (
LPMEMPTR) & lpBuff) ||
00938         !
GetCPElement (cp, 
Index, lpBuff, MemSize))
00939     {
00940         
if (
NULL != lpBuff)
00941         {
00942             
MemFree (hBuff);
00943         }
00944         
return (
FALSE);
00945     }
00946     nCount = 
ui32toSINT (((
lpcpCurveType) lpBuff)->curve.count);
00947 
00948  
00949     *lpcbSize = nCount * 6 +            
00950         3 * (lstrlen (
IndexArray) +
00951              lstrlen (
StartClip) +
00952              lstrlen (
EndClip)) +
00953         2048;                           
00954     
if (lpMem == 
NULL)                  
00955     {
00956         
MemFree (hBuff);
00957         
return (
TRUE);
00958     }
00959  
00960     
GetCPWhitePoint (cp, (
LPSFLOAT) & IlluminantWP);          
00961 
00962  
00963     
GetMediaWP(cp, InputIntent, IlluminantWP, MediaWP);
00964 
00965  
00966     lpMem += 
WriteNewLineObject (lpMem, 
CieBasedABCBegin);
00967 
00968     lpMem += 
WriteNewLineObject (lpMem, 
BeginArray);   
00969  
00970     lpMem += 
WriteObject (lpMem, 
CIEBasedABCTag);   
00971     lpMem += 
WriteObject (lpMem, 
BeginDict);    
00972 
00973  
00974     lpMem += 
SendCSABWPoint(lpMem, InputIntent, IlluminantWP, MediaWP);
00975 
00976  
00977     lpMem += 
WriteObject (lpMem, 
NewLine);
00978     lpLineStart = lpMem;
00979 
00980     
if (nCount != 0)
00981     {
00982         lpMem += 
WriteObject (lpMem, 
DecodeABCTag);
00983         lpMem += 
WriteObject (lpMem, 
BeginArray);
00984 
00985         lpMem += 
WriteObject (lpMem, 
BeginFunction);
00986         
if (nCount == 1)                
00987         {
00988             lpTable = (
MEMPTR) (((
lpcpCurveType) lpBuff)->curve.data);
00989             lpMem += 
WriteInt (lpMem, 
ui16toSINT (lpTable));
00990             lpMem += 
WriteObject (lpMem, 
DecodeA3);
00991         } 
else
00992         {
00993             lpMem += 
WriteObject (lpMem, 
StartClip);
00994             lpTable = (
MEMPTR) (((
lpcpCurveType) lpBuff)->curve.data);
00995             lpMem += 
WriteObject (lpMem, 
BeginArray);
00996             
for (i = 0; i < nCount; i++)
00997             {
00998                 lpMem += 
WriteInt (lpMem, 
ui16toSINT (lpTable));
00999                 lpTable += 
sizeof (
icUInt16Number);
01000                 
if (((
SINT) (lpMem - lpLineStart)) > 
MAX_LINELENG)
01001                 {
01002                     lpLineStart = lpMem;
01003                     lpMem += 
WriteObject (lpMem, 
NewLine);
01004                 }
01005             }
01006             lpMem += 
WriteObject (lpMem, 
EndArray);
01007             lpLineStart = lpMem;
01008             lpMem += 
WriteObject (lpMem, 
NewLine);
01009 
01010             lpMem += 
WriteObject (lpMem, 
IndexArray);
01011             lpMem += 
WriteObject (lpMem, 
Scale16);
01012             lpMem += 
WriteObject (lpMem, 
EndClip);
01013         }
01014         lpMem += 
WriteObject (lpMem, 
EndFunction);
01015         lpMem += 
WriteObject (lpMem, 
DupOp);
01016         lpMem += 
WriteObject (lpMem, 
DupOp);
01017         lpMem += 
WriteObject (lpMem, 
EndArray);
01018     }
01019  
01020     lpMem += 
WriteNewLineObject (lpMem, 
MatrixABCTag);
01021     lpMem += 
WriteObject (lpMem, 
BeginArray);
01022     
for (i = 0; i < 3; i ++)
01023     {
01024         
for (j = 0; j < 3; j++)
01025         {
01026             
if (i != j)
01027                 lpMem += 
WriteFloat (lpMem, (
double)0);
01028             
else
01029             {
01030                 
if (InputIntent == 
icAbsoluteColorimetric)
01031                     lpMem += 
WriteFloat (lpMem, (
double)MediaWP[i]);
01032                 
else
01033                     lpMem += 
WriteFloat (lpMem, (
double)IlluminantWP[i]);
01034             }
01035         }
01036     }
01037     lpMem += 
WriteObject (lpMem, 
EndArray);
01038 
01039  
01040     lpMem += 
WriteNewLineObject (lpMem, 
RangeLMNTag);
01041     lpMem += 
WriteObject (lpMem, 
RangeLMN);
01042 
01043 
01044     lpMem += 
WriteObject (lpMem, 
EndDict);  
01045     lpMem += 
WriteObject (lpMem, 
EndArray);
01046 
01047     
MemFree (hBuff);
01048 
01049     lpMem += 
WriteNewLineObject (lpMem, 
CieBasedABCEnd);
01050     *lpcbSize = (
DWORD) (lpMem - lpOldMem);
01051     
return (
TRUE);
01052 }
01053 
01054 
01055 
01056 
01057 
01058 
01059 
01060 
01061 
01062 
01063 
01064 
01065 
01066 
01067 
01068 
01069 
01070 
01071 
01072 
01073 
01074 
01075 
static BOOL
01076 GetPS2CSA_MONO_A (CHANDLE cp, MEMPTR lpMem, LPDWORD lpcbSize, 
01077                   CSIG InputIntent, BOOL AllowBinary)
01078 {
01079     
SINT nCount;
01080     
CSIG Tag, PCS;
01081     
SINT i, 
Index;
01082     
MEMPTR lpTable;
01083     
SFLOAT IlluminantWP[3];
01084     
SFLOAT MediaWP[3];
01085     
MEMPTR lpBuff = 
NULL;
01086     
SINT MemSize = 0;
01087     
MEMPTR lpOldMem = lpMem;
01088     HGLOBAL hBuff;
01089     
MEMPTR lpLineStart;
01090  
01091     
if (!
DoesCPTagExist (cp, 
icSigGrayTRCTag) ||
01092         !
GetCPTagIndex (cp, 
icSigGrayTRCTag, &
Index) ||
01093         !
GetCPElementType (cp, 
Index, (
LPCSIG) & Tag) ||
01094         (Tag != 
icSigCurveType) ||
01095         !
GetCPConnSpace (cp, (
LPCSIG) & PCS) ||
01096         !
GetCPElementSize (cp, 
Index, (
LPSINT) & MemSize) ||
01097         !
MemAlloc (MemSize, (HGLOBAL 
FAR *)&hBuff, (
LPMEMPTR) & lpBuff) ||
01098         !
GetCPElement (cp, 
Index, lpBuff, MemSize))
01099     {
01100         
if (
NULL != lpBuff)
01101         {
01102             
MemFree (hBuff);
01103         }
01104         
return (
FALSE);
01105     }
01106     nCount = 
ui32toSINT (((
lpcpCurveType) lpBuff)->curve.count);
01107 
01108  
01109     *lpcbSize = nCount * 6 +            
01110         3 * (lstrlen (
IndexArray) +
01111              lstrlen (
StartClip) +
01112              lstrlen (
EndClip)) +
01113         2048;                           
01114     
if (lpMem == 
NULL)                  
01115     {
01116         
MemFree (hBuff);
01117         
return (
TRUE);
01118     }
01119  
01120     
GetCPWhitePoint (cp, (
LPSFLOAT) & IlluminantWP);          
01121 
01122  
01123     
GetMediaWP(cp, InputIntent, IlluminantWP, MediaWP);
01124 
01125  
01126     lpMem += 
WriteNewLineObject (lpMem, 
CieBasedABegin);
01127 
01128     lpMem += 
WriteNewLineObject (lpMem, 
BeginArray);   
01129  
01130     lpMem += 
WriteObject (lpMem, 
CIEBasedATag); 
01131     lpMem += 
WriteObject (lpMem, 
BeginDict);    
01132 
01133  
01134     lpMem += 
SendCSABWPoint(lpMem, InputIntent, IlluminantWP, MediaWP);
01135 
01136  
01137     lpMem += 
WriteObject (lpMem, 
NewLine);
01138     lpLineStart = lpMem;
01139 
01140     
if (nCount != 0)
01141     {
01142         lpMem += 
WriteObject (lpMem, 
DecodeATag);
01143         lpMem += 
WriteObject (lpMem, 
BeginArray);
01144 
01145         lpMem += 
WriteObject (lpMem, 
BeginFunction);
01146         
if (nCount == 1)                
01147         {
01148             lpTable = (
MEMPTR) (((
lpcpCurveType) lpBuff)->curve.data);
01149             lpMem += 
WriteInt (lpMem, 
ui16toSINT (lpTable));
01150             lpMem += 
WriteObject (lpMem, 
DecodeA3);
01151     
01152     
01153     
01154             
if (PCS == 
icSigLabData)
01155             {
01156                 lpMem += 
WriteObject (lpMem, 
DecodeALab);
01157                 lpMem += 
WriteObject (lpMem, 
DecodeLMNLab);
01158             }
01159         } 
else
01160         {
01161             lpMem += 
WriteObject (lpMem, 
StartClip);
01162             lpTable = (
MEMPTR) (((
lpcpCurveType) lpBuff)->curve.data);
01163             lpMem += 
WriteObject (lpMem, 
BeginArray);
01164             
for (i = 0; i < nCount; i++)
01165             {
01166                 lpMem += 
WriteInt (lpMem, 
ui16toSINT (lpTable));
01167                 lpTable += 
sizeof (
icUInt16Number);
01168                 
if (((
SINT) (lpMem - lpLineStart)) > 
MAX_LINELENG)
01169                 {
01170                     lpLineStart = lpMem;
01171                     lpMem += 
WriteObject (lpMem, 
NewLine);
01172                 }
01173             }
01174             lpMem += 
WriteObject (lpMem, 
EndArray);
01175             lpLineStart = lpMem;
01176             lpMem += 
WriteObject (lpMem, 
NewLine);
01177 
01178             lpMem += 
WriteObject (lpMem, 
IndexArray);
01179             lpMem += 
WriteObject (lpMem, 
Scale16);
01180     
01181     
01182     
01183             
if (PCS == 
icSigLabData)
01184             {
01185                 lpMem += 
WriteObject (lpMem, 
DecodeALab);
01186                 lpMem += 
WriteObject (lpMem, 
DecodeLMNLab);
01187             }
01188             lpMem += 
WriteObject (lpMem, 
EndClip);
01189         }
01190         lpMem += 
WriteObject (lpMem, 
EndFunction);
01191         lpMem += 
WriteObject (lpMem, 
EndArray);
01192     }
01193 
01194  
01195     lpMem += 
WriteNewLineObject (lpMem, 
MatrixATag);
01196     lpMem += 
WriteObject (lpMem, 
BeginArray);
01197     
for (i = 0; i < 3; i++)
01198     {
01199         
if (InputIntent == 
icAbsoluteColorimetric)
01200             lpMem += 
WriteFloat (lpMem, (
double) MediaWP[i]);
01201         
else
01202             lpMem += 
WriteFloat (lpMem, (
double) IlluminantWP[i]);
01203     }
01204     lpMem += 
WriteObject (lpMem, 
EndArray);
01205 
01206  
01207     lpMem += 
WriteNewLineObject (lpMem, 
RangeLMNTag);
01208     lpMem += 
WriteObject (lpMem, 
RangeLMN);
01209 
01210  
01211     lpMem += 
WriteObject (lpMem, 
EndDict);  
01212     lpMem += 
WriteObject (lpMem, 
EndArray);
01213 
01214     
MemFree (hBuff);
01215 
01216     lpMem += 
WriteNewLineObject (lpMem, 
CieBasedAEnd);
01217     *lpcbSize = (
DWORD) (lpMem - lpOldMem);
01218     
return (
TRUE);
01219 }
01220 
01221 
01222 
01223 
01224 
01225 
01226 
01227 
01228 
01229 
01230 
01231 
01232 
01233 
01234 
01235 
01236 
01237 
01238 
01239 
01240 
01241 
01242 
01243 
static BOOL
01244 GetPS2CSA_MONO (CHANDLE cp, MEMPTR lpMem, LPDWORD lpcbSize,
01245                 DWORD InpDrvClrSp, CSIG InputIntent, BOOL AllowBinary)
01246 {
01247     
BOOL Success = 
FALSE;
01248 
#if 0
01249 
    if ((InpDrvClrSp == 
icSigRgbData) ||
01250         (InpDrvClrSp == 
icSigDefData) ||
01251         (InpDrvClrSp == 0))
01252     {
01253         Success = 
GetPS2CSA_MONO_ABC (cp, lpMem, lpcbSize, InputIntent, 
AllowBinary);
01254     } 
else if (InpDrvClrSp == 
icSigGrayData)
01255     {
01256         Success = 
GetPS2CSA_MONO_A (cp, lpMem, lpcbSize, InputIntent, 
AllowBinary);
01257     }
01258 
#else
01259 
    if ((InpDrvClrSp == 
icSigGrayData) ||
01260         (InpDrvClrSp == 0))
01261     {
01262         Success = 
GetPS2CSA_MONO_A (cp, lpMem, lpcbSize, InputIntent, 
AllowBinary);
01263     }
01264     
else
01265     {
01266         Success = 
FALSE;
01267     }
01268 
#endif
01269 
    return Success;
01270 }
01271 
01272 
01273 
01274 
01275 
01276 
01277 
SINT 
01278 
CreateColSpProc (CHANDLE cp, MEMPTR lpMem, CSIG CPTag, BOOL AllowBinary)
01279 {
01280     
SINT nCount, 
Index;
01281     
MEMPTR lpTable;
01282     
MEMPTR Buff = 
NULL;
01283     
SINT MemSize = 0;
01284     
MEMPTR lpOldMem;
01285     HGLOBAL hBuff;
01286     lpOldMem = lpMem;
01287     lpMem += 
WriteObject (lpMem, BeginFunction);
01288     
if (
DoesCPTagExist (cp, CPTag) &&
01289         
GetCPTagIndex (cp, CPTag, (LPSINT) & Index) &&
01290         
GetCPElementSize (cp, Index, (LPSINT) & MemSize) &&
01291         
MemAlloc (MemSize, (HGLOBAL FAR *)&hBuff, (LPMEMPTR) & Buff) &&
01292         
GetCPElement (cp, Index, Buff, MemSize))
01293     {
01294         nCount = 
ui32toSINT (((lpcpCurveType) Buff)->curve.count);
01295         
if (nCount != 0)
01296         {
01297             
if (nCount == 1)            
01298             {
01299                 lpTable = (
MEMPTR) (((
lpcpCurveType) Buff)->curve.data);
01300                 lpMem += 
WriteInt (lpMem, ui16toSINT (lpTable));
01301                 lpMem += 
WriteObject (lpMem, DecodeA3);
01302             } 
else
01303             {
01304                 lpMem += 
WriteObject (lpMem, StartClip);
01305                 lpTable = (
MEMPTR) (((
lpcpCurveType) Buff)->curve.data);
01306                 lpMem += 
WriteObject (lpMem, DecodeABCArray);
01307                 lpMem += 
WriteInt (lpMem, (SINT) CPTag);
01308 
01309                 
if (!
AllowBinary)       
01310                 {
01311                     lpMem += 
WriteObject (lpMem, IndexArray);
01312                 } 
else
01313                 {                       
01314                     lpMem += 
WriteObject (lpMem, IndexArray16b);
01315                 }
01316                 lpMem += 
WriteObject (lpMem, Scale16);
01317                 lpMem += 
WriteObject (lpMem, EndClip);
01318             }
01319         }
01320         
MemFree (hBuff);
01321     }
01322     lpMem += 
WriteObject (lpMem, EndFunction);
01323     
return ((
SINT) (lpMem - lpOldMem));
01324 }
01325 
01326 
01327 
01328 
01329 
01330 
01331 
SINT 
01332 
CreateFloatString (CHANDLE cp, MEMPTR lpMem, CSIG CPTag)
01333 {
01334     
SINT i, 
Index;
01335     
MEMPTR lpTable;
01336     
MEMPTR Buff = 
NULL;
01337     
SINT MemSize = 0;
01338     
MEMPTR lpOldMem;
01339     HGLOBAL hBuff;
01340     lpOldMem = lpMem;
01341     
if (
GetCPTagIndex (cp, CPTag, (LPSINT) & Index) &&
01342         
GetCPElementSize (cp, Index, (LPSINT) & MemSize) &&
01343         
MemAlloc (MemSize, (HGLOBAL FAR *)&hBuff, (LPMEMPTR) & Buff) &&
01344         
GetCPElement (cp, Index, Buff, MemSize))
01345     {
01346         lpTable = (
MEMPTR) & (((
lpcpXYZType) Buff)->data);
01347         
for (i = 0; i < 3; i++)
01348         {
01349             lpMem += 
WriteFloat (lpMem, si16f16toSFLOAT (lpTable));
01350             lpTable += 
sizeof (
icS15Fixed16Number);
01351         }
01352         
MemFree (hBuff);
01353     }
01354     
return ((
SINT) (lpMem - lpOldMem));
01355 }
01356 
01357 
01358 
01359 
01360 
01361 
01362 
SINT 
01363 
CreateColSpArray (CHANDLE cp, MEMPTR lpMem, CSIG CPTag, BOOL AllowBinary)
01364 {
01365     
SINT i, nCount, 
Index;
01366     
MEMPTR lpTable;
01367     
MEMPTR Buff = 
NULL;
01368     
SINT MemSize = 0;
01369     
MEMPTR lpOldMem, lpLineStart;
01370     HGLOBAL hBuff;
01371     lpOldMem = lpMem;
01372 
01373     lpLineStart = lpMem;
01374 
01375     
if (
DoesCPTagExist (cp, CPTag) &&
01376         
GetCPTagIndex (cp, CPTag, (LPSINT) & Index) &&
01377         
GetCPElementSize (cp, Index, (LPSINT) & MemSize) &&
01378         
MemAlloc (MemSize, (HGLOBAL FAR *)&hBuff, (LPMEMPTR) & Buff) &&
01379         
GetCPElement (cp, Index, Buff, MemSize))
01380     {
01381         nCount = 
ui32toSINT (((lpcpCurveType) Buff)->curve.count);
01382         
if (nCount > 1)
01383         {
01384             lpMem += 
WriteNewLineObject (lpMem, Slash);
01385             lpMem += 
WriteObject (lpMem, DecodeABCArray);
01386             lpMem += 
WriteInt (lpMem, (SINT) CPTag);
01387 
01388             lpTable = (
MEMPTR) (((
lpcpCurveType) Buff)->curve.data);
01389             
if (!
AllowBinary)           
01390             {
01391                 lpMem += 
WriteObject (lpMem, BeginArray);
01392                 
for (i = 0; i < nCount; i++)
01393                 {
01394                     lpMem += 
WriteInt (lpMem, ui16toSINT (lpTable));
01395                     lpTable += 
sizeof (
icUInt16Number);
01396                     
if (((
SINT) (lpMem - lpLineStart)) > 
MAX_LINELENG)
01397                     {
01398                         lpLineStart = lpMem;
01399                         lpMem += 
WriteObject (lpMem, NewLine);
01400                     }
01401                 }
01402                 lpMem += 
WriteObject (lpMem, EndArray);
01403             } 
else
01404             {                           
01405                 lpMem += 
WriteHNAToken (lpMem, 149, nCount);
01406                 lpMem += 
WriteIntStringU2S (lpMem, lpTable, nCount);
01407             }
01408             lpMem += 
WriteObject (lpMem, DefOp);
01409         }
01410         
MemFree (hBuff);
01411     }
01412     
return ((
SINT) (lpMem - lpOldMem));
01413 }
01414 
01415 
01416 
01417 
01418 
01419 
01420 
01421 
01422 
01423 
01424 
01425 
01426 
01427 
01428 
01429 
01430 
01431 
01432 
01433 
01434 
01435 
01436 
01437 
01438 
01439 
01440 
static BOOL
01441 GetCSAFromProfile (
01442                    CHANDLE cp,
01443                    MEMPTR lpMem,
01444                    LPDWORD lpcbSize,
01445                    DWORD InpDrvClrSp,
01446                    CSIG DrvColorSpace,
01447                    BOOL AllowBinary)
01448 {
01449     
SINT Index;
01450     
SINT Size;
01451     
if ((DrvColorSpace == 
icSigGrayData) && (InpDrvClrSp != 
icSigGrayData))
01452         
return FALSE;
01453 
01454     
if (
DoesCPTagExist (cp, 
icSigPs2CSATag) &&
01455         
GetCPTagIndex (cp, 
icSigPs2CSATag, (
LPSINT) & 
Index) &&
01456         
GetCPElementDataSize (cp, 
Index, (
LPSINT) & 
Size) &&
01457         ((lpMem == 
NULL) || 
GetCPElementData (cp, 
Index, lpMem, 
Size)) &&
01458         (*lpcbSize = 
Convert2Ascii (cp, 
Index, lpMem, *lpcbSize, 
Size, 
AllowBinary)))
01459     {
01460         
return TRUE;
01461     } 
else
01462     {
01463         
return FALSE;
01464     }
01465 }
01466 
01467 
01468 
01469 
01470 
01471 
01472 
01473 
01474 
01475 
01476 
01477 
01478 
01479 
01480 
01481 
01482 
01483 
01484 
01485 
01486 
01487 
01488 
01489 
01490 
01491 
01492 
BOOL
01493 GetPS2CSA_DEFG_Intent (
01494                        CHANDLE cp,
01495                        MEMPTR lpBuffer,
01496                        LPDWORD lpcbSize,
01497                        DWORD InpDrvClrSp,
01498                        CSIG Intent,
01499                        
int Type,
01500                        BOOL AllowBinary)
01501 {
01502     
SINT Index;
01503     
BOOL Success = 
FALSE;
01504     
CSIG icSigAToBx;
01505 
01506  
01507     
if (((Type == 
TYPE_CIEBASEDDEFG) && (InpDrvClrSp != 
icSigCmykData) ||
01508          (Type == 
TYPE_CIEBASEDDEF) && (InpDrvClrSp != 
icSigDefData)) &&
01509         (InpDrvClrSp != 0))
01510     {
01511         
return (
FALSE);
01512     }
01513     
switch (
Intent)
01514     {
01515         
case icPerceptual:
01516             icSigAToBx = 
icSigAToB0Tag;
01517             
break;
01518         
case icRelativeColorimetric:
01519             icSigAToBx = 
icSigAToB1Tag;
01520             
break;
01521         
case icSaturation:
01522             icSigAToBx = 
icSigAToB2Tag;
01523             
break;
01524         
case icAbsoluteColorimetric:
01525             icSigAToBx = 
icSigAToB1Tag;
01526             
break;
01527         
default:
01528             
return Success;
01529     }
01530 
01531     
if (
DoesCPTagExist (cp, icSigAToBx) &&
01532         
GetCPTagIndex (cp, icSigAToBx, (
LPSINT) & 
Index))
01533     {
01534         Success = 
GetPS2CSA_DEFG (cp, lpBuffer, lpcbSize, 
Intent, 
Index, Type, 
AllowBinary);
01535     }
01536 
01537     
return Success;
01538 }
01539 
01540 
01541 
01542 
01543 
01544 
01545 
01546 
01547 
01548 
01549 
01550 
01551 
01552 
01553 
01554 
01555 
01556 
01557 
01558 
01559 
01560 
01561 
01562 
01563 
01564 
01565 
01566 
01567 
01568 
01569 
BOOL EXTERN
01570 GetPS2ColorSpaceArray (
01571                        CHANDLE cp,
01572                        DWORD InputIntent,
01573                        DWORD InpDrvClrSp,
01574                        MEMPTR lpBuffer,
01575                        LPDWORD lpcbSize,
01576                        BOOL AllowBinary)
01577 {
01578     
CSIG ColorSpace, 
Intent;
01579     
BOOL Success = 
FALSE;
01580     
DWORD dwSaveSize;
01581     
if (!cp)
01582         
return Success;
01583 
01584     
if (!
GetCPDevSpace (cp, (
LPCSIG) & ColorSpace) ||
01585         !
GetCPRenderIntent (cp, (
LPCSIG) & 
Intent))
01586     {
01587         
return Success;
01588     }
01589     dwSaveSize = *lpcbSize;
01590     
if (InputIntent == 
icUseRenderingIntent)
01591         InputIntent = (
DWORD)
Intent;
01592 
01593  
01594     
if ((
CSIG) InputIntent == 
Intent)
01595     {
01596         Success = 
GetCSAFromProfile (cp, lpBuffer, lpcbSize,
01597                                      InpDrvClrSp, ColorSpace, 
AllowBinary);
01598     }
01599     
if (!Success)
01600     {
01601         
switch (ColorSpace)
01602         {
01603             
case icSigRgbData:
01604                 Success = 
GetPS2CSA_DEFG_Intent (cp, lpBuffer, lpcbSize,
01605                                                  InpDrvClrSp, (
CSIG) InputIntent, 
01606                                                  
TYPE_CIEBASEDDEF, 
AllowBinary);
01607                 
if (Success)
01608                 {                       
01609                                         
01610                                         
01611                     
DWORD cbNewSize = 0;
01612                     
MEMPTR lpNewBuffer;
01613                     
MEMPTR lpOldBuffer;
01614                     
if (lpBuffer)
01615                     {
01616                         lpNewBuffer = lpBuffer + *lpcbSize;
01617                         lpOldBuffer = lpNewBuffer;
01618                         lpNewBuffer += 
WriteObject (lpNewBuffer, 
NewLine);
01619                         cbNewSize = dwSaveSize - (
DWORD) (lpNewBuffer - lpBuffer);
01620                     } 
else
01621                         lpNewBuffer = 
NULL;
01622 
01623                     
if (!
GetPS2CSA_ABC (cp, lpNewBuffer, &cbNewSize,
01624                                         (
CSIG)InputIntent, InpDrvClrSp, 
01625                                         
AllowBinary, 1))   
01626                         
GetDeviceRGB (lpNewBuffer, &cbNewSize, InpDrvClrSp, 1);
01627 
01628                     
if (lpBuffer)
01629                     {
01630                         lpNewBuffer += cbNewSize;
01631                         *lpcbSize += (
DWORD) (lpNewBuffer - lpOldBuffer);
01632                     } 
else
01633                         *lpcbSize += cbNewSize;
01634 
01635                 }
01636                 
if (!Success)
01637                 {                           
01638                     Success = 
GetPS2CSA_ABC (cp, lpBuffer, lpcbSize,
01639                                          (
CSIG)InputIntent, InpDrvClrSp, 
01640                                          
AllowBinary, 0);
01641                 }
01642                 
if (!Success)
01643                 {                           
01644                     Success = 
GetDeviceRGB (lpBuffer, lpcbSize, InpDrvClrSp, 0);
01645                     Success = 
FALSE;
01646                 }
01647                 
break;
01648             
case icSigCmykData:
01649                 Success = 
GetPS2CSA_DEFG_Intent (cp, lpBuffer, lpcbSize,
01650                                                  InpDrvClrSp, (
CSIG) InputIntent, 
01651                                                  
TYPE_CIEBASEDDEFG, 
AllowBinary);
01652                 
if (Success)
01653                 {                       
01654                                         
01655                     
DWORD cbNewSize = 0;
01656                     
MEMPTR lpNewBuffer;
01657                     
MEMPTR lpOldBuffer;
01658                     
if (lpBuffer)
01659                     {
01660                         lpNewBuffer = lpBuffer + *lpcbSize;
01661                         lpOldBuffer = lpNewBuffer;
01662                         lpNewBuffer += 
WriteObject (lpNewBuffer, 
NewLine);
01663                         lpNewBuffer += 
WriteNewLineObject (lpNewBuffer, 
NotSupportDEFG_S);
01664                         cbNewSize = dwSaveSize - (
DWORD) (lpNewBuffer - lpBuffer);
01665                     } 
else
01666                         lpNewBuffer = 
NULL;
01667 
01668                     
GetDeviceCMYK (lpNewBuffer, &cbNewSize, InpDrvClrSp);
01669 
01670                     
if (lpBuffer)
01671                     {
01672                         lpNewBuffer += cbNewSize;
01673                         lpNewBuffer += 
WriteNewLineObject (lpNewBuffer, 
SupportDEFG_E);
01674                         *lpcbSize += (
DWORD) (lpNewBuffer - lpOldBuffer);
01675                     } 
else
01676                         *lpcbSize += cbNewSize;
01677                 }
01678                 
if (!Success)
01679                 {                           
01680                     Success = 
GetDeviceCMYK (lpBuffer, lpcbSize, InpDrvClrSp);
01681                     Success = 
FALSE;
01682                 }
01683                 
break;
01684             
case icSigGrayData:
01685                 Success = 
GetPS2CSA_MONO (cp, lpBuffer, lpcbSize, InpDrvClrSp, 
01686                                           (
CSIG)InputIntent, 
AllowBinary);
01687                 
if (!Success)
01688                 {                           
01689                     Success = 
GetDeviceGray (lpBuffer, lpcbSize, InpDrvClrSp);
01690                     Success = 
FALSE;
01691                 }
01692                 
break;
01693             
case icSigLabData:
01694                 Success = 
GetPS2CSA_DEFG_Intent (cp, lpBuffer, lpcbSize,
01695                                                  InpDrvClrSp, (
CSIG) InputIntent, 
01696                                                  
TYPE_CIEBASEDDEF, 
AllowBinary);
01697                 
if (Success)
01698                 {                       
01699                                         
01700                                         
01701                     
DWORD cbNewSize = 0;
01702                     
MEMPTR lpNewBuffer;
01703                     
MEMPTR lpOldBuffer;
01704                     
if (lpBuffer)
01705                     {
01706                         lpNewBuffer = lpBuffer + *lpcbSize;
01707                         lpOldBuffer = lpNewBuffer;
01708                         lpNewBuffer += 
WriteObject (lpNewBuffer, 
NewLine);
01709                         lpNewBuffer += 
WriteNewLineObject (lpNewBuffer, 
NotSupportDEFG_S);
01710                         cbNewSize = dwSaveSize - (
DWORD) (lpNewBuffer - lpBuffer);
01711                     } 
else
01712                         lpNewBuffer = 
NULL;
01713 
01714                     
GetPS2CSA_ABC_LAB (cp, lpNewBuffer, &cbNewSize,
01715                                         (
CSIG)InputIntent, InpDrvClrSp, 
AllowBinary);
01716 
01717                     
if (lpBuffer)
01718                     {
01719                         lpNewBuffer += cbNewSize;
01720                         lpNewBuffer += 
WriteNewLineObject (lpNewBuffer, 
SupportDEFG_E);
01721                         *lpcbSize += (
DWORD) (lpNewBuffer - lpOldBuffer);
01722                     } 
else
01723                         *lpcbSize += cbNewSize;
01724                 }
01725                 
if (!Success)
01726                 {                           
01727                     Success = 
GetPS2CSA_ABC_LAB (cp, lpBuffer, lpcbSize,
01728                                          (
CSIG)InputIntent, InpDrvClrSp, 
AllowBinary);
01729                 }
01730                 
break;
01731 
01732             
default:
01733                 
break;
01734         }
01735     }
01736     
return Success;
01737 }