snapshot: Try to avoid some linear gradient nodes
authorTimm Bäder <mail@baedert.org>
Wed, 25 Sep 2019 15:07:45 +0000 (17:07 +0200)
committerTimm Bäder <mail@baedert.org>
Wed, 25 Sep 2019 15:51:52 +0000 (17:51 +0200)
gtk/gtksnapshot.c

index 46a8cecfdcf1e8b1ff97fd27494878dad9bb2d9c..ab38d09f3cd70febf9c283acf86f71b61f58a572 100644 (file)
@@ -1745,6 +1745,9 @@ gtk_snapshot_append_linear_gradient (GtkSnapshot            *snapshot,
   graphene_point_t real_start_point;
   graphene_point_t real_end_point;
   float scale_x, scale_y, dx, dy;
+  const GdkRGBA *first_color;
+  gboolean need_gradient = FALSE;
+  int i;
 
   g_return_if_fail (snapshot != NULL);
   g_return_if_fail (start_point != NULL);
@@ -1759,11 +1762,24 @@ gtk_snapshot_append_linear_gradient (GtkSnapshot            *snapshot,
   real_end_point.x = scale_x * end_point->x + dx;
   real_end_point.y = scale_y * end_point->y + dy;
 
-  node = gsk_linear_gradient_node_new (&real_bounds,
-                                       &real_start_point,
-                                       &real_end_point,
-                                       stops,
-                                       n_stops);
+  first_color = &stops[0].color;
+  for (i = 0; i < n_stops; i ++)
+    {
+      if (!gdk_rgba_equal (first_color, &stops[i].color))
+        {
+          need_gradient = TRUE;
+          break;
+        }
+    }
+
+  if (need_gradient)
+    node = gsk_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);
 }