gsk: Allow creating cairo contexts for 0x0 nodes

This happens in regular code paths for example when trying to render the
empty text string. We don't want to store a surface on the render
node in such a case (so actual rendering isn't slowed down), but we do
want to return a working cairo context that is not in an error state
(so the cairo rendering can continue without error messages).
This commit is contained in:
Benjamin Otte 2016-11-15 07:01:27 +01:00
parent 703d80eac0
commit 3a18bed7d7

View File

@ -1420,13 +1420,23 @@ cairo_t *
gsk_render_node_get_draw_context (GskRenderNode *node, gsk_render_node_get_draw_context (GskRenderNode *node,
GskRenderer *renderer) GskRenderer *renderer)
{ {
int width, height;
cairo_t *res; cairo_t *res;
g_return_val_if_fail (GSK_IS_RENDER_NODE (node), NULL); g_return_val_if_fail (GSK_IS_RENDER_NODE (node), NULL);
g_return_val_if_fail (node->is_mutable, NULL); g_return_val_if_fail (node->is_mutable, NULL);
g_return_val_if_fail (renderer == NULL || GSK_IS_RENDERER (renderer), NULL); g_return_val_if_fail (renderer == NULL || GSK_IS_RENDERER (renderer), NULL);
if (node->surface == NULL) width = ceilf (node->bounds.size.width);
height = ceilf (node->bounds.size.height);
if (width <= 0 || height <= 0)
{
cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 0, 0);
res = cairo_create (surface);
cairo_surface_destroy (surface);
}
else if (node->surface == NULL)
{ {
if (renderer) if (renderer)
{ {
@ -1443,9 +1453,12 @@ gsk_render_node_get_draw_context (GskRenderNode *node,
ceilf (node->bounds.size.width), ceilf (node->bounds.size.width),
ceilf (node->bounds.size.height)); ceilf (node->bounds.size.height));
} }
res = cairo_create (node->surface);
}
else
{
res = cairo_create (node->surface);
} }
res = cairo_create (node->surface);
cairo_translate (res, -node->bounds.origin.x, -node->bounds.origin.y); cairo_translate (res, -node->bounds.origin.x, -node->bounds.origin.y);