diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2016-02-24 13:35:11 +0100 |
---|---|---|
committer | Tor Andersson <tor.andersson@artifex.com> | 2016-02-24 13:41:56 +0100 |
commit | 07b0e5e758d77e6b9b3049e13cb386128be1592c (patch) | |
tree | c68e3d6d66ffc919ba751a83958d73b924e5849a /source/fitz | |
parent | a76adb3dce6360d08aa5eeb7a23da50c3af81c10 (diff) | |
download | mupdf-07b0e5e758d77e6b9b3049e13cb386128be1592c.tar.xz |
Add fz_show_string function and move wmode argument to end.
Diffstat (limited to 'source/fitz')
-rw-r--r-- | source/fitz/font.c | 14 | ||||
-rw-r--r-- | source/fitz/stext-device.c | 2 | ||||
-rw-r--r-- | source/fitz/text.c | 22 |
3 files changed, 30 insertions, 8 deletions
diff --git a/source/fitz/font.c b/source/fitz/font.c index b3403229..db07e890 100644 --- a/source/fitz/font.c +++ b/source/fitz/font.c @@ -1378,7 +1378,7 @@ int fz_glyph_cacheable(fz_context *ctx, fz_font *font, int gid) } static float -fz_advance_ft_glyph(fz_context *ctx, fz_font *font, int gid) +fz_advance_ft_glyph(fz_context *ctx, fz_font *font, int gid, int wmode) { FT_Fixed adv; int mask; @@ -1392,8 +1392,8 @@ fz_advance_ft_glyph(fz_context *ctx, fz_font *font, int gid) } mask = FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING | FT_LOAD_IGNORE_TRANSFORM; - /* if (font->wmode) - mask |= FT_LOAD_VERTICAL_LAYOUT; */ + if (wmode) + mask |= FT_LOAD_VERTICAL_LAYOUT; fz_lock(ctx, FZ_LOCK_FREETYPE); FT_Get_Advance(font->ft_face, gid, mask, &adv); fz_unlock(ctx, FZ_LOCK_FREETYPE); @@ -1409,10 +1409,12 @@ fz_advance_t3_glyph(fz_context *ctx, fz_font *font, int gid) } float -fz_advance_glyph(fz_context *ctx, fz_font *font, int gid) +fz_advance_glyph(fz_context *ctx, fz_font *font, int gid, int wmode) { if (font->ft_face) { + if (wmode) + return fz_advance_ft_glyph(ctx, font, gid, 1); if (gid >= 0 && gid < font->glyph_count && gid < MAX_ADVANCE_CACHE) { if (!font->advance_cache) @@ -1420,12 +1422,12 @@ fz_advance_glyph(fz_context *ctx, fz_font *font, int gid) int i; font->advance_cache = fz_malloc_array(ctx, font->glyph_count, sizeof(float)); for (i = 0; i < font->glyph_count; ++i) - font->advance_cache[i] = fz_advance_ft_glyph(ctx, font, i); + font->advance_cache[i] = fz_advance_ft_glyph(ctx, font, i, 0); } return font->advance_cache[gid]; } - return fz_advance_ft_glyph(ctx, font, gid); + return fz_advance_ft_glyph(ctx, font, gid, 0); } if (font->t3procs) return fz_advance_t3_glyph(ctx, font, gid); diff --git a/source/fitz/stext-device.c b/source/fitz/stext-device.c index 1decf5af..83bde371 100644 --- a/source/fitz/stext-device.c +++ b/source/fitz/stext-device.c @@ -800,7 +800,7 @@ fz_stext_extract(fz_context *ctx, fz_stext_device *dev, fz_text_span *span, cons fz_concat(&trm, &tm, ctm); /* Calculate bounding box and new pen position based on font metrics */ - adv = fz_advance_glyph(ctx, font, span->items[i].gid); + adv = fz_advance_glyph(ctx, font, span->items[i].gid, style->wmode); /* Check for one glyph to many char mapping */ for (j = i + 1; j < span->len; j++) diff --git a/source/fitz/text.c b/source/fitz/text.c index 87aa2e79..735b3a5b 100644 --- a/source/fitz/text.c +++ b/source/fitz/text.c @@ -80,7 +80,7 @@ fz_grow_text_span(fz_context *ctx, fz_text_span *span, int n) } void -fz_show_glyph(fz_context *ctx, fz_text *text, fz_font *font, int wmode, const fz_matrix *trm, int gid, int ucs) +fz_show_glyph(fz_context *ctx, fz_text *text, fz_font *font, const fz_matrix *trm, int gid, int ucs, int wmode) { fz_text_span *span; @@ -98,6 +98,26 @@ fz_show_glyph(fz_context *ctx, fz_text *text, fz_font *font, int wmode, const fz span->len++; } +void +fz_show_string(fz_context *ctx, fz_text *text, fz_font *user_font, fz_matrix *trm, const char *s, int wmode) +{ + fz_font *font; + int gid, ucs; + float adv; + + while (*s) + { + s += fz_chartorune(&ucs, s); + gid = fz_encode_character_with_fallback(ctx, user_font, ucs, 0, &font); + fz_show_glyph(ctx, text, font, trm, gid, ucs, wmode); + adv = fz_advance_glyph(ctx, font, gid, wmode); + if (wmode == 0) + fz_pre_translate(trm, adv, 0); + else + fz_pre_translate(trm, 0, -adv); + } +} + fz_rect * fz_bound_text(fz_context *ctx, const fz_text *text, const fz_stroke_state *stroke, const fz_matrix *ctm, fz_rect *bbox) { |