int pdf_add_colorspace(PDF *p, pdf_colorspace cs, const char *spotname) { int slot; /* TODO: optimize and check for known color space combinations if (cs == Separation) for (slot = 0; slot < p->colorspaces_number; slot++) { if (!strcmp(p->colorspaces[slot].name, spotname)) return slot; } */ slot = p->colorspaces_number; if (p->colorspaces_number >= p->colorspaces_capacity) pdf_grow_colorspaces(p); if (cs == Separation) { p->colorspaces[slot].obj_id = pdf_alloc_id(p); p->colorspaces[slot].name = pdf_strdup(p, spotname); p->colorspaces[slot].cs = Separation; p->colorspaces[slot].alternate = p->cstate[p->sl].fill; } else if (cs == PatternCS) { p->colorspaces[slot].obj_id = pdf_alloc_id(p); p->colorspaces[slot].name = (char *) NULL; p->colorspaces[slot].cs = PatternCS; p->colorspaces[slot].alternate = p->cstate[p->sl].fill; } else { pdf_error(p, PDF_SystemError, "Unknown color space in pdf_add_colorspace"); } p->colorspaces[p->colorspaces_number].used_on_current_page = pdf_true; p->colorspaces_number++; return slot; }
int pdf_add_colorspace(PDF *p, pdf_colorspace *cs, pdc_bool inuse) { pdf_colorspace *cs_new; static const char fn[] = "pdf_add_colorspace"; int slot; for (slot = 0; slot < p->colorspaces_number; slot++) { if (pdf_colorspace_equal(p, &p->colorspaces[slot], cs)) { if (inuse) p->colorspaces[slot].used_on_current_page = pdc_true; return slot; } } slot = p->colorspaces_number; if (p->colorspaces_number >= p->colorspaces_capacity) pdf_grow_colorspaces(p); cs_new = &p->colorspaces[slot]; cs_new->type = cs->type; /* don't allocate id for simple color spaces, since we don't write these */ if (PDF_SIMPLE_COLORSPACE(cs)) { cs_new->obj_id = PDC_BAD_ID; cs_new->used_on_current_page = pdc_false; } else { cs_new->obj_id = pdc_alloc_id(p->out); cs_new->used_on_current_page = inuse; } switch (cs_new->type) { case DeviceGray: case DeviceRGB: case DeviceCMYK: break; case Indexed: { size_t palsize; /* palette size in bytes */ palsize = cs->val.indexed.palette_size * pdf_color_components(p, cs->val.indexed.base); cs_new->val.indexed.base = cs->val.indexed.base; cs_new->val.indexed.palette_size = cs->val.indexed.palette_size; cs_new->val.indexed.colormap_id = pdc_alloc_id(p->out); cs_new->val.indexed.colormap = (pdf_colormap *) pdc_malloc(p->pdc, palsize, fn); memcpy(cs_new->val.indexed.colormap, cs->val.indexed.colormap, palsize); cs_new->val.indexed.colormap_done = pdc_false; break; case PatternCS: cs_new->val.pattern.base = cs->val.pattern.base; break; } default: pdc_error(p->pdc, PDF_E_INT_BADCS, fn, pdc_errprintf(p->pdc, "%d", slot), pdc_errprintf(p->pdc, "%d", cs_new->type), 0); } p->colorspaces_number++; return slot; } /* pdf_add_colorspace */