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

📄 pdf_build.c

📁 SumatraPDF是一款小型开源的pdf阅读工具。虽然玲珑小巧(只有800多KB)
💻 C
📖 第 1 页 / 共 2 页
字号:
	{	case PDF_MNONE:		fz_insertnodelast(gs->head, shape);		break;	case PDF_MCOLOR:	case PDF_MLAB:	case PDF_MINDEXED:		error = addcolorshape(gs, shape, gs->fill.alpha, gs->fill.cs, gs->fill.v);		if (error)			return fz_rethrow(error, "cannot add colored shape");		break;	case PDF_MPATTERN:		error = addpatternshape(gs, shape, gs->fill.pattern, gs->fill.cs, gs->fill.v);		if (error)			return fz_rethrow(error, "cannot add pattern shape");		break;	case PDF_MSHADE:		error = addshadeshape(gs, shape, gs->fill.shade);		if (error)			return fz_rethrow(error, "cannot add shade shape");		break;	default:		return fz_throw("assert: unknown material");	}	return fz_okay;}fz_error *pdf_addstrokeshape(pdf_gstate *gs, fz_node *shape){	fz_error *error;	switch (gs->stroke.kind)	{	case PDF_MNONE:		fz_insertnodelast(gs->head, shape);		break;	case PDF_MCOLOR:	case PDF_MLAB:	case PDF_MINDEXED:		error = addcolorshape(gs, shape, gs->stroke.alpha, gs->stroke.cs, gs->stroke.v);		if (error)			return fz_rethrow(error, "cannot add colored shape");		break;	case PDF_MPATTERN:		error = addpatternshape(gs, shape, gs->stroke.pattern, gs->stroke.cs, gs->stroke.v);		if (error)			return fz_rethrow(error, "cannot add pattern shape");		break;	case PDF_MSHADE:		error = addshadeshape(gs, shape, gs->stroke.shade);		if (error)			return fz_rethrow(error, "cannot add shade shape");		break;	default:		return fz_throw("assert: unknown material");	}	return fz_okay;}fz_error *pdf_addclipmask(pdf_gstate *gs, fz_node *shape){	fz_error *error;	fz_node *mask;	fz_node *over;	error = fz_newmasknode(&mask);	if (error)		return fz_rethrow(error, "cannot create mask node");	error = pdf_newovernode(&over, gs);	if (error)	{		fz_dropnode(mask);		return fz_rethrow(error, "cannot create over node");	}	fz_insertnodelast(mask, shape);	fz_insertnodelast(mask, over);	fz_insertnodelast(gs->head, mask);	gs->head = over;	return fz_okay;}fz_error *pdf_addtransform(pdf_gstate *gs, fz_node *transform){	fz_error *error;	fz_node *over;	error = pdf_newovernode(&over, gs);	if (error)		return fz_rethrow(error, "cannot create over node");	fz_insertnodelast(gs->head, transform);	fz_insertnodelast(transform, over);	gs->head = over;	return fz_okay;}fz_error *pdf_showimage(pdf_csi *csi, pdf_image *img){	fz_error *error;	fz_node *mask;	fz_node *color;	fz_node *shape;	error = fz_newimagenode(&color, (fz_image*)img);	if (error)		return fz_rethrow(error, "cannot create image node");	if (img->super.n == 0 && img->super.a == 1)	{		error = pdf_addfillshape(csi->gstate + csi->gtop, color);		if (error)		{			fz_dropnode(color);			return fz_rethrow(error, "cannot add filled image mask");		}	}	else	{		if (img->mask)		{			error = fz_newimagenode(&shape, (fz_image*)img->mask);			if (error)			{				fz_dropnode(color);				return fz_rethrow(error, "cannot create image node for image mask");			}			error = fz_newmasknode(&mask);			if (error)			{				fz_dropnode(shape);				fz_dropnode(color);				return fz_rethrow(error, "cannot create mask node for image mask");			}			fz_insertnodelast(mask, shape);			fz_insertnodelast(mask, color);			fz_insertnodelast(csi->gstate[csi->gtop].head, mask);		}		else		{			fz_insertnodelast(csi->gstate[csi->gtop].head, color);		}	}	return fz_okay;}fz_error *pdf_showpath(pdf_csi *csi,		int doclose, int dofill, int dostroke, int evenodd){	pdf_gstate *gstate = csi->gstate + csi->gtop;	fz_error *error;	char *reason;	fz_pathnode *spath = nil;	fz_pathnode *fpath = nil;	fz_pathnode *clip = nil;	/* TODO review memory cleanup code cleanup... */	if (doclose)	{		error = fz_closepath(csi->path);		if (error)			return fz_rethrow(error, "cannot create path node");	}	/*	 * Prepare the various copies of the path node.	 */	if (csi->clip)	{		error = fz_clonepathnode(&clip, csi->path);		if (error)			return fz_rethrow(error, "cannot copy path node for clip mask");	}	if (dofill && dostroke)	{		fpath = csi->path;		error = fz_clonepathnode(&spath, fpath);		if (error)			return fz_rethrow(error, "cannot duplicate path node");	}	else if (dofill)	{		fpath = csi->path;	}	else if (dostroke)	{		spath = csi->path;	}	else	{		fz_dropnode((fz_node*)csi->path);	}	csi->path = nil;	/*	 * Add nodes to the tree.	 */	if (dofill)	{		error = pdf_buildfillpath(gstate, fpath, evenodd);		if (error)		{			reason = "cannot finish fill path";			goto cleanup;		}		error = pdf_addfillshape(gstate, (fz_node*)fpath);		if (error)		{			reason = "cannot add filled path";			goto cleanup;		}	}	if (dostroke)	{		error = pdf_buildstrokepath(gstate, spath);		if (error)		{			reason = "cannot finish stroke path";			goto cleanup;		}		error = pdf_addstrokeshape(gstate, (fz_node*)spath);		if (error)		{			reason = "cannot add stroked path";			goto cleanup;		}	}	if (csi->clip)	{		error = fz_endpath(clip, evenodd ? FZ_EOFILL : FZ_FILL, nil, nil);		if (error)		{			reason = "cannot finish clip path";			goto cleanupclip;		}		error = pdf_addclipmask(gstate, (fz_node*)clip);		if (error)		{			reason = "cannot add clip mask";			goto cleanupclip;		}		csi->clip = 0;	}	error = fz_newpathnode(&csi->path);	if (error)		return fz_rethrow(error, "cannot create path node");;	return fz_okay;cleanup:	if (spath) fz_dropnode((fz_node *)spath);	if (fpath) fz_dropnode((fz_node *)fpath);cleanupclip:	if (clip) fz_dropnode((fz_node *)clip);	return fz_rethrow(error, "%s", reason);}/* * Text */fz_error *pdf_flushtext(pdf_csi *csi){	pdf_gstate *gstate = csi->gstate + csi->gtop;	fz_error *error;	if (csi->text)	{		switch (csi->textmode)		{		case 0:	/* fill */		case 1:	/* stroke */		case 2:	/* stroke + fill */			error = pdf_addfillshape(gstate, (fz_node*)csi->text);			if (error)				return fz_rethrow(error, "cannot add filled text");			break;		case 3:	/* invisible */			error = addinvisibleshape(gstate, (fz_node*)csi->text);			if (error)				return fz_rethrow(error, "cannot add invisible text");			break;		case 4: /* fill + clip */		case 5: /* stroke + clip */		case 6: /* stroke + fill + clip */			{				fz_textnode *temp;				error = fz_clonetextnode(&temp, csi->text);				if (error)					return fz_rethrow(error, "cannot duplicate text");				error = pdf_addfillshape(gstate, (fz_node*)temp);				if (error)				{					fz_dropnode((fz_node*)temp);					return fz_rethrow(error, "cannot add filled text");				}				/* FIXME stroked text */			}			/* fall through */		case 7: /* invisible clip ( + fallthrough clips ) */			if (!csi->textclip)			{				error = pdf_newovernode(&csi->textclip, gstate);				if (error)					return fz_rethrow(error, "cannot create over node");			}			fz_insertnodelast(csi->textclip, (fz_node*)csi->text);			break;		}		csi->text = nil;	}	return fz_okay;}fz_error *showglyph(pdf_csi *csi, int cid){	pdf_gstate *gstate = csi->gstate + csi->gtop;	pdf_font *font = gstate->font;	fz_error *error;	fz_matrix tsm, trm;	float w0, w1, tx, ty;	fz_hmtx h;	fz_vmtx v;	tsm.a = gstate->size * gstate->scale;	tsm.b = 0;	tsm.c = 0;	tsm.d = gstate->size;	tsm.e = 0;	tsm.f = gstate->rise;	if (font->super.wmode == 1)	{		v = fz_getvmtx((fz_font*)font, cid);		tsm.e -= v.x * gstate->size / 1000.0;		tsm.f -= v.y * gstate->size / 1000.0;	}	trm = fz_concat(tsm, csi->tm);	/* flush buffered text if face or matrix or rendermode has changed */	if (!csi->text ||			((fz_font*)font) != csi->text->font ||			fabs(trm.a - csi->text->trm.a) > FLT_EPSILON ||			fabs(trm.b - csi->text->trm.b) > FLT_EPSILON ||			fabs(trm.c - csi->text->trm.c) > FLT_EPSILON ||			fabs(trm.d - csi->text->trm.d) > FLT_EPSILON ||			gstate->render != csi->textmode)	{		error = pdf_flushtext(csi);		if (error)			return fz_rethrow(error, "cannot finish text node (face/matrix change)");		error = fz_newtextnode(&csi->text, (fz_font*)font);		if (error)			return fz_rethrow(error, "cannot create text node");		csi->text->trm = trm;		csi->text->trm.e = 0;		csi->text->trm.f = 0;		csi->textmode = gstate->render;	}	/* add glyph to textobject */	error = fz_addtext(csi->text, cid, trm.e, trm.f);	if (error)		return fz_rethrow(error, "cannot add glyph to text node");	if (font->super.wmode == 0)	{		h = fz_gethmtx((fz_font*)font, cid);		w0 = h.w / 1000.0;		tx = (w0 * gstate->size + gstate->charspace) * gstate->scale;		csi->tm = fz_concat(fz_translate(tx, 0), csi->tm);	}	else	{		w1 = v.w / 1000.0;		ty = w1 * gstate->size + gstate->charspace;		csi->tm = fz_concat(fz_translate(0, ty), csi->tm);	}	return fz_okay;}voidshowspace(pdf_csi *csi, float tadj){	pdf_gstate *gstate = csi->gstate + csi->gtop;	pdf_font *font = gstate->font;	if (font->super.wmode == 0)		csi->tm = fz_concat(fz_translate(tadj * gstate->scale, 0), csi->tm);	else		csi->tm = fz_concat(fz_translate(0, tadj), csi->tm);}fz_error *pdf_showtext(pdf_csi *csi, fz_obj *text){	pdf_gstate *gstate = csi->gstate + csi->gtop;	pdf_font *font = gstate->font;	fz_error *error;	unsigned char *buf;	unsigned char *end;	int i, len;	int cpt, cid;	if (fz_isarray(text))	{		for (i = 0; i < fz_arraylen(text); i++)		{			fz_obj *item = fz_arrayget(text, i);			if (fz_isstring(item))			{				error = pdf_showtext(csi, item);				if (error)					return fz_rethrow(error, "cannot draw text item");			}			else			{				showspace(csi, - fz_toreal(item) * gstate->size / 1000.0);			}		}		return fz_okay;	}	buf = (unsigned char *)fz_tostrbuf(text);	len = fz_tostrlen(text);	end = buf + len;	while (buf < end)	{		buf = pdf_decodecmap(font->encoding, buf, &cpt);		cid = pdf_lookupcmap(font->encoding, cpt);		if (cid == -1)			cid = 0;		error = showglyph(csi, cid);		if (error)			return fz_rethrow(error, "cannot draw glyph");		if (cpt == 32)			showspace(csi, gstate->wordspace);	}	return fz_okay;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -