static void pdf_makewidthtable(pdf_fontdesc *fontdesc) { fz_font *font = fontdesc->font; int i, k, cid, gid; font->widthcount = 0; for (i = 0; i < fontdesc->nhmtx; i++) { for (k = fontdesc->hmtx[i].lo; k <= fontdesc->hmtx[i].hi; k++) { cid = pdf_lookupcmap(fontdesc->encoding, k); gid = pdf_fontcidtogid(fontdesc, cid); if (gid > font->widthcount) font->widthcount = gid; } } font->widthcount ++; font->widthtable = fz_malloc(sizeof(int) * font->widthcount); memset(font->widthtable, 0, sizeof(int) * font->widthcount); for (i = 0; i < fontdesc->nhmtx; i++) { for (k = fontdesc->hmtx[i].lo; k <= fontdesc->hmtx[i].hi; k++) { cid = pdf_lookupcmap(fontdesc->encoding, k); gid = pdf_fontcidtogid(fontdesc, cid); font->widthtable[gid] = fontdesc->hmtx[i].w; } } }
static void pdf_showglyph(pdf_csi *csi, int cid) { pdf_gstate *gstate = csi->gstate + csi->gtop; pdf_fontdesc *fontdesc = gstate->font; fz_matrix tsm, trm; float w0, w1, tx, ty; pdf_hmtx h; pdf_vmtx v; int gid; int ucsbuf[8]; int ucslen; int i; tsm.a = gstate->size * gstate->scale; tsm.b = 0; tsm.c = 0; tsm.d = gstate->size; tsm.e = 0; tsm.f = gstate->rise; ucslen = 0; if (fontdesc->tounicode) ucslen = pdf_lookupcmapfull(fontdesc->tounicode, cid, ucsbuf); if (ucslen == 0 && cid < fontdesc->ncidtoucs) { ucsbuf[0] = fontdesc->cidtoucs[cid]; ucslen = 1; } if (ucslen == 0 || (ucslen == 1 && ucsbuf[0] == 0)) { ucsbuf[0] = '?'; ucslen = 1; } gid = pdf_fontcidtogid(fontdesc, cid); if (fontdesc->wmode == 1) { v = pdf_getvmtx(fontdesc, cid); tsm.e -= v.x * gstate->size * 0.001f; tsm.f -= v.y * gstate->size * 0.001f; } trm = fz_concat(tsm, csi->tm); /* flush buffered text if face or matrix or rendermode has changed */ if (!csi->text || fontdesc->font != csi->text->font || fontdesc->wmode != csi->text->wmode || fabsf(trm.a - csi->text->trm.a) > FLT_EPSILON || fabsf(trm.b - csi->text->trm.b) > FLT_EPSILON || fabsf(trm.c - csi->text->trm.c) > FLT_EPSILON || fabsf(trm.d - csi->text->trm.d) > FLT_EPSILON || gstate->render != csi->textmode) { pdf_flushtext(csi); csi->text = fz_newtext(fontdesc->font, trm, fontdesc->wmode); csi->text->trm.e = 0; csi->text->trm.f = 0; csi->textmode = gstate->render; } /* add glyph to textobject */ fz_addtext(csi->text, gid, ucsbuf[0], trm.e, trm.f); /* add filler glyphs for one-to-many unicode mapping */ for (i = 1; i < ucslen; i++) fz_addtext(csi->text, -1, ucsbuf[i], trm.e, trm.f); if (fontdesc->wmode == 0) { h = pdf_gethmtx(fontdesc, cid); w0 = h.w * 0.001f; tx = (w0 * gstate->size + gstate->charspace) * gstate->scale; csi->tm = fz_concat(fz_translate(tx, 0), csi->tm); } if (fontdesc->wmode == 1) { w1 = v.w * 0.001f; ty = w1 * gstate->size + gstate->charspace; csi->tm = fz_concat(fz_translate(0, ty), csi->tm); } }