[gtk+/gtk-style-context: 116/191] Add GdkPangoAttrShade.



commit da55e95b37e6fea90c9bd00554423f68a77e51f2
Author: Carlos Garnacho <carlosg gnome org>
Date:   Fri Jul 2 20:51:56 2010 +0200

    Add GdkPangoAttrShade.
    
    This pango attribute shades a color by a factor.

 gdk/gdk.symbols |    1 +
 gdk/gdkpango.c  |   79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 gdk/gdkpango.h  |    8 +++++
 3 files changed, 87 insertions(+), 1 deletions(-)
---
diff --git a/gdk/gdk.symbols b/gdk/gdk.symbols
index e9227c6..2cee8a2 100644
--- a/gdk/gdk.symbols
+++ b/gdk/gdk.symbols
@@ -913,6 +913,7 @@ gdk_net_wm_supports
 gdk_pango_attr_emboss_color_new
 gdk_pango_attr_embossed_new
 gdk_pango_attr_stipple_new
+gdk_pango_attr_shade_new
 gdk_pango_context_get
 gdk_pango_context_get_for_screen
 #ifndef GDK_DISABLE_DEPRECATED
diff --git a/gdk/gdkpango.c b/gdk/gdkpango.c
index 114ac2e..46f8b31 100644
--- a/gdk/gdkpango.c
+++ b/gdk/gdkpango.c
@@ -50,6 +50,7 @@ struct _GdkPangoRendererPrivate
   GdkBitmap *stipple[MAX_RENDER_PART + 1];
   PangoColor emboss_color;
   gboolean embossed;
+  gdouble shade_factor;
 
   cairo_t *cr;
   PangoRenderPart last_part;
@@ -64,6 +65,7 @@ struct _GdkPangoRendererPrivate
 static PangoAttrType gdk_pango_attr_stipple_type;
 static PangoAttrType gdk_pango_attr_embossed_type;
 static PangoAttrType gdk_pango_attr_emboss_color_type;
+static PangoAttrType gdk_pango_attr_shade_type;
 
 enum {
   PROP_0,
@@ -219,7 +221,15 @@ get_cairo_context (GdkPangoRenderer *gdk_renderer,
 	  else
 	    {
 	      if (color)
-		gdk_cairo_set_source_color (priv->cr, color);
+                {
+                  gdouble factor;
+
+                  factor = priv->shade_factor;
+                  cairo_set_source_rgb (priv->cr,
+                                        CLAMP (factor * color->red / 65535., 0, 1),
+                                        CLAMP (factor * color->green / 65535., 0, 1),
+                                        CLAMP (factor * color->blue / 65535., 0, 1));
+                }
 	      else
 		cairo_set_source_rgb (priv->cr, 0, 0, 0);
 	    }
@@ -423,6 +433,7 @@ gdk_pango_renderer_prepare_run (PangoRenderer  *renderer,
   GdkBitmap *stipple = NULL;
   gboolean changed = FALSE;
   PangoColor emboss_color;
+  gdouble shade_factor = 1;
   GSList *l;
   int i;
 
@@ -450,6 +461,10 @@ gdk_pango_renderer_prepare_run (PangoRenderer  *renderer,
 	{
 	  emboss_color = ((GdkPangoAttrEmbossColor*)attr)->color;
 	}
+      else if (attr->klass->type == gdk_pango_attr_shade_type)
+        {
+          shade_factor = ((GdkPangoAttrShade *) attr)->factor;
+        }
     }
 
   gdk_pango_renderer_set_stipple (gdk_renderer, PANGO_RENDER_PART_FOREGROUND, stipple);
@@ -463,6 +478,12 @@ gdk_pango_renderer_prepare_run (PangoRenderer  *renderer,
       changed = TRUE;
     }
 
+  if (shade_factor != gdk_renderer->priv->shade_factor)
+    {
+      gdk_renderer->priv->shade_factor = shade_factor;
+      changed = TRUE;
+    }
+
   if (!color_equal (&gdk_renderer->priv->emboss_color, &emboss_color))
     {
       gdk_renderer->priv->emboss_color = emboss_color;
@@ -1209,6 +1230,62 @@ gdk_pango_attr_stipple_new (GdkBitmap *stipple)
   return (PangoAttribute *)result;
 }
 
+/* GdkPangoAttrShade */
+static PangoAttribute *
+gdk_pango_attr_shade_copy (const PangoAttribute *attr)
+{
+  const GdkPangoAttrShade *s = (const GdkPangoAttrShade *) attr;
+
+  return gdk_pango_attr_shade_new (s->factor);
+}
+
+static void
+gdk_pango_attr_shade_destroy (PangoAttribute *attr)
+{
+  g_free (attr);
+}
+
+static gboolean
+gdk_pango_attr_shade_compare (const PangoAttribute *attr1,
+                              const PangoAttribute *attr2)
+{
+  const GdkPangoAttrShade *s1 = (const GdkPangoAttrShade *) attr1;
+  const GdkPangoAttrShade *s2 = (const GdkPangoAttrShade *) attr2;
+
+  return s1->factor == s2->factor;
+}
+
+/**
+ * gdk_pango_attr_shade_new:
+ * @factor: shading factor
+ *
+ * Creates a new attribute to shade a region.
+ *
+ * Return value: new #PangoAttribute
+ **/
+PangoAttribute *
+gdk_pango_attr_shade_new (gdouble factor)
+{
+  GdkPangoAttrShade *result;
+
+  static PangoAttrClass klass = {
+    0,
+    gdk_pango_attr_shade_copy,
+    gdk_pango_attr_shade_destroy,
+    gdk_pango_attr_shade_compare
+  };
+
+  if (!klass.type)
+    klass.type = gdk_pango_attr_shade_type =
+      pango_attr_type_register ("GdkPangoAttrShade");
+
+  result = g_new (GdkPangoAttrShade, 1);
+  result->attr.klass = &klass;
+  result->factor = factor;
+
+  return (PangoAttribute *) result;
+}
+
 /* GdkPangoAttrEmbossed */
 
 static PangoAttribute *
diff --git a/gdk/gdkpango.h b/gdk/gdkpango.h
index e6fade6..0366f52 100644
--- a/gdk/gdkpango.h
+++ b/gdk/gdkpango.h
@@ -140,6 +140,7 @@ GdkRegion    *gdk_pango_layout_get_clip_region      (PangoLayout     *layout,
 typedef struct _GdkPangoAttrStipple GdkPangoAttrStipple;
 typedef struct _GdkPangoAttrEmbossed GdkPangoAttrEmbossed;
 typedef struct _GdkPangoAttrEmbossColor GdkPangoAttrEmbossColor;
+typedef struct _GdkPangoAttrShade GdkPangoAttrShade;
 
 struct _GdkPangoAttrStipple
 {
@@ -159,9 +160,16 @@ struct _GdkPangoAttrEmbossColor
   PangoColor color;
 };
 
+struct _GdkPangoAttrShade
+{
+  PangoAttribute attr;
+  gdouble factor;
+};
+
 PangoAttribute *gdk_pango_attr_stipple_new  (GdkBitmap *stipple);
 PangoAttribute *gdk_pango_attr_embossed_new (gboolean embossed);
 PangoAttribute *gdk_pango_attr_emboss_color_new (const GdkColor *color);
+PangoAttribute *gdk_pango_attr_shade_new (gdouble factor);
 
 void gdk_pango_show_layout (GdkScreen      *screen,
                             cairo_t        *cr,



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