vulkan: Adapt a function
authorBenjamin Otte <otte@redhat.com>
Wed, 12 Jul 2023 07:21:07 +0000 (09:21 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 16 Jul 2023 10:13:00 +0000 (12:13 +0200)
I want to use it for more operations when we can break those down to
operations on the pixels directly, and this function is what's needed
for that.

gsk/vulkan/gskvulkanrenderpass.c

index edf1f3387d60ba248896583608c2f4f356591cac..ec3d9878143f50030bf064aff0c6abba61d857e5 100644 (file)
@@ -157,6 +157,44 @@ gsk_vulkan_render_pass_append_push_constants (GskVulkanRender           *render,
   return FALSE; \
 }G_STMT_END
 
+static gboolean
+gsk_vulkan_parse_rect_is_integer (const GskVulkanParseState *state,
+                                  const graphene_rect_t     *rect,
+                                  cairo_rectangle_int_t     *int_rect)
+{
+  graphene_rect_t transformed_rect;
+  float scale_x = graphene_vec2_get_x (&state->scale);
+  float scale_y = graphene_vec2_get_y (&state->scale);
+
+  switch (gsk_transform_get_category (state->modelview))
+    {
+    case GSK_TRANSFORM_CATEGORY_UNKNOWN:
+    case GSK_TRANSFORM_CATEGORY_ANY:
+    case GSK_TRANSFORM_CATEGORY_3D:
+    case GSK_TRANSFORM_CATEGORY_2D:
+      return FALSE;
+
+    case GSK_TRANSFORM_CATEGORY_2D_AFFINE:
+    case GSK_TRANSFORM_CATEGORY_2D_TRANSLATE:
+      gsk_transform_transform_bounds (state->modelview, rect, &transformed_rect);
+      rect = &transformed_rect;
+      break;
+
+    case GSK_TRANSFORM_CATEGORY_IDENTITY:
+    default:
+      break;
+    } 
+  int_rect->x = rect->origin.x * scale_x;
+  int_rect->y = rect->origin.y * scale_y;
+  int_rect->width = rect->size.width * scale_x;
+  int_rect->height = rect->size.height * scale_y;
+
+  return int_rect->x == rect->origin.x * scale_x
+      && int_rect->y == rect->origin.y * scale_y
+      && int_rect->width == rect->size.width * scale_x
+      && int_rect->height == rect->size.height * scale_y;
+}
+
 static GskVulkanImage *
 gsk_vulkan_render_pass_get_node_as_image (GskVulkanRenderPass       *self,
                                           GskVulkanRender           *render,
@@ -681,45 +719,6 @@ gsk_vulkan_render_pass_add_color_matrix_node (GskVulkanRenderPass       *self,
   return TRUE;
 }
 
-static gboolean
-clip_can_be_scissored (const graphene_rect_t *rect,
-                       const graphene_vec2_t *scale,
-                       GskTransform          *modelview,
-                       cairo_rectangle_int_t *int_rect)
-{
-  graphene_rect_t transformed_rect;
-  float scale_x = graphene_vec2_get_x (scale);
-  float scale_y = graphene_vec2_get_y (scale);
-
-  switch (gsk_transform_get_category (modelview))
-    {
-    case GSK_TRANSFORM_CATEGORY_UNKNOWN:
-    case GSK_TRANSFORM_CATEGORY_ANY:
-    case GSK_TRANSFORM_CATEGORY_3D:
-    case GSK_TRANSFORM_CATEGORY_2D:
-      return FALSE;
-
-    case GSK_TRANSFORM_CATEGORY_2D_AFFINE:
-    case GSK_TRANSFORM_CATEGORY_2D_TRANSLATE:
-      gsk_transform_transform_bounds (modelview, rect, &transformed_rect);
-      rect = &transformed_rect;
-      break;
-
-    case GSK_TRANSFORM_CATEGORY_IDENTITY:
-    default:
-      break;
-    } 
-  int_rect->x = rect->origin.x * scale_x;
-  int_rect->y = rect->origin.y * scale_y;
-  int_rect->width = rect->size.width * scale_x;
-  int_rect->height = rect->size.height * scale_y;
-
-  return int_rect->x == rect->origin.x * scale_x
-      && int_rect->y == rect->origin.y * scale_y
-      && int_rect->width == rect->size.width * scale_x
-      && int_rect->height == rect->size.height * scale_y;
-}
-
 static inline gboolean
 gsk_vulkan_render_pass_add_clip_node (GskVulkanRenderPass       *self,
                                       GskVulkanRender           *render,
@@ -735,7 +734,7 @@ gsk_vulkan_render_pass_add_clip_node (GskVulkanRenderPass       *self,
                           &clip);
 
   /* Check if we can use scissoring for the clip */
-  if (clip_can_be_scissored (&clip, &state->scale, state->modelview, &new_state.scissor))
+  if (gsk_vulkan_parse_rect_is_integer (state, &clip, &new_state.scissor))
     {
       if (!gdk_rectangle_intersect (&new_state.scissor, &state->scissor, &new_state.scissor))
         return TRUE;