Merge branch 'color-font-vector-surface' into 'master'
Paint color glyphs in fallback resolution on vector surfaces See merge request cairo/cairo!293
|
|
@ -23,7 +23,6 @@ linear-gradient-reflect
|
|||
map-all-to-image
|
||||
map-bit-to-image
|
||||
map-to-image-fill
|
||||
mesh-pattern
|
||||
negative-stride-image
|
||||
overlapping-glyphs
|
||||
paint-source-alpha
|
||||
|
|
|
|||
|
|
@ -2641,7 +2641,9 @@ composite_one_color_glyph (cairo_surface_t *surface,
|
|||
const cairo_pattern_t *source,
|
||||
const cairo_clip_t *clip,
|
||||
cairo_glyph_t *glyph,
|
||||
cairo_scaled_glyph_t *scaled_glyph)
|
||||
cairo_scaled_glyph_t *scaled_glyph,
|
||||
double x_scale,
|
||||
double y_scale)
|
||||
{
|
||||
cairo_int_status_t status;
|
||||
cairo_image_surface_t *glyph_surface;
|
||||
|
|
@ -2661,11 +2663,12 @@ composite_one_color_glyph (cairo_surface_t *surface,
|
|||
int x, y;
|
||||
/* round glyph locations to the nearest pixels */
|
||||
/* XXX: FRAGILE: We're ignoring device_transform scaling here. A bug? */
|
||||
x = _cairo_lround (glyph->x - glyph_surface->base.device_transform.x0);
|
||||
y = _cairo_lround (glyph->y - glyph_surface->base.device_transform.y0);
|
||||
x = _cairo_lround (glyph->x * x_scale - glyph_surface->base.device_transform.x0);
|
||||
y = _cairo_lround (glyph->y * y_scale - glyph_surface->base.device_transform.y0);
|
||||
|
||||
pattern = cairo_pattern_create_for_surface ((cairo_surface_t *)glyph_surface);
|
||||
cairo_matrix_init_translate (&matrix, - x, - y);
|
||||
cairo_matrix_scale (&matrix, x_scale, y_scale);
|
||||
cairo_pattern_set_matrix (pattern, &matrix);
|
||||
if (op == CAIRO_OPERATOR_SOURCE || op == CAIRO_OPERATOR_CLEAR || !has_color)
|
||||
status = surface->backend->mask (surface, op, pattern, pattern, clip);
|
||||
|
|
@ -2702,6 +2705,27 @@ composite_color_glyphs (cairo_surface_t *surface,
|
|||
int gp;
|
||||
cairo_scaled_glyph_t *glyph_cache[GLYPH_CACHE_SIZE];
|
||||
cairo_color_t *foreground_color = NULL;
|
||||
double x_scale = 1.0;
|
||||
double y_scale = 1.0;
|
||||
|
||||
if (surface->is_vector) {
|
||||
cairo_font_face_t *font_face;
|
||||
cairo_matrix_t font_matrix;
|
||||
cairo_matrix_t ctm;
|
||||
cairo_font_options_t font_options;
|
||||
|
||||
x_scale = surface->x_fallback_resolution / surface->x_resolution;
|
||||
y_scale = surface->y_fallback_resolution / surface->y_resolution;
|
||||
font_face = cairo_scaled_font_get_font_face (scaled_font);
|
||||
cairo_scaled_font_get_font_matrix (scaled_font, &font_matrix);
|
||||
cairo_scaled_font_get_ctm (scaled_font, &ctm);
|
||||
cairo_scaled_font_get_font_options (scaled_font, &font_options);
|
||||
cairo_matrix_scale (&ctm, x_scale, y_scale);
|
||||
scaled_font = cairo_scaled_font_create (font_face,
|
||||
&font_matrix,
|
||||
&ctm,
|
||||
&font_options);
|
||||
}
|
||||
|
||||
if (source->type == CAIRO_PATTERN_TYPE_SOLID)
|
||||
foreground_color = &((cairo_solid_pattern_t *) source)->color;
|
||||
|
|
@ -2763,7 +2787,8 @@ composite_color_glyphs (cairo_surface_t *surface,
|
|||
goto UNLOCK;
|
||||
|
||||
status = composite_one_color_glyph (surface, op, source, clip,
|
||||
&glyphs[gp], scaled_glyph);
|
||||
&glyphs[gp], scaled_glyph,
|
||||
x_scale, y_scale);
|
||||
if (unlikely (status && status != CAIRO_INT_STATUS_NOTHING_TO_DO))
|
||||
goto UNLOCK;
|
||||
}
|
||||
|
|
@ -2799,7 +2824,8 @@ composite_color_glyphs (cairo_surface_t *surface,
|
|||
}
|
||||
|
||||
status = composite_one_color_glyph (surface, op, source, clip,
|
||||
&glyphs[glyph_pos], scaled_glyph);
|
||||
&glyphs[glyph_pos], scaled_glyph,
|
||||
x_scale, y_scale);
|
||||
if (unlikely (status && status != CAIRO_INT_STATUS_NOTHING_TO_DO))
|
||||
goto UNLOCK;
|
||||
}
|
||||
|
|
@ -2810,6 +2836,9 @@ composite_color_glyphs (cairo_surface_t *surface,
|
|||
UNLOCK:
|
||||
_cairo_scaled_font_thaw_cache (scaled_font);
|
||||
|
||||
if (surface->is_vector)
|
||||
cairo_scaled_font_destroy (scaled_font);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
|
|||
BIN
test/reference/ft-color-font.recording.ref.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 2 KiB |
BIN
test/reference/user-font-color.recording.ref.png
Normal file
|
After Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 3 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 2.1 KiB |