fz_error * pdf_loadfont(pdf_font **fontp, pdf_xref *xref, fz_obj *dict, fz_obj *ref) { fz_error *error; char *subtype; if ((*fontp = pdf_finditem(xref->store, PDF_KFONT, ref))) { fz_keepfont((fz_font*)*fontp); return fz_okay; } subtype = fz_toname(fz_dictgets(dict, "Subtype")); if (!strcmp(subtype, "Type0")) error = loadtype0(fontp, xref, dict, ref); else if (!strcmp(subtype, "Type1") || !strcmp(subtype, "MMType1")) error = loadsimplefont(fontp, xref, dict, ref); else if (!strcmp(subtype, "TrueType")) error = loadsimplefont(fontp, xref, dict, ref); else if (!strcmp(subtype, "Type3")) error = pdf_loadtype3font(fontp, xref, dict, ref); else return fz_throw("cannot recognize font format %s", subtype); if (error) return fz_rethrow(error, "cannot load font"); error = pdf_storeitem(xref->store, PDF_KFONT, ref, *fontp); if (error) return fz_rethrow(error, "cannot store font resource"); return fz_okay; }
fz_error fz_clonetextnode(fz_textnode **textp, fz_textnode *oldtext) { fz_textnode *text; text = *textp = fz_malloc(sizeof(fz_textnode)); if (!text) return fz_rethrow(-1, "out of memory"); fz_initnode((fz_node*)text, FZ_NTEXT); text->font = fz_keepfont(oldtext->font); text->trm = oldtext->trm; text->len = oldtext->len; text->cap = oldtext->len; text->els = nil; text->els = fz_malloc(sizeof(fz_textel) * text->len); if (!text->els) { fz_dropfont(text->font); fz_free(text); return fz_rethrow(-1, "out of memory"); } memcpy(text->els, oldtext->els, sizeof(fz_textel) * text->len); *textp = text; return fz_okay; }
fz_error * pdf_storeitem(pdf_store *store, pdf_itemkind kind, fz_obj *key, void *val) { fz_error *error; switch (kind) { case PDF_KCOLORSPACE: fz_keepcolorspace(val); break; case PDF_KFUNCTION: pdf_keepfunction(val); break; case PDF_KXOBJECT: pdf_keepxobject(val); break; case PDF_KIMAGE: fz_keepimage(val); break; case PDF_KPATTERN: pdf_keeppattern(val); break; case PDF_KSHADE: fz_keepshade(val); break; case PDF_KCMAP: pdf_keepcmap(val); break; case PDF_KFONT: fz_keepfont(val); break; } if (fz_isindirect(key)) { struct refkey item; pdf_logrsrc("store item %d: %d %d R = %p\n", kind, fz_tonum(key), fz_togen(key), val); item.kind = kind; item.oid = fz_tonum(key); item.gen = fz_togen(key); error = fz_hashinsert(store->hash, &item, val); if (error) return error; } else { pdf_item *item; item = fz_malloc(sizeof(pdf_item)); if (!item) return fz_outofmem; pdf_logrsrc("store item %d: ... = %p\n", kind, val); item->kind = kind; item->key = fz_keepobj(key); item->val = val; item->next = store->root; store->root = item; } return nil; }
fz_text * fz_newtext(fz_font *font, fz_matrix trm, int wmode) { fz_text *text; text = fz_malloc(sizeof(fz_text)); text->font = fz_keepfont(font); text->trm = trm; text->wmode = wmode; text->len = 0; text->cap = 0; text->els = nil; return text; }
fz_text * fz_clonetext(fz_text *old) { fz_text *text; text = fz_malloc(sizeof(fz_text)); text->font = fz_keepfont(old->font); text->trm = old->trm; text->wmode = old->wmode; text->len = old->len; text->cap = text->len; text->els = fz_malloc(text->len * sizeof(fz_textel)); memcpy(text->els, old->els, text->len * sizeof(fz_textel)); return text; }
fz_error fz_newtextnode(fz_textnode **textp, fz_font *font) { fz_textnode *text; text = fz_malloc(sizeof(fz_textnode)); if (!text) return fz_rethrow(-1, "out of memory"); fz_initnode((fz_node*)text, FZ_NTEXT); text->font = fz_keepfont(font); text->trm = fz_identity(); text->len = 0; text->cap = 0; text->els = nil; *textp = text; return fz_okay; }