⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pdf_colorspace1.c

📁 SumatraPDF是一款小型开源的pdf阅读工具。虽然玲珑小巧(只有800多KB)
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -