[gtk/wip/baedert/for-master: 1/3] snapshot: Replace trivial gradients with color nodes




commit 3eed61deba9d5ab488f3b9a0bd22b822d829156d
Author: Timm Bäder <mail baedert org>
Date:   Thu Jul 15 16:50:32 2021 +0200

    snapshot: Replace trivial gradients with color nodes
    
    Extend this to all existing gradient types

 gtk/gtksnapshot.c | 131 +++++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 96 insertions(+), 35 deletions(-)
---
diff --git a/gtk/gtksnapshot.c b/gtk/gtksnapshot.c
index b0b1222c66..827d4b80e9 100644
--- a/gtk/gtksnapshot.c
+++ b/gtk/gtksnapshot.c
@@ -2223,9 +2223,9 @@ gtk_snapshot_append_repeating_linear_gradient (GtkSnapshot            *snapshot,
 {
   GskRenderNode *node;
   graphene_rect_t real_bounds;
-  graphene_point_t real_start_point;
-  graphene_point_t real_end_point;
   float scale_x, scale_y, dx, dy;
+  gboolean need_gradient = FALSE;
+  const GdkRGBA *first_color;
 
   g_return_if_fail (snapshot != NULL);
   g_return_if_fail (start_point != NULL);
@@ -2235,16 +2235,36 @@ gtk_snapshot_append_repeating_linear_gradient (GtkSnapshot            *snapshot,
 
   gtk_snapshot_ensure_affine (snapshot, &scale_x, &scale_y, &dx, &dy);
   gtk_graphene_rect_scale_affine (bounds, scale_x, scale_y, dx, dy, &real_bounds);
-  real_start_point.x = scale_x * start_point->x + dx;
-  real_start_point.y = scale_y * start_point->y + dy;
-  real_end_point.x = scale_x * end_point->x + dx;
-  real_end_point.y = scale_y * end_point->y + dy;
 
-  node = gsk_repeating_linear_gradient_node_new (&real_bounds,
-                                                 &real_start_point,
-                                                 &real_end_point,
-                                                 stops,
-                                                 n_stops);
+  first_color = &stops[0].color;
+  for (gsize i = 0; i < n_stops; i ++)
+    {
+      if (!gdk_rgba_equal (first_color, &stops[i].color))
+        {
+          need_gradient = TRUE;
+          break;
+        }
+    }
+
+  if (need_gradient)
+    {
+      graphene_point_t real_start_point, real_end_point;
+
+      real_start_point.x = scale_x * start_point->x + dx;
+      real_start_point.y = scale_y * start_point->y + dy;
+      real_end_point.x = scale_x * end_point->x + dx;
+      real_end_point.y = scale_y * end_point->y + dy;
+
+      node = gsk_repeating_linear_gradient_node_new (&real_bounds,
+                                                     &real_start_point,
+                                                     &real_end_point,
+                                                     stops,
+                                                     n_stops);
+    }
+  else
+    {
+      node = gsk_color_node_new (first_color, &real_bounds);
+    }
 
   gtk_snapshot_append_node_internal (snapshot, node);
 }
@@ -2338,8 +2358,9 @@ gtk_snapshot_append_radial_gradient (GtkSnapshot            *snapshot,
 {
   GskRenderNode *node;
   graphene_rect_t real_bounds;
-  graphene_point_t real_center;
   float scale_x, scale_y, dx, dy;
+  gboolean need_gradient = FALSE;
+  const GdkRGBA *first_color;
 
   g_return_if_fail (snapshot != NULL);
   g_return_if_fail (center != NULL);
@@ -2348,17 +2369,37 @@ gtk_snapshot_append_radial_gradient (GtkSnapshot            *snapshot,
 
   gtk_snapshot_ensure_affine (snapshot, &scale_x, &scale_y, &dx, &dy);
   gtk_graphene_rect_scale_affine (bounds, scale_x, scale_y, dx, dy, &real_bounds);
-  real_center.x = scale_x * center->x + dx;
-  real_center.y = scale_y * center->y + dy;
-
-  node = gsk_radial_gradient_node_new (&real_bounds,
-                                       &real_center,
-                                       hradius * scale_x,
-                                       vradius * scale_y,
-                                       start,
-                                       end,
-                                       stops,
-                                       n_stops);
+
+  first_color = &stops[0].color;
+  for (gsize i = 0; i < n_stops; i ++)
+    {
+      if (!gdk_rgba_equal (first_color, &stops[i].color))
+        {
+          need_gradient = TRUE;
+          break;
+        }
+    }
+
+  if (need_gradient)
+    {
+      graphene_point_t real_center;
+
+      real_center.x = scale_x * center->x + dx;
+      real_center.y = scale_y * center->y + dy;
+
+      node = gsk_radial_gradient_node_new (&real_bounds,
+                                           &real_center,
+                                           hradius * scale_x,
+                                           vradius * scale_y,
+                                           start,
+                                           end,
+                                           stops,
+                                           n_stops);
+    }
+  else
+    {
+      node = gsk_color_node_new (first_color, &real_bounds);
+    }
 
   gtk_snapshot_append_node_internal (snapshot, node);
 }
@@ -2391,8 +2432,9 @@ gtk_snapshot_append_repeating_radial_gradient (GtkSnapshot            *snapshot,
 {
   GskRenderNode *node;
   graphene_rect_t real_bounds;
-  graphene_point_t real_center;
   float scale_x, scale_y, dx, dy;
+  gboolean need_gradient = FALSE;
+  const GdkRGBA *first_color;
 
   g_return_if_fail (snapshot != NULL);
   g_return_if_fail (center != NULL);
@@ -2401,17 +2443,36 @@ gtk_snapshot_append_repeating_radial_gradient (GtkSnapshot            *snapshot,
 
   gtk_snapshot_ensure_affine (snapshot, &scale_x, &scale_y, &dx, &dy);
   gtk_graphene_rect_scale_affine (bounds, scale_x, scale_y, dx, dy, &real_bounds);
-  real_center.x = scale_x * center->x + dx;
-  real_center.y = scale_y * center->y + dy;
-
-  node = gsk_repeating_radial_gradient_node_new (&real_bounds,
-                                                 &real_center,
-                                                 hradius * scale_x,
-                                                 vradius * scale_y,
-                                                 start,
-                                                 end,
-                                                 stops,
-                                                 n_stops);
+
+  first_color = &stops[0].color;
+  for (gsize i = 0; i < n_stops; i ++)
+    {
+      if (!gdk_rgba_equal (first_color, &stops[i].color))
+        {
+          need_gradient = TRUE;
+          break;
+        }
+    }
+
+  if (need_gradient)
+    {
+      graphene_point_t real_center;
+
+      real_center.x = scale_x * center->x + dx;
+      real_center.y = scale_y * center->y + dy;
+      node = gsk_repeating_radial_gradient_node_new (&real_bounds,
+                                                     &real_center,
+                                                     hradius * scale_x,
+                                                     vradius * scale_y,
+                                                     start,
+                                                     end,
+                                                     stops,
+                                                     n_stops);
+    }
+  else
+    {
+      node = gsk_color_node_new (first_color, &real_bounds);
+    }
 
   gtk_snapshot_append_node_internal (snapshot, node);
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]