[gtk+/wip/matthiasc/text-node: 1/2] wip: text rendering to render nodes
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/matthiasc/text-node: 1/2] wip: text rendering to render nodes
- Date: Tue, 29 Aug 2017 21:29:30 +0000 (UTC)
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]