summaryrefslogtreecommitdiff
path: root/source/xps/xps-glyphs.c
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2015-01-21 16:42:45 +0100
committerTor Andersson <tor.andersson@artifex.com>2015-02-17 18:05:39 +0100
commitf84a189d5f94250e46d2cbd1a75aba00130e2dd6 (patch)
tree8ee614ab90de1baa8941f91ae4946ed5c2e70721 /source/xps/xps-glyphs.c
parent681039767f2ccc72e236246178893eb0989169c9 (diff)
downloadmupdf-f84a189d5f94250e46d2cbd1a75aba00130e2dd6.tar.xz
Add ctx parameter and remove embedded contexts for API regularity.
Purge several embedded contexts: Remove embedded context in fz_output. Remove embedded context in fz_stream. Remove embedded context in fz_device. Remove fz_rebind_stream (since it is no longer necessary). Remove embedded context in svg_device. Remove embedded context in XML parser. Add ctx argument to fz_document functions. Remove embedded context in fz_document. Remove embedded context in pdf_document. Remove embedded context in pdf_obj. Make fz_page independent of fz_document in the interface. We shouldn't need to pass the document to all functions handling a page. If a page is tied to the source document, it's redundant; otherwise it's just pointless. Fix reference counting oddity in fz_new_image_from_pixmap.
Diffstat (limited to 'source/xps/xps-glyphs.c')
-rw-r--r--source/xps/xps-glyphs.c123
1 files changed, 62 insertions, 61 deletions
diff --git a/source/xps/xps-glyphs.c b/source/xps/xps-glyphs.c
index 4f030be0..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_drop_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_drop_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);
}