diff options
author | Adrian Johnson <ajohnson@redneon.com> | 2022-12-31 20:53:37 +1030 |
---|---|---|
committer | Adrian Johnson <ajohnson@redneon.com> | 2023-01-03 17:37:36 +1030 |
commit | f0ce8658f9ca905b87463f283155ed5c3ad67c10 (patch) | |
tree | b3df670128551b62d2a3341021bc6fae0b83ab92 /src/cairo-recording-surface.c | |
parent | 513c49e623887ed4c9e6a86e81d35cccde6d1662 (diff) | |
download | cairo-f0ce8658f9ca905b87463f283155ed5c3ad67c10.tar.gz |
Fix user-font with foreground in group failures on image, PDF, and PS
Diffstat (limited to 'src/cairo-recording-surface.c')
-rw-r--r-- | src/cairo-recording-surface.c | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/src/cairo-recording-surface.c b/src/cairo-recording-surface.c index d6b6ab337..1df0998e0 100644 --- a/src/cairo-recording-surface.c +++ b/src/cairo-recording-surface.c @@ -105,6 +105,7 @@ typedef struct _cairo_recording_surface_replay_params { cairo_recording_replay_type_t type; cairo_recording_region_type_t region; const cairo_color_t *foreground_color; + cairo_bool_t foreground_used; } cairo_recording_surface_replay_params_t; static const cairo_surface_backend_t cairo_recording_surface_backend; @@ -1829,7 +1830,11 @@ _cairo_recording_surface_replay_internal (cairo_recording_surface_t *surface, } _cairo_surface_wrapper_set_inverse_transform (&wrapper, params->surface_transform); _cairo_surface_wrapper_set_clip (&wrapper, params->target_clip); - _cairo_surface_wrapper_set_foreground_color (&wrapper, params->foreground_color); + + if (params->foreground_color) { + params->target->foreground_source = _cairo_pattern_create_solid (params->foreground_color); + params->target->foreground_used = FALSE; + } /* Compute the extents of the target clip in recorded device space */ if (! _cairo_surface_wrapper_get_target_extents (&wrapper, params->surface_is_unbounded, &extents)) @@ -2019,6 +2024,12 @@ _cairo_recording_surface_replay_internal (cairo_recording_surface_t *surface, } done: + if (params->foreground_color) { + cairo_pattern_destroy (params->target->foreground_source); + params->target->foreground_source = NULL; + params->foreground_used = params->target->foreground_used; + } + _cairo_surface_wrapper_fini (&wrapper); return _cairo_surface_set_error (&surface->base, status); } @@ -2151,11 +2162,13 @@ _cairo_recording_surface_replay (cairo_surface_t *surface, } cairo_status_t -_cairo_recording_surface_replay_with_foreground_color (cairo_surface_t *surface, - cairo_surface_t *target, - const cairo_color_t *color) +_cairo_recording_surface_replay_with_foreground_color (cairo_surface_t *surface, + cairo_surface_t *target, + const cairo_color_t *foreground_color, + cairo_bool_t *foreground_used) { cairo_recording_surface_replay_params_t params; + cairo_status_t status; params.surface_extents = NULL; params.surface_transform = NULL; @@ -2164,9 +2177,13 @@ _cairo_recording_surface_replay_with_foreground_color (cairo_surface_t *surface, params.surface_is_unbounded = FALSE; params.type = CAIRO_RECORDING_REPLAY; params.region = CAIRO_RECORDING_REGION_ALL; - params.foreground_color = color; + params.foreground_color = foreground_color; + params.foreground_used = FALSE; - return _cairo_recording_surface_replay_internal ((cairo_recording_surface_t *) surface, ¶ms); + status = _cairo_recording_surface_replay_internal ((cairo_recording_surface_t *) surface, ¶ms); + *foreground_used = params.foreground_used; + + return status; } cairo_status_t |