summaryrefslogtreecommitdiff
path: root/source/fitz
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2016-02-24 13:35:11 +0100
committerTor Andersson <tor.andersson@artifex.com>2016-02-24 13:41:56 +0100
commit07b0e5e758d77e6b9b3049e13cb386128be1592c (patch)
treec68e3d6d66ffc919ba751a83958d73b924e5849a /source/fitz
parenta76adb3dce6360d08aa5eeb7a23da50c3af81c10 (diff)
downloadmupdf-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.c14
-rw-r--r--source/fitz/stext-device.c2
-rw-r--r--source/fitz/text.c22
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)
{