Skip to content

Commit

Permalink
type1: Use correct glyph advance when subsetting type 1 fonts
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Adrian Johnson committed May 16, 2010
1 parent 34fd094 commit edcefa8
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 26 deletions.
23 changes: 12 additions & 11 deletions src/cairo-pdf-surface.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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"
Expand All @@ -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);
Expand All @@ -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");
Expand Down Expand Up @@ -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)
Expand Down
6 changes: 3 additions & 3 deletions src/cairo-scaled-font-subsets-private.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
18 changes: 9 additions & 9 deletions src/cairo-type1-fallback.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
6 changes: 3 additions & 3 deletions src/cairo-type1-subset.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ typedef struct _cairo_type1_font_subset {

struct {
int subset_index;
int width;
double width;
char *name;
} *glyphs;

Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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++) {
Expand Down

0 comments on commit edcefa8

Please sign in to comment.