summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStuart Parmenter <pavlov@pavlov.net>2006-09-12 16:27:40 -0700
committerU-CYCLONE\Vladimir Vukicevic <vladimir@cyclone.(none)>2006-09-12 16:27:40 -0700
commitf1bd0b9f9815ac838f30216d810bdd4eb2b67997 (patch)
tree184c42faa8cda08ea0c9b09e446beb997d844b2e
parent016653812640cddcc51d0500d62c5c65b33bdd04 (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.c16
-rw-r--r--src/cairo-win32-surface.c27
-rw-r--r--src/cairo-win32.h8
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 */