mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-05-06 02:18:03 +02:00
[win32] correct win32 show_glyphs for non-y-aligned text
Correctly calculate destination glyph coordinates for win32_show_glyphs.
This commit is contained in:
parent
0166538126
commit
f1bd0b9f98
3 changed files with 46 additions and 5 deletions
16
src/cairo-win32-font.c
Executable file → Normal file
16
src/cairo-win32-font.c
Executable file → Normal 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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue