summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorRobin Watts <Robin.Watts@artifex.com>2016-09-28 16:46:10 +0100
committerRobin Watts <robin.watts@artifex.com>2016-10-05 19:37:11 +0100
commit9e88b088ea2ddcb6f85584750eb3c989af101905 (patch)
tree19db41ec596cc347fd1b77389821135f8e934e84 /source
parent14109acf198d9371a4e2cb09ea4a125af67d441d (diff)
downloadmupdf-9e88b088ea2ddcb6f85584750eb3c989af101905.tar.xz
Move fz_font definition to be private.
Move the definition of fz_font to be in a private header file rather than in the public API. Add accessors for specific parts of the structure and use them as appropriate. The font flags, and the harfbuzz records remain public. This means that only 3 files now need access to the font implementation (font.c, pdf-font.c and pdf-type3.c). This may be able to be improved further in future.
Diffstat (limited to 'source')
-rw-r--r--source/fitz/draw-glyph.c20
-rw-r--r--source/fitz/font-impl.h50
-rw-r--r--source/fitz/font.c92
-rw-r--r--source/fitz/stext-device.c18
-rw-r--r--source/fitz/stext-output.c23
-rw-r--r--source/fitz/svg-device.c2
-rw-r--r--source/fitz/trace-device.c2
-rw-r--r--source/html/html-font.c11
-rw-r--r--source/html/html-layout.c17
-rw-r--r--source/pdf/pdf-device.c6
-rw-r--r--source/pdf/pdf-font.c34
-rw-r--r--source/pdf/pdf-op-run.c2
-rw-r--r--source/pdf/pdf-type3.c36
-rw-r--r--source/tools/murun.c2
-rw-r--r--source/xps/xps-glyphs.c23
15 files changed, 221 insertions, 117 deletions
diff --git a/source/fitz/draw-glyph.c b/source/fitz/draw-glyph.c
index dbaace9e..93bd62b3 100644
--- a/source/fitz/draw-glyph.c
+++ b/source/fitz/draw-glyph.c
@@ -175,7 +175,7 @@ fz_subpixel_adjust(fz_context *ctx, fz_matrix *ctm, fz_matrix *subpix_ctm, unsig
fz_glyph *
fz_render_stroked_glyph(fz_context *ctx, fz_font *font, int gid, fz_matrix *trm, const fz_matrix *ctm, const fz_stroke_state *stroke, const fz_irect *scissor)
{
- if (font->ft_face)
+ if (fz_font_ft_face(font))
{
fz_matrix subpix_trm;
unsigned char qe, qf;
@@ -191,7 +191,7 @@ fz_render_stroked_glyph(fz_context *ctx, fz_font *font, int gid, fz_matrix *trm,
fz_pixmap *
fz_render_stroked_glyph_pixmap(fz_context *ctx, fz_font *font, int gid, fz_matrix *trm, const fz_matrix *ctm, const fz_stroke_state *stroke, const fz_irect *scissor)
{
- if (font->ft_face)
+ if (fz_font_ft_face(font))
{
fz_matrix subpix_trm;
unsigned char qe, qf;
@@ -252,6 +252,7 @@ fz_render_glyph(fz_context *ctx, fz_font *font, int gid, fz_matrix *ctm, fz_colo
int do_cache, locked, caching;
fz_glyph_cache_entry *entry;
unsigned hash;
+ int is_ft_font = !!fz_font_ft_face(font);
fz_var(locked);
fz_var(caching);
@@ -266,7 +267,7 @@ fz_render_glyph(fz_context *ctx, fz_font *font, int gid, fz_matrix *ctm, fz_colo
}
else
{
- if (font->ft_face)
+ if (is_ft_font)
return NULL;
subpix_scissor.x0 = scissor->x0 - floorf(ctm->e);
subpix_scissor.y0 = scissor->y0 - floorf(ctm->f);
@@ -307,11 +308,11 @@ fz_render_glyph(fz_context *ctx, fz_font *font, int gid, fz_matrix *ctm, fz_colo
fz_try(ctx)
{
- if (font->ft_face)
+ if (is_ft_font)
{
val = fz_render_ft_glyph(ctx, font, gid, &subpix_ctm, key.aa);
}
- else if (font->t3procs)
+ else if (fz_font_t3_procs(font))
{
/* We drop the glyphcache here, and execute the t3
* glyph code. The danger here is that some other
@@ -339,7 +340,7 @@ fz_render_glyph(fz_context *ctx, fz_font *font, int gid, fz_matrix *ctm, fz_colo
/* If we throw an exception whilst caching,
* just ignore the exception and carry on. */
caching = 1;
- if (!font->ft_face)
+ if (!is_ft_font)
{
/* We had to unlock. Someone else might
* have rendered in the meantime */
@@ -413,6 +414,7 @@ fz_render_glyph_pixmap(fz_context *ctx, fz_font *font, int gid, fz_matrix *ctm,
unsigned char qe, qf;
fz_matrix subpix_ctm;
float size = fz_subpixel_adjust(ctx, ctm, &subpix_ctm, &qe, &qf);
+ int is_ft_font = !!fz_font_ft_face(font);
if (size <= MAX_GLYPH_SIZE)
{
@@ -420,17 +422,17 @@ fz_render_glyph_pixmap(fz_context *ctx, fz_font *font, int gid, fz_matrix *ctm,
}
else
{
- if (font->ft_face)
+ if (is_ft_font)
return NULL;
}
fz_try(ctx)
{
- if (font->ft_face)
+ if (is_ft_font)
{
val = fz_render_ft_glyph_pixmap(ctx, font, gid, &subpix_ctm, fz_text_aa_level(ctx));
}
- else if (font->t3procs)
+ else if (fz_font_t3_procs(font))
{
val = fz_render_t3_glyph_pixmap(ctx, font, gid, &subpix_ctm, NULL, scissor);
}
diff --git a/source/fitz/font-impl.h b/source/fitz/font-impl.h
new file mode 100644
index 00000000..b6015172
--- /dev/null
+++ b/source/fitz/font-impl.h
@@ -0,0 +1,50 @@
+#ifndef MUPDF_FITZ_FONT_IMPL_H
+#define MUPDF_FITZ_FONT_IMPL_H
+
+#include "mupdf/fitz/font.h"
+
+/* forward declaration for circular dependency */
+struct fz_device_s;
+struct fz_display_list_s;
+
+struct fz_font_s
+{
+ int refs;
+ char name[32];
+ fz_buffer *buffer;
+
+ fz_font_flags_t flags;
+
+ void *ft_face; /* has an FT_Face if used */
+ fz_hb_t hb;
+
+ fz_matrix t3matrix;
+ void *t3resources;
+ fz_buffer **t3procs; /* has 256 entries if used */
+ struct fz_display_list_s **t3lists; /* has 256 entries if used */
+ float *t3widths; /* has 256 entries if used */
+ unsigned short *t3flags; /* has 256 entries if used */
+ void *t3doc; /* a pdf_document for the callback */
+ void (*t3run)(fz_context *ctx, void *doc, void *resources, fz_buffer *contents, struct fz_device_s *dev, const fz_matrix *ctm, void *gstate, int nestedDepth);
+ void (*t3freeres)(fz_context *ctx, void *doc, void *resources);
+
+ fz_rect bbox; /* font bbox is used only for t3 fonts */
+
+ int glyph_count;
+
+ /* per glyph bounding box cache */
+ fz_rect *bbox_table;
+
+ /* substitute metrics */
+ int width_count;
+ short width_default; /* in 1000 units */
+ short *width_table; /* in 1000 units */
+
+ /* cached glyph metrics */
+ float *advance_cache;
+
+ /* cached encoding lookup */
+ uint16_t *encoding_cache[256];
+};
+
+#endif
diff --git a/source/fitz/font.c b/source/fitz/font.c
index beab4c87..be0f38d7 100644
--- a/source/fitz/font.c
+++ b/source/fitz/font.c
@@ -1,5 +1,7 @@
#include "mupdf/fitz.h"
+#include "font-impl.h"
+
#include <ft2build.h>
#include "hb.h"
#include "hb-ft.h"
@@ -37,11 +39,11 @@ fz_new_font(fz_context *ctx, const char *name, int use_glyph_bbox, int glyph_cou
fz_strlcpy(font->name, "(null)", sizeof font->name);
font->ft_face = NULL;
- font->ft_substitute = 0;
- font->fake_bold = 0;
- font->fake_italic = 0;
- font->force_hinting = 0;
- font->has_opentype = 0;
+ font->flags.ft_substitute = 0;
+ font->flags.fake_bold = 0;
+ font->flags.fake_italic = 0;
+ font->flags.force_hinting = 0;
+ font->flags.has_opentype = 0;
font->t3matrix = fz_identity;
font->t3resources = NULL;
@@ -59,7 +61,7 @@ fz_new_font(fz_context *ctx, const char *name, int use_glyph_bbox, int glyph_cou
font->glyph_count = glyph_count;
- font->use_glyph_bbox = !!use_glyph_bbox;
+ font->flags.use_glyph_bbox = !!use_glyph_bbox;
if (use_glyph_bbox && glyph_count <= MAX_BBOX_TABLE_SIZE)
{
font->bbox_table = fz_malloc_array(ctx, glyph_count, sizeof(fz_rect));
@@ -156,10 +158,10 @@ fz_drop_font(fz_context *ctx, fz_font *font)
fz_free(ctx, font->bbox_table);
fz_free(ctx, font->width_table);
fz_free(ctx, font->advance_cache);
- if (font->hb_destroy && font->hb_font)
+ if (font->hb.destroy && font->hb.font)
{
hb_lock(ctx);
- font->hb_destroy(font->hb_font);
+ font->hb.destroy(font->hb.font);
hb_unlock(ctx);
}
fz_free(ctx, font);
@@ -176,7 +178,7 @@ fz_set_font_bbox(fz_context *ctx, fz_font *font, float xmin, float ymin, float x
font->bbox.y0 = -1;
font->bbox.x1 = 2;
font->bbox.y1 = 2;
- font->invalid_bbox = 1;
+ font->flags.invalid_bbox = 1;
}
else
{
@@ -475,23 +477,23 @@ fz_new_font_from_buffer(fz_context *ctx, const char *name, fz_buffer *buffer, in
(float) face->bbox.xMax / face->units_per_EM,
(float) face->bbox.yMax / face->units_per_EM);
- font->is_mono = !!(face->face_flags & FT_FACE_FLAG_FIXED_WIDTH);
- font->is_serif = 1;
- font->is_bold = !!(face->style_flags & FT_STYLE_FLAG_BOLD);
- font->is_italic = !!(face->style_flags & FT_STYLE_FLAG_ITALIC);
+ font->flags.is_mono = !!(face->face_flags & FT_FACE_FLAG_FIXED_WIDTH);
+ font->flags.is_serif = 1;
+ font->flags.is_bold = !!(face->style_flags & FT_STYLE_FLAG_BOLD);
+ font->flags.is_italic = !!(face->style_flags & FT_STYLE_FLAG_ITALIC);
if (FT_IS_SFNT(face))
{
os2 = FT_Get_Sfnt_Table(face, FT_SFNT_OS2);
if (os2)
- font->is_serif = !(os2->sFamilyClass & 2048); /* Class 8 is sans-serif */
+ font->flags.is_serif = !(os2->sFamilyClass & 2048); /* Class 8 is sans-serif */
FT_Sfnt_Table_Info(face, 0, NULL, &n);
for (i = 0; i < n; ++i)
{
FT_Sfnt_Table_Info(face, i, &tag, &size);
if (tag == TTAG_GDEF || tag == TTAG_GPOS || tag == TTAG_GSUB)
- font->has_opentype = 1;
+ font->flags.has_opentype = 1;
}
}
@@ -532,7 +534,7 @@ static fz_matrix *
fz_adjust_ft_glyph_width(fz_context *ctx, fz_font *font, int gid, fz_matrix *trm)
{
/* Fudge the font matrix to stretch the glyph if we've substituted the font. */
- if (font->ft_stretch && font->width_table /* && font->wmode == 0 */)
+ if (font->flags.ft_stretch && font->width_table /* && font->wmode == 0 */)
{
FT_Fixed adv;
float subw;
@@ -588,7 +590,7 @@ do_ft_render_glyph(fz_context *ctx, fz_font *font, int gid, const fz_matrix *trm
fz_adjust_ft_glyph_width(ctx, font, gid, &local_trm);
- if (font->fake_italic)
+ if (font->flags.fake_italic)
fz_pre_shear(&local_trm, SHEAR, 0);
/*
@@ -633,7 +635,7 @@ do_ft_render_glyph(fz_context *ctx, fz_font *font, int gid, const fz_matrix *trm
goto retry_unhinted;
}
}
- else if (font->force_hinting)
+ else if (font->flags.force_hinting)
{
/*
Enable hinting, but keep the huge char size so that
@@ -659,7 +661,7 @@ retry_unhinted:
}
}
- if (font->fake_bold)
+ if (font->flags.fake_bold)
{
FT_Outline_Embolden(&face->glyph->outline, strength * 64);
FT_Outline_Translate(&face->glyph->outline, -strength * 32, -strength * 32);
@@ -749,7 +751,7 @@ do_render_ft_stroked_glyph(fz_context *ctx, fz_font *font, int gid, const fz_mat
fz_adjust_ft_glyph_width(ctx, font, gid, &local_trm);
- if (font->fake_italic)
+ if (font->flags.fake_italic)
fz_pre_shear(&local_trm, SHEAR, 0);
m.xx = local_trm.a * 64; /* should be 65536 */
@@ -907,7 +909,7 @@ fz_bound_ft_glyph(fz_context *ctx, fz_font *font, int gid)
fz_adjust_ft_glyph_width(ctx, font, gid, &local_trm);
- if (font->fake_italic)
+ if (font->flags.fake_italic)
fz_pre_shear(&local_trm, SHEAR, 0);
m.xx = local_trm.a * 65536;
@@ -917,7 +919,7 @@ fz_bound_ft_glyph(fz_context *ctx, fz_font *font, int gid)
v.x = local_trm.e * 65536;
v.y = local_trm.f * 65536;
- if (font->force_hinting)
+ if (font->flags.force_hinting)
{
ft_flags = FT_LOAD_NO_BITMAP;
}
@@ -945,7 +947,7 @@ fz_bound_ft_glyph(fz_context *ctx, fz_font *font, int gid)
return bounds;
}
- if (font->fake_bold)
+ if (font->flags.fake_bold)
{
FT_Outline_Embolden(&face->glyph->outline, strength * scale);
FT_Outline_Translate(&face->glyph->outline, -strength * 0.5 * scale, -strength * 0.5 * scale);
@@ -1047,12 +1049,12 @@ fz_outline_ft_glyph(fz_context *ctx, fz_font *font, int gid, const fz_matrix *tr
fz_adjust_ft_glyph_width(ctx, font, gid, &local_trm);
- if (font->fake_italic)
+ if (font->flags.fake_italic)
fz_pre_shear(&local_trm, SHEAR, 0);
fz_lock(ctx, FZ_LOCK_FREETYPE);
- if (font->force_hinting)
+ if (font->flags.force_hinting)
{
ft_flags = FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_TRANSFORM;
fterr = FT_Set_Char_Size(face, scale, scale, 72, 72);
@@ -1072,7 +1074,7 @@ fz_outline_ft_glyph(fz_context *ctx, fz_font *font, int gid, const fz_matrix *tr
return NULL;
}
- if (font->fake_bold)
+ if (font->flags.fake_bold)
{
FT_Outline_Embolden(&face->glyph->outline, strength * scale);
FT_Outline_Translate(&face->glyph->outline, -strength * 0.5 * scale, -strength * 0.5 * scale);
@@ -1205,7 +1207,7 @@ fz_prepare_t3_glyph(fz_context *ctx, fz_font *font, int gid, int nested_depth)
font->bbox_table[gid] = d1_rect;
fz_transform_rect(&font->bbox_table[gid], &font->t3matrix);
- if (font->invalid_bbox || !fz_contains_rect(&font->bbox, &d1_rect))
+ if (font->flags.invalid_bbox || !fz_contains_rect(&font->bbox, &d1_rect))
{
/* Either the font bbox is invalid, or the d1_rect returned is
* incompatible with it. Either way, don't trust the d1 rect
@@ -1352,7 +1354,7 @@ fz_print_font(fz_context *ctx, fz_output *out, fz_font *font)
if (font->ft_face)
{
fz_printf(ctx, out, "\tfreetype face %p\n", font->ft_face);
- if (font->ft_substitute)
+ if (font->flags.ft_substitute)
fz_printf(ctx, out, "\tsubstitute font\n");
}
@@ -1524,7 +1526,7 @@ fz_encode_character_with_fallback(fz_context *ctx, fz_font *user_font, int unico
if (script == 0)
script = ucdn_get_script(unicode);
- font = fz_load_fallback_font(ctx, script, language, user_font->is_serif, user_font->is_bold, user_font->is_italic);
+ font = fz_load_fallback_font(ctx, script, language, user_font->flags.is_serif, user_font->flags.is_bold, user_font->flags.is_italic);
if (font)
{
gid = fz_encode_character(ctx, font, unicode);
@@ -1550,3 +1552,35 @@ fz_encode_character_with_fallback(fz_context *ctx, fz_font *user_font, int unico
return *out_font = user_font, 0;
}
+
+const char *fz_font_name(fz_font *font)
+{
+ if (font == NULL || font->name == NULL)
+ return "";
+ return font->name;
+}
+
+fz_buffer **fz_font_t3_procs(fz_font *font)
+{
+ return font ? font->t3procs : NULL;
+}
+
+fz_rect *fz_font_bbox(fz_font *font)
+{
+ return font ? &font->bbox : NULL;
+}
+
+void *fz_font_ft_face(fz_font *font)
+{
+ return font ? font->ft_face : NULL;
+}
+
+fz_font_flags_t *fz_font_flags(fz_font *font)
+{
+ return font ? &font->flags : NULL;
+}
+
+fz_hb_t *fz_font_hb(fz_font *font)
+{
+ return font ? &font->hb : NULL;
+}
diff --git a/source/fitz/stext-device.c b/source/fitz/stext-device.c
index 909d0a46..88a9f669 100644
--- a/source/fitz/stext-device.c
+++ b/source/fitz/stext-device.c
@@ -784,7 +784,9 @@ static void
fz_stext_extract(fz_context *ctx, fz_stext_device *dev, fz_text_span *span, const fz_matrix *ctm, fz_stext_style *style)
{
fz_font *font = span->font;
- FT_Face face = font->ft_face;
+ FT_Face face = fz_font_ft_face(font);
+ fz_buffer **t3procs = fz_font_t3_procs(font);
+ fz_rect *bbox = fz_font_bbox(font);
fz_matrix tm = span->trm;
fz_matrix trm;
float adv;
@@ -800,26 +802,26 @@ fz_stext_extract(fz_context *ctx, fz_stext_device *dev, fz_text_span *span, cons
if (style->wmode == 0)
{
- if (font->ft_face)
+ if (face)
{
fz_lock(ctx, FZ_LOCK_FREETYPE);
- err = FT_Set_Char_Size(font->ft_face, 64, 64, 72, 72);
+ err = FT_Set_Char_Size(face, 64, 64, 72, 72);
if (err)
fz_warn(ctx, "freetype set character size: %s", ft_error_string(err));
ascender = (float)face->ascender / face->units_per_EM;
descender = (float)face->descender / face->units_per_EM;
fz_unlock(ctx, FZ_LOCK_FREETYPE);
}
- else if (font->t3procs && !fz_is_empty_rect(&font->bbox))
+ else if (t3procs && !fz_is_empty_rect(bbox))
{
- ascender = font->bbox.y1;
- descender = font->bbox.y0;
+ ascender = bbox->y1;
+ descender = bbox->y0;
}
}
else
{
- ascender = font->bbox.x1;
- descender = font->bbox.x0;
+ ascender = bbox->x1;
+ descender = bbox->x0;
}
style->ascender = ascender;
style->descender = descender;
diff --git a/source/fitz/stext-output.c b/source/fitz/stext-output.c
index f7ea0c24..39d97dc3 100644
--- a/source/fitz/stext-output.c
+++ b/source/fitz/stext-output.c
@@ -10,20 +10,22 @@
static int font_is_bold(fz_font *font)
{
- FT_Face face = font->ft_face;
+ FT_Face face = fz_font_ft_face(font);
if (face && (face->style_flags & FT_STYLE_FLAG_BOLD))
return 1;
- if (strstr(font->name, "Bold"))
+ if (strstr(fz_font_name(font), "Bold"))
return 1;
return 0;
}
static int font_is_italic(fz_font *font)
{
- FT_Face face = font->ft_face;
+ FT_Face face = fz_font_ft_face(font);
+ const char *name;
if (face && (face->style_flags & FT_STYLE_FLAG_ITALIC))
return 1;
- if (strstr(font->name, "Italic") || strstr(font->name, "Oblique"))
+ name = fz_font_name(font);
+ if (strstr(name, "Italic") || strstr(name, "Oblique"))
return 1;
return 0;
}
@@ -53,8 +55,9 @@ fz_print_style_end(fz_context *ctx, fz_output *out, fz_stext_style *style)
static void
fz_print_style(fz_context *ctx, fz_output *out, fz_stext_style *style)
{
- char *s = strchr(style->font->name, '+');
- s = s ? s + 1 : style->font->name;
+ const char *name = fz_font_name(style->font);
+ const char *s = strchr(name, '+');
+ s = s ? s + 1 : name;
fz_printf(ctx, out, "span.s%d{font-family:\"%s\";font-size:%gpt;",
style->id, s, style->size);
if (font_is_italic(style->font))
@@ -292,7 +295,7 @@ fz_print_stext_page_xml(fz_context *ctx, fz_output *out, fz_stext_page *page)
{
fz_stext_block *block = page->blocks[block_n].u.text;
fz_stext_line *line;
- char *s;
+ const char *s;
fz_printf(ctx, out, "<block bbox=\"%g %g %g %g\">\n",
block->bbox.x0, block->bbox.y0, block->bbox.x1, block->bbox.y1);
@@ -304,6 +307,7 @@ fz_print_stext_page_xml(fz_context *ctx, fz_output *out, fz_stext_page *page)
for (span = line->first_span; span; span = span->next)
{
fz_stext_style *style = NULL;
+ const char *name = NULL;
int char_num;
for (char_num = 0; char_num < span->len; char_num++)
{
@@ -315,8 +319,9 @@ fz_print_stext_page_xml(fz_context *ctx, fz_output *out, fz_stext_page *page)
fz_printf(ctx, out, "</span>\n");
}
style = ch->style;
- s = strchr(style->font->name, '+');
- s = s ? s + 1 : style->font->name;
+ name = fz_font_name(style->font);
+ s = strchr(name, '+');
+ s = s ? s + 1 : name;
fz_printf(ctx, out, "<span bbox=\"%g %g %g %g\" font=\"%s\" size=\"%g\">\n",
span->bbox.x0, span->bbox.y0, span->bbox.x1, span->bbox.y1,
s, style->size);
diff --git a/source/fitz/svg-device.c b/source/fitz/svg-device.c
index b997653d..1484dddd 100644
--- a/source/fitz/svg-device.c
+++ b/source/fitz/svg-device.c
@@ -274,7 +274,7 @@ svg_dev_text_span(fz_context *ctx, svg_device *sdev, const fz_matrix *ctm, const
fz_printf(ctx, out, " transform=\"matrix(%g,%g,%g,%g,%g,%g)\"",
local_trm.a, local_trm.b, local_trm.c, local_trm.d, local_trm.e, local_trm.f);
fz_printf(ctx, out, " font-size=\"%g\"", size);
- fz_printf(ctx, out, " font-family=\"%s\"", span->font->name);
+ fz_printf(ctx, out, " font-family=\"%s\"", fz_font_name(span->font));
/* Leading (and repeated) whitespace presents a problem for SVG
* text, so elide it here. */
diff --git a/source/fitz/trace-device.c b/source/fitz/trace-device.c
index 0b77c075..86e059b5 100644
--- a/source/fitz/trace-device.c
+++ b/source/fitz/trace-device.c
@@ -38,7 +38,7 @@ static void
fz_trace_text_span(fz_context *ctx, fz_output *out, fz_text_span *span)
{
int i;
- fz_printf(ctx, out, "<span font=\"%s\" wmode=\"%d\"", span->font->name, span->wmode);
+ fz_printf(ctx, out, "<span font=\"%s\" wmode=\"%d\"", fz_font_name(span->font), span->wmode);
fz_printf(ctx, out, " trm=\"%g %g %g %g\">\n", span->trm.a, span->trm.b, span->trm.c, span->trm.d);
for (i = 0; i < span->len; i++)
{
diff --git a/source/html/html-font.c b/source/html/html-font.c
index 3b8f7c72..01ec10f5 100644
--- a/source/html/html-font.c
+++ b/source/html/html-font.c
@@ -19,7 +19,7 @@ fz_load_html_default_font(fz_context *ctx, fz_html_font_set *set, const char *fa
if (!data)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load html font: %s", real_family);
set->fonts[idx] = fz_new_font_from_memory(ctx, NULL, data, size, 0, 1);
- set->fonts[idx]->is_serif = !is_sans;
+ fz_font_flags(set->fonts[idx])->is_serif = !is_sans;
}
return set->fonts[idx];
}
@@ -60,10 +60,11 @@ fz_load_html_font(fz_context *ctx, fz_html_font_set *set, const char *family, in
if (data)
{
fz_font *font = fz_new_font_from_memory(ctx, NULL, data, size, 0, 0);
- if (is_bold && !font->is_bold)
- font->fake_bold = 1;
- if (is_italic && !font->is_italic)
- font->fake_italic = 1;
+ fz_font_flags_t *flags = fz_font_flags(font);
+ if (is_bold && !flags->is_bold)
+ flags->fake_bold = 1;
+ if (is_italic && !flags->is_italic)
+ flags->fake_italic = 1;
fz_add_html_font_face(ctx, set, family, is_bold, is_italic, "<builtin>", font);
fz_drop_font(ctx, font);
return font;
diff --git a/source/html/html-layout.c b/source/html/html-layout.c
index e671c64d..2fe6de82 100644
--- a/source/html/html-layout.c
+++ b/source/html/html-layout.c
@@ -791,7 +791,7 @@ static int quick_ligature_mov(fz_context *ctx, string_walker *walker, unsigned i
static int quick_ligature(fz_context *ctx, string_walker *walker, unsigned int i)
{
- if (walker->glyph_info[i].codepoint == 'f' && i + 1 < walker->glyph_count && !walker->font->is_mono)
+ if (walker->glyph_info[i].codepoint == 'f' && i + 1 < walker->glyph_count && !fz_font_flags(walker->font)->is_mono)
{
if (walker->glyph_info[i+1].codepoint == 'f')
{
@@ -873,13 +873,13 @@ static int walk_string(string_walker *walker)
/* Disable harfbuzz shaping if script is common or LGC and there are no opentype tables. */
quickshape = 0;
- if (walker->script <= 3 && !walker->rtl && !walker->font->has_opentype)
+ if (walker->script <= 3 && !walker->rtl && !fz_font_flags(walker->font)->has_opentype)
quickshape = 1;
hb_lock(ctx);
fz_try(ctx)
{
- face = walker->font->ft_face;
+ face = fz_font_ft_face(walker->font);
walker->scale = face->units_per_EM;
fterr = FT_Set_Char_Size(face, walker->scale, walker->scale, 72, 72);
if (fterr)
@@ -899,11 +899,12 @@ static int walk_string(string_walker *walker)
if (!quickshape)
{
- if (walker->font->hb_font == NULL)
+ fz_hb_t *hb = fz_font_hb(walker->font);
+ if (hb->font == NULL)
{
Memento_startLeaking(); /* HarfBuzz leaks harmlessly */
- walker->font->hb_destroy = (fz_hb_font_destructor_t *)hb_font_destroy;
- walker->font->hb_font = hb_ft_font_create(face, NULL);
+ hb->destroy = (fz_hb_font_destructor_t *)hb_font_destroy;
+ hb->font = hb_ft_font_create(face, NULL);
Memento_stopLeaking();
}
@@ -911,7 +912,7 @@ static int walk_string(string_walker *walker)
hb_buffer_guess_segment_properties(walker->hb_buf);
Memento_stopLeaking();
- hb_shape(walker->font->hb_font, walker->hb_buf, NULL, 0);
+ hb_shape(hb->font, walker->hb_buf, NULL, 0);
}
walker->glyph_pos = hb_buffer_get_glyph_positions(walker->hb_buf, &walker->glyph_count);
@@ -1978,7 +1979,7 @@ void
fz_print_css_style(fz_context *ctx, fz_css_style *style, int boxtype, int n)
{
indent(n); printf("font_size %g%c\n", style->font_size.value, style->font_size.unit);
- indent(n); printf("font %s\n", style->font ? style->font->name : "NULL");
+ indent(n); printf("font %s\n", style->font ? fz_font_name(style->font) : "NULL");
indent(n); printf("width = %g%c;\n", style->width.value, style->width.unit);
indent(n); printf("height = %g%c;\n", style->height.value, style->height.unit);
if (boxtype == BOX_BLOCK)
diff --git a/source/pdf/pdf-device.c b/source/pdf/pdf-device.c
index 9644d862..30ae76b5 100644
--- a/source/pdf/pdf-device.c
+++ b/source/pdf/pdf-device.c
@@ -383,9 +383,9 @@ pdf_dev_font(fz_context *ctx, pdf_device *pdev, fz_font *font)
if (gs->font >= 0 && pdev->cid_fonts[gs->font] == font)
return;
- if (font->t3procs)
+ if (fz_font_t3_procs(font))
fz_throw(ctx, FZ_ERROR_GENERIC, "pdf device does not support type 3 fonts");
- if (font->ft_substitute)
+ if (fz_font_flags(font)->ft_substitute)
fz_throw(ctx, FZ_ERROR_GENERIC, "pdf device does not support substitute fonts");
if (!pdf_font_writing_supported(font))
fz_throw(ctx, FZ_ERROR_GENERIC, "pdf device does not support font types found in this file");
@@ -469,7 +469,7 @@ pdf_dev_text_span(fz_context *ctx, pdf_device *pdev, fz_text_span *span)
if (fabsf(dx) > 0 || fabsf(dy) > 0)
fz_buffer_printf(ctx, gs->buf, "%f %f %f %f %f %f Tm\n", tm.a, tm.b, tm.c, tm.d, tm.e, tm.f);
- if (span->font->t3procs)
+ if (fz_font_t3_procs(span->font))
fz_buffer_printf(ctx, gs->buf, "<%02x> Tj\n", it->gid);
else
fz_buffer_printf(ctx, gs->buf, "<%04x> Tj\n", it->gid);
diff --git a/source/pdf/pdf-font.c b/source/pdf/pdf-font.c
index b11d2240..aaab41a5 100644
--- a/source/pdf/pdf-font.c
+++ b/source/pdf/pdf-font.c
@@ -1,5 +1,7 @@
#include "mupdf/pdf.h"
+#include "../fitz/font-impl.h"
+
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_ADVANCES_H
@@ -208,7 +210,7 @@ static int ft_cid_to_gid(pdf_font_desc *fontdesc, int cid)
cid = pdf_lookup_cmap(fontdesc->to_ttf_cmap, cid);
/* vertical presentation forms */
- if (fontdesc->font->ft_substitute && fontdesc->wmode)
+ if (fontdesc->font->flags.ft_substitute && fontdesc->wmode)
{
switch (cid)
{
@@ -326,7 +328,7 @@ pdf_load_builtin_font(fz_context *ctx, pdf_font_desc *fontdesc, char *fontname,
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find builtin font: '%s'", fontname);
fontdesc->font = fz_new_font_from_memory(ctx, fontname, data, len, 0, 1);
- fontdesc->font->is_serif = !!strstr(clean_name, "Times");
+ fontdesc->font->flags.is_serif = !!strstr(clean_name, "Times");
}
if (!strcmp(clean_name, "Symbol") || !strcmp(clean_name, "ZapfDingbats"))
@@ -351,17 +353,17 @@ pdf_load_substitute_font(fz_context *ctx, pdf_font_desc *fontdesc, char *fontnam
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find substitute font");
fontdesc->font = fz_new_font_from_memory(ctx, fontname, data, len, 0, 1);
- fontdesc->font->fake_bold = bold && !fontdesc->font->is_bold;
- fontdesc->font->fake_italic = italic && !fontdesc->font->is_italic;
+ fontdesc->font->flags.fake_bold = bold && !fontdesc->font->flags.is_bold;
+ fontdesc->font->flags.fake_italic = italic && !fontdesc->font->flags.is_italic;
- fontdesc->font->is_mono = mono;
- fontdesc->font->is_serif = serif;
- fontdesc->font->is_bold = bold;
- fontdesc->font->is_italic = italic;
+ fontdesc->font->flags.is_mono = mono;
+ fontdesc->font->flags.is_serif = serif;
+ fontdesc->font->flags.is_bold = bold;
+ fontdesc->font->flags.is_italic = italic;
}
- fontdesc->font->ft_substitute = 1;
- fontdesc->font->ft_stretch = 1;
+ fontdesc->font->flags.ft_substitute = 1;
+ fontdesc->font->flags.ft_stretch = 1;
}
static void
@@ -382,8 +384,8 @@ pdf_load_substitute_cjk_font(fz_context *ctx, pdf_font_desc *fontdesc, char *fon
fontdesc->font = fz_new_font_from_memory(ctx, fontname, data, len, index, 0);
}
- fontdesc->font->ft_substitute = 1;
- fontdesc->font->ft_stretch = 0;
+ fontdesc->font->flags.ft_substitute = 1;
+ fontdesc->font->flags.ft_stretch = 0;
}
static void
@@ -1050,7 +1052,7 @@ load_cid_font(fz_context *ctx, pdf_document *doc, pdf_obj *dict, pdf_obj *encodi
/* if font is external, cidtogidmap should not be identity */
/* so we map from cid to unicode and then map that through the (3 1) */
/* unicode cmap to get a glyph id */
- else if (fontdesc->font->ft_substitute)
+ else if (fontdesc->font->flags.ft_substitute)
{
fterr = FT_Select_Charmap(face, ft_encoding_unicode);
if (fterr)
@@ -1074,7 +1076,7 @@ load_cid_font(fz_context *ctx, pdf_document *doc, pdf_obj *dict, pdf_obj *encodi
* If we only have a substitute font, that won't work.
* Make a last ditch attempt by using
* the ToUnicode table if it exists to map via the substitute font's cmap. */
- if (strstr(fontdesc->encoding->cmap_name, "Identity-") && fontdesc->font->ft_substitute)
+ if (strstr(fontdesc->encoding->cmap_name, "Identity-") && fontdesc->font->flags.ft_substitute)
{
fz_warn(ctx, "non-embedded font using identity encoding: %s", basefont);
if (fontdesc->to_unicode && !fontdesc->to_ttf_cmap)
@@ -1265,7 +1267,7 @@ pdf_load_font_descriptor(fz_context *ctx, pdf_document *doc, pdf_font_desc *font
if (ft_kind(face) == TRUETYPE)
{
if (FT_IS_TRICKY(face) || is_dynalab(fontdesc->font->name))
- fontdesc->font->force_hinting = 1;
+ fontdesc->font->flags.force_hinting = 1;
if (fontdesc->ascent == 0.0f)
fontdesc->ascent = 1000.0f * face->ascender / face->units_per_EM;
@@ -1463,7 +1465,7 @@ pdf_add_font_file(fz_context *ctx, pdf_document *doc, fz_font *font)
fz_var(ref);
/* Check for substitute fonts */
- if (font->ft_substitute)
+ if (font->flags.ft_substitute)
return NULL;
fz_try(ctx)
diff --git a/source/pdf/pdf-op-run.c b/source/pdf/pdf-op-run.c
index a3dca30c..dba3e086 100644
--- a/source/pdf/pdf-op-run.c
+++ b/source/pdf/pdf-op-run.c
@@ -926,7 +926,7 @@ pdf_show_char(fz_context *ctx, pdf_run_processor *pr, int cid)
/* If we are a type3 font within a type 3 font, or are otherwise
* uncachable, then render direct. */
- render_direct = (!fontdesc->font->ft_face && pr->nested_depth > 0) || !fz_glyph_cacheable(ctx, fontdesc->font, gid);
+ render_direct = (!fz_font_ft_face(fontdesc->font) && pr->nested_depth > 0) || !fz_glyph_cacheable(ctx, fontdesc->font, gid);
/* flush buffered text if rendermode has changed */
if (!pr->text || gstate->render != pr->text_mode || render_direct)
diff --git a/source/pdf/pdf-type3.c b/source/pdf/pdf-type3.c
index 57cda6df..84912772 100644
--- a/source/pdf/pdf-type3.c
+++ b/source/pdf/pdf-type3.c
@@ -1,5 +1,7 @@
#include "mupdf/pdf.h"
+#include "../fitz/font-impl.h"
+
static void
pdf_run_glyph_func(fz_context *ctx, void *doc, void *rdb, fz_buffer *contents, fz_device *dev, const fz_matrix *ctm, void *gstate, int nested_depth)
{
@@ -27,6 +29,7 @@ pdf_load_type3_font(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *d
int i, k, n;
fz_rect bbox;
fz_matrix matrix;
+ fz_font *font;
fz_var(fontdesc);
@@ -57,10 +60,11 @@ pdf_load_type3_font(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *d
obj = pdf_dict_get(ctx, dict, PDF_NAME_FontBBox);
fz_transform_rect(pdf_to_rect(ctx, obj, &bbox), &matrix);
- fontdesc->font = fz_new_type3_font(ctx, buf, &matrix);
+ font = fz_new_type3_font(ctx, buf, &matrix);
+ fontdesc->font = font;
fontdesc->size += sizeof(fz_font) + 256 * (sizeof(fz_buffer*) + sizeof(float));
- fz_set_font_bbox(ctx, fontdesc->font, bbox.x0, bbox.y0, bbox.x1, bbox.y1);
+ fz_set_font_bbox(ctx, font, bbox.x0, bbox.y0, bbox.x1, bbox.y1);
/* Encoding */
@@ -124,8 +128,8 @@ pdf_load_type3_font(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *d
for (i = first; i <= last; i++)
{
float w = pdf_to_real(ctx, pdf_array_get(ctx, widths, i - first));
- w = fontdesc->font->t3matrix.a * w * 1000;
- fontdesc->font->t3widths[i] = w * 0.001f;
+ w = font->t3matrix.a * w * 1000;
+ font->t3widths[i] = w * 0.001f;
pdf_add_hmtx(ctx, fontdesc, i, i, w);
}
@@ -133,17 +137,17 @@ pdf_load_type3_font(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *d
/* Resources -- inherit page resources if the font doesn't have its own */
- fontdesc->font->t3freeres = pdf_t3_free_resources;
- fontdesc->font->t3resources = pdf_dict_get(ctx, dict, PDF_NAME_Resources);
- if (!fontdesc->font->t3resources)
- fontdesc->font->t3resources = rdb;
- if (fontdesc->font->t3resources)
- pdf_keep_obj(ctx, fontdesc->font->t3resources);
- if (!fontdesc->font->t3resources)
+ font->t3freeres = pdf_t3_free_resources;
+ font->t3resources = pdf_dict_get(ctx, dict, PDF_NAME_Resources);
+ if (!font->t3resources)
+ font->t3resources = rdb;
+ if (font->t3resources)
+ pdf_keep_obj(ctx, font->t3resources);
+ if (!font->t3resources)
fz_warn(ctx, "no resource dictionary for type 3 font!");
- fontdesc->font->t3doc = doc;
- fontdesc->font->t3run = pdf_run_glyph_func;
+ font->t3doc = doc;
+ font->t3run = pdf_run_glyph_func;
/* CharProcs */
@@ -160,8 +164,8 @@ pdf_load_type3_font(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *d
obj = pdf_dict_gets(ctx, charprocs, estrings[i]);
if (pdf_is_stream(ctx, obj))
{
- fontdesc->font->t3procs[i] = pdf_load_stream(ctx, obj);
- fontdesc->size += fontdesc->font->t3procs[i]->cap;
+ font->t3procs[i] = pdf_load_stream(ctx, obj);
+ fontdesc->size += font->t3procs[i]->cap;
fontdesc->size += 0; // TODO: display list size calculation
}
}
@@ -174,7 +178,7 @@ pdf_load_type3_font(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *d
fz_rethrow(ctx);
}
- doc->type3_fonts[doc->num_type3_fonts++] = fz_keep_font(ctx, fontdesc->font);
+ doc->type3_fonts[doc->num_type3_fonts++] = fz_keep_font(ctx, font);
return fontdesc;
}
diff --git a/source/tools/murun.c b/source/tools/murun.c
index 3ed0228f..14e28f70 100644
--- a/source/tools/murun.c
+++ b/source/tools/murun.c
@@ -2073,7 +2073,7 @@ static void ffi_new_Font(js_State *J)
static void ffi_Font_getName(js_State *J)
{
fz_font *font = js_touserdata(J, 0, "fz_font");
- js_pushstring(J, font->name);
+ js_pushstring(J, fz_font_name(font));
}
static void ffi_Font_encodeCharacter(js_State *J)
diff --git a/source/xps/xps-glyphs.c b/source/xps/xps-glyphs.c
index 407953e8..1296d6f9 100644
--- a/source/xps/xps-glyphs.c
+++ b/source/xps/xps-glyphs.c
@@ -22,14 +22,14 @@ static inline int unhex(int a)
int
xps_count_font_encodings(fz_font *font)
{
- FT_Face face = font->ft_face;
+ FT_Face face = fz_font_ft_face(font);
return face->num_charmaps;
}
void
xps_identify_font_encoding(fz_font *font, int idx, int *pid, int *eid)
{
- FT_Face face = font->ft_face;
+ FT_Face face = fz_font_ft_face(font);
*pid = face->charmaps[idx]->platform_id;
*eid = face->charmaps[idx]->encoding_id;
}
@@ -37,14 +37,14 @@ xps_identify_font_encoding(fz_font *font, int idx, int *pid, int *eid)
void
xps_select_font_encoding(fz_font *font, int idx)
{
- FT_Face face = font->ft_face;
+ FT_Face face = fz_font_ft_face(font);
FT_Set_Charmap(face, face->charmaps[idx]);
}
int
xps_encode_font_char(fz_font *font, int code)
{
- FT_Face face = font->ft_face;
+ FT_Face face = fz_font_ft_face(font);
int gid = FT_Get_Char_Index(face, code);
if (gid == 0 && face->charmap && face->charmap->platform_id == 3 && face->charmap->encoding_id == 0)
gid = FT_Get_Char_Index(face, 0xF000 | code);
@@ -55,7 +55,7 @@ void
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_Face face = fz_font_ft_face(font);
FT_Fixed hadv = 0, vadv = 0;
fz_lock(ctx, FZ_LOCK_FREETYPE);
@@ -242,10 +242,13 @@ xps_lookup_font(fz_context *ctx, xps_document *doc, char *base_uri, char *font_u
if (style_att)
{
- font->fake_bold = !!strstr(style_att, "Bold");
- font->is_bold = font->fake_bold;
- font->fake_italic = !!strstr(style_att, "Italic");
- font->is_italic = font->fake_italic;
+ fz_font_flags_t *flags = fz_font_flags(font);
+ int bold = !!strstr(style_att, "Bold");
+ int italic = !!strstr(style_att, "Italic");
+ flags->fake_bold = bold;
+ flags->is_bold = bold;
+ flags->fake_italic = italic;
+ flags->is_italic = italic;
}
xps_select_best_font_encoding(ctx, doc, font);
@@ -436,7 +439,7 @@ xps_parse_glyphs_imp(fz_context *ctx, xps_document *doc, const fz_matrix *ctm,
else
advance = mtx.hadv * 100;
- if (font->fake_bold)
+ if (fz_font_flags(font)->fake_bold)
advance *= 1.02f;
if (is && *is)