[gnome-shell] st: Use ClutterCanvas for StDrawingArea
- From: Florian Müllner <fmuellner src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] st: Use ClutterCanvas for StDrawingArea
- Date: Thu, 15 Oct 2015 21:11:23 +0000 (UTC)
commit c164a8fe0305e2eec943c8f3ee3c7d0d3d2749f5
Author: Florian Müllner <fmuellner gnome org>
Date: Sat Sep 26 03:11:12 2015 +0200
st: Use ClutterCanvas for StDrawingArea
Stop chasing down cogl deprecations by delegating all texture
handling to a ClutterCanvas.
src/st/st-drawing-area.c | 138 ++++++++++++---------------------------------
1 files changed, 37 insertions(+), 101 deletions(-)
---
diff --git a/src/st/st-drawing-area.c b/src/st/st-drawing-area.c
index 28e3c26..e8fc4f6 100644
--- a/src/st/st-drawing-area.c
+++ b/src/st/st-drawing-area.c
@@ -38,10 +38,7 @@
typedef struct _StDrawingAreaPrivate StDrawingAreaPrivate;
struct _StDrawingAreaPrivate {
- CoglTexture *texture;
- CoglPipeline *pipeline;
cairo_t *context;
- guint needs_repaint : 1;
guint in_repaint : 1;
};
@@ -56,124 +53,61 @@ enum
static guint st_drawing_area_signals [LAST_SIGNAL] = { 0 };
-static void
-st_drawing_area_dispose (GObject *object)
+static gboolean
+draw_content (ClutterCanvas *canvas,
+ cairo_t *cr,
+ int width,
+ int height,
+ gpointer user_data)
{
- StDrawingArea *area = ST_DRAWING_AREA (object);
+ StDrawingArea *area = ST_DRAWING_AREA (user_data);
StDrawingAreaPrivate *priv = st_drawing_area_get_instance_private (area);
- g_clear_pointer (&priv->pipeline, cogl_object_unref);
- g_clear_pointer (&priv->texture, cogl_object_unref);
+ priv->context = cr;
+ priv->in_repaint = TRUE;
+
+ clutter_cairo_clear (cr);
+ g_signal_emit (area, st_drawing_area_signals[REPAINT], 0);
- G_OBJECT_CLASS (st_drawing_area_parent_class)->dispose (object);
+ priv->context = NULL;
+ priv->in_repaint = FALSE;
+
+ return TRUE;
}
static void
-st_drawing_area_paint (ClutterActor *self)
+st_drawing_area_allocate (ClutterActor *self,
+ const ClutterActorBox *box,
+ ClutterAllocationFlags flags)
{
- StDrawingArea *area = ST_DRAWING_AREA (self);
- StDrawingAreaPrivate *priv = st_drawing_area_get_instance_private (area);
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (self));
- ClutterActorBox allocation_box;
+ ClutterContent *content = clutter_actor_get_content (self);
ClutterActorBox content_box;
int width, height;
- (CLUTTER_ACTOR_CLASS (st_drawing_area_parent_class))->paint (self);
-
- clutter_actor_get_allocation_box (self, &allocation_box);
- st_theme_node_get_content_box (theme_node, &allocation_box, &content_box);
+ clutter_actor_set_allocation (self, box, flags);
+ st_theme_node_get_content_box (theme_node, box, &content_box);
width = (int)(0.5 + content_box.x2 - content_box.x1);
height = (int)(0.5 + content_box.y2 - content_box.y1);
-
- if (priv->pipeline == NULL)
- {
- CoglContext *ctx =
- clutter_backend_get_cogl_context (clutter_get_default_backend ());
-
- priv->pipeline = cogl_pipeline_new (ctx);
- }
-
- if (priv->texture != NULL &&
- (width != (int)cogl_texture_get_width (priv->texture) ||
- height != (int)cogl_texture_get_height (priv->texture)))
- {
- cogl_object_unref (priv->texture);
- priv->texture = NULL;
- }
-
- if (width > 0 && height > 0)
- {
- if (priv->texture == NULL)
- {
- priv->texture = cogl_texture_new_with_size (width, height,
- COGL_TEXTURE_NONE,
- CLUTTER_CAIRO_FORMAT_ARGB32);
- priv->needs_repaint = TRUE;
- }
-
- if (priv->needs_repaint)
- {
- cairo_surface_t *surface;
-
- surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
- priv->context = cairo_create (surface);
- priv->in_repaint = TRUE;
- priv->needs_repaint = FALSE;
-
- g_signal_emit ((GObject*)area, st_drawing_area_signals[REPAINT], 0);
-
- priv->in_repaint = FALSE;
- cairo_destroy (priv->context);
- priv->context = NULL;
-
- cogl_texture_set_region (priv->texture, 0, 0, 0, 0, width, height, width, height,
- CLUTTER_CAIRO_FORMAT_ARGB32,
- cairo_image_surface_get_stride (surface),
- cairo_image_surface_get_data (surface));
-
- cairo_surface_destroy (surface);
- }
- }
-
- cogl_pipeline_set_layer_texture (priv->pipeline, 0, priv->texture);
-
- if (priv->texture)
- {
- CoglColor color;
- guint8 paint_opacity;
- CoglFramebuffer *fb = cogl_get_draw_framebuffer ();
-
- paint_opacity = clutter_actor_get_paint_opacity (self);
- cogl_color_init_from_4ub (&color, paint_opacity, paint_opacity, paint_opacity, paint_opacity);
- cogl_pipeline_set_color (priv->pipeline, &color);
-
- cogl_framebuffer_draw_rectangle (fb, priv->pipeline,
- content_box.x1, content_box.y1,
- content_box.x2, content_box.y2);
- }
+ clutter_canvas_set_size (CLUTTER_CANVAS (content), width, height);
}
static void
st_drawing_area_style_changed (StWidget *self)
{
- StDrawingArea *area = ST_DRAWING_AREA (self);
- StDrawingAreaPrivate *priv = st_drawing_area_get_instance_private (area);
-
(ST_WIDGET_CLASS (st_drawing_area_parent_class))->style_changed (self);
- priv->needs_repaint = TRUE;
+ st_drawing_area_queue_repaint (ST_DRAWING_AREA (self));
}
static void
st_drawing_area_class_init (StDrawingAreaClass *klass)
{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
StWidgetClass *widget_class = ST_WIDGET_CLASS (klass);
- gobject_class->dispose = st_drawing_area_dispose;
- actor_class->paint = st_drawing_area_paint;
+ actor_class->allocate = st_drawing_area_allocate;
widget_class->style_changed = st_drawing_area_style_changed;
st_drawing_area_signals[REPAINT] =
@@ -188,8 +122,10 @@ st_drawing_area_class_init (StDrawingAreaClass *klass)
static void
st_drawing_area_init (StDrawingArea *area)
{
- StDrawingAreaPrivate *priv = st_drawing_area_get_instance_private (area);
- priv->texture = NULL;
+ ClutterContent *content = clutter_canvas_new ();
+ g_signal_connect (content, "draw", G_CALLBACK (draw_content), area);
+ clutter_actor_set_content (CLUTTER_ACTOR (area), content);
+ g_object_unref (content);
}
/**
@@ -205,14 +141,9 @@ st_drawing_area_init (StDrawingArea *area)
void
st_drawing_area_queue_repaint (StDrawingArea *area)
{
- StDrawingAreaPrivate *priv;
-
g_return_if_fail (ST_IS_DRAWING_AREA (area));
- priv = st_drawing_area_get_instance_private (area);
-
- priv->needs_repaint = TRUE;
- clutter_actor_queue_redraw (CLUTTER_ACTOR (area));
+ clutter_content_invalidate (clutter_actor_get_content (CLUTTER_ACTOR (area)));
}
/**
@@ -253,14 +184,19 @@ st_drawing_area_get_surface_size (StDrawingArea *area,
guint *height)
{
StDrawingAreaPrivate *priv;
+ ClutterContent *content;
+ float w, h;
g_return_if_fail (ST_IS_DRAWING_AREA (area));
priv = st_drawing_area_get_instance_private (area);
g_return_if_fail (priv->in_repaint);
+ content = clutter_actor_get_content (CLUTTER_ACTOR (area));
+ clutter_content_get_preferred_size (content, &w, &h);
+
if (width)
- *width = cogl_texture_get_width (priv->texture);
+ *width = (guint)w;
if (height)
- *height = cogl_texture_get_height (priv->texture);
+ *height = (guint)h;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]