[gtk+/wip/csd-fixes: 3/5] cssshadow: add a method to get the size of a shadows value



commit 753ac6942cf8176731f59c6e0e08a2de8e744b7b
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Mon Apr 22 16:50:39 2013 -0400

    cssshadow: add a method to get the size of a shadows value
    
    The method returns the size of each side of a GtkCssShadowsValue.

 gtk/gtkcssshadowsvalue.c        | 44 +++++++++++++++++++++++++++++++++++++++++
 gtk/gtkcssshadowsvalueprivate.h |  3 +++
 gtk/gtkcssshadowvalue.c         | 20 +++++++++++++++++++
 gtk/gtkcssshadowvalueprivate.h  |  6 ++++++
 4 files changed, 73 insertions(+)
---
diff --git a/gtk/gtkcssshadowsvalue.c b/gtk/gtkcssshadowsvalue.c
index a71f4fe..1265360 100644
--- a/gtk/gtkcssshadowsvalue.c
+++ b/gtk/gtkcssshadowsvalue.c
@@ -300,3 +300,47 @@ _gtk_css_shadows_value_paint_box (const GtkCssValue   *shadows,
         _gtk_css_shadow_value_paint_box (shadows->values[i], cr, padding_box);
     }
 }
+
+void
+_gtk_css_shadows_value_get_size (const GtkCssValue *shadows,
+                                 GtkBorder         *border)
+{
+  guint i;
+  GtkBorder b = { 0 };
+  const GtkCssValue *shadow;
+  gdouble hoffset, voffset, spread, radius;
+
+  g_return_if_fail (shadows->class == &GTK_CSS_VALUE_SHADOWS);
+
+  for (i = 0; i < shadows->len; i++)
+    {
+      shadow = shadows->values[i];
+
+      if (_gtk_css_shadow_value_get_inset (shadow))
+        continue;
+
+      _gtk_css_shadow_value_get_geometry (shadow,
+                                          &hoffset, &voffset,
+                                          &radius, &spread);
+
+      if (hoffset < 0)
+        b.left = -hoffset;
+      else
+        b.right = hoffset;
+
+      if (voffset < 0)
+        b.top = -voffset;
+      else
+        b.bottom = voffset;
+
+      b.top += radius + spread;
+      b.right += radius + spread;
+      b.bottom += radius + spread;
+      b.left += radius + spread;
+
+      border->top = MAX (border->top, b.top);
+      border->right = MAX (border->right, b.right);
+      border->bottom = MAX (border->bottom, b.bottom);
+      border->left = MAX (border->left, b.left);
+    }
+}
diff --git a/gtk/gtkcssshadowsvalueprivate.h b/gtk/gtkcssshadowsvalueprivate.h
index 7ee619e..eb34387 100644
--- a/gtk/gtkcssshadowsvalueprivate.h
+++ b/gtk/gtkcssshadowsvalueprivate.h
@@ -49,6 +49,9 @@ void            _gtk_css_shadows_value_paint_box      (const GtkCssValue
                                                        const GtkRoundedBox      *padding_box,
                                                        gboolean                  inset);
 
+void            _gtk_css_shadows_value_get_size       (const GtkCssValue        *shadows,
+                                                       GtkBorder                *border);
+
 G_END_DECLS
 
 #endif /* __GTK_CSS_SHADOWS_VALUE_H__ */
diff --git a/gtk/gtkcssshadowvalue.c b/gtk/gtkcssshadowvalue.c
index 6e61cab..4e7ca65 100644
--- a/gtk/gtkcssshadowvalue.c
+++ b/gtk/gtkcssshadowvalue.c
@@ -454,6 +454,26 @@ _gtk_css_shadow_value_get_inset (const GtkCssValue *shadow)
 }
 
 void
+_gtk_css_shadow_value_get_geometry (const GtkCssValue *shadow,
+                                    gdouble           *hoffset,
+                                    gdouble           *voffset,
+                                    gdouble           *radius,
+                                    gdouble           *spread)
+{
+  g_return_if_fail (shadow->class == &GTK_CSS_VALUE_SHADOW);
+
+  if (hoffset != NULL)
+    *hoffset = _gtk_css_number_value_get (shadow->hoffset, 0);
+  if (voffset != NULL)
+    *voffset = _gtk_css_number_value_get (shadow->voffset, 0);
+
+  if (radius != NULL)
+    *radius = _gtk_css_number_value_get (shadow->radius, 0);
+  if (spread != NULL)
+    *spread = _gtk_css_number_value_get (shadow->spread, 0);
+}
+
+void
 _gtk_css_shadow_value_paint_box (const GtkCssValue   *shadow,
                                  cairo_t             *cr,
                                  const GtkRoundedBox *padding_box)
diff --git a/gtk/gtkcssshadowvalueprivate.h b/gtk/gtkcssshadowvalueprivate.h
index 0688fc3..e46b303 100644
--- a/gtk/gtkcssshadowvalueprivate.h
+++ b/gtk/gtkcssshadowvalueprivate.h
@@ -36,6 +36,12 @@ GtkCssValue *   _gtk_css_shadow_value_parse           (GtkCssParser
 
 gboolean        _gtk_css_shadow_value_get_inset       (const GtkCssValue        *shadow);
 
+void            _gtk_css_shadow_value_get_geometry    (const GtkCssValue        *shadow,
+                                                       gdouble                  *hoffset,
+                                                       gdouble                  *voffset,
+                                                       gdouble                  *radius,
+                                                       gdouble                  *spread);
+
 void            _gtk_css_shadow_value_paint_layout    (const GtkCssValue        *shadow,
                                                        cairo_t                  *cr,
                                                        PangoLayout              *layout);


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