Create a DeviceN colorspace
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
PDEColorSpace createDeviceN(PDDoc pdDoc) {
PDEColorSpace deviceNColorSpace;
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
CosObj cosDomainObj = CosNewArray(cosDocObj, false, 10);
CosArrayPut(cosDomainObj, 0, CosNewFloat(cosDocObj, false, (float) 0.0));
CosArrayPut(cosDomainObj, 1, CosNewFloat(cosDocObj, false, (float) 1.0));
[…]
// Range
CosObj cosRangeObj = 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 }";
const char *PostScriptFunc = "{ 0.5 0.5 0.5 0.5 }";
ASInt32 Size = strlen(PostScriptFunc);
CosObj cosFunctDict = 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));
ASStm Stream = ASMemStmRdOpen(PostScriptFunc, Size);
CosObj PostScriptFuncStreamObj = 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);
return deviceNColorSpace;
}
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
CosObj cosDomainObj2 = CosNewArray(cosDocObj, false, 2);
CosArrayPut(cosDomainObj2, 0, CosNewFloat(cosDocObj, false, (float) 0.0));
CosArrayPut(cosDomainObj2, 1, CosNewFloat(cosDocObj, false, (float) 1.0));
// Range
CosObj cosRangeObj2 = CosNewArray(cosDocObj, false, 8);
CosArrayPut(cosRangeObj2, 0, CosNewFloat(cosDocObj, false, (float) 0.0));
CosArrayPut(cosRangeObj2, 1, CosNewFloat(cosDocObj, false, (float) 1.0));
[...]
// Function
const char *PostScriptFunc2 = "{ 1.0 1.0 0.0 0.0 }";
ASInt32 Size2 = strlen(PostScriptFunc2);
CosObj cosFunctDict2 = 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));
ASStm Stream2 = ASMemStmRdOpen(PostScriptFunc2, Size2);
CosObj PostScriptFuncStreamObj2 = CosNewStream(cosDocObj, true, Stream2, 0, true, cosFunctDict2, CosNewNull(), -1);
ASStmClose(Stream2);
CosObj cosBlueObj = 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
CosObj cosColorantsDict = 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
