mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-01-11 21:30:25 +01:00
xlib: Only fallback through the mask intermediate if we can composite the mask
Before rendering into the mask, we should first check whether the subsequent call to composite the mask will trigger a fallback. In that case, we should fallback earlier and do the operation in place. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
parent
1bcd59ef4c
commit
503b6b9e2e
3 changed files with 38 additions and 16 deletions
|
|
@ -128,6 +128,9 @@ struct cairo_mask_compositor {
|
|||
const cairo_color_t *color,
|
||||
cairo_boxes_t *boxes);
|
||||
|
||||
cairo_int_status_t
|
||||
(*check_composite) (const cairo_composite_rectangles_t *extents);
|
||||
|
||||
cairo_int_status_t
|
||||
(*composite) (void *dst,
|
||||
cairo_operator_t op,
|
||||
|
|
|
|||
|
|
@ -960,6 +960,10 @@ _cairo_mask_compositor_paint (const cairo_compositor_t *_compositor,
|
|||
cairo_boxes_t boxes;
|
||||
cairo_int_status_t status;
|
||||
|
||||
status = compositor->check_composite (extents);
|
||||
if (unlikely (status))
|
||||
return status;
|
||||
|
||||
_cairo_clip_steal_boxes (extents->clip, &boxes);
|
||||
status = clip_and_composite_boxes (compositor, extents, &boxes);
|
||||
_cairo_clip_unsteal_boxes (extents->clip, &boxes);
|
||||
|
|
@ -1210,6 +1214,10 @@ _cairo_mask_compositor_mask (const cairo_compositor_t *_compositor,
|
|||
const cairo_mask_compositor_t *compositor = (cairo_mask_compositor_t*)_compositor;
|
||||
cairo_int_status_t status = CAIRO_INT_STATUS_UNSUPPORTED;
|
||||
|
||||
status = compositor->check_composite (extents);
|
||||
if (unlikely (status))
|
||||
return status;
|
||||
|
||||
if (extents->mask_pattern.base.type == CAIRO_PATTERN_TYPE_SOLID &&
|
||||
extents->clip->path == NULL &&
|
||||
! _cairo_clip_is_region (extents->clip)) {
|
||||
|
|
@ -1242,9 +1250,12 @@ _cairo_mask_compositor_stroke (const cairo_compositor_t *_compositor,
|
|||
const cairo_mask_compositor_t *compositor = (cairo_mask_compositor_t*)_compositor;
|
||||
cairo_surface_t *mask;
|
||||
cairo_surface_pattern_t pattern;
|
||||
cairo_int_status_t status;
|
||||
cairo_int_status_t status = CAIRO_INT_STATUS_UNSUPPORTED;
|
||||
|
||||
status = compositor->check_composite (extents);
|
||||
if (unlikely (status))
|
||||
return status;
|
||||
|
||||
status = CAIRO_INT_STATUS_UNSUPPORTED;
|
||||
if (_cairo_path_fixed_stroke_is_rectilinear (path)) {
|
||||
cairo_boxes_t boxes;
|
||||
|
||||
|
|
@ -1311,9 +1322,12 @@ _cairo_mask_compositor_fill (const cairo_compositor_t *_compositor,
|
|||
const cairo_mask_compositor_t *compositor = (cairo_mask_compositor_t*)_compositor;
|
||||
cairo_surface_t *mask;
|
||||
cairo_surface_pattern_t pattern;
|
||||
cairo_int_status_t status;
|
||||
cairo_int_status_t status = CAIRO_INT_STATUS_UNSUPPORTED;
|
||||
|
||||
status = compositor->check_composite (extents);
|
||||
if (unlikely (status))
|
||||
return status;
|
||||
|
||||
status = CAIRO_INT_STATUS_UNSUPPORTED;
|
||||
if (_cairo_path_fixed_fill_is_rectilinear (path)) {
|
||||
cairo_boxes_t boxes;
|
||||
|
||||
|
|
@ -1374,10 +1388,15 @@ _cairo_mask_compositor_glyphs (const cairo_compositor_t *_compositor,
|
|||
int num_glyphs,
|
||||
cairo_bool_t overlap)
|
||||
{
|
||||
const cairo_mask_compositor_t *compositor = (cairo_mask_compositor_t*)_compositor;
|
||||
cairo_surface_t *mask;
|
||||
cairo_surface_pattern_t pattern;
|
||||
cairo_int_status_t status;
|
||||
|
||||
status = compositor->check_composite (extents);
|
||||
if (unlikely (status))
|
||||
return CAIRO_INT_STATUS_UNSUPPORTED;
|
||||
|
||||
mask = cairo_surface_create_similar_image (extents->surface,
|
||||
CAIRO_FORMAT_A8,
|
||||
extents->bounded.width,
|
||||
|
|
|
|||
|
|
@ -54,6 +54,17 @@
|
|||
#include "cairo-traps-private.h"
|
||||
#include "cairo-tristrip-private.h"
|
||||
|
||||
static cairo_int_status_t
|
||||
check_composite (const cairo_composite_rectangles_t *extents)
|
||||
{
|
||||
cairo_xlib_display_t *display = ((cairo_xlib_surface_t *)extents->surface)->display;
|
||||
|
||||
if (! CAIRO_RENDER_SUPPORTS_OPERATOR (display, extents->op))
|
||||
return CAIRO_INT_STATUS_UNSUPPORTED;
|
||||
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static cairo_int_status_t
|
||||
acquire (void *abstract_dst)
|
||||
{
|
||||
|
|
@ -1697,7 +1708,7 @@ _cairo_xlib_mask_compositor_get (void)
|
|||
compositor.fill_rectangles = fill_rectangles;
|
||||
compositor.fill_boxes = fill_boxes;
|
||||
compositor.copy_boxes = copy_boxes;
|
||||
//compositor.check_composite = check_composite;
|
||||
compositor.check_composite = check_composite;
|
||||
compositor.composite = composite;
|
||||
//compositor.check_composite_boxes = check_composite_boxes;
|
||||
compositor.composite_boxes = composite_boxes;
|
||||
|
|
@ -1928,17 +1939,6 @@ composite_tristrip (void *abstract_dst,
|
|||
return CAIRO_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static cairo_int_status_t
|
||||
check_composite (const cairo_composite_rectangles_t *extents)
|
||||
{
|
||||
cairo_xlib_display_t *display = ((cairo_xlib_surface_t *)extents->surface)->display;
|
||||
|
||||
if (! CAIRO_RENDER_SUPPORTS_OPERATOR (display, extents->op))
|
||||
return CAIRO_INT_STATUS_UNSUPPORTED;
|
||||
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
const cairo_compositor_t *
|
||||
_cairo_xlib_traps_compositor_get (void)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue