ref: 7b9490c36eed8a9545890a108e003c5b0e57a39f
parent: 239bac5fd6ad3503d15ea1b5dd142ffec51b6433
author: Noam Preil <[email protected]>
date: Fri Apr 8 19:53:51 EDT 2022
gs: implement color space setting
--- a/op.c
+++ b/op.c
@@ -339,10 +339,50 @@
return 0;
}
+char *colorspacedevices[] = {"DeviceGray", "DeviceRGB", "DeviceCMYK"};
+ColorSpace colorspacechans[] = {
+ [1] = DeviceGray,
+ [3] = DeviceRGB,
+ [4] = DeviceCMYK,
+};
+
static int
+iccbasedcspace(Object *icc, ColorSpace *c)
+{
+ Object *o;
+ *c = colorspacechans[dictint(icc, "N")];
+ if((o = dictget(icc, "Alternate")) != &null){
+ if(*c > 2 || strcmp(colorspacedevices[*c], o->name) != 0){
+ werrstr("ICCBased cspace: TODO: handle non-device alternate '%s'", o->name);
+ return 0;
+ }
+ }
+ return 1;
+}
+
+static int
cspace(Op *op, Page *p)
{
- USED(op, p);
+ ColorSpace *c = (op->flags & Nonstroking) ? &p->GSactive->NSCS : &p->GSactive->SCS;
+ char *s = arrayget(p->stack, 0)->name;
+ Object *o;
+ int i;
+ for(i = 0; i < 3; i += 1)
+ if(strcmp(s, colorspacedevices[i]) == 0){
+ *c = i;
+ return 1;
+ }
+ if((o = dictget(dictget(p->obj, "Resources"), "ColorSpace")) == &null
+ || (o = dictget(o, s)) == &null){
+ werrstr("colorspace '%s' not found", s);
+ return 0;
+ }
+ if(strcmp(arrayget(o, 0)->name, "ICCBased") == 0){
+ /* Don't support ICC; fall back to Alternate or default */
+ o = arrayget(o, 1);
+ return iccbasedcspace(o, c);
+ }
+ werrstr("cspace: TODO: %s color space", arrayget(o, 0)->name);
return 0;
}