[gtk+] Convert GtkLabel to indirect rendering



commit be0de5423731fac6955aa44b6a61058248801c22
Author: Matthias Clasen <mclasen redhat com>
Date:   Thu Aug 18 09:59:35 2016 -0400

    Convert GtkLabel to indirect rendering
    
    Warning! This breaks GtkAccelLabel. It will be fixed in the next
    commit.

 gtk/gtklabel.c |   75 ++++++++++++++++++++++++++++---------------------------
 1 files changed, 38 insertions(+), 37 deletions(-)
---
diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c
index 1c893bb..5ea67e0 100644
--- a/gtk/gtklabel.c
+++ b/gtk/gtklabel.c
@@ -414,11 +414,12 @@ static void gtk_label_size_allocate     (GtkWidget        *widget,
 static void gtk_label_state_flags_changed   (GtkWidget        *widget,
                                              GtkStateFlags     prev_state);
 static void gtk_label_style_updated     (GtkWidget        *widget);
-static gboolean gtk_label_draw          (GtkWidget        *widget,
-                                         cairo_t          *cr);
 static gboolean gtk_label_focus         (GtkWidget         *widget,
                                          GtkDirectionType   direction);
 
+static GskRenderNode *gtk_label_get_render_node (GtkWidget   *label,
+                                                 GskRenderer *renderer);
+
 static void gtk_label_realize           (GtkWidget        *widget);
 static void gtk_label_unrealize         (GtkWidget        *widget);
 static void gtk_label_map               (GtkWidget        *widget);
@@ -577,13 +578,6 @@ static void     gtk_label_measure (GtkCssGadget   *gadget,
                                    int            *minimum_baseline,
                                    int            *natural_baseline,
                                    gpointer        unused);
-static gboolean gtk_label_render  (GtkCssGadget   *gadget,
-                                   cairo_t        *cr,
-                                   int             x,
-                                   int             y,
-                                   int             width,
-                                   int             height,
-                                   gpointer        data);
 
 static GtkBuildableIface *buildable_parent_iface = NULL;
 
@@ -631,7 +625,7 @@ gtk_label_class_init (GtkLabelClass *class)
   widget_class->state_flags_changed = gtk_label_state_flags_changed;
   widget_class->style_updated = gtk_label_style_updated;
   widget_class->query_tooltip = gtk_label_query_tooltip;
-  widget_class->draw = gtk_label_draw;
+  widget_class->get_render_node = gtk_label_get_render_node;
   widget_class->realize = gtk_label_realize;
   widget_class->unrealize = gtk_label_unrealize;
   widget_class->map = gtk_label_map;
@@ -1393,7 +1387,7 @@ gtk_label_init (GtkLabel *label)
                                                      GTK_WIDGET (label),
                                                      gtk_label_measure,
                                                      NULL,
-                                                     gtk_label_render,
+                                                     NULL,
                                                      NULL,
                                                      NULL);
 }
@@ -4224,39 +4218,41 @@ gtk_label_get_focus_link (GtkLabel *label)
   return NULL;
 }
 
-static gboolean
-gtk_label_draw (GtkWidget *widget,
-                cairo_t   *cr)
-{
-  gtk_css_gadget_draw (GTK_LABEL (widget)->priv->gadget, cr);
-
-  return FALSE;
-}
-
 static void layout_to_window_coords (GtkLabel *label,
                                      gint     *x,
                                      gint     *y);
 
-static gboolean
-gtk_label_render (GtkCssGadget *gadget,
-                  cairo_t      *cr,
-                  int           x,
-                  int           y,
-                  int           width,
-                  int           height,
-                  gpointer      data)
+static GskRenderNode *
+gtk_label_get_render_node (GtkWidget   *widget,
+                           GskRenderer *renderer)
 {
-  GtkWidget *widget;
-  GtkLabel *label;
-  GtkLabelPrivate *priv;
-  GtkLabelSelectionInfo *info;
+  GtkLabel *label = GTK_LABEL (widget);
+  GtkLabelPrivate *priv = label->priv;
+  GtkLabelSelectionInfo *info = priv->select_info;
   GtkStyleContext *context;
+  gint x, y, width, height;
   gint lx, ly;
+  cairo_t *cr;
+  GtkAllocation alloc, clip;
+  GskRenderNode *node;
+  GskRenderNode *res;
 
-  widget = gtk_css_gadget_get_owner (gadget);
-  label = GTK_LABEL (widget);
-  priv = label->priv;
-  info = priv->select_info;
+  res = gtk_css_gadget_get_render_node (priv->gadget, renderer, FALSE);
+
+  if (res == NULL)
+    return NULL;
+
+  node = gtk_widget_create_render_node (widget, renderer, "Label Content");
+
+  gtk_widget_get_clip (widget, &clip);
+  _gtk_widget_get_allocation (widget, &alloc);
+
+  cr = gsk_render_node_get_draw_context (node);
+  cairo_translate (cr, alloc.x - clip.x, alloc.y - clip.y);
+  x = 0;
+  y = 0;
+  width = alloc.width;
+  height = alloc.height;
 
   gtk_label_ensure_layout (label);
 
@@ -4367,7 +4363,12 @@ gtk_label_render (GtkCssGadget *gadget,
         }
     }
 
-  return FALSE;
+  cairo_destroy (cr);
+
+  gsk_render_node_append_child (res, node);
+  gsk_render_node_unref (node);
+
+  return res;
 }
 
 static gboolean


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]