diff options
author | Adrian Johnson <ajohnson@redneon.com> | 2021-08-30 20:41:18 +0930 |
---|---|---|
committer | Adrian Johnson <ajohnson@redneon.com> | 2021-09-18 07:05:35 +0930 |
commit | 8ea4ae5413bd8ae1497e11a473d173cfc2475ae6 (patch) | |
tree | 7fc073d2416c0d95c3c5ce5c2277db4b3db36c7e /src/cairo-user-font.c | |
parent | 994e33215e35e49981dea5b459a9b5b85d4cd1b1 (diff) | |
download | cairo-8ea4ae5413bd8ae1497e11a473d173cfc2475ae6.tar.gz |
Allow user fonts to use the foreground color
Diffstat (limited to 'src/cairo-user-font.c')
-rw-r--r-- | src/cairo-user-font.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/src/cairo-user-font.c b/src/cairo-user-font.c index 47b9f0422..d6427f060 100644 --- a/src/cairo-user-font.c +++ b/src/cairo-user-font.c @@ -171,15 +171,21 @@ _cairo_user_scaled_glyph_init (void *abstract_font, status = CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED; if (face->scaled_font_methods.render_color_glyph) { + cairo_pattern_t *pattern; + recording_surface = _cairo_user_scaled_font_create_recording_surface (scaled_font, TRUE); cr = _cairo_user_scaled_font_create_recording_context (scaled_font, recording_surface, TRUE); + pattern = cairo_pattern_create_rgb (0, 0, 0); + pattern->is_userfont_foreground = TRUE; + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); status = face->scaled_font_methods.render_color_glyph ((cairo_scaled_font_t *)scaled_font, _cairo_scaled_glyph_index(scaled_glyph), cr, &extents); if (status == CAIRO_INT_STATUS_SUCCESS) { status = cairo_status (cr); - scaled_glyph->has_color = TRUE; + scaled_glyph->recording_is_color = TRUE; } } @@ -260,7 +266,7 @@ _cairo_user_scaled_glyph_init (void *abstract_font, height = _cairo_fixed_integer_ceil (scaled_glyph->bbox.p2.y) - _cairo_fixed_integer_floor (scaled_glyph->bbox.p1.y); - if (scaled_glyph->has_color) { + if (scaled_glyph->recording_is_color) { format = CAIRO_FORMAT_ARGB32; } else { switch (scaled_font->base.options.antialias) { @@ -285,20 +291,27 @@ _cairo_user_scaled_glyph_init (void *abstract_font, cairo_surface_set_device_offset (surface, - _cairo_fixed_integer_floor (scaled_glyph->bbox.p1.x), - _cairo_fixed_integer_floor (scaled_glyph->bbox.p1.y)); - status = _cairo_recording_surface_replay (recording_surface, surface); + + if (scaled_glyph->recording_is_color) { + status = _cairo_recording_surface_replay_with_foreground_color (recording_surface, + surface, + foreground_color); + } else { + status = _cairo_recording_surface_replay (recording_surface, surface); + } if (unlikely (status)) { cairo_surface_destroy(surface); return status; } - if (!scaled_glyph->has_color && (info & CAIRO_SCALED_GLYPH_INFO_SURFACE)) { + if (!scaled_glyph->recording_is_color && (info & CAIRO_SCALED_GLYPH_INFO_SURFACE)) { _cairo_scaled_glyph_set_surface (scaled_glyph, &scaled_font->base, (cairo_image_surface_t *) surface); } - if (scaled_glyph->has_color && (info & CAIRO_SCALED_GLYPH_INFO_COLOR_SURFACE)) { + if (scaled_glyph->recording_is_color && (info & CAIRO_SCALED_GLYPH_INFO_COLOR_SURFACE)) { _cairo_scaled_glyph_set_color_surface (scaled_glyph, &scaled_font->base, (cairo_image_surface_t *)surface, |