diff options
author | Timm Bäder <mail@baedert.org> | 2018-03-04 17:35:17 +0100 |
---|---|---|
committer | Timm Bäder <mail@baedert.org> | 2018-03-04 19:12:04 +0100 |
commit | 2d50d9ebe62ccea9824f258b288e9f10c73a3bd7 (patch) | |
tree | 196d023c1a9e1efec38bbdec9cd94af2b516cbc7 /gsk | |
parent | ee8132a439905f9a0c2cce68e7d380afb4a6c995 (diff) | |
download | gtk+-2d50d9ebe62ccea9824f258b288e9f10c73a3bd7.tar.gz |
rendernodes: Add gsk_text_node_new_with_bounds
An alternative GskTextNode constructor that does no text measuring. That
way, we can measure the text before and check if the node will be
outside of the current clip anyway.
Diffstat (limited to 'gsk')
-rw-r--r-- | gsk/gskrendernode.h | 7 | ||||
-rw-r--r-- | gsk/gskrendernodeimpl.c | 42 |
2 files changed, 44 insertions, 5 deletions
diff --git a/gsk/gskrendernode.h b/gsk/gskrendernode.h index 766e4f8091..6277bf74ce 100644 --- a/gsk/gskrendernode.h +++ b/gsk/gskrendernode.h @@ -288,6 +288,13 @@ GskRenderNode * gsk_text_node_new (PangoFont double x, double y); GDK_AVAILABLE_IN_ALL +GskRenderNode * gsk_text_node_new_with_bounds (PangoFont *font, + PangoGlyphString *glyphs, + const GdkRGBA *color, + double x, + double y, + const graphene_rect_t *bounds); +GDK_AVAILABLE_IN_ALL const PangoFont * gsk_text_node_peek_font (GskRenderNode *node); GDK_AVAILABLE_IN_ALL guint gsk_text_node_get_num_glyphs (GskRenderNode *node); diff --git a/gsk/gskrendernodeimpl.c b/gsk/gskrendernodeimpl.c index f7765b72fd..f0b451f9a4 100644 --- a/gsk/gskrendernodeimpl.c +++ b/gsk/gskrendernodeimpl.c @@ -4002,6 +4002,42 @@ 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); @@ -4011,11 +4047,7 @@ gsk_text_node_new (PangoFont *font, self->num_glyphs = glyphs->num_glyphs; memcpy (self->glyphs, glyphs->glyphs, sizeof (PangoGlyphInfo) * glyphs->num_glyphs); - graphene_rect_init (&self->render_node.bounds, - x, - y + ink_rect.y, - ink_rect.x + ink_rect.width, - ink_rect.height); + graphene_rect_init_from_rect (&self->render_node.bounds, bounds); return &self->render_node; } |