[gtk+/wip/matthiasc/gskpango: 3/3] wip: move node creation into the renderer
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/matthiasc/gskpango: 3/3] wip: move node creation into the renderer
- Date: Wed, 30 Aug 2017 17:54:29 +0000 (UTC)
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]