mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-05-05 14:38:13 +02:00
fdr,tee: Reorder master/slave invocation to capture death-upon-signals
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
parent
983cfb2f54
commit
35f41d253f
2 changed files with 58 additions and 52 deletions
|
|
@ -209,10 +209,6 @@ _cairo_tee_surface_paint (void *abstract_surface,
|
|||
int n, num_slaves;
|
||||
cairo_int_status_t status;
|
||||
|
||||
status = _cairo_surface_wrapper_paint (&surface->master, op, source, clip);
|
||||
if (unlikely (status))
|
||||
return status;
|
||||
|
||||
num_slaves = _cairo_array_num_elements (&surface->slaves);
|
||||
slaves = _cairo_array_index (&surface->slaves, 0);
|
||||
for (n = 0; n < num_slaves; n++) {
|
||||
|
|
@ -221,7 +217,7 @@ _cairo_tee_surface_paint (void *abstract_surface,
|
|||
return status;
|
||||
}
|
||||
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
return _cairo_surface_wrapper_paint (&surface->master, op, source, clip);
|
||||
}
|
||||
|
||||
static cairo_int_status_t
|
||||
|
|
@ -236,11 +232,6 @@ _cairo_tee_surface_mask (void *abstract_surface,
|
|||
cairo_int_status_t status;
|
||||
int n, num_slaves;
|
||||
|
||||
status = _cairo_surface_wrapper_mask (&surface->master,
|
||||
op, source, mask, clip);
|
||||
if (unlikely (status))
|
||||
return status;
|
||||
|
||||
num_slaves = _cairo_array_num_elements (&surface->slaves);
|
||||
slaves = _cairo_array_index (&surface->slaves, 0);
|
||||
for (n = 0; n < num_slaves; n++) {
|
||||
|
|
@ -250,7 +241,8 @@ _cairo_tee_surface_mask (void *abstract_surface,
|
|||
return status;
|
||||
}
|
||||
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
return _cairo_surface_wrapper_mask (&surface->master,
|
||||
op, source, mask, clip);
|
||||
}
|
||||
|
||||
static cairo_int_status_t
|
||||
|
|
@ -270,15 +262,6 @@ _cairo_tee_surface_stroke (void *abstract_surface,
|
|||
cairo_int_status_t status;
|
||||
int n, num_slaves;
|
||||
|
||||
status = _cairo_surface_wrapper_stroke (&surface->master,
|
||||
op, source,
|
||||
path, style,
|
||||
ctm, ctm_inverse,
|
||||
tolerance, antialias,
|
||||
clip);
|
||||
if (unlikely (status))
|
||||
return status;
|
||||
|
||||
num_slaves = _cairo_array_num_elements (&surface->slaves);
|
||||
slaves = _cairo_array_index (&surface->slaves, 0);
|
||||
for (n = 0; n < num_slaves; n++) {
|
||||
|
|
@ -292,7 +275,12 @@ _cairo_tee_surface_stroke (void *abstract_surface,
|
|||
return status;
|
||||
}
|
||||
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
return _cairo_surface_wrapper_stroke (&surface->master,
|
||||
op, source,
|
||||
path, style,
|
||||
ctm, ctm_inverse,
|
||||
tolerance, antialias,
|
||||
clip);
|
||||
}
|
||||
|
||||
static cairo_int_status_t
|
||||
|
|
@ -310,14 +298,6 @@ _cairo_tee_surface_fill (void *abstract_surface,
|
|||
cairo_int_status_t status;
|
||||
int n, num_slaves;
|
||||
|
||||
status = _cairo_surface_wrapper_fill (&surface->master,
|
||||
op, source,
|
||||
path, fill_rule,
|
||||
tolerance, antialias,
|
||||
clip);
|
||||
if (unlikely (status))
|
||||
return status;
|
||||
|
||||
num_slaves = _cairo_array_num_elements (&surface->slaves);
|
||||
slaves = _cairo_array_index (&surface->slaves, 0);
|
||||
for (n = 0; n < num_slaves; n++) {
|
||||
|
|
@ -330,7 +310,11 @@ _cairo_tee_surface_fill (void *abstract_surface,
|
|||
return status;
|
||||
}
|
||||
|
||||
return CAIRO_INT_STATUS_SUCCESS;
|
||||
return _cairo_surface_wrapper_fill (&surface->master,
|
||||
op, source,
|
||||
path, fill_rule,
|
||||
tolerance, antialias,
|
||||
clip);
|
||||
}
|
||||
|
||||
static cairo_bool_t
|
||||
|
|
@ -364,18 +348,6 @@ _cairo_tee_surface_show_text_glyphs (void *abstract_surface,
|
|||
if (unlikely (glyphs_copy == NULL))
|
||||
return _cairo_error (CAIRO_STATUS_NO_MEMORY);
|
||||
|
||||
memcpy (glyphs_copy, glyphs, sizeof (cairo_glyph_t) * num_glyphs);
|
||||
status = _cairo_surface_wrapper_show_text_glyphs (&surface->master, op,
|
||||
source,
|
||||
utf8, utf8_len,
|
||||
glyphs_copy, num_glyphs,
|
||||
clusters, num_clusters,
|
||||
cluster_flags,
|
||||
scaled_font,
|
||||
clip);
|
||||
if (unlikely (status))
|
||||
goto CLEANUP;
|
||||
|
||||
num_slaves = _cairo_array_num_elements (&surface->slaves);
|
||||
slaves = _cairo_array_index (&surface->slaves, 0);
|
||||
for (n = 0; n < num_slaves; n++) {
|
||||
|
|
@ -392,7 +364,16 @@ _cairo_tee_surface_show_text_glyphs (void *abstract_surface,
|
|||
goto CLEANUP;
|
||||
}
|
||||
|
||||
CLEANUP:
|
||||
memcpy (glyphs_copy, glyphs, sizeof (cairo_glyph_t) * num_glyphs);
|
||||
status = _cairo_surface_wrapper_show_text_glyphs (&surface->master, op,
|
||||
source,
|
||||
utf8, utf8_len,
|
||||
glyphs_copy, num_glyphs,
|
||||
clusters, num_clusters,
|
||||
cluster_flags,
|
||||
scaled_font,
|
||||
clip);
|
||||
CLEANUP:
|
||||
free (glyphs_copy);
|
||||
return status;
|
||||
}
|
||||
|
|
@ -499,27 +480,26 @@ cairo_tee_surface_remove (cairo_surface_t *abstract_surface,
|
|||
{
|
||||
cairo_tee_surface_t *surface;
|
||||
cairo_surface_wrapper_t *slaves;
|
||||
cairo_int_status_t status;
|
||||
int n, num_slaves;
|
||||
|
||||
if (unlikely (abstract_surface->status))
|
||||
return;
|
||||
if (unlikely (abstract_surface->finished)) {
|
||||
status = _cairo_surface_set_error (abstract_surface,
|
||||
_cairo_error (CAIRO_STATUS_SURFACE_FINISHED));
|
||||
_cairo_surface_set_error (abstract_surface,
|
||||
_cairo_error (CAIRO_STATUS_SURFACE_FINISHED));
|
||||
return;
|
||||
}
|
||||
|
||||
if (abstract_surface->backend != &cairo_tee_surface_backend) {
|
||||
status = _cairo_surface_set_error (abstract_surface,
|
||||
_cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH));
|
||||
_cairo_surface_set_error (abstract_surface,
|
||||
_cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH));
|
||||
return;
|
||||
}
|
||||
|
||||
surface = (cairo_tee_surface_t *) abstract_surface;
|
||||
if (target == surface->master.target) {
|
||||
status = _cairo_surface_set_error (abstract_surface,
|
||||
_cairo_error (CAIRO_STATUS_INVALID_INDEX));
|
||||
_cairo_surface_set_error (abstract_surface,
|
||||
_cairo_error (CAIRO_STATUS_INVALID_INDEX));
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -531,8 +511,8 @@ cairo_tee_surface_remove (cairo_surface_t *abstract_surface,
|
|||
}
|
||||
|
||||
if (n == num_slaves) {
|
||||
status = _cairo_surface_set_error (abstract_surface,
|
||||
_cairo_error (CAIRO_STATUS_INVALID_INDEX));
|
||||
_cairo_surface_set_error (abstract_surface,
|
||||
_cairo_error (CAIRO_STATUS_INVALID_INDEX));
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -84,6 +84,12 @@ fdr_sighandler (int sig)
|
|||
fdr_dump = 1;
|
||||
}
|
||||
|
||||
static void
|
||||
fdr_urgent_sighandler (int sig)
|
||||
{
|
||||
fdr_dump_ringbuffer ();
|
||||
}
|
||||
|
||||
static void
|
||||
fdr_atexit (void)
|
||||
{
|
||||
|
|
@ -100,6 +106,9 @@ fdr_pending_signals (void)
|
|||
initialized = 1;
|
||||
|
||||
signal (SIGUSR1, fdr_sighandler);
|
||||
|
||||
signal (SIGSEGV, fdr_urgent_sighandler);
|
||||
signal (SIGABRT, fdr_urgent_sighandler);
|
||||
atexit (fdr_atexit);
|
||||
}
|
||||
|
||||
|
|
@ -303,3 +312,20 @@ cairo_surface_create_similar (cairo_surface_t *surface,
|
|||
return DLCALL (cairo_surface_create_similar,
|
||||
surface, content, width, height);
|
||||
}
|
||||
|
||||
cairo_surface_t *
|
||||
cairo_surface_create_for_rectangle (cairo_surface_t *surface,
|
||||
double x,
|
||||
double y,
|
||||
double width,
|
||||
double height)
|
||||
{
|
||||
cairo_surface_t *tee;
|
||||
|
||||
tee = fdr_surface_get_tee (surface);
|
||||
if (tee != NULL)
|
||||
surface = tee;
|
||||
|
||||
return DLCALL (cairo_surface_create_for_rectangle,
|
||||
surface, x, y, width, height);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue