From 3af4fba895f4e85d6d5ce7866457d87fd9086951 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sun, 11 Dec 2016 02:59:47 +0100 Subject: [PATCH] gsk: Split render node subclasses out into their own file --- gsk/Makefile.am | 1 + gsk/gskrendernode.c | 168 ---------------------------------- gsk/gskrendernodeimpl.c | 196 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 197 insertions(+), 168 deletions(-) create mode 100644 gsk/gskrendernodeimpl.c diff --git a/gsk/Makefile.am b/gsk/Makefile.am index 9091c2424a..d7c433c7c4 100644 --- a/gsk/Makefile.am +++ b/gsk/Makefile.am @@ -65,6 +65,7 @@ gsk_private_source_h = \ gsk_public_source_c = \ gskrenderer.c \ gskrendernode.c \ + gskrendernodeimpl.c \ gsktexture.c gsk_private_source_c = \ $(gsk_private_vulkan_source_c) \ diff --git a/gsk/gskrendernode.c b/gsk/gskrendernode.c index 4dc12c3a5c..0d088403b0 100644 --- a/gsk/gskrendernode.c +++ b/gsk/gskrendernode.c @@ -753,61 +753,6 @@ gsk_render_node_update_world_matrix (GskRenderNode *node, } } -GskTexture * -gsk_texture_node_get_texture (GskRenderNode *node) -{ - g_return_val_if_fail (GSK_IS_RENDER_NODE (node), 0); - g_return_val_if_fail (node->type == GSK_TEXTURE_NODE, 0); - - return node->texture; -} - -/** - * gsk_texture_node_new: - * @texture: the #GskTexture - * @bounds: the rectangle to render the texture into - * - * Creates a #GskRenderNode that will render the given - * @texture into the area given by @bounds. - * - * Returns: A new #GskRenderNode - * - * Since: 3.90 - */ -GskRenderNode * -gsk_texture_node_new (GskTexture *texture, - const graphene_rect_t *bounds) -{ - GskRenderNode *node; - - g_return_val_if_fail (GSK_IS_TEXTURE (texture), NULL); - g_return_val_if_fail (bounds != NULL, NULL); - - node = gsk_render_node_new (GSK_TEXTURE_NODE); - - node->texture = gsk_texture_ref (texture); - graphene_rect_init_from_rect (&node->bounds, bounds); - - return node; -} - -/*< private > - * gsk_cairo_node_get_surface: - * @node: a #GskRenderNode - * - * Retrieves the surface set using gsk_render_node_set_surface(). - * - * Returns: (transfer none) (nullable): a Cairo surface - */ -cairo_surface_t * -gsk_cairo_node_get_surface (GskRenderNode *node) -{ - g_return_val_if_fail (GSK_IS_RENDER_NODE (node), NULL); - g_return_val_if_fail (node->type == GSK_CAIRO_NODE, NULL); - - return node->surface; -} - void gsk_render_node_set_scaling_filters (GskRenderNode *node, GskScalingFilter min_filter, @@ -930,119 +875,6 @@ gsk_render_node_get_blend_mode (GskRenderNode *node) return node->blend_mode; } -/** - * gsk_cairo_node_new: - * @bounds: the rectangle to render the to - * - * Creates a #GskRenderNode that will render a cairo surface - * into the area given by @bounds. You can draw to the cairo - * surface using gsk_cairo_node_get_draw_context() - * - * Returns: A new #GskRenderNode - * - * Since: 3.90 - */ -GskRenderNode * -gsk_cairo_node_new (const graphene_rect_t *bounds) -{ - GskRenderNode *node; - - g_return_val_if_fail (bounds != NULL, NULL); - - node = gsk_render_node_new (GSK_CAIRO_NODE); - - graphene_rect_init_from_rect (&node->bounds, bounds); - - return node; -} - -/** - * gsk_cairo_node_get_draw_context: - * @node: a cairo #GskRenderNode - * @renderer: (nullable): Renderer to optimize for or %NULL for any - * - * Creates a Cairo context for drawing using the surface associated - * to the render node. - * If no surface exists yet, a surface will be created optimized for - * rendering to @renderer. - * - * Returns: (transfer full): a Cairo context used for drawing; use - * cairo_destroy() when done drawing - * - * Since: 3.90 - */ -cairo_t * -gsk_cairo_node_get_draw_context (GskRenderNode *node, - GskRenderer *renderer) -{ - int width, height; - cairo_t *res; - - g_return_val_if_fail (GSK_IS_RENDER_NODE (node), NULL); - g_return_val_if_fail (node->type == GSK_CAIRO_NODE, NULL); - g_return_val_if_fail (node->is_mutable, NULL); - g_return_val_if_fail (renderer == NULL || GSK_IS_RENDERER (renderer), 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) - { - node->surface = gsk_renderer_create_cairo_surface (renderer, - node->opaque ? CAIRO_FORMAT_RGB24 - : CAIRO_FORMAT_ARGB32, - ceilf (node->bounds.size.width), - ceilf (node->bounds.size.height)); - } - else - { - node->surface = cairo_image_surface_create (node->opaque ? CAIRO_FORMAT_RGB24 - : CAIRO_FORMAT_ARGB32, - ceilf (node->bounds.size.width), - ceilf (node->bounds.size.height)); - } - res = cairo_create (node->surface); - } - else - { - res = cairo_create (node->surface); - } - - cairo_translate (res, -node->bounds.origin.x, -node->bounds.origin.y); - - cairo_rectangle (res, - node->bounds.origin.x, node->bounds.origin.y, - node->bounds.size.width, node->bounds.size.height); - cairo_clip (res); - - if (GSK_DEBUG_CHECK (SURFACE)) - { - const char *prefix; - prefix = g_getenv ("GSK_DEBUG_PREFIX"); - if (!prefix || g_str_has_prefix (node->name, prefix)) - { - cairo_save (res); - cairo_rectangle (res, - node->bounds.origin.x + 1, node->bounds.origin.y + 1, - node->bounds.size.width - 2, node->bounds.size.height - 2); - cairo_set_line_width (res, 2); - cairo_set_source_rgb (res, 1, 0, 0); - cairo_stroke (res); - cairo_restore (res); - } - } - - return res; -} - /*< private > * gsk_render_node_make_immutable: * @node: a #GskRenderNode diff --git a/gsk/gskrendernodeimpl.c b/gsk/gskrendernodeimpl.c new file mode 100644 index 0000000000..be1214d8b8 --- /dev/null +++ b/gsk/gskrendernodeimpl.c @@ -0,0 +1,196 @@ +/* GSK - The GTK Scene Kit + * + * Copyright 2016 Endless + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + */ + +#include "gskrendernodeprivate.h" + +#include "gskdebugprivate.h" +#include "gskrendererprivate.h" +#include "gsktexture.h" + +/*** GSK_TEXTURE_NODE ***/ + +GskTexture * +gsk_texture_node_get_texture (GskRenderNode *node) +{ + g_return_val_if_fail (GSK_IS_RENDER_NODE (node), 0); + g_return_val_if_fail (node->type == GSK_TEXTURE_NODE, 0); + + return node->texture; +} + +/** + * gsk_texture_node_new: + * @texture: the #GskTexture + * @bounds: the rectangle to render the texture into + * + * Creates a #GskRenderNode that will render the given + * @texture into the area given by @bounds. + * + * Returns: A new #GskRenderNode + * + * Since: 3.90 + */ +GskRenderNode * +gsk_texture_node_new (GskTexture *texture, + const graphene_rect_t *bounds) +{ + GskRenderNode *node; + + g_return_val_if_fail (GSK_IS_TEXTURE (texture), NULL); + g_return_val_if_fail (bounds != NULL, NULL); + + node = gsk_render_node_new (GSK_TEXTURE_NODE); + + node->texture = gsk_texture_ref (texture); + graphene_rect_init_from_rect (&node->bounds, bounds); + + return node; +} + +/*** GSK_CAIRO_NODE ***/ + +/*< private > + * gsk_cairo_node_get_surface: + * @node: a #GskRenderNode + * + * Retrieves the surface set using gsk_render_node_set_surface(). + * + * Returns: (transfer none) (nullable): a Cairo surface + */ +cairo_surface_t * +gsk_cairo_node_get_surface (GskRenderNode *node) +{ + g_return_val_if_fail (GSK_IS_RENDER_NODE (node), NULL); + g_return_val_if_fail (node->type == GSK_CAIRO_NODE, NULL); + + return node->surface; +} + +/** + * gsk_cairo_node_new: + * @bounds: the rectangle to render the to + * + * Creates a #GskRenderNode that will render a cairo surface + * into the area given by @bounds. You can draw to the cairo + * surface using gsk_cairo_node_get_draw_context() + * + * Returns: A new #GskRenderNode + * + * Since: 3.90 + */ +GskRenderNode * +gsk_cairo_node_new (const graphene_rect_t *bounds) +{ + GskRenderNode *node; + + g_return_val_if_fail (bounds != NULL, NULL); + + node = gsk_render_node_new (GSK_CAIRO_NODE); + + graphene_rect_init_from_rect (&node->bounds, bounds); + + return node; +} + +/** + * gsk_cairo_node_get_draw_context: + * @node: a cairo #GskRenderNode + * @renderer: (nullable): Renderer to optimize for or %NULL for any + * + * Creates a Cairo context for drawing using the surface associated + * to the render node. + * If no surface exists yet, a surface will be created optimized for + * rendering to @renderer. + * + * Returns: (transfer full): a Cairo context used for drawing; use + * cairo_destroy() when done drawing + * + * Since: 3.90 + */ +cairo_t * +gsk_cairo_node_get_draw_context (GskRenderNode *node, + GskRenderer *renderer) +{ + int width, height; + cairo_t *res; + + g_return_val_if_fail (GSK_IS_RENDER_NODE (node), NULL); + g_return_val_if_fail (node->type == GSK_CAIRO_NODE, NULL); + g_return_val_if_fail (node->is_mutable, NULL); + g_return_val_if_fail (renderer == NULL || GSK_IS_RENDERER (renderer), 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) + { + node->surface = gsk_renderer_create_cairo_surface (renderer, + node->opaque ? CAIRO_FORMAT_RGB24 + : CAIRO_FORMAT_ARGB32, + ceilf (node->bounds.size.width), + ceilf (node->bounds.size.height)); + } + else + { + node->surface = cairo_image_surface_create (node->opaque ? CAIRO_FORMAT_RGB24 + : CAIRO_FORMAT_ARGB32, + ceilf (node->bounds.size.width), + ceilf (node->bounds.size.height)); + } + res = cairo_create (node->surface); + } + else + { + res = cairo_create (node->surface); + } + + cairo_translate (res, -node->bounds.origin.x, -node->bounds.origin.y); + + cairo_rectangle (res, + node->bounds.origin.x, node->bounds.origin.y, + node->bounds.size.width, node->bounds.size.height); + cairo_clip (res); + + if (GSK_DEBUG_CHECK (SURFACE)) + { + const char *prefix; + prefix = g_getenv ("GSK_DEBUG_PREFIX"); + if (!prefix || g_str_has_prefix (node->name, prefix)) + { + cairo_save (res); + cairo_rectangle (res, + node->bounds.origin.x + 1, node->bounds.origin.y + 1, + node->bounds.size.width - 2, node->bounds.size.height - 2); + cairo_set_line_width (res, 2); + cairo_set_source_rgb (res, 1, 0, 0); + cairo_stroke (res); + cairo_restore (res); + } + } + + return res; +} +