Hi,
I need some help to create a DeviceN colorspace.
Thanks to the PDF Reference and this forum, I have written this function
// Creates a DeviceN colorspace
PDEColorSpacecreateDeviceN(PDDocpdDoc){
PDEColorSpacedeviceNColorSpace;
CosDoc cosDocObj=PDDocGetCosDoc(pdDoc);
CosObj colourSpaceCosObj=CosNewArray(cosDocObj,true,4);
// Names array
CosObj namesCosObj=CosNewArray(cosDocObj,false,5);
CosArrayPut(namesCosObj,0,CosNewNameFromString(cosDocObj,false,"Cyan"));
CosArrayPut(namesCosObj,1,CosNewNameFromString(cosDocObj,false,"Magenta"));
CosArrayPut(namesCosObj,2,CosNewNameFromString(cosDocObj,false,"Yellow"));
CosArrayPut(namesCosObj,3,CosNewNameFromString(cosDocObj,false,"Black"));
CosArrayPut(namesCosObj,4,CosNewNameFromString(cosDocObj,false,"Blue"));
// Domain
CosObjcosDomainObj=CosNewArray(cosDocObj,false,10);
CosArrayPut(cosDomainObj,0,CosNewFloat(cosDocObj,false,(float)0.0));
CosArrayPut(cosDomainObj,1,CosNewFloat(cosDocObj,false,(float)1.0));
[…]
// Range
CosObjcosRangeObj=CosNewArray(cosDocObj,false,8);
CosArrayPut(cosRangeObj,0,CosNewFloat(cosDocObj,false,(float)0.0));
CosArrayPut(cosRangeObj,1,CosNewFloat(cosDocObj,false,(float)1.0));
[…]
// Function
//const char *PostScriptFunc = "{ pop }";
constchar *PostScriptFunc="{ 0.5 0.5 0.5 0.5 }";
ASInt32Size=strlen(PostScriptFunc);
CosObjcosFunctDict=CosNewDict(cosDocObj,false,4);
CosDictPut(cosFunctDict,ASAtomFromString("FunctionType"),CosNewInteger(cosDocObj,false,4));
CosDictPut(cosFunctDict,ASAtomFromString("Domain"),cosDomainObj);
CosDictPut(cosFunctDict,ASAtomFromString("Range"),cosRangeObj);
CosDictPut(cosFunctDict,ASAtomFromString("Length"),CosNewInteger(cosDocObj,true,Size));
ASStmStream=ASMemStmRdOpen(PostScriptFunc,Size);
CosObjPostScriptFuncStreamObj=CosNewStream(cosDocObj,true,Stream,0,true,cosFunctDict,CosNewNull(),-1);
ASStmClose(Stream);
CosArrayPut(colourSpaceCosObj,0,CosNewNameFromString(cosDocObj,false,"DeviceN"));
CosArrayPut(colourSpaceCosObj,1,namesCosObjP);
CosArrayPut(colourSpaceCosObj,2,CosNewNameFromString(cosDocObj,false,"DeviceCMYK"));
CosArrayPut(colourSpaceCosObj,3,PostScriptFuncStreamObj);
deviceNColorSpace=PDEColorSpaceCreateFromCosObj(&colourSpaceCosObj);
returndeviceNColorSpace;
}
According to an answer on a post of yokuju, I have tried to add the optional attributes by adding this part to the function
// Domain
CosObjcosDomainObj2=CosNewArray(cosDocObj,false,2);
CosArrayPut(cosDomainObj2,0,CosNewFloat(cosDocObj,false,(float)0.0));
CosArrayPut(cosDomainObj2,1,CosNewFloat(cosDocObj,false,(float)1.0));
// Range
CosObjcosRangeObj2=CosNewArray(cosDocObj,false,8);
CosArrayPut(cosRangeObj2,0,CosNewFloat(cosDocObj,false,(float)0.0));
CosArrayPut(cosRangeObj2,1,CosNewFloat(cosDocObj,false,(float)1.0));
[...]
// Function
constchar *PostScriptFunc2="{ 1.0 1.0 0.0 0.0 }";
ASInt32Size2=strlen(PostScriptFunc2);
CosObjcosFunctDict2=CosNewDict(cosDocObj,false,4);
CosDictPut(cosFunctDict2,ASAtomFromString("FunctionType"),CosNewInteger(cosDocObj,false,4));
CosDictPut(cosFunctDict2,ASAtomFromString("Domain"),cosDomainObj2);
CosDictPut(cosFunctDict2,ASAtomFromString("Range"),cosRangeObj2);
CosDictPut(cosFunctDict2,ASAtomFromString("Length"),CosNewInteger(cosDocObj,true,Size2));
ASStmStream2=ASMemStmRdOpen(PostScriptFunc2,Size2);
CosObjPostScriptFuncStreamObj2=CosNewStream(cosDocObj,true,Stream2,0,true,cosFunctDict2,CosNewNull(),-1);
ASStmClose(Stream2);
CosObjcosBlueObj=CosNewArray(cosDocObj,false,4);
CosArrayPut(cosBlueObj,0,CosNewNameFromString(cosDocObj,false,"Separation"));
CosArrayPut(cosBlueObj,1,CosNewNameFromString(cosDocObj,false,"Blue"));
CosArrayPut(cosBlueObj,2,CosNewNameFromString(cosDocObj,false,"DeviceCMYK"));
CosArrayPut(cosBlueObj,3,PostScriptFuncStreamObj2);
// Colorants sictionary
CosObjcosColorantsDict=CosNewDict(cosDocObj,false,1);
CosDictPut(cosFunctDict2,ASAtomFromString("Blue"),cosBlueObj);
CosArrayPut(colourSpaceCosObjP,4,PostScriptFuncStreamObj2);
Even with the additionnal attribute, I still have the same issue as Sam BSW. If I use just one time this colorspace, the current page will be empty. In the PDF file instead of having something like
<</Contents 3 0 R/CropBox[0.0 0.0 612.0 842.4]/MediaBox[0.0 0.0 612.0 842.4]/Parent 162 0 R/Resources<</ColorSpace<</CS0 227 0 R/CS1 227 0 R>>/Font<</T1_0 12 0 R/ [...] /T1_9 29 0 R>>/ProcSet[/PDF/Text/ImageC]/XObject<</Im0 230 0 R>>>>/Rotate 0/Type/Page>>
for the page, I have simply
<</CropBox[0.0 0.0 612.0 842.4]/MediaBox[0.0 0.0 612.0 842.4]/Parent 162 0 R/Resources<<>>/Rotate 0/Type/Page>>
I am not a power user of the Adobe SDK so I am stuck here. I hope that someone can help me with my issue.
Thank you