diff options
author | Stuart Parmenter <pavlov@pavlov.net> | 2006-09-12 16:27:40 -0700 |
---|---|---|
committer | U-CYCLONE\Vladimir Vukicevic <vladimir@cyclone.(none)> | 2006-09-12 16:27:40 -0700 |
commit | f1bd0b9f9815ac838f30216d810bdd4eb2b67997 (patch) | |
tree | 184c42faa8cda08ea0c9b09e446beb997d844b2e | |
parent | 016653812640cddcc51d0500d62c5c65b33bdd04 (diff) |
[win32] correct win32 show_glyphs for non-y-aligned text
Correctly calculate destination glyph coordinates for win32_show_glyphs.
-rw-r--r--[-rwxr-xr-x] | src/cairo-win32-font.c | 16 | ||||
-rw-r--r-- | src/cairo-win32-surface.c | 27 | ||||
-rw-r--r-- | src/cairo-win32.h | 8 |
3 files changed, 46 insertions, 5 deletions
diff --git a/src/cairo-win32-font.c b/src/cairo-win32-font.c index d92987c7..ee8cd3e7 100755..100644 --- a/src/cairo-win32-font.c +++ b/src/cairo-win32-font.c @@ -1673,3 +1673,19 @@ cairo_win32_scaled_font_get_metrics_factor (cairo_scaled_font_t *scaled_font) { return 1. / ((cairo_win32_scaled_font_t *)scaled_font)->logical_scale; } + +void +cairo_win32_scaled_font_get_logical_to_device (cairo_scaled_font_t *scaled_font, + cairo_matrix_t *logical_to_device) +{ + cairo_win32_scaled_font_t *win_font = (cairo_win32_scaled_font_t *)scaled_font; + *logical_to_device = win_font->logical_to_device; +} + +void +cairo_win32_scaled_font_get_device_to_logical (cairo_scaled_font_t *scaled_font, + cairo_matrix_t *device_to_logical) +{ + cairo_win32_scaled_font_t *win_font = (cairo_win32_scaled_font_t *)scaled_font; + *device_to_logical = win_font->device_to_logical; +} diff --git a/src/cairo-win32-surface.c b/src/cairo-win32-surface.c index 3b3cf259..54c86985 100644 --- a/src/cairo-win32-surface.c +++ b/src/cairo-win32-surface.c @@ -1250,6 +1250,8 @@ _cairo_win32_surface_show_glyphs (void *surface, COLORREF color; int output_count = 0; + cairo_matrix_t device_to_logical; + /* We can only handle win32 fonts */ if (cairo_scaled_font_get_type (scaled_font) != CAIRO_FONT_TYPE_WIN32) return CAIRO_INT_STATUS_UNSUPPORTED; @@ -1276,6 +1278,8 @@ _cairo_win32_surface_show_glyphs (void *surface, ((int)solid_pattern->color.green_short) >> 8, ((int)solid_pattern->color.blue_short) >> 8); + cairo_win32_scaled_font_get_device_to_logical(scaled_font, &device_to_logical); + SaveDC(dst->dc); cairo_win32_scaled_font_select_font(scaled_font, dst->dc); @@ -1295,13 +1299,23 @@ _cairo_win32_surface_show_glyphs (void *surface, if (i == num_glyphs - 1) dx_buf[i] = 0; else - dx_buf[i] = (glyphs[i+1].x - glyphs[i].x) * WIN32_FONT_LOGICAL_SCALE; + dx_buf[i] = floor(((glyphs[i+1].x - glyphs[i].x) * WIN32_FONT_LOGICAL_SCALE) + 0.5); if (i == num_glyphs - 1 || glyphs[i].y != glyphs[i+1].y) { const int offset = (i - output_count) + 1; + double user_x = glyphs[offset].x; + double user_y = last_y; + double logical_x, logical_y; + + cairo_matrix_transform_point(&device_to_logical, + &user_x, &user_y); + + logical_x = floor(user_x + 0.5); + logical_y = floor(user_y + 0.5); + win_result = ExtTextOutW(dst->dc, - glyphs[offset].x * WIN32_FONT_LOGICAL_SCALE, - last_y * WIN32_FONT_LOGICAL_SCALE, + logical_x, + logical_y, ETO_GLYPH_INDEX, NULL, glyph_buf + offset, @@ -1313,9 +1327,12 @@ _cairo_win32_surface_show_glyphs (void *surface, } output_count = 0; - } - last_y = glyphs[i].y; + if (i < num_glyphs - 1) + last_y = glyphs[i+1].y; + } else { + last_y = glyphs[i].y; + } } FAIL: diff --git a/src/cairo-win32.h b/src/cairo-win32.h index 9710e9a8..8719d338 100644 --- a/src/cairo-win32.h +++ b/src/cairo-win32.h @@ -80,6 +80,14 @@ cairo_win32_scaled_font_done_font (cairo_scaled_font_t *scaled_font); cairo_public double cairo_win32_scaled_font_get_metrics_factor (cairo_scaled_font_t *scaled_font); +cairo_public void +cairo_win32_scaled_font_get_logical_to_device (cairo_scaled_font_t *scaled_font, + cairo_matrix_t *logical_to_device); + +cairo_public void +cairo_win32_scaled_font_get_device_to_logical (cairo_scaled_font_t *scaled_font, + cairo_matrix_t *device_to_logical); + CAIRO_END_DECLS #else /* CAIRO_HAS_WIN32_SURFACE */ |