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