[gtk+/wip/matthiasc/text-node: 1/2] wip: text rendering to render nodes



commit 39586eb6b810c27e886174445d0c89acffd8f34e
Author: Matthias Clasen <mclasen redhat com>
Date:   Tue Aug 29 17:26:55 2017 -0400

    wip: text rendering to render nodes
    
    This is an initial dump of some code to turn a PangoLayout
    into a bunch of render nodes.

 gtk/gtkpango.c    |  146 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 gtk/gtksnapshot.c |   10 ++++
 2 files changed, 156 insertions(+), 0 deletions(-)
---
diff --git a/gtk/gtkpango.c b/gtk/gtkpango.c
index 98f787a..927531c 100644
--- a/gtk/gtkpango.c
+++ b/gtk/gtkpango.c
@@ -1251,3 +1251,149 @@ _gtk_pango_attr_list_merge (PangoAttrList *into,
 
   return into;
 }
+
+/* FIXME: find a better place for this */
+
+#include "gtksnapshot.h"
+
+
+#define GTK_TYPE_GSK_LAYOUT_RENDERER            (gtk_gsk_layout_renderer_get_type())
+#define GTK_GSK_LAYOUT_RENDERER(object)         (G_TYPE_CHECK_INSTANCE_CAST ((object), 
GTK_TYPE_GSK_LAYOUT_RENDERER, GtkGskLayoutRenderer))
+#define GTK_IS_GSK_LAYOUT_RENDERER(object)      (G_TYPE_CHECK_INSTANCE_TYPE ((object), 
GTK_TYPE_GSK_LAYOUT_RENDERER))
+#define GTK_GSK_LAYOUT_RENDERER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), 
GTK_TYPE_GSK_LAYOUT_RENDERER, GtkGskLayoutRendererClass))
+#define GTK_IS_GSK_LAYOUT_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), 
GTK_TYPE_GSK_LAYOUT_RENDERER))
+#define GTK_GSK_LAYOUT_RENDERER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), 
GTK_TYPE_GSK_LAYOUT_RENDERER, GtkGskLayoutRendererClass))
+
+typedef struct _GtkGskLayoutRenderer      GtkGskLayoutRenderer;
+typedef struct _GtkGskLayoutRendererClass GtkGskLayoutRendererClass;
+
+struct _GtkGskLayoutRenderer
+{
+  PangoRenderer parent_instance;
+
+  GtkSnapshot *snapshot;
+};
+
+struct _GtkGskLayoutRendererClass
+{
+  PangoRendererClass parent_class;
+};
+
+GType gtk_gsk_layout_renderer_get_type (void);
+
+G_DEFINE_TYPE (GtkGskLayoutRenderer, gtk_gsk_layout_renderer, PANGO_TYPE_RENDERER)
+
+static void
+gtk_gsk_layout_renderer_draw_glyphs (PangoRenderer     *renderer,
+                                      PangoFont         *font,
+                                      PangoGlyphString  *glyphs,
+                                      int                x,
+                                      int                y)
+{
+  GtkGskLayoutRenderer *gsk_renderer = (GtkGskLayoutRenderer *)renderer;
+  GskRenderNode *node;
+
+  node = gsk_text_node_new (font, x, y, glyphs);
+  gtk_snapshot_append_node (gsk_renderer->snapshot, node);
+  gsk_render_node_unref (node);
+}
+
+static void
+gtk_gsk_layout_renderer_draw_glyph_item (PangoRenderer     *renderer,
+                                          const char        *text,
+                                          PangoGlyphItem    *glyph_item,
+                                          int                x,
+                                          int                y)
+{
+  gtk_gsk_layout_renderer_draw_glyphs (renderer,
+                                       glyph_item->item->analysis.font,
+                                       glyph_item->glyphs,
+                                       x, y);
+}
+
+static void
+gtk_gsk_layout_renderer_draw_rectangle (PangoRenderer     *renderer,
+                                         PangoRenderPart    part,
+                                         int                x,
+                                         int                y,
+                                         int                width,
+                                         int                height)
+{
+  g_print ("draw rectangle part %d x %d y %d width %d height %d\n",
+           part, x, y, width, height);
+}
+
+static void
+gtk_gsk_layout_renderer_draw_trapezoid (PangoRenderer     *renderer,
+                                         PangoRenderPart    part,
+                                         double             y1_,
+                                         double             x11,
+                                         double             x21,
+                                         double             y2,
+                                         double             x12,
+                                         double             x22)
+{
+  g_print ("draw trapezoid part %d y1 %g x11 %g x21 %g y2 %g x12 %g x22 %g\n",
+           part, y1_, x11, x21, y2, x12, x22);
+}
+
+static void
+gtk_gsk_layout_renderer_draw_error_underline (PangoRenderer *renderer,
+                                               int            x,
+                                               int            y,
+                                               int            width,
+                                               int            height)
+{
+  g_print ("draw error underline x %d y %d width %d height %d\n",
+           x, y, width, height);
+}
+
+static void
+gtk_gsk_layout_renderer_draw_shape (PangoRenderer   *renderer,
+                                     PangoAttrShape  *attr,
+                                     int              x,
+                                     int              y)
+{
+  g_print ("draw shape x %d y %d\n", x, y);
+}
+
+static void
+gtk_gsk_layout_renderer_finalize (GObject *object)
+{
+  G_OBJECT_CLASS (gtk_gsk_layout_renderer_parent_class)->finalize (object);
+}
+
+static void
+gtk_gsk_layout_renderer_init (GtkGskLayoutRenderer *renderer)
+{
+}
+
+static void
+gtk_gsk_layout_renderer_class_init (GtkGskLayoutRendererClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  PangoRendererClass *renderer_class = PANGO_RENDERER_CLASS (klass);
+
+  renderer_class->draw_glyphs = gtk_gsk_layout_renderer_draw_glyphs;
+  renderer_class->draw_glyph_item = gtk_gsk_layout_renderer_draw_glyph_item;
+  renderer_class->draw_rectangle = gtk_gsk_layout_renderer_draw_rectangle;
+  renderer_class->draw_trapezoid = gtk_gsk_layout_renderer_draw_trapezoid;
+  renderer_class->draw_error_underline = gtk_gsk_layout_renderer_draw_error_underline;
+  renderer_class->draw_shape = gtk_gsk_layout_renderer_draw_shape;
+
+  object_class->finalize = gtk_gsk_layout_renderer_finalize;
+}
+
+PangoRenderer *
+gtk_gsk_layout_renderer_new (GtkSnapshot *snapshot)
+{
+  GtkGskLayoutRenderer *renderer;
+
+  renderer = g_object_new (gtk_gsk_layout_renderer_get_type (), NULL);
+
+  renderer->snapshot = snapshot;
+
+  return PANGO_RENDERER (renderer);
+}
+
diff --git a/gtk/gtksnapshot.c b/gtk/gtksnapshot.c
index 77146e4..e2bce2f 100644
--- a/gtk/gtksnapshot.c
+++ b/gtk/gtksnapshot.c
@@ -1308,6 +1308,8 @@ gtk_snapshot_render_focus (GtkSnapshot     *snapshot,
   gtk_snapshot_offset (snapshot, -x, -y);
 }
 
+extern PangoRenderer *gtk_gsk_layout_renderer_new (GtkSnapshot *snapshot);
+
 /**
  * gtk_snapshot_render_layout:
  * @snapshot: a #GtkSnapshot
@@ -1335,6 +1337,7 @@ gtk_snapshot_render_layout (GtkSnapshot     *snapshot,
   PangoRectangle ink_rect;
   GtkCssValue *shadow;
   cairo_t *cr;
+  PangoRenderer *renderer;
 
   g_return_if_fail (snapshot != NULL);
   g_return_if_fail (GTK_IS_STYLE_CONTEXT (context));
@@ -1352,6 +1355,12 @@ gtk_snapshot_render_layout (GtkSnapshot     *snapshot,
 
   gtk_snapshot_offset (snapshot, x, y);
 
+  renderer = gtk_gsk_layout_renderer_new (snapshot);
+  pango_renderer_draw_layout (renderer, layout, 0, 0);
+
+  g_object_unref (renderer);
+#if 0
+
   cr = gtk_snapshot_append_cairo (snapshot, &bounds, "Text<%dchars>", pango_layout_get_character_count 
(layout));
 
   _gtk_css_shadows_value_paint_layout (shadow, cr, layout);
@@ -1360,6 +1369,7 @@ gtk_snapshot_render_layout (GtkSnapshot     *snapshot,
   pango_cairo_show_layout (cr, layout);
 
   cairo_destroy (cr);
+#endif
   gtk_snapshot_offset (snapshot, -x, -y);
 }
 


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