summaryrefslogtreecommitdiff
path: root/src/cairo-recording-surface.c
diff options
context:
space:
mode:
authorAdrian Johnson <ajohnson@redneon.com>2022-12-31 20:53:37 +1030
committerAdrian Johnson <ajohnson@redneon.com>2023-01-03 17:37:36 +1030
commitf0ce8658f9ca905b87463f283155ed5c3ad67c10 (patch)
treeb3df670128551b62d2a3341021bc6fae0b83ab92 /src/cairo-recording-surface.c
parent513c49e623887ed4c9e6a86e81d35cccde6d1662 (diff)
downloadcairo-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.c29
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, &params);
+ status = _cairo_recording_surface_replay_internal ((cairo_recording_surface_t *) surface, &params);
+ *foreground_used = params.foreground_used;
+
+ return status;
}
cairo_status_t