diff options
-rw-r--r-- | include/mupdf/fitz/font.h | 20 | ||||
-rw-r--r-- | source/fitz/font.c | 20 | ||||
-rw-r--r-- | source/fitz/stext-output.c | 26 | ||||
-rw-r--r-- | source/fitz/svg-device.c | 21 |
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. */ |