[gtk+/wip/matthiasc/gskpango: 3/3] wip: move node creation into the renderer



commit c5e60639773d2545b41dfac921f43c29625fea2e
Author: Matthias Clasen <mclasen redhat com>
Date:   Wed Aug 30 13:52:40 2017 -0400

    wip: move node creation into the renderer
    
    Create a cairo node for each show_text_glyphs call.

 gtk/gskpango.c    |  108 +++++++++++++++++++++++++++++------------------------
 gtk/gskpango.h    |    7 ++-
 gtk/gtksnapshot.c |   39 +++++++++++--------
 3 files changed, 85 insertions(+), 69 deletions(-)
---
diff --git a/gtk/gskpango.c b/gtk/gskpango.c
index 643af01..0715c21 100644
--- a/gtk/gskpango.c
+++ b/gtk/gskpango.c
@@ -19,6 +19,7 @@
 
 #include "config.h"
 
+#include "gsk/gsk.h"
 #include "gskpango.h"
 
 #include <math.h>
@@ -49,7 +50,8 @@ struct _GskPangoRenderer
 {
   PangoRenderer parent_instance;
 
-  cairo_t *cr;
+  GtkSnapshot *snapshot;
+  const GdkRGBA *fg_color;
   gboolean do_path;
   gboolean has_show_text_glyphs;
   double x_offset, y_offset;
@@ -57,6 +59,8 @@ struct _GskPangoRenderer
   /* house-keeping options */
   gboolean is_cached_renderer;
   gboolean cr_had_current_point;
+
+  graphene_rect_t bounds;
 };
 
 struct _GskPangoRendererClass
@@ -68,7 +72,8 @@ G_DEFINE_TYPE (GskPangoRenderer, gsk_pango_renderer, PANGO_TYPE_RENDERER)
 
 static void
 set_color (GskPangoRenderer *crenderer,
-           PangoRenderPart     part)
+           cairo_t          *cr,
+           PangoRenderPart   part)
 {
   PangoColor *color = pango_renderer_get_color ((PangoRenderer *) (crenderer), part);
   guint16 a = pango_renderer_get_alpha ((PangoRenderer *) (crenderer), part);
@@ -86,7 +91,7 @@ set_color (GskPangoRenderer *crenderer,
     }
   else
     {
-      cairo_pattern_t *pattern = cairo_get_source (crenderer->cr);
+      cairo_pattern_t *pattern = cairo_get_source (cr);
 
       if (pattern && cairo_pattern_get_type (pattern) == CAIRO_PATTERN_TYPE_SOLID)
         cairo_pattern_get_rgba (pattern, &red, &green, &blue, &alpha);
@@ -102,7 +107,7 @@ set_color (GskPangoRenderer *crenderer,
   if (a)
     alpha = a / 65535.;
 
-  cairo_set_source_rgba (crenderer->cr, red, green, blue, alpha);
+  cairo_set_source_rgba (cr, red, green, blue, alpha);
 }
 
 #if 0
@@ -354,6 +359,7 @@ gsk_pango_renderer_show_text_glyphs (PangoRenderer        *renderer,
 {
   GskPangoRenderer *crenderer = (GskPangoRenderer *) (renderer);
 
+  cairo_t *cr;
   int i, count;
   int x_position = 0;
   cairo_glyph_t *cairo_glyphs;
@@ -361,11 +367,15 @@ gsk_pango_renderer_show_text_glyphs (PangoRenderer        *renderer,
   double base_x = crenderer->x_offset + (double)x / PANGO_SCALE;
   double base_y = crenderer->y_offset + (double)y / PANGO_SCALE;
 
-  cairo_save (crenderer->cr);
+
+  cr = gtk_snapshot_append_cairo (crenderer->snapshot, &crenderer->bounds, "Text<%dglyphs>", 
glyphs->num_glyphs);
+
+  gdk_cairo_set_source_rgba (cr, crenderer->fg_color);
+
   if (!crenderer->do_path)
-    set_color (crenderer, PANGO_RENDER_PART_FOREGROUND);
+    set_color (crenderer, cr, PANGO_RENDER_PART_FOREGROUND);
 
-  if (!_pango_cairo_font_install (font, crenderer->cr))
+  if (!_pango_cairo_font_install (font, cr))
     {
       for (i = 0; i < glyphs->num_glyphs; i++)
         {
@@ -417,22 +427,22 @@ gsk_pango_renderer_show_text_glyphs (PangoRenderer        *renderer,
     }
 
   if (G_UNLIKELY (crenderer->do_path))
-    cairo_glyph_path (crenderer->cr, cairo_glyphs, count);
+    cairo_glyph_path (cr, cairo_glyphs, count);
   else
     if (G_UNLIKELY (clusters))
-      cairo_show_text_glyphs (crenderer->cr,
+      cairo_show_text_glyphs (cr,
                               text, text_len,
                               cairo_glyphs, count,
                               clusters, num_clusters,
                               backward ? CAIRO_TEXT_CLUSTER_FLAG_BACKWARD : 0);
     else
-      cairo_show_glyphs (crenderer->cr, cairo_glyphs, count);
+      cairo_show_glyphs (cr, cairo_glyphs, count);
 
   if (cairo_glyphs != stack_glyphs)
     g_free (cairo_glyphs);
 
 done:
-  cairo_restore (crenderer->cr);
+  cairo_destroy (cr);
 }
 
 static void
@@ -442,13 +452,7 @@ gsk_pango_renderer_draw_glyphs (PangoRenderer     *renderer,
                                 int                x,
                                 int                y)
 {
-  gsk_pango_renderer_show_text_glyphs (renderer,
-                                       NULL, 0,
-                                       glyphs,
-                                       NULL, 0,
-                                       FALSE,
-                                       font,
-                                       x, y);
+  gsk_pango_renderer_show_text_glyphs (renderer, NULL, 0, glyphs, NULL, 0, FALSE, font, x, y);
 }
 
 static void
@@ -459,25 +463,19 @@ gsk_pango_renderer_draw_glyph_item (PangoRenderer  *renderer,
                                     int             y)
 {
   GskPangoRenderer *crenderer = (GskPangoRenderer *) (renderer);
-  PangoFont          *font      = glyph_item->item->analysis.font;
-  PangoGlyphString   *glyphs    = glyph_item->glyphs;
-  PangoItem          *item      = glyph_item->item;
-  gboolean            backward  = (item->analysis.level & 1) != 0;
+  PangoFont *font = glyph_item->item->analysis.font;
+  PangoGlyphString *glyphs = glyph_item->glyphs;
+  PangoItem *item = glyph_item->item;
+  gboolean backward = (item->analysis.level & 1) != 0;
 
-  PangoGlyphItemIter   iter;
+  PangoGlyphItemIter iter;
   cairo_text_cluster_t *cairo_clusters;
   cairo_text_cluster_t stack_clusters[STACK_ARRAY_LENGTH (cairo_text_cluster_t)];
   int num_clusters;
 
   if (!crenderer->has_show_text_glyphs || crenderer->do_path)
     {
-      gsk_pango_renderer_show_text_glyphs (renderer,
-                                           NULL, 0,
-                                           glyphs,
-                                           NULL, 0,
-                                           FALSE,
-                                           font,
-                                           x, y);
+      gsk_pango_renderer_show_text_glyphs (renderer, NULL, 0, glyphs, NULL, 0, FALSE, font, x, y);
       return;
     }
 
@@ -519,12 +517,12 @@ gsk_pango_renderer_draw_glyph_item (PangoRenderer  *renderer,
     }
 
   gsk_pango_renderer_show_text_glyphs (renderer,
-                                         text + item->offset, item->length,
-                                         glyphs,
-                                         cairo_clusters, num_clusters,
-                                         backward,
-                                         font,
-                                         x, y);
+                                       text + item->offset, item->length,
+                                       glyphs,
+                                       cairo_clusters, num_clusters,
+                                       backward,
+                                       font,
+                                       x, y);
 
   if (cairo_clusters != stack_clusters)
     g_free (cairo_clusters);
@@ -538,6 +536,7 @@ gsk_pango_renderer_draw_rectangle (PangoRenderer     *renderer,
                                      int                width,
                                      int                height)
 {
+#if 0
   GskPangoRenderer *crenderer = (GskPangoRenderer *) (renderer);
 
   if (!crenderer->do_path)
@@ -558,6 +557,7 @@ gsk_pango_renderer_draw_rectangle (PangoRenderer     *renderer,
 
       cairo_restore (crenderer->cr);
     }
+#endif
 }
 
 static void
@@ -570,6 +570,7 @@ gsk_pango_renderer_draw_trapezoid (PangoRenderer     *renderer,
                                      double             x12,
                                      double             x22)
 {
+#if 0
   GskPangoRenderer *crenderer = (GskPangoRenderer *) (renderer);
   cairo_t *cr;
   double x, y;
@@ -597,6 +598,7 @@ gsk_pango_renderer_draw_trapezoid (PangoRenderer     *renderer,
     cairo_fill (cr);
 
   cairo_restore (cr);
+#endif
 }
 
 /* Draws an error underline that looks like one of:
@@ -679,6 +681,7 @@ gsk_pango_renderer_draw_error_underline (PangoRenderer *renderer,
                                            int            width,
                                            int            height)
 {
+#if 0
   GskPangoRenderer *crenderer = (GskPangoRenderer *) (renderer);
   cairo_t *cr = crenderer->cr;
 
@@ -702,6 +705,7 @@ gsk_pango_renderer_draw_error_underline (PangoRenderer *renderer,
 
       cairo_restore (cr);
     }
+#endif
 }
 
 static void
@@ -793,7 +797,7 @@ release_renderer (GskPangoRenderer *renderer)
 {
   if (G_LIKELY (renderer->is_cached_renderer))
     {
-      renderer->cr = NULL;
+      renderer->snapshot = NULL;
       renderer->do_path = FALSE;
       renderer->has_show_text_glyphs = FALSE;
       renderer->x_offset = 0.;
@@ -805,6 +809,7 @@ release_renderer (GskPangoRenderer *renderer)
     g_object_unref (renderer);
 }
 
+#if 0
 static void
 save_current_point (GskPangoRenderer *renderer)
 {
@@ -824,35 +829,40 @@ restore_current_point (GskPangoRenderer *renderer)
   else
     cairo_new_sub_path (renderer->cr);
 }
-
+#endif
 
 /* convenience wrappers using the default renderer */
 
 static void
-gsk_pango_do_layout (cairo_t     *cr,
-                     PangoLayout *layout,
-                     gboolean     do_path)
+gsk_pango_do_layout (GtkSnapshot   *snapshot,
+                     const GdkRGBA *fg_color,
+                     PangoLayout   *layout,
+                     gboolean       do_path)
 {
   GskPangoRenderer *crenderer = acquire_renderer ();
   PangoRenderer *renderer = (PangoRenderer *) crenderer;
+  PangoRectangle ink_rect;
 
-  crenderer->cr = cr;
+  crenderer->snapshot = snapshot;
+  crenderer->fg_color = fg_color;
   crenderer->do_path = do_path;
-  save_current_point (crenderer);
+  crenderer->x_offset = crenderer->y_offset = 0;
 
-  pango_renderer_draw_layout (renderer, layout, 0, 0);
+  pango_layout_get_pixel_extents (layout, &ink_rect, NULL);
+  graphene_rect_init (&crenderer->bounds, ink_rect.x, ink_rect.y, ink_rect.width, ink_rect.height);
 
-  restore_current_point (crenderer);
+  pango_renderer_draw_layout (renderer, layout, 0, 0);
 
   release_renderer (crenderer);
 }
 
 void
-gsk_pango_show_layout (cairo_t     *cr,
-                       PangoLayout *layout)
+gsk_pango_show_layout (GtkSnapshot   *snapshot,
+                       const GdkRGBA *fg_color,
+                       PangoLayout   *layout)
 {
-  g_return_if_fail (cr != NULL);
+  g_return_if_fail (snapshot != NULL);
   g_return_if_fail (PANGO_IS_LAYOUT (layout));
 
-  gsk_pango_do_layout (cr, layout, FALSE);
+  gsk_pango_do_layout (snapshot, fg_color, layout, FALSE);
 }
diff --git a/gtk/gskpango.h b/gtk/gskpango.h
index 75a54d8..1fe7a6c 100644
--- a/gtk/gskpango.h
+++ b/gtk/gskpango.h
@@ -19,7 +19,7 @@
 #ifndef __GSK_PANGO_H__
 #define __GSK_PANGO_H__
 
-#include <gsk/gsk.h>
+#include "gtk/gtksnapshot.h"
 
 G_BEGIN_DECLS
 
@@ -35,8 +35,9 @@ GDK_AVAILABLE_IN_3_92
 GType gsk_pango_renderer_get_type (void) G_GNUC_CONST;
 
 GDK_AVAILABLE_IN_3_92
-void gsk_pango_show_layout (cairo_t     *cr,
-                            PangoLayout *layout);
+void gsk_pango_show_layout (GtkSnapshot   *snapshot,
+                            const GdkRGBA *fg_color,
+                            PangoLayout   *layout);
 
 G_END_DECLS
 
diff --git a/gtk/gtksnapshot.c b/gtk/gtksnapshot.c
index d46c0a0..11e594e 100644
--- a/gtk/gtksnapshot.c
+++ b/gtk/gtksnapshot.c
@@ -1332,37 +1332,42 @@ gtk_snapshot_render_layout (GtkSnapshot     *snapshot,
                             PangoLayout     *layout)
 {
   const GdkRGBA *fg_color;
-  graphene_rect_t bounds;
-  GtkBorder shadow_extents;
-  PangoRectangle ink_rect;
   GtkCssValue *shadow;
-  cairo_t *cr;
 
   g_return_if_fail (snapshot != NULL);
   g_return_if_fail (GTK_IS_STYLE_CONTEXT (context));
   g_return_if_fail (PANGO_IS_LAYOUT (layout));
 
+  gtk_snapshot_offset (snapshot, x, y);
+
   fg_color = _gtk_css_rgba_value_get_rgba (_gtk_style_context_peek_property (context, 
GTK_CSS_PROPERTY_COLOR));
+
   shadow = _gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_TEXT_SHADOW);
-  pango_layout_get_pixel_extents (layout, &ink_rect, NULL);
-  _gtk_css_shadows_value_get_extents (shadow, &shadow_extents);
-  graphene_rect_init (&bounds,
-                      ink_rect.x - shadow_extents.left,
-                      ink_rect.y - shadow_extents.top,
-                      ink_rect.width + shadow_extents.left + shadow_extents.right,
-                      ink_rect.height + shadow_extents.top + shadow_extents.bottom);
+  if (!_gtk_css_shadows_value_is_none (shadow))
+    {
+      PangoRectangle ink_rect;
+      graphene_rect_t bounds;
+      GtkBorder shadow_extents = { 0, };
+      cairo_t *cr;
 
-  gtk_snapshot_offset (snapshot, x, y);
+      pango_layout_get_pixel_extents (layout, &ink_rect, NULL);
+      _gtk_css_shadows_value_get_extents (shadow, &shadow_extents);
+      graphene_rect_init (&bounds,
+                          ink_rect.x - shadow_extents.left,
+                          ink_rect.y - shadow_extents.top,
+                          ink_rect.width + shadow_extents.left + shadow_extents.right,
+                          ink_rect.height + shadow_extents.top + shadow_extents.bottom);
 
-  cr = gtk_snapshot_append_cairo (snapshot, &bounds, "Text<%dchars>", pango_layout_get_character_count 
(layout));
+      cr = gtk_snapshot_append_cairo (snapshot, &bounds, "Text<%dchars>", pango_layout_get_character_count 
(layout));
 
-  _gtk_css_shadows_value_paint_layout (shadow, cr, layout);
+      gdk_cairo_set_source_rgba (cr, fg_color);
 
-  gdk_cairo_set_source_rgba (cr, fg_color);
+      _gtk_css_shadows_value_paint_layout (shadow, cr, layout);
+      cairo_destroy (cr);
+    }
 
-  gsk_pango_show_layout (cr, layout);
+  gsk_pango_show_layout (snapshot, fg_color, layout);
 
-  cairo_destroy (cr);
   gtk_snapshot_offset (snapshot, -x, -y);
 }
 


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