summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2023-05-10 16:40:22 +0200
committerBenjamin Otte <otte@redhat.com>2023-05-17 02:25:32 +0200
commit3ba4d5f124ed49b3179434f70ab47bafdf28223a (patch)
treec175fd919cac74c3c1f0493d122bb0b798270130
parentb14c0678e5f4010a923cecf3c6958b1a674a0de2 (diff)
downloadgtk+-3ba4d5f124ed49b3179434f70ab47bafdf28223a.tar.gz
vulkan: Track offset in the renderpass
This avoids emitting lots of push constant updates as most of the transforms we have are simple translations to adjust drawing for the next widget.
-rw-r--r--gsk/gskroundedrect.c9
-rw-r--r--gsk/gskroundedrectprivate.h1
-rw-r--r--gsk/vulkan/gskvulkanblendmodepipeline.c15
-rw-r--r--gsk/vulkan/gskvulkanblendmodepipelineprivate.h1
-rw-r--r--gsk/vulkan/gskvulkanblurpipeline.c15
-rw-r--r--gsk/vulkan/gskvulkanblurpipelineprivate.h1
-rw-r--r--gsk/vulkan/gskvulkanborderpipeline.c3
-rw-r--r--gsk/vulkan/gskvulkanborderpipelineprivate.h1
-rw-r--r--gsk/vulkan/gskvulkanboxshadowpipeline.c3
-rw-r--r--gsk/vulkan/gskvulkanboxshadowpipelineprivate.h1
-rw-r--r--gsk/vulkan/gskvulkancolorpipeline.c5
-rw-r--r--gsk/vulkan/gskvulkancolorpipelineprivate.h1
-rw-r--r--gsk/vulkan/gskvulkancrossfadepipeline.c15
-rw-r--r--gsk/vulkan/gskvulkancrossfadepipelineprivate.h1
-rw-r--r--gsk/vulkan/gskvulkaneffectpipeline.c5
-rw-r--r--gsk/vulkan/gskvulkaneffectpipelineprivate.h1
-rw-r--r--gsk/vulkan/gskvulkanlineargradientpipeline.c13
-rw-r--r--gsk/vulkan/gskvulkanlineargradientpipelineprivate.h1
-rw-r--r--gsk/vulkan/gskvulkanpushconstants.c2
-rw-r--r--gsk/vulkan/gskvulkanrenderpass.c129
-rw-r--r--gsk/vulkan/gskvulkantextpipelineprivate.h28
-rw-r--r--gsk/vulkan/gskvulkantexturepipeline.c5
-rw-r--r--gsk/vulkan/gskvulkantexturepipelineprivate.h1
-rw-r--r--gtk/inspector/recorder.c2
-rw-r--r--testsuite/gsk/rounded-rect.c9
25 files changed, 182 insertions, 86 deletions
diff --git a/gsk/gskroundedrect.c b/gsk/gskroundedrect.c
index 7c0733fbe9..ed1131de83 100644
--- a/gsk/gskroundedrect.c
+++ b/gsk/gskroundedrect.c
@@ -766,13 +766,14 @@ gsk_rounded_rect_path (const GskRoundedRect *self,
* only look at the last vec4 if they have to.
*/
void
-gsk_rounded_rect_to_float (const GskRoundedRect *self,
- float rect[12])
+gsk_rounded_rect_to_float (const GskRoundedRect *self,
+ const graphene_point_t *offset,
+ float rect[12])
{
guint i;
- rect[0] = self->bounds.origin.x;
- rect[1] = self->bounds.origin.y;
+ rect[0] = self->bounds.origin.x + offset->x;
+ rect[1] = self->bounds.origin.y + offset->y;
rect[2] = self->bounds.size.width;
rect[3] = self->bounds.size.height;
diff --git a/gsk/gskroundedrectprivate.h b/gsk/gskroundedrectprivate.h
index b9afb754cc..c42906d53a 100644
--- a/gsk/gskroundedrectprivate.h
+++ b/gsk/gskroundedrectprivate.h
@@ -28,6 +28,7 @@ gboolean gsk_rounded_rect_is_circular (const GskRounde
void gsk_rounded_rect_path (const GskRoundedRect *self,
cairo_t *cr);
void gsk_rounded_rect_to_float (const GskRoundedRect *self,
+ const graphene_point_t *offset,
float rect[12]);
gboolean gsk_rounded_rect_equal (gconstpointer rect1,
diff --git a/gsk/vulkan/gskvulkanblendmodepipeline.c b/gsk/vulkan/gskvulkanblendmodepipeline.c
index 117ed414d5..1e6943d9dc 100644
--- a/gsk/vulkan/gskvulkanblendmodepipeline.c
+++ b/gsk/vulkan/gskvulkanblendmodepipeline.c
@@ -106,16 +106,17 @@ gsk_vulkan_blend_mode_pipeline_count_vertex_data (GskVulkanBlendModePipeline *pi
void
gsk_vulkan_blend_mode_pipeline_collect_vertex_data (GskVulkanBlendModePipeline *pipeline,
- guchar *data,
- const graphene_rect_t *bounds,
- const graphene_rect_t *start_tex_rect,
- const graphene_rect_t *end_tex_rect,
- GskBlendMode blend_mode)
+ guchar *data,
+ const graphene_point_t *offset,
+ const graphene_rect_t *bounds,
+ const graphene_rect_t *start_tex_rect,
+ const graphene_rect_t *end_tex_rect,
+ GskBlendMode blend_mode)
{
GskVulkanBlendModeInstance *instance = (GskVulkanBlendModeInstance *) data;
- instance->rect[0] = bounds->origin.x;
- instance->rect[1] = bounds->origin.y;
+ instance->rect[0] = bounds->origin.x + offset->x;
+ instance->rect[1] = bounds->origin.y + offset->y;
instance->rect[2] = bounds->size.width;
instance->rect[3] = bounds->size.height;
diff --git a/gsk/vulkan/gskvulkanblendmodepipelineprivate.h b/gsk/vulkan/gskvulkanblendmodepipelineprivate.h
index 6382ed73e5..3a018b7ef3 100644
--- a/gsk/vulkan/gskvulkanblendmodepipelineprivate.h
+++ b/gsk/vulkan/gskvulkanblendmodepipelineprivate.h
@@ -21,6 +21,7 @@ GskVulkanPipeline * gsk_vulkan_blend_mode_pipeline_new (GdkVulka
gsize gsk_vulkan_blend_mode_pipeline_count_vertex_data (GskVulkanBlendModePipeline *pipeline);
void gsk_vulkan_blend_mode_pipeline_collect_vertex_data (GskVulkanBlendModePipeline *pipeline,
guchar *data,
+ const graphene_point_t *offset,
const graphene_rect_t *bounds,
const graphene_rect_t *start_bounds,
const graphene_rect_t *end_bounds,
diff --git a/gsk/vulkan/gskvulkanblurpipeline.c b/gsk/vulkan/gskvulkanblurpipeline.c
index 5686e5423a..8d596d3227 100644
--- a/gsk/vulkan/gskvulkanblurpipeline.c
+++ b/gsk/vulkan/gskvulkanblurpipeline.c
@@ -98,16 +98,17 @@ gsk_vulkan_blur_pipeline_count_vertex_data (GskVulkanBlurPipeline *pipeline)
}
void
-gsk_vulkan_blur_pipeline_collect_vertex_data (GskVulkanBlurPipeline *pipeline,
- guchar *data,
- const graphene_rect_t *rect,
- const graphene_rect_t *tex_rect,
- double blur_radius)
+gsk_vulkan_blur_pipeline_collect_vertex_data (GskVulkanBlurPipeline *pipeline,
+ guchar *data,
+ const graphene_point_t *offset,
+ const graphene_rect_t *rect,
+ const graphene_rect_t *tex_rect,
+ double blur_radius)
{
GskVulkanBlurInstance *instance = (GskVulkanBlurInstance *) data;
- instance->rect[0] = rect->origin.x;
- instance->rect[1] = rect->origin.y;
+ instance->rect[0] = rect->origin.x + offset->x;
+ instance->rect[1] = rect->origin.y + offset->y;
instance->rect[2] = rect->size.width;
instance->rect[3] = rect->size.height;
instance->tex_rect[0] = tex_rect->origin.x;
diff --git a/gsk/vulkan/gskvulkanblurpipelineprivate.h b/gsk/vulkan/gskvulkanblurpipelineprivate.h
index 74db815b08..b806ed5501 100644
--- a/gsk/vulkan/gskvulkanblurpipelineprivate.h
+++ b/gsk/vulkan/gskvulkanblurpipelineprivate.h
@@ -20,6 +20,7 @@ GskVulkanPipeline * gsk_vulkan_blur_pipeline_new (GdkVulka
gsize gsk_vulkan_blur_pipeline_count_vertex_data (GskVulkanBlurPipeline *pipeline);
void gsk_vulkan_blur_pipeline_collect_vertex_data (GskVulkanBlurPipeline *pipeline,
guchar *data,
+ const graphene_point_t *offset,
const graphene_rect_t *rect,
const graphene_rect_t *tex_rect,
double radius);
diff --git a/gsk/vulkan/gskvulkanborderpipeline.c b/gsk/vulkan/gskvulkanborderpipeline.c
index a0da43962b..dfd0442a62 100644
--- a/gsk/vulkan/gskvulkanborderpipeline.c
+++ b/gsk/vulkan/gskvulkanborderpipeline.c
@@ -132,6 +132,7 @@ gsk_vulkan_border_pipeline_count_vertex_data (GskVulkanBorderPipeline *pipeline)
void
gsk_vulkan_border_pipeline_collect_vertex_data (GskVulkanBorderPipeline *pipeline,
guchar *data,
+ const graphene_point_t *offset,
const GskRoundedRect *rect,
const float widths[4],
const GdkRGBA colors[4])
@@ -139,7 +140,7 @@ gsk_vulkan_border_pipeline_collect_vertex_data (GskVulkanBorderPipeline *pipelin
GskVulkanBorderInstance *instance = (GskVulkanBorderInstance *) data;
guint i;
- gsk_rounded_rect_to_float (rect, instance->rect);
+ gsk_rounded_rect_to_float (rect, offset, instance->rect);
for (i = 0; i < 4; i++)
{
instance->widths[i] = widths[i];
diff --git a/gsk/vulkan/gskvulkanborderpipelineprivate.h b/gsk/vulkan/gskvulkanborderpipelineprivate.h
index 423860bfe2..c10976e704 100644
--- a/gsk/vulkan/gskvulkanborderpipelineprivate.h
+++ b/gsk/vulkan/gskvulkanborderpipelineprivate.h
@@ -21,6 +21,7 @@ GskVulkanPipeline * gsk_vulkan_border_pipeline_new (GdkVulk
gsize gsk_vulkan_border_pipeline_count_vertex_data (GskVulkanBorderPipeline *pipeline);
void gsk_vulkan_border_pipeline_collect_vertex_data (GskVulkanBorderPipeline *pipeline,
guchar *data,
+ const graphene_point_t *offset,
const GskRoundedRect *rect,
const float widths[4],
const GdkRGBA colors[4]);
diff --git a/gsk/vulkan/gskvulkanboxshadowpipeline.c b/gsk/vulkan/gskvulkanboxshadowpipeline.c
index fb272176d4..b4940a97ab 100644
--- a/gsk/vulkan/gskvulkanboxshadowpipeline.c
+++ b/gsk/vulkan/gskvulkanboxshadowpipeline.c
@@ -128,6 +128,7 @@ gsk_vulkan_box_shadow_pipeline_count_vertex_data (GskVulkanBoxShadowPipeline *pi
void
gsk_vulkan_box_shadow_pipeline_collect_vertex_data (GskVulkanBoxShadowPipeline *pipeline,
guchar *data,
+ const graphene_point_t *offset,
const GskRoundedRect *outline,
const GdkRGBA *color,
float dx,
@@ -137,7 +138,7 @@ gsk_vulkan_box_shadow_pipeline_collect_vertex_data (GskVulkanBoxShadowPipeline *
{
GskVulkanBoxShadowInstance *instance = (GskVulkanBoxShadowInstance *) data;
- gsk_rounded_rect_to_float (outline, instance->outline);
+ gsk_rounded_rect_to_float (outline, offset, instance->outline);
instance->color[0] = color->red;
instance->color[1] = color->green;
instance->color[2] = color->blue;
diff --git a/gsk/vulkan/gskvulkanboxshadowpipelineprivate.h b/gsk/vulkan/gskvulkanboxshadowpipelineprivate.h
index c8a55c1204..7db8d1f9eb 100644
--- a/gsk/vulkan/gskvulkanboxshadowpipelineprivate.h
+++ b/gsk/vulkan/gskvulkanboxshadowpipelineprivate.h
@@ -21,6 +21,7 @@ GskVulkanPipeline * gsk_vulkan_box_shadow_pipeline_new (GdkVulk
gsize gsk_vulkan_box_shadow_pipeline_count_vertex_data (GskVulkanBoxShadowPipeline *pipeline);
void gsk_vulkan_box_shadow_pipeline_collect_vertex_data (GskVulkanBoxShadowPipeline *pipeline,
guchar *data,
+ const graphene_point_t *offset,
const GskRoundedRect *outline,
const GdkRGBA *color,
float dx,
diff --git a/gsk/vulkan/gskvulkancolorpipeline.c b/gsk/vulkan/gskvulkancolorpipeline.c
index cd6867a1a4..b2e548e110 100644
--- a/gsk/vulkan/gskvulkancolorpipeline.c
+++ b/gsk/vulkan/gskvulkancolorpipeline.c
@@ -93,13 +93,14 @@ gsk_vulkan_color_pipeline_count_vertex_data (GskVulkanColorPipeline *pipeline)
void
gsk_vulkan_color_pipeline_collect_vertex_data (GskVulkanColorPipeline *pipeline,
guchar *data,
+ const graphene_point_t *offset,
const graphene_rect_t *rect,
const GdkRGBA *color)
{
GskVulkanColorInstance *instance = (GskVulkanColorInstance *) data;
- instance->rect[0] = rect->origin.x;
- instance->rect[1] = rect->origin.y;
+ instance->rect[0] = rect->origin.x + offset->x;
+ instance->rect[1] = rect->origin.y + offset->y;
instance->rect[2] = rect->size.width;
instance->rect[3] = rect->size.height;
instance->color[0] = color->red;
diff --git a/gsk/vulkan/gskvulkancolorpipelineprivate.h b/gsk/vulkan/gskvulkancolorpipelineprivate.h
index bf9280b26c..8c2ec5454d 100644
--- a/gsk/vulkan/gskvulkancolorpipelineprivate.h
+++ b/gsk/vulkan/gskvulkancolorpipelineprivate.h
@@ -20,6 +20,7 @@ GskVulkanPipeline * gsk_vulkan_color_pipeline_new (GdkVulk
gsize gsk_vulkan_color_pipeline_count_vertex_data (GskVulkanColorPipeline *pipeline);
void gsk_vulkan_color_pipeline_collect_vertex_data (GskVulkanColorPipeline *pipeline,
guchar *data,
+ const graphene_point_t *offset,
const graphene_rect_t *rect,
const GdkRGBA *color);
gsize gsk_vulkan_color_pipeline_draw (GskVulkanColorPipeline *pipeline,
diff --git a/gsk/vulkan/gskvulkancrossfadepipeline.c b/gsk/vulkan/gskvulkancrossfadepipeline.c
index 679c583c6e..7452b8681b 100644
--- a/gsk/vulkan/gskvulkancrossfadepipeline.c
+++ b/gsk/vulkan/gskvulkancrossfadepipeline.c
@@ -106,16 +106,17 @@ gsk_vulkan_cross_fade_pipeline_count_vertex_data (GskVulkanCrossFadePipeline *pi
void
gsk_vulkan_cross_fade_pipeline_collect_vertex_data (GskVulkanCrossFadePipeline *pipeline,
- guchar *data,
- const graphene_rect_t *bounds,
- const graphene_rect_t *start_tex_rect,
- const graphene_rect_t *end_tex_rect,
- double progress)
+ guchar *data,
+ const graphene_point_t *offset,
+ const graphene_rect_t *bounds,
+ const graphene_rect_t *start_tex_rect,
+ const graphene_rect_t *end_tex_rect,
+ double progress)
{
GskVulkanCrossFadeInstance *instance = (GskVulkanCrossFadeInstance *) data;
- instance->rect[0] = bounds->origin.x;
- instance->rect[1] = bounds->origin.y;
+ instance->rect[0] = bounds->origin.x + offset->x;
+ instance->rect[1] = bounds->origin.y + offset->y;
instance->rect[2] = bounds->size.width;
instance->rect[3] = bounds->size.height;
diff --git a/gsk/vulkan/gskvulkancrossfadepipelineprivate.h b/gsk/vulkan/gskvulkancrossfadepipelineprivate.h
index 92551c5d46..eee69d6acf 100644
--- a/gsk/vulkan/gskvulkancrossfadepipelineprivate.h
+++ b/gsk/vulkan/gskvulkancrossfadepipelineprivate.h
@@ -20,6 +20,7 @@ GskVulkanPipeline * gsk_vulkan_cross_fade_pipeline_new (GdkVulka
gsize gsk_vulkan_cross_fade_pipeline_count_vertex_data (GskVulkanCrossFadePipeline *pipeline);
void gsk_vulkan_cross_fade_pipeline_collect_vertex_data (GskVulkanCrossFadePipeline *pipeline,
guchar *data,
+ const graphene_point_t *offset,
const graphene_rect_t *bounds,
const graphene_rect_t *start_bounds,
const graphene_rect_t *end_bounds,
diff --git a/gsk/vulkan/gskvulkaneffectpipeline.c b/gsk/vulkan/gskvulkaneffectpipeline.c
index aa9973c711..559eb038e7 100644
--- a/gsk/vulkan/gskvulkaneffectpipeline.c
+++ b/gsk/vulkan/gskvulkaneffectpipeline.c
@@ -125,6 +125,7 @@ gsk_vulkan_effect_pipeline_count_vertex_data (GskVulkanEffectPipeline *pipeline)
void
gsk_vulkan_effect_pipeline_collect_vertex_data (GskVulkanEffectPipeline *pipeline,
guchar *data,
+ const graphene_point_t *offset,
const graphene_rect_t *rect,
const graphene_rect_t *tex_rect,
const graphene_matrix_t *color_matrix,
@@ -132,8 +133,8 @@ gsk_vulkan_effect_pipeline_collect_vertex_data (GskVulkanEffectPipeline *pipelin
{
GskVulkanEffectInstance *instance = (GskVulkanEffectInstance *) data;
- instance->rect[0] = rect->origin.x;
- instance->rect[1] = rect->origin.y;
+ instance->rect[0] = rect->origin.x + offset->x;
+ instance->rect[1] = rect->origin.y + offset->y;
instance->rect[2] = rect->size.width;
instance->rect[3] = rect->size.height;
instance->tex_rect[0] = tex_rect->origin.x;
diff --git a/gsk/vulkan/gskvulkaneffectpipelineprivate.h b/gsk/vulkan/gskvulkaneffectpipelineprivate.h
index b08ea07e15..cb4dca445f 100644
--- a/gsk/vulkan/gskvulkaneffectpipelineprivate.h
+++ b/gsk/vulkan/gskvulkaneffectpipelineprivate.h
@@ -20,6 +20,7 @@ GskVulkanPipeline * gsk_vulkan_effect_pipeline_new (GdkVulk
gsize gsk_vulkan_effect_pipeline_count_vertex_data (GskVulkanEffectPipeline *pipeline);
void gsk_vulkan_effect_pipeline_collect_vertex_data (GskVulkanEffectPipeline *pipeline,
guchar *data,
+ const graphene_point_t *offset,
const graphene_rect_t *rect,
const graphene_rect_t *tex_rect,
const graphene_matrix_t *color_matrix,
diff --git a/gsk/vulkan/gskvulkanlineargradientpipeline.c b/gsk/vulkan/gskvulkanlineargradientpipeline.c
index 058a2f8416..bf4b54af7d 100644
--- a/gsk/vulkan/gskvulkanlineargradientpipeline.c
+++ b/gsk/vulkan/gskvulkanlineargradientpipeline.c
@@ -176,6 +176,7 @@ gsk_vulkan_linear_gradient_pipeline_count_vertex_data (GskVulkanLinearGradientPi
void
gsk_vulkan_linear_gradient_pipeline_collect_vertex_data (GskVulkanLinearGradientPipeline *pipeline,
guchar *data,
+ const graphene_point_t *offset,
const graphene_rect_t *rect,
const graphene_point_t *start,
const graphene_point_t *end,
@@ -191,14 +192,14 @@ gsk_vulkan_linear_gradient_pipeline_collect_vertex_data (GskVulkanLinearGradient
g_warning ("Only %u color stops supported.", GSK_VULKAN_LINEAR_GRADIENT_PIPELINE_MAX_COLOR_STOPS);
n_stops = GSK_VULKAN_LINEAR_GRADIENT_PIPELINE_MAX_COLOR_STOPS;
}
- instance->rect[0] = rect->origin.x;
- instance->rect[1] = rect->origin.y;
+ instance->rect[0] = rect->origin.x + offset->x;
+ instance->rect[1] = rect->origin.y + offset->y;
instance->rect[2] = rect->size.width;
instance->rect[3] = rect->size.height;
- instance->start[0] = start->x;
- instance->start[1] = start->y;
- instance->end[0] = end->x;
- instance->end[1] = end->y;
+ instance->start[0] = start->x + offset->x;
+ instance->start[1] = start->y + offset->y;
+ instance->end[0] = end->x + offset->x;
+ instance->end[1] = end->y + offset->y;
instance->repeating = repeating;
instance->stop_count = n_stops;
for (i = 0; i < n_stops; i++)
diff --git a/gsk/vulkan/gskvulkanlineargradientpipelineprivate.h b/gsk/vulkan/gskvulkanlineargradientpipelineprivate.h
index 176cd92a70..fa60c73cd3 100644
--- a/gsk/vulkan/gskvulkanlineargradientpipelineprivate.h
+++ b/gsk/vulkan/gskvulkanlineargradientpipelineprivate.h
@@ -25,6 +25,7 @@ gsize gsk_vulkan_linear_gradient_pipeline_count_vertex_data
void gsk_vulkan_linear_gradient_pipeline_collect_vertex_data
(GskVulkanLinearGradientPipeline*pipeline,
guchar *data,
+ const graphene_point_t *offset,
const graphene_rect_t *rect,
const graphene_point_t *start,
const graphene_point_t *end,
diff --git a/gsk/vulkan/gskvulkanpushconstants.c b/gsk/vulkan/gskvulkanpushconstants.c
index e2bf63326b..36ba9852a6 100644
--- a/gsk/vulkan/gskvulkanpushconstants.c
+++ b/gsk/vulkan/gskvulkanpushconstants.c
@@ -78,7 +78,7 @@ gsk_vulkan_push_constants_wire_init (GskVulkanPushConstantsWire *wire,
const GskVulkanPushConstants *self)
{
graphene_matrix_to_float (&self->mvp, wire->common.mvp);
- gsk_rounded_rect_to_float (&self->clip.rect, wire->common.clip);
+ gsk_rounded_rect_to_float (&self->clip.rect, graphene_point_zero (), wire->common.clip);
}
void
diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c
index d890c36fab..9cbd0b8a78 100644
--- a/gsk/vulkan/gskvulkanrenderpass.c
+++ b/gsk/vulkan/gskvulkanrenderpass.c
@@ -63,6 +63,7 @@ struct _GskVulkanOpRender
{
GskVulkanOpType type;
GskRenderNode *node; /* node that's the source of this op */
+ graphene_point_t offset; /* offset of the node */
GskVulkanPipeline *pipeline; /* pipeline to use */
GskRoundedRect clip; /* clip rect (or random memory if not relevant) */
GskVulkanImage *source; /* source image to render */
@@ -79,6 +80,7 @@ struct _GskVulkanOpText
{
GskVulkanOpType type;
GskRenderNode *node; /* node that's the source of this op */
+ graphene_point_t offset; /* offset of the node */
GskVulkanPipeline *pipeline; /* pipeline to use */
GskRoundedRect clip; /* clip rect (or random memory if not relevant) */
GskVulkanImage *source; /* source image to render */
@@ -117,6 +119,7 @@ struct _GskVulkanRenderPass
cairo_region_t *clip;
graphene_vec2_t scale;
+ graphene_point_t offset;
VkRenderPass render_pass;
VkSemaphore signal_semaphore;
@@ -247,7 +250,8 @@ gsk_vulkan_render_pass_add_fallback_node (GskVulkanRenderPass *self,
GskRenderNode *node)
{
GskVulkanOp op = {
- .render.node = node
+ .render.node = node,
+ .render.offset = self->offset,
};
switch (constants->clip.type)
@@ -321,7 +325,8 @@ gsk_vulkan_render_pass_add_color_node (GskVulkanRenderPass *self,
GskRenderNode *node)
{
GskVulkanOp op = {
- .render.node = node
+ .render.node = node,
+ .render.offset = self->offset,
};
GskVulkanPipelineType pipeline_type;
@@ -349,7 +354,8 @@ gsk_vulkan_render_pass_add_repeating_linear_gradient_node (GskVulkanRenderPass
{
GskVulkanPipelineType pipeline_type;
GskVulkanOp op = {
- .render.node = node
+ .render.node = node,
+ .render.offset = self->offset,
};
if (gsk_linear_gradient_node_get_n_color_stops (node) > GSK_VULKAN_LINEAR_GRADIENT_PIPELINE_MAX_COLOR_STOPS)
@@ -381,7 +387,8 @@ gsk_vulkan_render_pass_add_border_node (GskVulkanRenderPass *self,
{
GskVulkanPipelineType pipeline_type;
GskVulkanOp op = {
- .render.node = node
+ .render.node = node,
+ .render.offset = self->offset,
};
if (gsk_vulkan_clip_contains_rect (&constants->clip, &node->bounds))
@@ -408,7 +415,8 @@ gsk_vulkan_render_pass_add_texture_node (GskVulkanRenderPass *self,
{
GskVulkanPipelineType pipeline_type;
GskVulkanOp op = {
- .render.node = node
+ .render.node = node,
+ .render.offset = self->offset,
};
if (gsk_vulkan_clip_contains_rect (&constants->clip, &node->bounds))
@@ -435,7 +443,8 @@ gsk_vulkan_render_pass_add_inset_shadow_node (GskVulkanRenderPass *self
{
GskVulkanPipelineType pipeline_type;
GskVulkanOp op = {
- .render.node = node
+ .render.node = node,
+ .render.offset = self->offset,
};
if (gsk_inset_shadow_node_get_blur_radius (node) > 0)
@@ -464,7 +473,8 @@ gsk_vulkan_render_pass_add_outset_shadow_node (GskVulkanRenderPass *sel
{
GskVulkanPipelineType pipeline_type;
GskVulkanOp op = {
- .render.node = node
+ .render.node = node,
+ .render.offset = self->offset,
};
if (gsk_outset_shadow_node_get_blur_radius (node) > 0)
@@ -492,11 +502,13 @@ gsk_vulkan_render_pass_add_transform_node (GskVulkanRenderPass *self,
GskRenderNode *node)
{
GskVulkanOp op = {
- .render.node = node
+ .render.node = node,
+ .render.offset = self->offset,
};
GskRenderNode *child;
GskTransform *transform;
graphene_vec2_t old_scale;
+ graphene_point_t old_offset;
float scale_x;
float scale_y;
graphene_vec2_t scale;
@@ -506,14 +518,23 @@ gsk_vulkan_render_pass_add_transform_node (GskVulkanRenderPass *self,
FALLBACK ("Transform nodes can't deal with clip type %u\n", clip->type);
#endif
+ child = gsk_transform_node_get_child (node);
transform = gsk_transform_node_get_transform (node);
switch (gsk_transform_get_category (transform))
{
case GSK_TRANSFORM_CATEGORY_IDENTITY:
case GSK_TRANSFORM_CATEGORY_2D_TRANSLATE:
- scale_x = scale_y = 1;
- break;
+ {
+ float dx, dy;
+ gsk_transform_to_translate (transform, &dx, &dy);
+ self->offset.x += dx;
+ self->offset.y += dy;
+ gsk_vulkan_render_pass_add_node (self, render, constants, child);
+ self->offset.x -= dx;
+ self->offset.y -= dy;
+ }
+ return TRUE;
case GSK_TRANSFORM_CATEGORY_2D_AFFINE:
{
@@ -562,13 +583,16 @@ gsk_vulkan_render_pass_add_transform_node (GskVulkanRenderPass *self,
break;
}
- child = gsk_transform_node_get_child (node);
+ transform = gsk_transform_transform (gsk_transform_translate (NULL, &self->offset),
+ transform);
if (!gsk_vulkan_push_constants_transform (&op.constants.constants, constants, transform, &child->bounds))
FALLBACK ("Transform nodes can't deal with clip type %u", constants->clip.type);
op.type = GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS;
g_array_append_val (self->render_ops, op);
+ old_offset = self->offset;
+ self->offset = *graphene_point_zero ();
graphene_vec2_init_from_vec2 (&old_scale, &self->scale);
graphene_vec2_init (&scale, fabs (scale_x), fabs (scale_y));
graphene_vec2_multiply (&self->scale, &scale, &self->scale);
@@ -579,6 +603,9 @@ gsk_vulkan_render_pass_add_transform_node (GskVulkanRenderPass *self,
g_array_append_val (self->render_ops, op);
graphene_vec2_init_from_vec2 (&self->scale, &old_scale);
+ self->offset = old_offset;
+
+ gsk_transform_unref (transform);
return TRUE;
}
@@ -591,7 +618,8 @@ gsk_vulkan_render_pass_add_opacity_node (GskVulkanRenderPass *self,
{
GskVulkanPipelineType pipeline_type;
GskVulkanOp op = {
- .render.node = node
+ .render.node = node,
+ .render.offset = self->offset,
};
if (gsk_vulkan_clip_contains_rect (&constants->clip, &node->bounds))
@@ -618,7 +646,8 @@ gsk_vulkan_render_pass_add_color_matrix_node (GskVulkanRenderPass *self
{
GskVulkanPipelineType pipeline_type;
GskVulkanOp op = {
- .render.node = node
+ .render.node = node,
+ .render.offset = self->offset,
};
if (gsk_vulkan_clip_contains_rect (&constants->clip, &node->bounds))
@@ -644,10 +673,16 @@ gsk_vulkan_render_pass_add_clip_node (GskVulkanRenderPass *self,
GskRenderNode *node)
{
GskVulkanOp op = {
- .render.node = node
+ .render.node = node,
+ .render.offset = self->offset,
};
+ graphene_rect_t clip;
+
+ graphene_rect_offset_r (gsk_clip_node_get_clip (node),
+ self->offset.x, self->offset.y,
+ &clip);
- if (!gsk_vulkan_push_constants_intersect_rect (&op.constants.constants, constants, gsk_clip_node_get_clip (node)))
+ if (!gsk_vulkan_push_constants_intersect_rect (&op.constants.constants, constants, &clip))
FALLBACK ("Failed to find intersection between clip of type %u and rectangle", constants->clip.type);
if (op.constants.constants.clip.type == GSK_VULKAN_CLIP_ALL_CLIPPED)
@@ -671,12 +706,15 @@ gsk_vulkan_render_pass_add_rounded_clip_node (GskVulkanRenderPass *self
GskRenderNode *node)
{
GskVulkanOp op = {
- .render.node = node
+ .render.node = node,
+ .render.offset = self->offset,
};
+ GskRoundedRect clip;
- if (!gsk_vulkan_push_constants_intersect_rounded (&op.constants.constants,
- constants,
- gsk_rounded_clip_node_get_clip (node)))
+ clip = *gsk_rounded_clip_node_get_clip (node);
+ gsk_rounded_rect_offset (&clip, self->offset.x, self->offset.y);
+
+ if (!gsk_vulkan_push_constants_intersect_rounded (&op.constants.constants, constants, &clip))
FALLBACK ("Failed to find intersection between clip of type %u and rounded rectangle", constants->clip.type);
if (op.constants.constants.clip.type == GSK_VULKAN_CLIP_ALL_CLIPPED)
@@ -701,7 +739,8 @@ gsk_vulkan_render_pass_add_repeat_node (GskVulkanRenderPass *self,
{
GskVulkanPipelineType pipeline_type;
GskVulkanOp op = {
- .render.node = node
+ .render.node = node,
+ .render.offset = self->offset,
};
if (graphene_rect_get_area (gsk_repeat_node_get_child_bounds (node)) == 0)
@@ -731,7 +770,8 @@ gsk_vulkan_render_pass_add_blend_node (GskVulkanRenderPass *self,
{
GskVulkanPipelineType pipeline_type;
GskVulkanOp op = {
- .render.node = node
+ .render.node = node,
+ .render.offset = self->offset,
};
if (gsk_vulkan_clip_contains_rect (&constants->clip, &node->bounds))
@@ -757,7 +797,8 @@ gsk_vulkan_render_pass_add_cross_fade_node (GskVulkanRenderPass *self,
GskRenderNode *node)
{
GskVulkanOp op = {
- .render.node = node
+ .render.node = node,
+ .render.offset = self->offset,
};
GskVulkanPipelineType pipeline_type;
@@ -784,7 +825,8 @@ gsk_vulkan_render_pass_add_text_node (GskVulkanRenderPass *self,
GskRenderNode *node)
{
GskVulkanOp op = {
- .render.node = node
+ .render.node = node,
+ .render.offset = self->offset,
};
GskVulkanPipelineType pipeline_type;
const PangoGlyphInfo *glyphs;
@@ -877,7 +919,8 @@ gsk_vulkan_render_pass_add_blur_node (GskVulkanRenderPass *self,
{
GskVulkanPipelineType pipeline_type;
GskVulkanOp op = {
- .render.node = node
+ .render.node = node,
+ .render.offset = self->offset,
};
if (gsk_vulkan_clip_contains_rect (&constants->clip, &node->bounds))
@@ -1001,6 +1044,8 @@ gsk_vulkan_render_pass_add (GskVulkanRenderPass *self,
g_array_append_val (self->render_ops, op);
gsk_vulkan_render_pass_add_node (self, render, &op.constants.constants, node);
+
+ self->offset = GRAPHENE_POINT_INIT (0, 0);
}
static GskVulkanImage *
@@ -1207,13 +1252,17 @@ gsk_vulkan_render_pass_upload_fallback (GskVulkanRenderPass *self,
if (op->type == GSK_VULKAN_OP_FALLBACK_CLIP)
{
cairo_rectangle (cr,
- op->clip.bounds.origin.x, op->clip.bounds.origin.y,
- op->clip.bounds.size.width, op->clip.bounds.size.height);
+ op->clip.bounds.origin.x - op->offset.x,
+ op->clip.bounds.origin.y - op->offset.y,
+ op->clip.bounds.size.width,
+ op->clip.bounds.size.height);
cairo_clip (cr);
}
else if (op->type == GSK_VULKAN_OP_FALLBACK_ROUNDED_CLIP)
{
+ cairo_translate (cr, - op->offset.x, - op->offset.y);
gsk_rounded_rect_path (&op->clip, cr);
+ cairo_translate (cr, op->offset.x, op->offset.y);
cairo_clip (cr);
}
else
@@ -1227,8 +1276,10 @@ gsk_vulkan_render_pass_upload_fallback (GskVulkanRenderPass *self,
if (GSK_RENDERER_DEBUG_CHECK (gsk_vulkan_render_get_renderer (render), FALLBACK))
{
cairo_rectangle (cr,
- op->clip.bounds.origin.x, op->clip.bounds.origin.y,
- op->clip.bounds.size.width, op->clip.bounds.size.height);
+ op->clip.bounds.origin.x - op->offset.x,
+ op->clip.bounds.origin.y - op->offset.y,
+ op->clip.bounds.size.width,
+ op->clip.bounds.size.height);
if (gsk_render_node_get_node_type (node) == GSK_CAIRO_NODE)
cairo_set_source_rgba (cr, 0.3, 0, 1, 0.25);
else
@@ -1579,6 +1630,7 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
op->render.vertex_offset = offset + n_bytes;
gsk_vulkan_texture_pipeline_collect_vertex_data (GSK_VULKAN_TEXTURE_PIPELINE (op->render.pipeline),
data + n_bytes + offset,
+ &op->render.offset,
&op->render.node->bounds,
&op->render.source_rect);
n_bytes += op->render.vertex_count;
@@ -1590,6 +1642,7 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
op->render.vertex_offset = offset + n_bytes;
gsk_vulkan_texture_pipeline_collect_vertex_data (GSK_VULKAN_TEXTURE_PIPELINE (op->render.pipeline),
data + n_bytes + offset,
+ &op->render.offset,
&op->render.node->bounds,
&op->render.source_rect);
n_bytes += op->render.vertex_count;
@@ -1607,7 +1660,10 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
gsk_text_node_get_num_glyphs (op->text.node),
gsk_text_node_get_glyphs (op->text.node, NULL),
gsk_text_node_get_color (op->text.node),
- gsk_text_node_get_offset (op->text.node),
+ &GRAPHENE_POINT_INIT (
+ gsk_text_node_get_offset (op->text.node)->x + op->render.offset.x,
+ gsk_text_node_get_offset (op->text.node)->y + op->render.offset.y
+ ),
op->text.start_glyph,
op->text.num_glyphs,
op->text.scale);
@@ -1625,7 +1681,10 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
(PangoFont *)gsk_text_node_get_font (op->text.node),
gsk_text_node_get_num_glyphs (op->text.node),
gsk_text_node_get_glyphs (op->text.node, NULL),
- gsk_text_node_get_offset (op->text.node),
+ &GRAPHENE_POINT_INIT (
+ gsk_text_node_get_offset (op->text.node)->x + op->render.offset.x,
+ gsk_text_node_get_offset (op->text.node)->y + op->render.offset.y
+ ),
op->text.start_glyph,
op->text.num_glyphs,
op->text.scale);
@@ -1638,6 +1697,7 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
op->render.vertex_offset = offset + n_bytes;
gsk_vulkan_color_pipeline_collect_vertex_data (GSK_VULKAN_COLOR_PIPELINE (op->render.pipeline),
data + n_bytes + offset,
+ &op->render.offset,
&op->render.node->bounds,
gsk_color_node_get_color (op->render.node));
n_bytes += op->render.vertex_count;
@@ -1649,6 +1709,7 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
op->render.vertex_offset = offset + n_bytes;
gsk_vulkan_linear_gradient_pipeline_collect_vertex_data (GSK_VULKAN_LINEAR_GRADIENT_PIPELINE (op->render.pipeline),
data + n_bytes + offset,
+ &op->render.offset,
&op->render.node->bounds,
gsk_linear_gradient_node_get_start (op->render.node),
gsk_linear_gradient_node_get_end (op->render.node),
@@ -1676,6 +1737,7 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
gsk_vulkan_effect_pipeline_collect_vertex_data (GSK_VULKAN_EFFECT_PIPELINE (op->render.pipeline),
data + n_bytes + offset,
+ &op->render.offset,
&op->render.node->bounds,
&op->render.source_rect,
&color_matrix,
@@ -1689,6 +1751,7 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
op->render.vertex_offset = offset + n_bytes;
gsk_vulkan_blur_pipeline_collect_vertex_data (GSK_VULKAN_BLUR_PIPELINE (op->render.pipeline),
data + n_bytes + offset,
+ &op->render.offset,
&op->render.node->bounds,
&op->render.source_rect,
gsk_blur_node_get_radius (op->render.node));
@@ -1701,6 +1764,7 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
op->render.vertex_offset = offset + n_bytes;
gsk_vulkan_effect_pipeline_collect_vertex_data (GSK_VULKAN_EFFECT_PIPELINE (op->render.pipeline),
data + n_bytes + offset,
+ &op->render.offset,
&op->render.node->bounds,
&op->render.source_rect,
gsk_color_matrix_node_get_color_matrix (op->render.node),
@@ -1714,6 +1778,7 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
op->render.vertex_offset = offset + n_bytes;
gsk_vulkan_border_pipeline_collect_vertex_data (GSK_VULKAN_BORDER_PIPELINE (op->render.pipeline),
data + n_bytes + offset,
+ &op->render.offset,
gsk_border_node_get_outline (op->render.node),
gsk_border_node_get_widths (op->render.node),
gsk_border_node_get_colors (op->render.node));
@@ -1726,6 +1791,7 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
op->render.vertex_offset = offset + n_bytes;
gsk_vulkan_box_shadow_pipeline_collect_vertex_data (GSK_VULKAN_BOX_SHADOW_PIPELINE (op->render.pipeline),
data + n_bytes + offset,
+ &op->render.offset,
gsk_inset_shadow_node_get_outline (op->render.node),
gsk_inset_shadow_node_get_color (op->render.node),
gsk_inset_shadow_node_get_dx (op->render.node),
@@ -1741,6 +1807,7 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
op->render.vertex_offset = offset + n_bytes;
gsk_vulkan_box_shadow_pipeline_collect_vertex_data (GSK_VULKAN_BOX_SHADOW_PIPELINE (op->render.pipeline),
data + n_bytes + offset,
+ &op->render.offset,
gsk_outset_shadow_node_get_outline (op->render.node),
gsk_outset_shadow_node_get_color (op->render.node),
gsk_outset_shadow_node_get_dx (op->render.node),
@@ -1756,6 +1823,7 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
op->render.vertex_offset = offset + n_bytes;
gsk_vulkan_cross_fade_pipeline_collect_vertex_data (GSK_VULKAN_CROSS_FADE_PIPELINE (op->render.pipeline),
data + n_bytes + offset,
+ &op->render.offset,
&op->render.node->bounds,
&op->render.source_rect,
&op->render.source2_rect,
@@ -1769,6 +1837,7 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
op->render.vertex_offset = offset + n_bytes;
gsk_vulkan_blend_mode_pipeline_collect_vertex_data (GSK_VULKAN_BLEND_MODE_PIPELINE (op->render.pipeline),
data + n_bytes + offset,
+ &op->render.offset,
&op->render.node->bounds,
&op->render.source_rect,
&op->render.source2_rect,
diff --git a/gsk/vulkan/gskvulkantextpipelineprivate.h b/gsk/vulkan/gskvulkantextpipelineprivate.h
index 59d0a2da45..eddd572f68 100644
--- a/gsk/vulkan/gskvulkantextpipelineprivate.h
+++ b/gsk/vulkan/gskvulkantextpipelineprivate.h
@@ -21,21 +21,21 @@ GskVulkanPipeline * gsk_vulkan_text_pipeline_new (GdkVulka
gsize gsk_vulkan_text_pipeline_count_vertex_data (GskVulkanTextPipeline *pipeline,
int num_instances);
void gsk_vulkan_text_pipeline_collect_vertex_data (GskVulkanTextPipeline *pipeline,
- guchar *data,
- GskVulkanRenderer *renderer,
- const graphene_rect_t *rect,
- PangoFont *font,
- guint total_glyphs,
- const PangoGlyphInfo *glyphs,
- const GdkRGBA *color,
- const graphene_point_t *offset,
- guint start_glyph,
- guint num_glyphs,
- float scale);
+ guchar *data,
+ GskVulkanRenderer *renderer,
+ const graphene_rect_t *rect,
+ PangoFont *font,
+ guint total_glyphs,
+ const PangoGlyphInfo *glyphs,
+ const GdkRGBA *color,
+ const graphene_point_t *offset,
+ guint start_glyph,
+ guint num_glyphs,
+ float scale);
gsize gsk_vulkan_text_pipeline_draw (GskVulkanTextPipeline *pipeline,
- VkCommandBuffer command_buffer,
- gsize offset,
- gsize n_commands);
+ VkCommandBuffer command_buffer,
+ gsize offset,
+ gsize n_commands);
G_END_DECLS
diff --git a/gsk/vulkan/gskvulkantexturepipeline.c b/gsk/vulkan/gskvulkantexturepipeline.c
index 9db719093b..bcb238918d 100644
--- a/gsk/vulkan/gskvulkantexturepipeline.c
+++ b/gsk/vulkan/gskvulkantexturepipeline.c
@@ -93,13 +93,14 @@ gsk_vulkan_texture_pipeline_count_vertex_data (GskVulkanTexturePipeline *pipelin
void
gsk_vulkan_texture_pipeline_collect_vertex_data (GskVulkanTexturePipeline *pipeline,
guchar *data,
+ const graphene_point_t *offset,
const graphene_rect_t *rect,
const graphene_rect_t *tex_rect)
{
GskVulkanTextureInstance *instance = (GskVulkanTextureInstance *) data;
- instance->rect[0] = rect->origin.x;
- instance->rect[1] = rect->origin.y;
+ instance->rect[0] = rect->origin.x + offset->x;
+ instance->rect[1] = rect->origin.y + offset->y;
instance->rect[2] = rect->size.width;
instance->rect[3] = rect->size.height;
instance->tex_rect[0] = tex_rect->origin.x;
diff --git a/gsk/vulkan/gskvulkantexturepipelineprivate.h b/gsk/vulkan/gskvulkantexturepipelineprivate.h
index a4f5f8b173..71f5382475 100644
--- a/gsk/vulkan/gskvulkantexturepipelineprivate.h
+++ b/gsk/vulkan/gskvulkantexturepipelineprivate.h
@@ -20,6 +20,7 @@ GskVulkanPipeline * gsk_vulkan_texture_pipeline_new (GdkVulk
gsize gsk_vulkan_texture_pipeline_count_vertex_data (GskVulkanTexturePipeline *pipeline);
void gsk_vulkan_texture_pipeline_collect_vertex_data (GskVulkanTexturePipeline *pipeline,
guchar *data,
+ const graphene_point_t *offset,
const graphene_rect_t *rect,
const graphene_rect_t *tex_rect);
gsize gsk_vulkan_texture_pipeline_draw (GskVulkanTexturePipeline *pipeline,
diff --git a/gtk/inspector/recorder.c b/gtk/inspector/recorder.c
index 78db4669cf..89f1826bd8 100644
--- a/gtk/inspector/recorder.c
+++ b/gtk/inspector/recorder.c
@@ -1267,7 +1267,7 @@ populate_render_node_properties (GListStore *store,
float radius = gsk_outset_shadow_node_get_blur_radius (node);
float rect[12];
- gsk_rounded_rect_to_float (outline, rect);
+ gsk_rounded_rect_to_float (outline, graphene_point_zero (), rect);
tmp = g_strdup_printf ("%.2f x %.2f + %.2f + %.2f",
rect[2], rect[3], rect[0], rect[1]);
add_text_row (store, "Outline", tmp);
diff --git a/testsuite/gsk/rounded-rect.c b/testsuite/gsk/rounded-rect.c
index 6ea7e7475b..5a72928257 100644
--- a/testsuite/gsk/rounded-rect.c
+++ b/testsuite/gsk/rounded-rect.c
@@ -152,12 +152,19 @@ test_to_float (void)
&GRAPHENE_SIZE_INIT (8, 9),
&GRAPHENE_SIZE_INIT (10, 11));
- gsk_rounded_rect_to_float (&rect, flt);
+ gsk_rounded_rect_to_float (&rect, &GRAPHENE_POINT_INIT(0, 0), flt);
g_assert_true (flt[0] == 0. && flt[1] == 11. && flt[2] == 22. && flt[3] == 33.);
g_assert_true (flt[4] == 4. && flt[5] == 6.);
g_assert_true (flt[6] == 8. && flt[7] == 10.);
g_assert_true (flt[8] == 5. && flt[9] == 7.);
g_assert_true (flt[10] == 9. && flt[11] == 11.);
+
+ gsk_rounded_rect_to_float (&rect, &GRAPHENE_POINT_INIT(100, 200), flt);
+ g_assert_true (flt[0] == 100. && flt[1] == 211. && flt[2] == 22. && flt[3] == 33.);
+ g_assert_true (flt[4] == 4. && flt[5] == 6.);
+ g_assert_true (flt[6] == 8. && flt[7] == 10.);
+ g_assert_true (flt[8] == 5. && flt[9] == 7.);
+ g_assert_true (flt[10] == 9. && flt[11] == 11.);
}
#define ROUNDED_RECT_INIT_FULL(x,y,w,h,w0,h0,w1,h1,w2,h2,w3,h3) \