summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Johnson <ajohnson@redneon.com>2010-05-12 23:12:55 +0930
committerAdrian Johnson <ajohnson@redneon.com>2010-05-16 20:52:31 +0930
commitedcefa87ed0a8ff59b54ef9251182ce68f9158ba (patch)
treebefb80cd0997e00854726a78b89c0db3b675f093
parent34fd094b3be54138c20ea5c4aab1d9597d056f35 (diff)
type1: Use correct glyph advance when subsetting type 1 fonts
Previously the glyph advance in font units was used for the widths in the PDF font dictionary. This only works for Type 1 fonts that use a [0.001 0 0 0.001 0 0] font matrix. https://bugs.freedesktop.org/show_bug.cgi?id=28061
-rw-r--r--src/cairo-pdf-surface.c23
-rw-r--r--src/cairo-scaled-font-subsets-private.h6
-rw-r--r--src/cairo-type1-fallback.c18
-rw-r--r--src/cairo-type1-subset.c6
4 files changed, 27 insertions, 26 deletions
diff --git a/src/cairo-pdf-surface.c b/src/cairo-pdf-surface.c
index 091ed5882..038b94cd7 100644
--- a/src/cairo-pdf-surface.c
+++ b/src/cairo-pdf-surface.c
@@ -3849,6 +3849,8 @@ _cairo_pdf_surface_emit_to_unicode_stream (cairo_pdf_surface_t *surface,
return _cairo_pdf_surface_close_stream (surface);
}
+#define PDF_UNITS_PER_EM 1000
+
static cairo_status_t
_cairo_pdf_surface_emit_cff_font (cairo_pdf_surface_t *surface,
cairo_scaled_font_subset_t *font_subset,
@@ -4088,7 +4090,7 @@ _cairo_pdf_surface_emit_type1_font (cairo_pdf_surface_t *surface,
" /ItalicAngle 0\n"
" /Ascent %ld\n"
" /Descent %ld\n"
- " /CapHeight 500\n"
+ " /CapHeight %ld\n"
" /StemV 80\n"
" /StemH 80\n"
" /FontFile %u 0 R\n"
@@ -4097,12 +4099,13 @@ _cairo_pdf_surface_emit_type1_font (cairo_pdf_surface_t *surface,
descriptor.id,
tag,
subset->base_font,
- subset->x_min,
- subset->y_min,
- subset->x_max,
- subset->y_max,
- subset->ascent,
- subset->descent,
+ (long)(subset->x_min*PDF_UNITS_PER_EM),
+ (long)(subset->y_min*PDF_UNITS_PER_EM),
+ (long)(subset->x_max*PDF_UNITS_PER_EM),
+ (long)(subset->y_max*PDF_UNITS_PER_EM),
+ (long)(subset->ascent*PDF_UNITS_PER_EM),
+ (long)(subset->descent*PDF_UNITS_PER_EM),
+ (long)(subset->y_max*PDF_UNITS_PER_EM),
stream.id);
_cairo_pdf_surface_update_object (surface, subset_resource);
@@ -4123,8 +4126,8 @@ _cairo_pdf_surface_emit_type1_font (cairo_pdf_surface_t *surface,
for (i = 0; i < font_subset->num_glyphs; i++)
_cairo_output_stream_printf (surface->output,
- " %d",
- subset->widths[i]);
+ " %ld",
+ (long)(subset->widths[i]*PDF_UNITS_PER_EM));
_cairo_output_stream_printf (surface->output,
" ]\n");
@@ -4186,8 +4189,6 @@ _cairo_pdf_surface_emit_type1_fallback_font (cairo_pdf_surface_t *surface,
return status;
}
-#define PDF_UNITS_PER_EM 1000
-
static cairo_status_t
_cairo_pdf_surface_emit_truetype_font_subset (cairo_pdf_surface_t *surface,
cairo_scaled_font_subset_t *font_subset)
diff --git a/src/cairo-scaled-font-subsets-private.h b/src/cairo-scaled-font-subsets-private.h
index 9e12a9185..35c1e71de 100644
--- a/src/cairo-scaled-font-subsets-private.h
+++ b/src/cairo-scaled-font-subsets-private.h
@@ -451,9 +451,9 @@ _cairo_truetype_subset_fini (cairo_truetype_subset_t *truetype_subset);
typedef struct _cairo_type1_subset {
char *base_font;
- int *widths;
- long x_min, y_min, x_max, y_max;
- long ascent, descent;
+ double *widths;
+ double x_min, y_min, x_max, y_max;
+ double ascent, descent;
char *data;
unsigned long header_length;
unsigned long data_length;
diff --git a/src/cairo-type1-fallback.c b/src/cairo-type1-fallback.c
index 7894f7ed8..b93c42348 100644
--- a/src/cairo-type1-fallback.c
+++ b/src/cairo-type1-fallback.c
@@ -727,20 +727,20 @@ _cairo_type1_fallback_init_internal (cairo_type1_subset_t *type1_subset,
goto fail1;
}
- type1_subset->widths = calloc (sizeof (int), font->scaled_font_subset->num_glyphs);
+ type1_subset->widths = calloc (sizeof (double), font->scaled_font_subset->num_glyphs);
if (unlikely (type1_subset->widths == NULL)) {
status = _cairo_error (CAIRO_STATUS_NO_MEMORY);
goto fail2;
}
for (i = 0; i < font->scaled_font_subset->num_glyphs; i++)
- type1_subset->widths[i] = font->widths[i];
-
- type1_subset->x_min = (int) font->x_min;
- type1_subset->y_min = (int) font->y_min;
- type1_subset->x_max = (int) font->x_max;
- type1_subset->y_max = (int) font->y_max;
- type1_subset->ascent = (int) font->y_max;
- type1_subset->descent = (int) font->y_min;
+ type1_subset->widths[i] = (double)font->widths[i]/1000;
+
+ type1_subset->x_min = (double)font->x_min/1000;
+ type1_subset->y_min = (double)font->y_min/1000;
+ type1_subset->x_max = (double)font->x_max/1000;
+ type1_subset->y_max = (double)font->y_max/1000;
+ type1_subset->ascent = (double)font->y_max/1000;
+ type1_subset->descent = (double)font->y_min/1000;
length = font->header_size + font->data_size +
font->trailer_size;
diff --git a/src/cairo-type1-subset.c b/src/cairo-type1-subset.c
index 3757ffffd..d92c86066 100644
--- a/src/cairo-type1-subset.c
+++ b/src/cairo-type1-subset.c
@@ -83,7 +83,7 @@ typedef struct _cairo_type1_font_subset {
struct {
int subset_index;
- int width;
+ double width;
char *name;
} *glyphs;
@@ -566,7 +566,7 @@ cairo_type1_font_subset_get_glyph_names_and_widths (cairo_type1_font_subset_t *f
return CAIRO_INT_STATUS_UNSUPPORTED;
}
- font->glyphs[i].width = font->face->glyph->metrics.horiAdvance;
+ font->glyphs[i].width = font->face->glyph->linearHoriAdvance / 65536.0; /* 16.16 format */
error = FT_Get_Glyph_Name(font->face, i, buffer, sizeof buffer);
if (error != FT_Err_Ok) {
@@ -1346,7 +1346,7 @@ _cairo_type1_subset_init (cairo_type1_subset_t *type1_subset,
if (unlikely (type1_subset->base_font == NULL))
goto fail1;
- type1_subset->widths = calloc (sizeof (int), font.num_glyphs);
+ type1_subset->widths = calloc (sizeof (double), font.num_glyphs);
if (unlikely (type1_subset->widths == NULL))
goto fail2;
for (i = 0; i < font.base.num_glyphs; i++) {