📄 pdf_build.c
字号:
{ 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 + -