diff options
author | Benjamin Otte <otte@redhat.com> | 2019-02-21 03:07:14 +0100 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2019-02-21 19:47:28 +0100 |
commit | 0d119f81c8558d15567bb2784a2b0a6b01d237f8 (patch) | |
tree | 2df4b651f94983d12272f0f24a547080c4cb66c8 | |
parent | e1570e9ebc1e8b7600514958355550cd804abca6 (diff) | |
download | gtk+-0d119f81c8558d15567bb2784a2b0a6b01d237f8.tar.gz |
snapshot: Refactor text rendering
The code didn't change, it was just shuffled around to make the
with_bounds() versions of the text rendering unnecessary and instead
pass through the generic append_node() path.
-rw-r--r-- | gsk/gskrendernode.h | 4 | ||||
-rw-r--r-- | gsk/gskrendernodeimpl.c | 46 | ||||
-rw-r--r-- | gsk/gskrendernodeprivate.h | 7 | ||||
-rw-r--r-- | gtk/gskpango.c | 37 | ||||
-rw-r--r-- | gtk/gtksnapshot.c | 42 | ||||
-rw-r--r-- | gtk/gtksnapshotprivate.h | 6 |
6 files changed, 63 insertions, 79 deletions
diff --git a/gsk/gskrendernode.h b/gsk/gskrendernode.h index 3099569471..4ab51853da 100644 --- a/gsk/gskrendernode.h +++ b/gsk/gskrendernode.h @@ -287,8 +287,8 @@ GDK_AVAILABLE_IN_ALL GskRenderNode * gsk_text_node_new (PangoFont *font, PangoGlyphString *glyphs, const GdkRGBA *color, - double x, - double y); + float x, + float y); GDK_AVAILABLE_IN_ALL const PangoFont * gsk_text_node_peek_font (GskRenderNode *node); GDK_AVAILABLE_IN_ALL diff --git a/gsk/gskrendernodeimpl.c b/gsk/gskrendernodeimpl.c index aa72646065..1b7d5be39e 100644 --- a/gsk/gskrendernodeimpl.c +++ b/gsk/gskrendernodeimpl.c @@ -4647,8 +4647,8 @@ GskRenderNode * gsk_text_node_new (PangoFont *font, PangoGlyphString *glyphs, const GdkRGBA *color, - double x, - double y) + float x, + float y) { GskTextNode *self; PangoRectangle ink_rect; @@ -4660,42 +4660,6 @@ gsk_text_node_new (PangoFont *font, if (ink_rect.width == 0 || ink_rect.height == 0) return NULL; - self = (GskTextNode *)gsk_text_node_new_with_bounds (font, glyphs, color, x, y, - &GRAPHENE_RECT_INIT (x, - y + ink_rect.y, - ink_rect.x + ink_rect.width, - ink_rect.height)); - - return &self->render_node; -} - -/** - * gsk_text_node_new_with_bounds: - * @font: the #PangoFont containing the glyphs - * @glyphs: the #PangoGlyphString to render - * @color: the foreground color to render with - * @x: the x coordinate at which to put the baseline - * @y: the y coordinate at wihch to put the baseline - * @bounds: the node bounds - * - * Creates a render node that renders the given glyphs, - * Note that @color may not be used if the font contains - * color glyphs. - * - * This function will not do any text measuring, contrary to gsk_text_node_new(). - * - * Returns: (nullable): a new text node, or %NULL - */ -GskRenderNode * -gsk_text_node_new_with_bounds (PangoFont *font, - PangoGlyphString *glyphs, - const GdkRGBA *color, - double x, - double y, - const graphene_rect_t *bounds) -{ - GskTextNode *self; - self = (GskTextNode *) gsk_render_node_new (&GSK_TEXT_NODE_CLASS, sizeof (PangoGlyphInfo) * glyphs->num_glyphs); self->font = g_object_ref (font); @@ -4705,7 +4669,11 @@ gsk_text_node_new_with_bounds (PangoFont *font, self->num_glyphs = glyphs->num_glyphs; memcpy (self->glyphs, glyphs->glyphs, sizeof (PangoGlyphInfo) * glyphs->num_glyphs); - graphene_rect_init_from_rect (&self->render_node.bounds, bounds); + graphene_rect_init (&self->render_node.bounds, + x + ink_rect.x - 1, + y + ink_rect.y - 1, + ink_rect.width + 2, + ink_rect.height + 2); return &self->render_node; } diff --git a/gsk/gskrendernodeprivate.h b/gsk/gskrendernodeprivate.h index 1f0565cfab..62f34ba3db 100644 --- a/gsk/gskrendernodeprivate.h +++ b/gsk/gskrendernodeprivate.h @@ -101,13 +101,6 @@ GskRenderNode * gsk_transform_node_new_with_category (GskRenderNode GskMatrixCategory category); GskMatrixCategory gsk_transform_node_get_category (GskRenderNode *node); -GskRenderNode * gsk_text_node_new_with_bounds (PangoFont *font, - PangoGlyphString *glyphs, - const GdkRGBA *color, - double x, - double y, - const graphene_rect_t *bounds); - G_END_DECLS diff --git a/gtk/gskpango.c b/gtk/gskpango.c index ae4a6a81fe..8e1c2e3f70 100644 --- a/gtk/gskpango.c +++ b/gtk/gskpango.c @@ -113,41 +113,16 @@ gsk_pango_renderer_show_text_glyphs (PangoRenderer *renderer, int y) { GskPangoRenderer *crenderer = (GskPangoRenderer *) (renderer); - int x_offset, y_offset; - GskRenderNode *node; GdkRGBA color; - graphene_rect_t node_bounds; - PangoRectangle ink_rect; - - pango_glyph_string_extents (glyphs, font, &ink_rect, NULL); - pango_extents_to_pixels (&ink_rect, NULL); - - /* Don't create empty nodes */ - if (ink_rect.width == 0 || ink_rect.height == 0) - return; - - graphene_rect_init (&node_bounds, - (float)x/PANGO_SCALE - 1.0, - (float)y/PANGO_SCALE + ink_rect.y - 1.0, - ink_rect.x + ink_rect.width + 2.0, - ink_rect.height + 2.0); - - gtk_snapshot_get_offset (crenderer->snapshot, &x_offset, &y_offset); - graphene_rect_offset (&node_bounds, x_offset, y_offset); get_color (crenderer, PANGO_RENDER_PART_FOREGROUND, &color); - node = gsk_text_node_new_with_bounds (font, - glyphs, - &color, - x_offset + (double)x/PANGO_SCALE, - y_offset + (double)y/PANGO_SCALE, - &node_bounds); - if (node == NULL) - return; - - gtk_snapshot_append_node_internal (crenderer->snapshot, node); - gsk_render_node_unref (node); + gtk_snapshot_append_text (crenderer->snapshot, + font, + glyphs, + &color, + (float) x / PANGO_SCALE, + (float) y / PANGO_SCALE); } static void diff --git a/gtk/gtksnapshot.c b/gtk/gtksnapshot.c index 1be41ad138..eb666dc5ad 100644 --- a/gtk/gtksnapshot.c +++ b/gtk/gtksnapshot.c @@ -607,6 +607,23 @@ gtk_snapshot_ensure_affine (GtkSnapshot *snapshot, } static void +gtk_snapshot_ensure_translate (GtkSnapshot *snapshot, + float *dx, + float *dy) +{ + const GtkSnapshotState *current_state = gtk_snapshot_get_current_state (snapshot); + float scale_x, scale_y; + + if (gtk_transform_to_affine (current_state->transform, &scale_x, &scale_y, dx, dy) && + scale_x == 1.0f && scale_y == 1.0f) + return; + + gtk_snapshot_autopush_transform (snapshot); + + *dx = *dy = 0; +} + +static void gtk_snapshot_ensure_identity (GtkSnapshot *snapshot) { const GtkSnapshotState *state = gtk_snapshot_get_current_state (snapshot); @@ -1463,6 +1480,31 @@ gtk_snapshot_render_layout (GtkSnapshot *snapshot, gtk_snapshot_offset (snapshot, -x, -y); } +void +gtk_snapshot_append_text (GtkSnapshot *snapshot, + PangoFont *font, + PangoGlyphString *glyphs, + const GdkRGBA *color, + float x, + float y) +{ + GskRenderNode *node; + float dx, dy; + + gtk_snapshot_ensure_translate (snapshot, &dx, &dy); + + node = gsk_text_node_new (font, + glyphs, + color, + x + dx, + y + dy); + if (node == NULL) + return; + + gtk_snapshot_append_node_internal (snapshot, node); + gsk_render_node_unref (node); +} + /** * gtk_snapshot_append_linear_gradient: * @snapshot: a #GtkSnapshot diff --git a/gtk/gtksnapshotprivate.h b/gtk/gtksnapshotprivate.h index e19d0b2a20..7750cf5dbf 100644 --- a/gtk/gtksnapshotprivate.h +++ b/gtk/gtksnapshotprivate.h @@ -108,6 +108,12 @@ GtkSnapshot * gtk_snapshot_new_with_parent (GtkSnapshot void gtk_snapshot_push_transform_with_category (GtkSnapshot *snapshot, const graphene_matrix_t*transform, GskMatrixCategory category); +void gtk_snapshot_append_text (GtkSnapshot *snapshot, + PangoFont *font, + PangoGlyphString *glyphs, + const GdkRGBA *color, + float x, + float y); G_END_DECLS #endif /* __GTK_SNAPSHOT_PRIVATE_H__ */ |