[metacity] libmetacity: use cairo to draw tint



commit 1f0212d9d91c4cf588ec7c4fe968c72ea8152978
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Thu Jul 7 18:48:05 2016 +0300

    libmetacity: use cairo to draw tint

 libmetacity/meta-draw-op.c               |   41 ++---------------
 libmetacity/meta-gradient-spec-private.h |    9 +++-
 libmetacity/meta-gradient-spec.c         |   71 ++++++++++++++++++------------
 3 files changed, 53 insertions(+), 68 deletions(-)
---
diff --git a/libmetacity/meta-draw-op.c b/libmetacity/meta-draw-op.c
index 4d3ba5b..e3740ed 100644
--- a/libmetacity/meta-draw-op.c
+++ b/libmetacity/meta-draw-op.c
@@ -395,18 +395,6 @@ draw_op_as_pixbuf (const MetaDrawOp   *op,
 
   switch (op->type)
     {
-    case META_DRAW_TINT:
-      {
-        GdkRGBA color;
-
-        meta_color_spec_render (op->data.rectangle.color_spec,
-                                context, &color);
-
-        pixbuf = meta_alpha_gradient_spec_render (op->data.tint.alpha_spec,
-                                                  width, height, color);
-      }
-      break;
-
     case META_DRAW_IMAGE:
       {
        if (op->data.image.colorize_spec)
@@ -469,6 +457,7 @@ draw_op_as_pixbuf (const MetaDrawOp   *op,
                                          FALSE, FALSE);
       break;
 
+    case META_DRAW_TINT:
     case META_DRAW_LINE:
     case META_DRAW_RECTANGLE:
     case META_DRAW_ARC:
@@ -667,37 +656,15 @@ draw_op_draw_with_env (const MetaDrawOp    *op,
     case META_DRAW_TINT:
       {
         int rx, ry, rwidth, rheight;
-        gboolean needs_alpha;
-
-        needs_alpha = meta_alpha_gradient_spec_needs_alpha (op->data.tint.alpha_spec);
 
         rx = meta_draw_spec_parse_x_position (op->data.tint.x, env);
         ry = meta_draw_spec_parse_y_position (op->data.tint.y, env);
         rwidth = meta_draw_spec_parse_size (op->data.tint.width, env);
         rheight = meta_draw_spec_parse_size (op->data.tint.height, env);
 
-        if (!needs_alpha)
-          {
-            meta_color_spec_render (op->data.tint.color_spec, context, &color);
-            gdk_cairo_set_source_rgba (cr, &color);
-
-            cairo_rectangle (cr, rx, ry, rwidth, rheight);
-            cairo_fill (cr);
-          }
-        else
-          {
-            GdkPixbuf *pixbuf;
-
-            pixbuf = draw_op_as_pixbuf (op, context, info, rwidth, rheight);
-
-            if (pixbuf)
-              {
-                gdk_cairo_set_source_pixbuf (cr, pixbuf, rx, ry);
-                cairo_paint (cr);
-
-                g_object_unref (G_OBJECT (pixbuf));
-              }
-          }
+        meta_color_spec_render (op->data.tint.color_spec, context, &color);
+        meta_alpha_gradient_spec_render (op->data.tint.alpha_spec, color, cr,
+                                         rx, ry, rwidth, rheight);
       }
       break;
 
diff --git a/libmetacity/meta-gradient-spec-private.h b/libmetacity/meta-gradient-spec-private.h
index b3416e2..31503dc 100644
--- a/libmetacity/meta-gradient-spec-private.h
+++ b/libmetacity/meta-gradient-spec-private.h
@@ -77,10 +77,13 @@ GdkPixbuf             *meta_alpha_gradient_spec_apply_alpha (MetaAlphaGradientSp
                                                              gboolean                 force_copy);
 
 G_GNUC_INTERNAL
-GdkPixbuf             *meta_alpha_gradient_spec_render      (MetaAlphaGradientSpec   *spec,
+void                   meta_alpha_gradient_spec_render      (MetaAlphaGradientSpec   *spec,
+                                                             GdkRGBA                  color,
+                                                             cairo_t                 *cr,
+                                                             gint                     x,
+                                                             gint                     y,
                                                              gint                     width,
-                                                             gint                     height,
-                                                             GdkRGBA                  color);
+                                                             gint                     height);
 
 G_END_DECLS
 
diff --git a/libmetacity/meta-gradient-spec.c b/libmetacity/meta-gradient-spec.c
index 70affdd..3bc6c1b 100644
--- a/libmetacity/meta-gradient-spec.c
+++ b/libmetacity/meta-gradient-spec.c
@@ -261,42 +261,57 @@ meta_alpha_gradient_spec_apply_alpha (MetaAlphaGradientSpec *spec,
   return pixbuf;
 }
 
-GdkPixbuf *
+void
 meta_alpha_gradient_spec_render (MetaAlphaGradientSpec *spec,
+                                 GdkRGBA                color,
+                                 cairo_t               *cr,
+                                 gint                   x,
+                                 gint                   y,
                                  gint                   width,
-                                 gint                   height,
-                                 GdkRGBA                color)
+                                 gint                   height)
 {
-  gboolean has_alpha;
-  GdkPixbuf *pixbuf;
-  guint32 rgba;
-
-  has_alpha = spec && (spec->n_alphas > 1 || spec->alphas[0] != 0xff);
-  pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, has_alpha, 8, width, height);
-
-  rgba = 0xff;
-  rgba |= (gint) (color.red * 255) << 24;
-  rgba |= (gint) (color.green * 255) << 16;
-  rgba |= (gint) (color.blue * 255) << 8;
-
-  if (!has_alpha)
+  if (!spec || spec->n_alphas == 1)
     {
-      gdk_pixbuf_fill (pixbuf, rgba);
-    }
-  else if (spec->n_alphas == 1)
-    {
-      rgba &= ~0xff;
-      rgba |= spec->alphas[0];
+      if (spec)
+        color.alpha = spec->alphas[0] / 255.0;
 
-      gdk_pixbuf_fill (pixbuf, rgba);
+      gdk_cairo_set_source_rgba (cr, &color);
+      cairo_rectangle (cr, x, y, width, height);
+      cairo_fill (cr);
     }
   else
     {
-      gdk_pixbuf_fill (pixbuf, rgba);
+      cairo_pattern_t *pattern;
+      gint n_alphas;
+      gint i;
 
-      meta_gradient_add_alpha (pixbuf, spec->alphas, spec->n_alphas,
-                               spec->type);
-    }
+      /* Hardcoded in meta-theme-metacity.c */
+      g_assert (spec->type == META_GRADIENT_HORIZONTAL);
 
-  return pixbuf;
+      pattern = cairo_pattern_create_linear (0, 0, 1, 0);
+      n_alphas = spec->n_alphas;
+
+      for (i = 0; i < n_alphas; i++)
+        cairo_pattern_add_color_stop_rgba (pattern, i / (gfloat) (n_alphas - 1),
+                                           color.red, color.green, color.blue,
+                                           spec->alphas[i] / 255.0);
+
+      if (cairo_pattern_status (pattern) != CAIRO_STATUS_SUCCESS)
+        {
+          cairo_pattern_destroy (pattern);
+          return;
+        }
+
+      cairo_save (cr);
+      cairo_rectangle (cr, x, y, width, height);
+
+      cairo_translate (cr, x, y);
+      cairo_scale (cr, width, height);
+
+      cairo_set_source (cr, pattern);
+      cairo_fill (cr);
+
+      cairo_pattern_destroy (pattern);
+      cairo_restore (cr);
+    }
 }


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