diff options
Diffstat (limited to 'source/xps/xps-glyphs.c')
-rw-r--r-- | source/xps/xps-glyphs.c | 123 |
1 files changed, 62 insertions, 61 deletions
diff --git a/source/xps/xps-glyphs.c b/source/xps/xps-glyphs.c index ee16fb6f..e15eb726 100644 --- a/source/xps/xps-glyphs.c +++ b/source/xps/xps-glyphs.c @@ -52,12 +52,11 @@ xps_encode_font_char(fz_font *font, int code) } void -xps_measure_font_glyph(xps_document *doc, fz_font *font, int gid, xps_glyph_metrics *mtx) +xps_measure_font_glyph(fz_context *ctx, xps_document *doc, fz_font *font, int gid, xps_glyph_metrics *mtx) { int mask = FT_LOAD_NO_SCALE | FT_LOAD_IGNORE_TRANSFORM; FT_Face face = font->ft_face; FT_Fixed hadv = 0, vadv = 0; - fz_context *ctx = doc->ctx; fz_lock(ctx, FZ_LOCK_FREETYPE); FT_Get_Advance(face, gid, mask, &hadv); @@ -70,21 +69,21 @@ xps_measure_font_glyph(xps_document *doc, fz_font *font, int gid, xps_glyph_metr } static fz_font * -xps_lookup_font(xps_document *doc, char *name) +xps_lookup_font(fz_context *ctx, xps_document *doc, char *name) { xps_font_cache *cache; for (cache = doc->font_table; cache; cache = cache->next) if (!xps_strcasecmp(cache->name, name)) - return fz_keep_font(doc->ctx, cache->font); + return fz_keep_font(ctx, cache->font); return NULL; } static void -xps_insert_font(xps_document *doc, char *name, fz_font *font) +xps_insert_font(fz_context *ctx, xps_document *doc, char *name, fz_font *font) { - xps_font_cache *cache = fz_malloc_struct(doc->ctx, xps_font_cache); - cache->name = fz_strdup(doc->ctx, name); - cache->font = fz_keep_font(doc->ctx, font); + xps_font_cache *cache = fz_malloc_struct(ctx, xps_font_cache); + cache->name = fz_strdup(ctx, name); + cache->font = fz_keep_font(ctx, font); cache->next = doc->font_table; doc->font_table = cache; } @@ -94,7 +93,7 @@ xps_insert_font(xps_document *doc, char *name, fz_font *font) * data with the GUID in the fontname. */ static void -xps_deobfuscate_font_resource(xps_document *doc, xps_part *part) +xps_deobfuscate_font_resource(fz_context *ctx, xps_document *doc, xps_part *part) { unsigned char buf[33]; unsigned char key[16]; @@ -103,7 +102,7 @@ xps_deobfuscate_font_resource(xps_document *doc, xps_part *part) if (part->size < 32) { - fz_warn(doc->ctx, "insufficient data for font deobfuscation"); + fz_warn(ctx, "insufficient data for font deobfuscation"); return; } @@ -120,7 +119,7 @@ xps_deobfuscate_font_resource(xps_document *doc, xps_part *part) if (i != 32) { - fz_warn(doc->ctx, "cannot extract GUID from obfuscated font part name"); + fz_warn(ctx, "cannot extract GUID from obfuscated font part name"); return; } @@ -135,7 +134,7 @@ xps_deobfuscate_font_resource(xps_document *doc, xps_part *part) } static void -xps_select_best_font_encoding(xps_document *doc, fz_font *font) +xps_select_best_font_encoding(fz_context *ctx, xps_document *doc, fz_font *font) { static struct { int pid, eid; } xps_cmap_list[] = { @@ -166,7 +165,7 @@ xps_select_best_font_encoding(xps_document *doc, fz_font *font) } } - fz_warn(doc->ctx, "cannot find a suitable cmap"); + fz_warn(ctx, "cannot find a suitable cmap"); } /* @@ -257,7 +256,7 @@ xps_parse_glyph_metrics(char *s, float *advance, float *uofs, float *vofs) * Calculate metrics for positioning. */ static fz_text * -xps_parse_glyphs_imp(xps_document *doc, const fz_matrix *ctm, +xps_parse_glyphs_imp(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, fz_font *font, float size, float originx, float originy, int is_sideways, int bidi_level, char *indices, char *unicode) @@ -273,7 +272,7 @@ xps_parse_glyphs_imp(xps_document *doc, const fz_matrix *ctm, int un = 0; if (!unicode && !indices) - fz_warn(doc->ctx, "glyphs element with neither characters nor indices"); + fz_warn(ctx, "glyphs element with neither characters nor indices"); if (us) { @@ -289,7 +288,7 @@ xps_parse_glyphs_imp(xps_document *doc, const fz_matrix *ctm, else fz_scale(&tm, size, -size); - text = fz_new_text(doc->ctx, font, &tm, is_sideways); + text = fz_new_text(ctx, font, &tm, is_sideways); while ((us && un > 0) || (is && *is)) { @@ -331,7 +330,7 @@ xps_parse_glyphs_imp(xps_document *doc, const fz_matrix *ctm, if (glyph_index == -1) glyph_index = xps_encode_font_char(font, char_code); - xps_measure_font_glyph(doc, font, glyph_index, &mtx); + xps_measure_font_glyph(ctx, doc, font, glyph_index, &mtx); if (is_sideways) advance = mtx.vadv * 100; else if (bidi_level & 1) @@ -366,7 +365,7 @@ xps_parse_glyphs_imp(xps_document *doc, const fz_matrix *ctm, f = y - v_offset; } - fz_add_text(doc->ctx, text, glyph_index, char_code, e, f); + fz_add_text(ctx, text, glyph_index, char_code, e, f); x += advance * 0.01f * size; } @@ -376,9 +375,11 @@ xps_parse_glyphs_imp(xps_document *doc, const fz_matrix *ctm, } void -xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm, +xps_parse_glyphs(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, char *base_uri, xps_resource *dict, fz_xml *root) { + fz_device *dev = doc->dev; + fz_xml *node; char *fill_uri; @@ -459,17 +460,17 @@ xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm, fill_uri = base_uri; opacity_mask_uri = base_uri; - xps_resolve_resource_reference(doc, dict, &transform_att, &transform_tag, NULL); - xps_resolve_resource_reference(doc, dict, &clip_att, &clip_tag, NULL); - xps_resolve_resource_reference(doc, dict, &fill_att, &fill_tag, &fill_uri); - xps_resolve_resource_reference(doc, dict, &opacity_mask_att, &opacity_mask_tag, &opacity_mask_uri); + xps_resolve_resource_reference(ctx, doc, dict, &transform_att, &transform_tag, NULL); + xps_resolve_resource_reference(ctx, doc, dict, &clip_att, &clip_tag, NULL); + xps_resolve_resource_reference(ctx, doc, dict, &fill_att, &fill_tag, &fill_uri); + xps_resolve_resource_reference(ctx, doc, dict, &opacity_mask_att, &opacity_mask_tag, &opacity_mask_uri); /* * Check that we have all the necessary information. */ if (!font_size_att || !font_uri_att || !origin_x_att || !origin_y_att) { - fz_warn(doc->ctx, "missing attributes in glyphs element"); + fz_warn(ctx, "missing attributes in glyphs element"); return; } @@ -486,7 +487,7 @@ xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm, * Find and load the font resource */ - xps_resolve_url(partname, base_uri, font_uri_att, sizeof partname); + xps_resolve_url(ctx, doc, partname, base_uri, font_uri_att, sizeof partname); subfont = strrchr(partname, '#'); if (subfont) { @@ -506,45 +507,45 @@ xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm, fz_strlcat(fakename, "#BoldItalic", sizeof fakename); } - font = xps_lookup_font(doc, fakename); + font = xps_lookup_font(ctx, doc, fakename); if (!font) { fz_buffer *buf = NULL; fz_var(buf); - fz_try(doc->ctx) + fz_try(ctx) { - part = xps_read_part(doc, partname); + part = xps_read_part(ctx, doc, partname); } - fz_catch(doc->ctx) + fz_catch(ctx) { - fz_rethrow_if(doc->ctx, FZ_ERROR_TRYLATER); - fz_warn(doc->ctx, "cannot find font resource part '%s'", partname); + fz_rethrow_if(ctx, FZ_ERROR_TRYLATER); + fz_warn(ctx, "cannot find font resource part '%s'", partname); return; } /* deobfuscate if necessary */ if (strstr(part->name, ".odttf")) - xps_deobfuscate_font_resource(doc, part); + xps_deobfuscate_font_resource(ctx, doc, part); if (strstr(part->name, ".ODTTF")) - xps_deobfuscate_font_resource(doc, part); + xps_deobfuscate_font_resource(ctx, doc, part); - fz_try(doc->ctx) + fz_try(ctx) { - buf = fz_new_buffer_from_data(doc->ctx, part->data, part->size); + buf = fz_new_buffer_from_data(ctx, part->data, part->size); /* part->data is now owned by buf */ part->data = NULL; - font = fz_new_font_from_buffer(doc->ctx, NULL, buf, subfontid, 1); + font = fz_new_font_from_buffer(ctx, NULL, buf, subfontid, 1); } - fz_always(doc->ctx) + fz_always(ctx) { - fz_drop_buffer(doc->ctx, buf); - xps_free_part(doc, part); + fz_drop_buffer(ctx, buf); + xps_drop_part(ctx, doc, part); } - fz_catch(doc->ctx) + fz_catch(ctx) { - fz_rethrow_if(doc->ctx, FZ_ERROR_TRYLATER); - fz_warn(doc->ctx, "cannot load font resource '%s'", partname); + fz_rethrow_if(ctx, FZ_ERROR_TRYLATER); + fz_warn(ctx, "cannot load font resource '%s'", partname); return; } @@ -554,8 +555,8 @@ xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm, font->ft_italic = !!strstr(style_att, "Italic"); } - xps_select_best_font_encoding(doc, font); - xps_insert_font(doc, fakename, font); + xps_select_best_font_encoding(ctx, doc, font); + xps_insert_font(ctx, doc, fakename, font); } /* @@ -566,27 +567,27 @@ xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm, { fz_matrix transform; if (transform_att) - xps_parse_render_transform(doc, transform_att, &transform); + xps_parse_render_transform(ctx, doc, transform_att, &transform); if (transform_tag) - xps_parse_matrix_transform(doc, transform_tag, &transform); + xps_parse_matrix_transform(ctx, doc, transform_tag, &transform); fz_concat(&local_ctm, &transform, &local_ctm); } if (clip_att || clip_tag) - xps_clip(doc, &local_ctm, dict, clip_att, clip_tag); + xps_clip(ctx, doc, &local_ctm, dict, clip_att, clip_tag); font_size = fz_atof(font_size_att); - text = xps_parse_glyphs_imp(doc, &local_ctm, font, font_size, + text = xps_parse_glyphs_imp(ctx, doc, &local_ctm, font, font_size, fz_atof(origin_x_att), fz_atof(origin_y_att), is_sideways, bidi_level, indices_att, unicode_att); - fz_bound_text(doc->ctx, text, NULL, &local_ctm, &area); + fz_bound_text(ctx, text, NULL, &local_ctm, &area); if (navigate_uri_att) - xps_add_link(doc, &area, base_uri, navigate_uri_att); + xps_add_link(ctx, doc, &area, base_uri, navigate_uri_att); - xps_begin_opacity(doc, &local_ctm, &area, opacity_mask_uri, dict, opacity_att, opacity_mask_tag); + xps_begin_opacity(ctx, doc, &local_ctm, &area, opacity_mask_uri, dict, opacity_att, opacity_mask_tag); /* If it's a solid color brush fill/stroke do a simple fill */ @@ -602,12 +603,12 @@ xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm, float samples[FZ_MAX_COLORS]; fz_colorspace *colorspace; - xps_parse_color(doc, base_uri, fill_att, &colorspace, samples); + xps_parse_color(ctx, doc, base_uri, fill_att, &colorspace, samples); if (fill_opacity_att) samples[0] *= fz_atof(fill_opacity_att); - xps_set_color(doc, colorspace, samples); + xps_set_color(ctx, doc, colorspace, samples); - fz_fill_text(doc->dev, text, &local_ctm, + fz_fill_text(ctx, dev, text, &local_ctm, doc->colorspace, doc->color, doc->alpha); } @@ -615,17 +616,17 @@ xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm, if (fill_tag) { - fz_clip_text(doc->dev, text, &local_ctm, 0); - xps_parse_brush(doc, &local_ctm, &area, fill_uri, dict, fill_tag); - fz_pop_clip(doc->dev); + fz_clip_text(ctx, dev, text, &local_ctm, 0); + xps_parse_brush(ctx, doc, &local_ctm, &area, fill_uri, dict, fill_tag); + fz_pop_clip(ctx, dev); } - xps_end_opacity(doc, opacity_mask_uri, dict, opacity_att, opacity_mask_tag); + xps_end_opacity(ctx, doc, opacity_mask_uri, dict, opacity_att, opacity_mask_tag); - fz_free_text(doc->ctx, text); + fz_drop_text(ctx, text); if (clip_att || clip_tag) - fz_pop_clip(doc->dev); + fz_pop_clip(ctx, dev); - fz_drop_font(doc->ctx, font); + fz_drop_font(ctx, font); } |