/* Finish building a font, by calling gs_definefont if needed. */ int define_gs_font(i_ctx_t *i_ctx_p, gs_font * pfont) { return (pfont->base == pfont && pfont->dir == 0 ? /* i.e., unregistered original font */ gs_definefont(ifont_dir, pfont) : 0); }
/* Create a Type 0 wrapper for a CIDFont/CMap pair. */ static int type0_from_cidfont_cmap(gs_font_type0 **ppfont0, gs_font *font, gs_cmap_t *pcmap, int wmode, const gs_matrix *psmat, gs_memory_t *mem) { gs_font_type0 *font0 = (gs_font_type0 *) gs_font_alloc(mem, &st_gs_font_type0, &gs_font_procs_default, NULL, "gs_type0_from_cidfont(font)"); /* We allocate Encoding dynamically only for the sake of the GC. */ uint *encoding = (uint *) gs_alloc_bytes(mem, sizeof(uint), "gs_type0_from_cidfont(Encoding)"); gs_font **fdep = gs_alloc_struct_array(mem, 1, gs_font *, &st_gs_font_ptr_element, "gs_type0_from_cidfont(FDepVector)"); int code; if (font0 == 0 || encoding == 0 || fdep == 0) { gs_free_object(mem, fdep, "gs_type0_from_cidfont(FDepVector)"); gs_free_object(mem, encoding, "gs_type0_from_cidfont(Encoding)"); gs_free_object(mem, font0, "gs_type0_from_cidfont(font)"); return_error(gs_error_VMerror); } if (psmat) font0->FontMatrix = *psmat; else gs_make_identity(&font0->FontMatrix); font0->FontType = ft_composite; font0->procs.init_fstack = gs_type0_init_fstack; font0->procs.define_font = gs_no_define_font; font0->procs.make_font = 0; /* not called */ font0->procs.next_char_glyph = gs_type0_next_char_glyph; font0->key_name = font->key_name; font0->font_name = font->font_name; font0->data.FMapType = fmap_CMap; encoding[0] = 0; font0->data.Encoding = encoding; font0->data.encoding_size = 1; fdep[0] = font; font0->data.FDepVector = fdep; font0->data.fdep_size = 1; font0->data.CMap = pcmap; font0->data.SubsVector.data = 0; font0->data.SubsVector.size = 0; code = gs_definefont(font->dir, (gs_font *)font0); if (code < 0) return code; *ppfont0 = font0; return 0; }
int xps_init_truetype_font(xps_context_t *ctx, xps_font_t *font) { font->font = (void*) gs_alloc_struct(ctx->memory, gs_font_type42, &st_gs_font_type42, "xps_font type42"); if (!font->font) return gs_throw(gs_error_VMerror, "out of memory"); /* no shortage of things to initialize */ { gs_font_type42 *p42 = (gs_font_type42*) font->font; /* Common to all fonts: */ p42->next = 0; p42->prev = 0; p42->memory = ctx->memory; p42->dir = ctx->fontdir; /* NB also set by gs_definefont later */ p42->base = font->font; /* NB also set by gs_definefont later */ p42->is_resource = false; gs_notify_init(&p42->notify_list, gs_memory_stable(ctx->memory)); p42->id = gs_next_ids(ctx->memory, 1); p42->client_data = font; /* that's us */ /* this is overwritten in grid_fit() */ gs_make_identity(&p42->FontMatrix); gs_make_identity(&p42->orig_FontMatrix); /* NB ... original or zeroes? */ p42->FontType = ft_TrueType; p42->BitmapWidths = false; p42->ExactSize = fbit_use_outlines; p42->InBetweenSize = fbit_use_outlines; p42->TransformedChar = fbit_use_outlines; p42->WMode = 0; p42->PaintType = 0; p42->StrokeWidth = 0; p42->is_cached = 0; p42->procs.define_font = gs_no_define_font; p42->procs.make_font = gs_no_make_font; p42->procs.font_info = gs_type42_font_info; p42->procs.same_font = gs_default_same_font; p42->procs.encode_char = xps_true_callback_encode_char; p42->procs.decode_glyph = xps_true_callback_decode_glyph; p42->procs.enumerate_glyph = gs_type42_enumerate_glyph; p42->procs.glyph_info = gs_type42_glyph_info; p42->procs.glyph_outline = gs_type42_glyph_outline; p42->procs.glyph_name = xps_true_callback_glyph_name; p42->procs.init_fstack = gs_default_init_fstack; p42->procs.next_char_glyph = gs_default_next_char_glyph; p42->procs.build_char = xps_true_callback_build_char; memset(p42->font_name.chars, 0, sizeof(p42->font_name.chars)); xps_load_sfnt_name(font, (char*)p42->font_name.chars); p42->font_name.size = strlen((char*)p42->font_name.chars); memset(p42->key_name.chars, 0, sizeof(p42->key_name.chars)); strcpy((char*)p42->key_name.chars, (char*)p42->font_name.chars); p42->key_name.size = strlen((char*)p42->key_name.chars); /* Base font specific: */ p42->FontBBox.p.x = 0; p42->FontBBox.p.y = 0; p42->FontBBox.q.x = 0; p42->FontBBox.q.y = 0; uid_set_UniqueID(&p42->UID, p42->id); p42->encoding_index = ENCODING_INDEX_UNKNOWN; p42->nearest_encoding_index = ENCODING_INDEX_ISOLATIN1; p42->FAPI = 0; p42->FAPI_font_data = 0; /* Type 42 specific: */ p42->data.string_proc = xps_true_callback_string_proc; p42->data.proc_data = font; gs_type42_font_init(p42, font->subfontid); p42->data.get_glyph_index = xps_true_get_glyph_index; } gs_definefont(ctx->fontdir, font->font); return 0; }