/* Creates the PDF Encoding entry for the encoding. * If baseenc is non-null, it is used as BaseEncoding entry. */ static pdf_obj * create_encoding_resource (pdf_encoding *encoding, pdf_encoding *baseenc) { pdf_obj *differences; ASSERT(encoding); ASSERT(!encoding->resource); differences = make_encoding_differences(encoding->glyphs, baseenc ? baseenc->glyphs : NULL, encoding->is_used); if (differences) { pdf_obj *resource = pdf_new_dict(); if (baseenc) pdf_add_dict(resource, pdf_new_name("BaseEncoding"), pdf_link_obj(baseenc->resource)); pdf_add_dict(resource, pdf_new_name("Differences"), differences); return resource; } else { /* Fix a bug with the MinionPro package using MnSymbol fonts * in its virtual fonts: * * Some font may have font_id even if no character is used. * For example, suppose that a virtual file A.vf uses two * other fonts, B and C. Even if only characters of B are used * in a DVI document, C will have font_id too. * In this case, both baseenc and differences can be NULL. * * Actually these fonts will be ignored in pdffont.c. */ return baseenc ? pdf_link_obj(baseenc->resource) : NULL; } }
pdf_obj * CIDFont_get_resource (CIDFont *font) { ASSERT(font); if (!font->indirect) font->indirect = pdf_ref_obj(font->fontdict); return pdf_link_obj(font->indirect); }
pdf_obj * Type0Font_get_resource (Type0Font *font) { ASSERT(font); /* * This looks somewhat strange. */ if (!font->indirect) { pdf_obj *array; array = pdf_new_array(); pdf_add_array(array, CIDFont_get_resource(font->descendant)); pdf_add_dict(font->fontdict, pdf_new_name("DescendantFonts"), array); font->indirect = pdf_ref_obj(font->fontdict); } return pdf_link_obj(font->indirect); }
pdf_obj * pdf_get_font_reference (int font_id) { pdf_font *font; CHECK_ID(font_id); font = GET_FONT(font_id); if (font->subtype == PDF_FONT_FONTTYPE_TYPE0) { Type0Font *t0font; t0font = Type0Font_cache_get(font->font_id); return Type0Font_get_resource(t0font); } else { if (!font->reference) { font->reference = pdf_ref_obj(pdf_font_get_resource(font)); } } return pdf_link_obj(font->reference); }
static int dev_set_font (int font_id) { struct dev_font *font; struct dev_font *real_font; int text_rotate; double font_scale; int len; int vert_dir, vert_font; /* text_mode() must come before text_state.is_mb is changed. */ text_mode(); font = GET_FONT(font_id); ASSERT(font); /* Caller should check font_id. */ if (font->real_font_index >= 0) real_font = GET_FONT(font->real_font_index); else real_font = font; text_state.is_mb = (font->format == PDF_FONTTYPE_COMPOSITE) ? 1 : 0; vert_font = font->wmode ? 1 : 0; if (dev_param.autorotate) { vert_dir = text_state.dir_mode; } else { vert_dir = vert_font; } text_rotate = (vert_font << 2)|vert_dir; if (font->slant != text_state.matrix.slant || font->extend != text_state.matrix.extend || ANGLE_CHANGES(text_rotate, text_state.matrix.rotate)) { text_state.force_reset = 1; } text_state.matrix.slant = font->slant; text_state.matrix.extend = font->extend; text_state.matrix.rotate = text_rotate; if (!real_font->resource) { real_font->resource = pdf_get_font_reference(real_font->font_id); real_font->used_chars = pdf_get_font_usedchars(real_font->font_id); } if (!real_font->used_on_this_page) { pdf_doc_add_page_resource("Font", real_font->short_name, pdf_link_obj(real_font->resource)); real_font->used_on_this_page = 1; } font_scale = (double) font->sptsize * dev_unit.dvi2pts; len = sprintf(format_buffer, " /%s", real_font->short_name); /* space not necessary. */ format_buffer[len++] = ' '; len += p_dtoa(font_scale, MIN(dev_unit.precision+1, DEV_PRECISION_MAX), format_buffer+len); format_buffer[len++] = ' '; format_buffer[len++] = 'T'; format_buffer[len++] = 'f'; pdf_doc_add_page_content(format_buffer, len); /* op: Tf */ if (font->bold > 0.0 || font->bold != text_state.bold_param) { if (font->bold <= 0.0) len = sprintf(format_buffer, " 0 Tr"); else len = sprintf(format_buffer, " 2 Tr %.6f w", font->bold); /* _FIXME_ */ pdf_doc_add_page_content(format_buffer, len); /* op: Tr w */ } text_state.bold_param = font->bold; text_state.font_id = font_id; return 0; }