commit 5dbc19f0796de45c8c5932d7bfd5c912eb28275f Author: Brian Ewins Date: Sat Mar 17 01:13:48 2007 +0000 [atsui] make text_to_glyphs return positions in user units. text_to_glyphs was returning positions in device units; correct this to use user units. diff --git a/src/cairo-atsui-font.c b/src/cairo-atsui-font.c index 030db16..f357e7d 100644 --- a/src/cairo-atsui-font.c +++ b/src/cairo-atsui-font.c @@ -85,6 +85,7 @@ struct _cairo_atsui_font { Fixed size; CGAffineTransform font_matrix; + CGAffineTransform device_to_user_scale; }; struct _cairo_atsui_font_face { @@ -235,6 +236,12 @@ _cairo_atsui_font_create_scaled (cairo_font_face_t *font_face, _cairo_scaled_font_init(&font->base, font_face, font_matrix, ctm, options, &cairo_atsui_scaled_font_backend); + _cairo_matrix_compute_scale_factors (ctm, + &xscale, &yscale, 1); + font->device_to_user_scale = + CGAffineTransformInvert (CGAffineTransformMake (xscale, 0, + 0, yscale, + 0, 0)); _cairo_matrix_compute_scale_factors (&font->base.scale, &xscale, &yscale, 1); font->font_matrix = CGAffineTransformMake (1., 0., @@ -844,6 +851,7 @@ _cairo_atsui_font_text_to_glyphs (void *abstract_font, cairo_atsui_font_t *font = abstract_font; ItemCount glyphCount; int i; + CGPoint point; status = _cairo_utf8_to_utf16 ((unsigned char *)utf8, -1, &utf16, &n16); if (status) @@ -872,7 +880,11 @@ _cairo_atsui_font_text_to_glyphs (void *abstract_font, for (i = 0; i < *num_glyphs; i++) { (*glyphs)[i].index = layoutRecords[i].glyphID; - (*glyphs)[i].x = x + FixedToFloat(layoutRecords[i].realPos); + /* ATSLayoutRecord.realPos is in device units, convert to user units */ + point = CGPointMake (FixedToFloat (layoutRecords[i].realPos), 0); + point = CGPointApplyAffineTransform (point, font->device_to_user_scale); + + (*glyphs)[i].x = x + point.x; (*glyphs)[i].y = y; }