Commit ae7a6773 authored by Benjamin Otte's avatar Benjamin Otte

cairocontext: Remove fallback implementations

Now that all Cairo contexts are ported to managing cairo surfaces
themselves, the old fallback code that didi the managing is no longer
needed.

Also clarify the behavior of gdk_cairo_context_cairo_create() wrt the
vfunc by doing the early exit and the clipping outside of it.
parent 7002f08c
......@@ -874,14 +874,6 @@ gdk_broadway_surface_set_functions (GdkSurface *surface,
return;
}
static void
gdk_broadway_surface_end_paint (GdkSurface *surface)
{
GdkSurfaceImplBroadway *impl;
impl = GDK_SURFACE_IMPL_BROADWAY (surface->impl);
impl->dirty = TRUE;
}
typedef struct _MoveResizeData MoveResizeData;
struct _MoveResizeData
......@@ -1378,7 +1370,6 @@ gdk_surface_impl_broadway_class_init (GdkSurfaceImplBroadwayClass *klass)
impl_class->get_device_state = gdk_surface_broadway_get_device_state;
impl_class->input_shape_combine_region = gdk_surface_broadway_input_shape_combine_region;
impl_class->destroy = _gdk_broadway_surface_destroy;
impl_class->end_paint = gdk_broadway_surface_end_paint;
impl_class->beep = gdk_broadway_surface_beep;
impl_class->focus = gdk_broadway_surface_focus;
......
......@@ -56,193 +56,9 @@ struct _GdkCairoContextPrivate {
G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GdkCairoContext, gdk_cairo_context, GDK_TYPE_DRAW_CONTEXT,
G_ADD_PRIVATE (GdkCairoContext))
static cairo_surface_t *
gdk_surface_ref_impl_surface (GdkSurface *surface)
{
return GDK_SURFACE_IMPL_GET_CLASS (surface->impl)->ref_cairo_surface (surface);
}
static cairo_content_t
gdk_surface_get_content (GdkSurface *surface)
{
cairo_surface_t *cairo_surface;
cairo_content_t content;
g_return_val_if_fail (GDK_IS_SURFACE (surface), 0);
cairo_surface = gdk_surface_ref_impl_surface (surface);
content = cairo_surface_get_content (cairo_surface);
cairo_surface_destroy (cairo_surface);
return content;
}
static cairo_t *
gdk_cairo_context_default_cairo_create (GdkCairoContext *self)
{
GdkDrawContext *context;
GdkSurface *surface;
cairo_surface_t *cairo_surface;
cairo_t *cr;
g_return_val_if_fail (GDK_IS_CAIRO_CONTEXT (self), NULL);
context = GDK_DRAW_CONTEXT (self);
if (!gdk_draw_context_is_in_frame (context))
return NULL;
surface = gdk_draw_context_get_surface (context);
cairo_surface = _gdk_surface_ref_cairo_surface (surface);
cr = cairo_create (cairo_surface);
gdk_cairo_region (cr, gdk_draw_context_get_frame_region (context));
cairo_clip (cr);
cairo_surface_destroy (cairo_surface);
return cr;
}
static void
gdk_surface_clear_backing_region (GdkSurface *surface)
{
cairo_t *cr;
if (GDK_SURFACE_DESTROYED (surface))
return;
cr = cairo_create (surface->current_paint.surface);
cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
gdk_cairo_region (cr, surface->current_paint.region);
cairo_fill (cr);
cairo_destroy (cr);
}
static void
gdk_surface_free_current_paint (GdkSurface *surface)
{
cairo_surface_destroy (surface->current_paint.surface);
surface->current_paint.surface = NULL;
cairo_region_destroy (surface->current_paint.region);
surface->current_paint.region = NULL;
surface->current_paint.surface_needs_composite = FALSE;
}
static void
gdk_cairo_context_begin_frame (GdkDrawContext *draw_context,
cairo_region_t *region)
{
GdkRectangle clip_box;
GdkSurface *surface;
GdkSurfaceImplClass *impl_class;
double sx, sy;
gboolean needs_surface;
cairo_content_t surface_content;
surface = gdk_draw_context_get_surface (draw_context);
if (surface->current_paint.surface != NULL)
{
g_warning ("A paint operation on the surface is alredy in progress. "
"This is not allowed.");
return;
}
impl_class = GDK_SURFACE_IMPL_GET_CLASS (surface->impl);
needs_surface = TRUE;
if (impl_class->begin_paint)
needs_surface = impl_class->begin_paint (surface);
surface->current_paint.region = cairo_region_copy (region);
cairo_region_get_extents (surface->current_paint.region, &clip_box);
surface_content = gdk_surface_get_content (surface);
if (needs_surface)
{
surface->current_paint.surface = gdk_surface_create_similar_surface (surface,
surface_content,
MAX (clip_box.width, 1),
MAX (clip_box.height, 1));
sx = sy = 1;
cairo_surface_get_device_scale (surface->current_paint.surface, &sx, &sy);
cairo_surface_set_device_offset (surface->current_paint.surface, -clip_box.x*sx, -clip_box.y*sy);
surface->current_paint.surface_needs_composite = TRUE;
}
else
{
surface->current_paint.surface = gdk_surface_ref_impl_surface (surface);
surface->current_paint.surface_needs_composite = FALSE;
}
if (!cairo_region_is_empty (surface->current_paint.region))
gdk_surface_clear_backing_region (surface);
}
static void
gdk_cairo_context_end_frame (GdkDrawContext *draw_context,
cairo_region_t *painted,
cairo_region_t *damage)
{
GdkSurfaceImplClass *impl_class;
GdkSurface *surface;
cairo_t *cr;
surface = gdk_draw_context_get_surface (draw_context);
if (surface->current_paint.surface == NULL)
{
g_warning (G_STRLOC": no preceding call to gdk_draw_context_end_frame(), see documentation");
return;
}
impl_class = GDK_SURFACE_IMPL_GET_CLASS (surface->impl);
if (impl_class->end_paint)
impl_class->end_paint (surface);
if (surface->current_paint.surface_needs_composite)
{
cairo_surface_t *cairo_surface;
cairo_surface = gdk_surface_ref_impl_surface (surface);
cr = cairo_create (cairo_surface);
cairo_set_source_surface (cr, surface->current_paint.surface, 0, 0);
gdk_cairo_region (cr, surface->current_paint.region);
cairo_clip (cr);
cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
cairo_paint (cr);
cairo_destroy (cr);
cairo_surface_flush (cairo_surface);
cairo_surface_destroy (cairo_surface);
}
gdk_surface_free_current_paint (surface);
}
static void
gdk_cairo_context_surface_resized (GdkDrawContext *draw_context)
{
}
static void
gdk_cairo_context_class_init (GdkCairoContextClass *klass)
{
GdkDrawContextClass *draw_context_class = GDK_DRAW_CONTEXT_CLASS (klass);
draw_context_class->begin_frame = gdk_cairo_context_begin_frame;
draw_context_class->end_frame = gdk_cairo_context_end_frame;
draw_context_class->surface_resized = gdk_cairo_context_surface_resized;
klass->cairo_create = gdk_cairo_context_default_cairo_create;
}
static void
......@@ -268,6 +84,21 @@ gdk_cairo_context_init (GdkCairoContext *self)
cairo_t *
gdk_cairo_context_cairo_create (GdkCairoContext *self)
{
return GDK_CAIRO_CONTEXT_GET_CLASS (self)->cairo_create (self);
GdkDrawContext *draw_context;
cairo_t *cr;
g_return_val_if_fail (GDK_IS_CAIRO_CONTEXT (self), NULL);
draw_context = GDK_DRAW_CONTEXT (self);
if (!gdk_draw_context_is_in_frame (draw_context))
return NULL;
cr = GDK_CAIRO_CONTEXT_GET_CLASS (self)->cairo_create (self);
gdk_cairo_region (cr, gdk_draw_context_get_frame_region (draw_context));
cairo_clip (cr);
return cr;
}
......@@ -158,16 +158,6 @@ struct _GdkSurface
GList *children;
GList children_list_node;
struct {
/* The temporary surface that we're painting to. This will be composited
* back into the surface when we call end_paint. This is our poor-man's
* way of doing double buffering. */
cairo_surface_t *surface;
cairo_region_t *region;
gboolean surface_needs_composite;
} current_paint;
GdkGLContext *gl_paint_context;
cairo_region_t *update_area;
......@@ -290,9 +280,6 @@ cairo_region_t *gdk_cairo_region_from_clip (cairo_t *cr);
* Interfaces used by windowing code *
*************************************/
cairo_surface_t *
_gdk_surface_ref_cairo_surface (GdkSurface *surface);
GdkSurface* gdk_surface_new (GdkDisplay *display,
GdkSurface *parent,
GdkSurfaceAttr *attributes);
......@@ -307,8 +294,6 @@ void gdk_surface_get_unscaled_size (GdkSurface *surface,
int *unscaled_width,
int *unscaled_height);
cairo_region_t *gdk_surface_get_current_paint_region (GdkSurface *surface);
/*****************************************
* Interfaces provided by windowing code *
*****************************************/
......
......@@ -1541,67 +1541,6 @@ gdk_surface_create_vulkan_context (GdkSurface *surface,
NULL);
}
/*< private >
* gdk_surface_get_current_paint_region:
* @surface: a #GdkSurface
*
* Retrieves a copy of the current paint region.
*
* Returns: (transfer full): a Cairo region
*/
cairo_region_t *
gdk_surface_get_current_paint_region (GdkSurface *surface)
{
cairo_region_t *region;
if (surface->impl_surface->current_paint.region != NULL)
{
region = cairo_region_copy (surface->impl_surface->current_paint.region);
cairo_region_translate (region, -surface->abs_x, -surface->abs_y);
}
else
{
region = cairo_region_create_rectangle (&(cairo_rectangle_int_t) { 0, 0, surface->width, surface->height });
}
return region;
}
/* This is used in places like gdk_cairo_set_source_surface and
* other places to take "screenshots" of surfaces. Thus, we allow
* it to be used outside of a begin_paint / end_paint. */
cairo_surface_t *
_gdk_surface_ref_cairo_surface (GdkSurface *surface)
{
cairo_surface_t *cairo_surface;
g_return_val_if_fail (GDK_IS_SURFACE (surface), NULL);
/* This returns either the current working surface on the paint stack
* or the actual impl surface of the surface. This should not be used
* from very many places: be careful! */
if (surface->impl_surface->current_paint.surface)
cairo_surface = cairo_surface_reference (surface->impl_surface->current_paint.surface);
else
cairo_surface = GDK_SURFACE_IMPL_GET_CLASS (surface->impl)->ref_cairo_surface (gdk_surface_get_impl_surface (surface));
if (gdk_surface_has_impl (surface))
{
return cairo_surface;
}
else
{
cairo_surface_t *subsurface;
subsurface = cairo_surface_create_for_rectangle (cairo_surface,
surface->abs_x,
surface->abs_y,
surface->width,
surface->height);
cairo_surface_destroy (cairo_surface);
return subsurface;
}
}
/* Code for dirty-region queueing
*/
static GSList *update_surfaces = NULL;
......
......@@ -95,8 +95,6 @@ struct _GdkSurfaceImplClass
gdouble *x,
gdouble *y,
GdkModifierType *mask);
gboolean (* begin_paint) (GdkSurface *surface);
void (* end_paint) (GdkSurface *surface);
void (* input_shape_combine_region) (GdkSurface *surface,
const cairo_region_t *shape_region,
......
......@@ -205,16 +205,8 @@ static cairo_t *
gdk_wayland_cairo_context_cairo_create (GdkCairoContext *context)
{
GdkWaylandCairoContext *self = GDK_WAYLAND_CAIRO_CONTEXT (context);
cairo_t *cr;
if (self->paint_surface == NULL)
return NULL;
cr = cairo_create (self->paint_surface);
gdk_cairo_region (cr, gdk_wayland_cairo_context_surface_get_region (self->paint_surface));
cairo_clip (cr);
return cr;
return cairo_create (self->paint_surface);
}
static void
......
......@@ -105,9 +105,6 @@ gdk_x11_cairo_context_cairo_create (GdkCairoContext *context)
{
GdkX11CairoContext *self = GDK_X11_CAIRO_CONTEXT (context);
if (self->paint_surface == NULL)
return NULL;
return cairo_create (self->paint_surface);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment