[win32] correct win32 show_glyphs for non-y-aligned text

Correctly calculate destination glyph coordinates for win32_show_glyphs.
This commit is contained in:
Stuart Parmenter 2006-09-12 16:27:40 -07:00 committed by U-CYCLONE\Vladimir Vukicevic
parent 0166538126
commit f1bd0b9f98
3 changed files with 46 additions and 5 deletions

16
src/cairo-win32-font.c Executable file → Normal file
View file

@ -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;
}

View file

@ -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:

View file

@ -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 */