summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2017-02-17 13:13:35 +0100
committerTor Andersson <tor.andersson@artifex.com>2017-02-20 12:47:15 +0100
commitf19daf828bd69fd0d78657208b56b44fa707d065 (patch)
treee688602ca8f10df04194ac230502f9faa7afd1aa
parent46159e8297d649695f36ad3816ca53ce4311c276 (diff)
downloadmupdf-f19daf828bd69fd0d78657208b56b44fa707d065.tar.xz
Add fz_font_is_bold and italic functions. Use them for svg output.
-rw-r--r--include/mupdf/fitz/font.h20
-rw-r--r--source/fitz/font.c20
-rw-r--r--source/fitz/stext-output.c26
-rw-r--r--source/fitz/svg-device.c21
4 files changed, 62 insertions, 25 deletions
diff --git a/include/mupdf/fitz/font.h b/include/mupdf/fitz/font.h
index 7bd36629..782f60b1 100644
--- a/include/mupdf/fitz/font.h
+++ b/include/mupdf/fitz/font.h
@@ -126,6 +126,26 @@ fz_shaper_data_t *fz_font_shaper_data(fz_context *ctx, fz_font *font);
const char *fz_font_name(fz_context *ctx, fz_font *font);
/*
+ fz_font_is_bold: Returns true if the font is bold.
+*/
+int fz_font_is_bold(fz_context *ctx, fz_font *font);
+
+/*
+ fz_font_is_italic: Returns true if the font is italic.
+*/
+int fz_font_is_italic(fz_context *ctx, fz_font *font);
+
+/*
+ fz_font_is_serif: Returns true if the font is serif.
+*/
+int fz_font_is_serif(fz_context *ctx, fz_font *font);
+
+/*
+ fz_font_is_monospaced: Returns true if the font is monospaced.
+*/
+int fz_font_is_monospaced(fz_context *ctx, fz_font *font);
+
+/*
fz_font_bbox: Retrieve a pointer to the font bbox.
font: The font to query.
diff --git a/source/fitz/font.c b/source/fitz/font.c
index 9a594cff..31877d67 100644
--- a/source/fitz/font.c
+++ b/source/fitz/font.c
@@ -1570,6 +1570,26 @@ fz_encode_character_with_fallback(fz_context *ctx, fz_font *user_font, int unico
return *out_font = user_font, 0;
}
+int fz_font_is_bold(fz_context *ctx, fz_font *font)
+{
+ return font ? font->flags.is_bold : 0;
+}
+
+int fz_font_is_italic(fz_context *ctx, fz_font *font)
+{
+ return font ? font->flags.is_italic : 0;
+}
+
+int fz_font_is_serif(fz_context *ctx, fz_font *font)
+{
+ return font ? font->flags.is_serif : 0;
+}
+
+int fz_font_is_monospaced(fz_context *ctx, fz_font *font)
+{
+ return font ? font->flags.is_mono : 0;
+}
+
const char *fz_font_name(fz_context *ctx, fz_font *font)
{
return font ? font->name : "";
diff --git a/source/fitz/stext-output.c b/source/fitz/stext-output.c
index d671288f..09b18db8 100644
--- a/source/fitz/stext-output.c
+++ b/source/fitz/stext-output.c
@@ -8,28 +8,6 @@
/* XML, HTML and plain-text output */
-static int font_is_bold(fz_context *ctx, fz_font *font)
-{
- FT_Face face = fz_font_ft_face(ctx, font);
- if (face && (face->style_flags & FT_STYLE_FLAG_BOLD))
- return 1;
- if (strstr(fz_font_name(ctx, font), "Bold"))
- return 1;
- return 0;
-}
-
-static int font_is_italic(fz_context *ctx, fz_font *font)
-{
- FT_Face face = fz_font_ft_face(ctx, font);
- const char *name;
- if (face && (face->style_flags & FT_STYLE_FLAG_ITALIC))
- return 1;
- name = fz_font_name(ctx, font);
- if (strstr(name, "Italic") || strstr(name, "Oblique"))
- return 1;
- return 0;
-}
-
static void
fz_print_style_begin(fz_context *ctx, fz_output *out, fz_stext_style *style)
{
@@ -60,9 +38,9 @@ fz_print_style(fz_context *ctx, fz_output *out, fz_stext_style *style)
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(ctx, style->font))
+ if (fz_font_is_italic(ctx, style->font))
fz_printf(ctx, out, "font-style:italic;");
- if (font_is_bold(ctx, style->font))
+ if (fz_font_is_bold(ctx, style->font))
fz_printf(ctx, out, "font-weight:bold;");
fz_printf(ctx, out, "}\n");
}
diff --git a/source/fitz/svg-device.c b/source/fitz/svg-device.c
index bf2a2605..8a69d223 100644
--- a/source/fitz/svg-device.c
+++ b/source/fitz/svg-device.c
@@ -256,6 +256,17 @@ is_xml_wspace(int c)
}
static void
+svg_font_family(fz_context *ctx, char buf[], int size, const char *name)
+{
+ /* Remove "ABCDEF+" prefix and "-Bold" suffix. */
+ char *p = strchr(name, '+');
+ if (p) fz_strlcpy(buf, p+1, size);
+ else fz_strlcpy(buf, name, size);
+ p = strrchr(buf, '-');
+ if (p) *p = 0;
+}
+
+static void
svg_dev_text_span(fz_context *ctx, svg_device *sdev, const fz_matrix *ctm, const fz_text_span *span)
{
fz_output *out = sdev->out;
@@ -265,6 +276,8 @@ svg_dev_text_span(fz_context *ctx, svg_device *sdev, const fz_matrix *ctm, const
fz_matrix local_trm;
float size;
int start, is_wspace, was_wspace;
+ char font_family[100];
+ int is_bold, is_italic;
/* Rely on the fact that trm.{e,f} == 0 */
size = fz_matrix_expansion(&span->trm);
@@ -277,10 +290,16 @@ svg_dev_text_span(fz_context *ctx, svg_device *sdev, const fz_matrix *ctm, const
fz_invert_matrix(&inverse, &local_trm);
fz_concat(&local_trm, &local_trm, ctm);
+ svg_font_family(ctx, font_family, sizeof font_family, fz_font_name(ctx, span->font));
+ is_bold = fz_font_is_bold(ctx, span->font);
+ is_italic = fz_font_is_italic(ctx, span->font);
+
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\"", fz_font_name(ctx, span->font));
+ fz_printf(ctx, out, " font-family=\"%s\"", font_family);
+ if (is_bold) fz_printf(ctx, out, " font-weight=\"bold\"");
+ if (is_italic) fz_printf(ctx, out, " font-style=\"italic\"");
/* Leading (and repeated) whitespace presents a problem for SVG
* text, so elide it here. */