📄 pdf_colorspace1.c.svn-base
字号:
tmp = fz_dictgets(dict, "WhitePoint"); if (fz_isarray(tmp)) { cs->white[0] = fz_toreal(fz_arrayget(tmp, 0)); cs->white[1] = fz_toreal(fz_arrayget(tmp, 1)); cs->white[2] = fz_toreal(fz_arrayget(tmp, 2)); } tmp = fz_dictgets(dict, "BlackPoint"); if (fz_isarray(tmp)) { cs->black[0] = fz_toreal(fz_arrayget(tmp, 0)); cs->black[1] = fz_toreal(fz_arrayget(tmp, 1)); cs->black[2] = fz_toreal(fz_arrayget(tmp, 2)); } tmp = fz_dictgets(dict, "Range"); if (fz_isarray(tmp)) { cs->range[0] = fz_toreal(fz_arrayget(tmp, 0)); cs->range[1] = fz_toreal(fz_arrayget(tmp, 1)); cs->range[2] = fz_toreal(fz_arrayget(tmp, 2)); cs->range[3] = fz_toreal(fz_arrayget(tmp, 3)); } fz_dropobj(dict); *csp = (fz_colorspace*) cs; return fz_okay;}#endif/* * ICCBased */static fz_error *loadiccbased(fz_colorspace **csp, pdf_xref *xref, fz_obj *ref){ fz_error *error; fz_obj *dict; int n; pdf_logrsrc("load ICCBased\n"); error = pdf_loadindirect(&dict, xref, ref); if (error) return fz_rethrow(error, "cannot find colorspace"); n = fz_toint(fz_dictgets(dict, "N")); fz_dropobj(dict); switch (n) { case 1: *csp = pdf_devicegray; return fz_okay; case 3: *csp = pdf_devicergb; return fz_okay; case 4: *csp = pdf_devicecmyk; return fz_okay; } return fz_throw("syntaxerror: ICCBased must have 1, 3 or 4 components");}/* * Separation and DeviceN */struct separation{ fz_colorspace super; fz_colorspace *base; pdf_function *tint;};static void separationtoxyz(fz_colorspace *fzcs, float *sep, float *xyz){ struct separation *cs = (struct separation *)fzcs; fz_error *error; float alt[FZ_MAXCOLORS]; error = pdf_evalfunction(cs->tint, sep, fzcs->n, alt, cs->base->n); if (error) { fz_warn("separation: %s", error->msg); fz_droperror(error); xyz[0] = 0; xyz[1] = 0; xyz[2] = 0; return; } cs->base->toxyz(cs->base, alt, xyz);}static voiddropseparation(fz_colorspace *fzcs){ struct separation *cs = (struct separation *)fzcs; fz_dropcolorspace(cs->base); pdf_dropfunction(cs->tint);}static fz_error *loadseparation(fz_colorspace **csp, pdf_xref *xref, fz_obj *array){ fz_error *error; struct separation *cs; fz_obj *nameobj = fz_arrayget(array, 1); fz_obj *baseobj = fz_arrayget(array, 2); fz_obj *tintobj = fz_arrayget(array, 3); fz_colorspace *base; pdf_function *tint; int n; pdf_logrsrc("load Separation {\n"); if (fz_isarray(nameobj)) n = fz_arraylen(nameobj); else n = 1; pdf_logrsrc("n = %d\n", n); error = pdf_resolve(&baseobj, xref); if (error) return fz_rethrow(error, "cannot find colorspace"); error = pdf_loadcolorspace(&base, xref, baseobj); fz_dropobj(baseobj); if (error) return fz_rethrow(error, "cannot load base colorspace"); error = pdf_loadfunction(&tint, xref, tintobj); if (error) { fz_dropcolorspace(base); return fz_rethrow(error, "cannot load tint function"); } cs = fz_malloc(sizeof(struct separation)); if (!cs) { pdf_dropfunction(tint); fz_dropcolorspace(base); return fz_throw("outofmem: separation colorspace struct"); } initcs((fz_colorspace*)cs, n == 1 ? "Separation" : "DeviceN", n, separationtoxyz, nil, dropseparation); cs->base = base; cs->tint = tint; pdf_logrsrc("}\n"); *csp = (fz_colorspace*)cs; return fz_okay;}/* * Indexed */#if 0static voidindexedtoxyz(fz_colorspace *fzcs, float *ind, float *xyz){ pdf_indexed *cs = (pdf_indexed *)fzcs; float alt[FZ_MAXCOLORS]; int i, k; i = ind[0] * 255; i = CLAMP(i, 0, cs->high); for (k = 0; k < cs->base->n; k++) alt[k] = cs->lookup[i * cs->base->n + k] / 255.0; cs->base->toxyz(cs->base, alt, xyz);}#endifstatic voiddropindexed(fz_colorspace *fzcs){ pdf_indexed *cs = (pdf_indexed *)fzcs; if (cs->base) fz_dropcolorspace(cs->base); if (cs->lookup) fz_free(cs->lookup);}static fz_error *loadindexed(fz_colorspace **csp, pdf_xref *xref, fz_obj *array){ fz_error *error; pdf_indexed *cs; fz_obj *baseobj = fz_arrayget(array, 1); fz_obj *highobj = fz_arrayget(array, 2); fz_obj *lookup = fz_arrayget(array, 3); fz_colorspace *base; int n; pdf_logrsrc("load Indexed {\n"); error = pdf_resolve(&baseobj, xref); if (error) return fz_rethrow(error, "cannot find colorspace"); error = pdf_loadcolorspace(&base, xref, baseobj); fz_dropobj(baseobj); if (error) return fz_rethrow(error, "cannot load base colorspace"); pdf_logrsrc("base %s\n", base->name); cs = fz_malloc(sizeof(pdf_indexed)); if (!cs) { fz_dropcolorspace(base); return fz_throw("outofmem: indexed colorspace struct"); } initcs((fz_colorspace*)cs, "Indexed", 1, nil, nil, dropindexed); cs->base = base; cs->high = fz_toint(highobj); n = base->n * (cs->high + 1); cs->lookup = fz_malloc(n); if (!cs->lookup) { fz_dropcolorspace((fz_colorspace*)cs); return fz_throw("outofmem: indexed colorspace lookup table (%d entries)", n); } if (fz_isstring(lookup) && fz_tostrlen(lookup) == n) { unsigned char *buf; int i; pdf_logrsrc("string lookup\n"); buf = (unsigned char *) fz_tostrbuf(lookup); for (i = 0; i < n; i++) cs->lookup[i] = buf[i]; } if (fz_isindirect(lookup)) { fz_buffer *buf; int i; pdf_logrsrc("stream lookup\n"); error = pdf_loadstream(&buf, xref, fz_tonum(lookup), fz_togen(lookup)); if (error) { fz_dropcolorspace((fz_colorspace*)cs); return fz_rethrow(error, "cannot load colorpsace lookup table"); } for (i = 0; i < n && i < (buf->wp - buf->rp); i++) cs->lookup[i] = buf->rp[i]; fz_dropbuffer(buf); } pdf_logrsrc("}\n"); *csp = (fz_colorspace*)cs; return fz_okay;}/* * Parse and create colorspace from PDF object. */fz_error *pdf_loadcolorspace(fz_colorspace **csp, pdf_xref *xref, fz_obj *obj){ if (fz_isname(obj)) { if (!strcmp(fz_toname(obj), "DeviceGray")) *csp = pdf_devicegray; else if (!strcmp(fz_toname(obj), "DeviceRGB")) *csp = pdf_devicergb; else if (!strcmp(fz_toname(obj), "DeviceCMYK")) *csp = pdf_devicecmyk; else if (!strcmp(fz_toname(obj), "G")) *csp = pdf_devicegray; else if (!strcmp(fz_toname(obj), "RGB")) *csp = pdf_devicergb; else if (!strcmp(fz_toname(obj), "CMYK")) *csp = pdf_devicecmyk; else if (!strcmp(fz_toname(obj), "Pattern")) *csp = pdf_devicepattern; else return fz_throw("unknown colorspace: %s", fz_toname(obj)); return fz_okay; } else if (fz_isarray(obj)) { fz_obj *name = fz_arrayget(obj, 0); if (fz_isname(name)) { if (!strcmp(fz_toname(name), "CalCMYK")) *csp = pdf_devicecmyk;#ifdef USECAL else if (!strcmp(fz_toname(name), "CalGray")) return loadcalgray(csp, xref, fz_arrayget(obj, 1)); else if (!strcmp(fz_toname(name), "CalRGB")) return loadcalrgb(csp, xref, fz_arrayget(obj, 1)); else if (!strcmp(fz_toname(name), "Lab")) return loadlab(csp, xref, fz_arrayget(obj, 1));#else else if (!strcmp(fz_toname(name), "CalGray")) *csp = pdf_devicegray; else if (!strcmp(fz_toname(name), "CalRGB")) *csp = pdf_devicergb; else if (!strcmp(fz_toname(name), "Lab")) *csp = pdf_devicelab;#endif else if (!strcmp(fz_toname(name), "ICCBased")) return loadiccbased(csp, xref, fz_arrayget(obj, 1)); else if (!strcmp(fz_toname(name), "Indexed")) return loadindexed(csp, xref, obj); else if (!strcmp(fz_toname(name), "I")) return loadindexed(csp, xref, obj); else if (!strcmp(fz_toname(name), "Separation")) return loadseparation(csp, xref, obj); else if (!strcmp(fz_toname(name), "DeviceN")) return loadseparation(csp, xref, obj); /* load base colorspace instead */ else if (!strcmp(fz_toname(name), "Pattern")) { fz_error *error; obj = fz_arrayget(obj, 1); if (!obj) { *csp = pdf_devicepattern; return fz_okay; } error = pdf_resolve(&obj, xref); if (error) return fz_rethrow(error, "cannot find pattern"); error = pdf_loadcolorspace(csp, xref, obj); fz_dropobj(obj); if (error) return fz_rethrow(error, "cannot load pattern"); } else if (!strcmp(fz_toname(name), "DeviceGray")) *csp = pdf_devicegray; else if (!strcmp(fz_toname(name), "DeviceRGB")) *csp = pdf_devicergb; else if (!strcmp(fz_toname(name), "DeviceCMYK")) *csp = pdf_devicecmyk; else if (!strcmp(fz_toname(name), "G")) *csp = pdf_devicegray; else if (!strcmp(fz_toname(name), "RGB")) *csp = pdf_devicergb; else if (!strcmp(fz_toname(name), "CMYK")) *csp = pdf_devicecmyk; else return fz_throw("syntaxerror: unknown colorspace %s", fz_toname(name)); return fz_okay; } } return fz_throw("syntaxerror: could not parse color space");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -