mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2025-12-20 19:50:10 +01:00
boilerplate: Ensure that the recording surfaces are finished.
Be paranoid and explicitly call finish to cleanup self-referential leaks when using paginated/recording surfaces.
This commit is contained in:
parent
f08cc311af
commit
3ae5723464
4 changed files with 17 additions and 8 deletions
|
|
@ -137,6 +137,7 @@ _cairo_boilerplate_pdf_finish_surface (cairo_surface_t *surface)
|
||||||
if (status)
|
if (status)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
|
cairo_surface_finish (surface);
|
||||||
status = cairo_surface_status (surface);
|
status = cairo_surface_status (surface);
|
||||||
if (status)
|
if (status)
|
||||||
return status;
|
return status;
|
||||||
|
|
@ -204,8 +205,10 @@ static void
|
||||||
_cairo_boilerplate_pdf_cleanup (void *closure)
|
_cairo_boilerplate_pdf_cleanup (void *closure)
|
||||||
{
|
{
|
||||||
pdf_target_closure_t *ptc = closure;
|
pdf_target_closure_t *ptc = closure;
|
||||||
if (ptc->target)
|
if (ptc->target) {
|
||||||
|
cairo_surface_finish (ptc->target);
|
||||||
cairo_surface_destroy (ptc->target);
|
cairo_surface_destroy (ptc->target);
|
||||||
|
}
|
||||||
free (ptc->filename);
|
free (ptc->filename);
|
||||||
free (ptc);
|
free (ptc);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -197,6 +197,7 @@ _cairo_boilerplate_ps_finish_surface (cairo_surface_t *surface)
|
||||||
if (status)
|
if (status)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
|
cairo_surface_finish (surface);
|
||||||
status = cairo_surface_status (surface);
|
status = cairo_surface_status (surface);
|
||||||
if (status)
|
if (status)
|
||||||
return status;
|
return status;
|
||||||
|
|
@ -269,8 +270,10 @@ static void
|
||||||
_cairo_boilerplate_ps_cleanup (void *closure)
|
_cairo_boilerplate_ps_cleanup (void *closure)
|
||||||
{
|
{
|
||||||
ps_target_closure_t *ptc = closure;
|
ps_target_closure_t *ptc = closure;
|
||||||
if (ptc->target)
|
if (ptc->target) {
|
||||||
|
cairo_surface_finish (ptc->target);
|
||||||
cairo_surface_destroy (ptc->target);
|
cairo_surface_destroy (ptc->target);
|
||||||
|
}
|
||||||
free (ptc->filename);
|
free (ptc->filename);
|
||||||
free (ptc);
|
free (ptc);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -170,6 +170,7 @@ _cairo_boilerplate_svg_finish_surface (cairo_surface_t *surface)
|
||||||
if (status)
|
if (status)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
|
cairo_surface_finish (surface);
|
||||||
status = cairo_surface_status (surface);
|
status = cairo_surface_status (surface);
|
||||||
if (status)
|
if (status)
|
||||||
return status;
|
return status;
|
||||||
|
|
@ -241,8 +242,10 @@ static void
|
||||||
_cairo_boilerplate_svg_cleanup (void *closure)
|
_cairo_boilerplate_svg_cleanup (void *closure)
|
||||||
{
|
{
|
||||||
svg_target_closure_t *ptc = closure;
|
svg_target_closure_t *ptc = closure;
|
||||||
if (ptc->target)
|
if (ptc->target) {
|
||||||
|
cairo_surface_finish (ptc->target);
|
||||||
cairo_surface_destroy (ptc->target);
|
cairo_surface_destroy (ptc->target);
|
||||||
|
}
|
||||||
free (ptc->filename);
|
free (ptc->filename);
|
||||||
free (ptc);
|
free (ptc);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -180,13 +180,11 @@ _cairo_boilerplate_recording_create_surface (const char *name,
|
||||||
{
|
{
|
||||||
cairo_rectangle_t extents;
|
cairo_rectangle_t extents;
|
||||||
|
|
||||||
*closure = NULL;
|
|
||||||
|
|
||||||
extents.x = 0;
|
extents.x = 0;
|
||||||
extents.y = 0;
|
extents.y = 0;
|
||||||
extents.width = width;
|
extents.width = width;
|
||||||
extents.height = height;
|
extents.height = height;
|
||||||
return cairo_recording_surface_create (content, &extents);
|
return *closure = cairo_recording_surface_create (content, &extents);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -353,7 +351,8 @@ static const cairo_boilerplate_target_t builtin_targets[] = {
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
_cairo_boilerplate_get_image_surface,
|
_cairo_boilerplate_get_image_surface,
|
||||||
cairo_surface_write_to_png,
|
cairo_surface_write_to_png,
|
||||||
NULL, NULL,
|
(cairo_boilerplate_cleanup_t) cairo_surface_finish,
|
||||||
|
NULL,
|
||||||
FALSE, FALSE, TRUE
|
FALSE, FALSE, TRUE
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -364,7 +363,8 @@ static const cairo_boilerplate_target_t builtin_targets[] = {
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
_cairo_boilerplate_get_image_surface,
|
_cairo_boilerplate_get_image_surface,
|
||||||
cairo_surface_write_to_png,
|
cairo_surface_write_to_png,
|
||||||
NULL, NULL,
|
(cairo_boilerplate_cleanup_t) cairo_surface_finish,
|
||||||
|
NULL,
|
||||||
FALSE, FALSE, TRUE
|
FALSE, FALSE, TRUE
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue