/* * Create a Type 0 font wrapper for a Type 42 font (converted to a Type 2 * CIDFont), optionally using the TrueType cmap as the CMap. * See gs_cmap_from_type42_cmap for details. */ int gs_font_type0_from_type42(gs_font_type0 **ppfont0, gs_font_type42 *pfont42, int wmode, bool use_cmap, gs_memory_t *mem) { gs_font_cid2 *pfcid; gs_font_type0 *pfont0; int code = gs_font_cid2_from_type42(&pfcid, pfont42, wmode, mem); if (code < 0) return code; if (use_cmap) { gs_cmap_t *pcmap; code = gs_cmap_from_type42_cmap(&pcmap, pfont42, wmode, mem); if (code < 0) return code; code = type0_from_cidfont_cmap(&pfont0, (gs_font *)pfcid, pcmap, wmode, NULL, mem); } else { code = gs_font_type0_from_cidfont(&pfont0, (gs_font *)pfcid, wmode, NULL, mem); } if (code < 0) { gs_free_object(mem, pfcid, "gs_type0_from_type42(CIDFont)"); /****** FREE SUBSTRUCTURES -- HOW? ******/ return code; } *ppfont0 = pfont0; return 0; }
/* - .wrapfont - */ static int zwrapfont(i_ctx_t *i_ctx_p) { gs_font *font = gs_currentfont(igs); gs_font_type0 *font0; int wmode = 0; int code; switch (font->FontType) { case ft_TrueType: code = gs_font_type0_from_type42(&font0, (gs_font_type42 *)font, wmode, true, font->memory); if (code < 0) return code; /* * Patch up BuildChar and CIDMap. This isn't necessary for * TrueType fonts in general, only for Type 42 fonts whose * BuildChar is implemented in PostScript code. */ { font_data *pdata = pfont_data(font); const char *bgstr = "%Type11BuildGlyph"; ref temp; make_int(&temp, 0); ref_assign(&pdata->u.type42.CIDMap, &temp); code = name_ref((const byte *)bgstr, strlen(bgstr), &temp, 1); if (code < 0) return code; r_set_attrs(&temp, a_executable); ref_assign(&pdata->BuildGlyph, &temp); } break; case ft_CID_encrypted: case ft_CID_user_defined: case ft_CID_TrueType: code = gs_font_type0_from_cidfont(&font0, font, wmode, NULL, font->memory); break; default: return_error(e_rangecheck); } if (code < 0) return code; gs_setfont(igs, (gs_font *)font0); return 0; }