Code

Unify stat type for older glib.
[inkscape.git] / src / sp-gradient.h
index abd44538e71204c6f3c7ce389c75a21777088f0b..fbcc4934ec0f0872a1afc47e4d318985ca395dd9 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef __SP_GRADIENT_H__
-#define __SP_GRADIENT_H__
+#ifndef SEEN_SP_GRADIENT_H
+#define SEEN_SP_GRADIENT_H
 
 /** \file
  * SVG <stop> <linearGradient> and <radialGradient> implementation
@@ -7,7 +7,9 @@
  * Authors:
  *   Lauris Kaplinski <lauris@kaplinski.com>
  *   Johan Engelen <j.b.c.engelen@ewi.utwente.nl>
+ *   Jon A. Cruz <jon@joncruz.org>
  *
+ * Copyrigt  (C) 2010 Jon A. Cruz
  * Copyright (C) 2007 Johan Engelen
  * Copyright (C) 1999-2002 Lauris Kaplinski
  * Copyright (C) 2000-2001 Ximian, Inc.
@@ -16,6 +18,7 @@
  */
 
 #include <gdk/gdktypes.h>
+#include <glibmm/ustring.h>
 #include "libnr/nr-matrix.h"
 #include "sp-paint-server.h"
 #include "sp-gradient-spread.h"
 
 struct SPGradientReference;
 
+
+#define SP_TYPE_GRADIENT (SPGradient::getType())
+#define SP_GRADIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_GRADIENT, SPGradient))
+#define SP_GRADIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_GRADIENT, SPGradientClass))
+#define SP_IS_GRADIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_GRADIENT))
+#define SP_IS_GRADIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_GRADIENT))
+
 typedef enum {
-       SP_GRADIENT_TYPE_UNKNOWN,
-       SP_GRADIENT_TYPE_LINEAR,
-       SP_GRADIENT_TYPE_RADIAL
+    SP_GRADIENT_TYPE_UNKNOWN,
+    SP_GRADIENT_TYPE_LINEAR,
+    SP_GRADIENT_TYPE_RADIAL
 } SPGradientType;
 
 typedef enum {
-       SP_GRADIENT_STATE_UNKNOWN,
-       SP_GRADIENT_STATE_VECTOR,
-       SP_GRADIENT_STATE_PRIVATE
+    SP_GRADIENT_STATE_UNKNOWN,
+    SP_GRADIENT_STATE_VECTOR,
+    SP_GRADIENT_STATE_PRIVATE
 } SPGradientState;
 
 typedef enum {
@@ -49,7 +59,7 @@ typedef enum {
     POINT_RG_MID1,
     POINT_RG_MID2,
     // insert new point types here.
-    
+
     POINT_G_INVALID
 } GrPointType;
 
@@ -61,47 +71,100 @@ typedef enum {
  */
 struct SPGradient : public SPPaintServer {
 
-       /** Reference (href) */
-       SPGradientReference *ref;
+    /** Reference (href) */
+    SPGradientReference *ref;
+
+    /** State in Inkscape gradient system */
+    guint state : 2;
+
+private:
+    /** gradientUnits attribute */
+    SPGradientUnits units;
+    guint units_set : 1;
+public:
+
+    /** gradientTransform attribute */
+    Geom::Matrix gradientTransform;
+    guint gradientTransform_set : 1;
+
+private:
+    /** spreadMethod attribute */
+    SPGradientSpread spread;
+    guint spread_set : 1;
+
+    /** Gradient stops */
+    guint has_stops : 1;
+public:
+
+    /** Composed vector */
+    SPGradientVector vector;
+
+    /** Rendered color array (4 * 1024 bytes) */
+    guchar *color;
+
+    sigc::connection modified_connection;
+
+    bool hasStops() const;
+
+    SPStop* getFirstStop();
+    int getStopCount() const;
+
+
+    bool isUnitsSet() const;
+    SPGradientUnits getUnits() const;
+    void setUnits(SPGradientUnits units);
+
+
+    bool isSpreadSet() const;
+    SPGradientSpread getSpread() const;
+
+/**
+ * Returns private vector of given gradient (the gradient at the end of the href chain which has
+ * stops), optionally normalizing it.
+ *
+ * \pre SP_IS_GRADIENT(gradient).
+ * \pre There exists a gradient in the chain that has stops.
+ */
+    SPGradient *getVector(bool force_private = false);
 
-       /** State in Inkscape gradient system */
-       guint state : 2;
+    static GType getType();
 
-       /** gradientUnits attribute */
-       SPGradientUnits units;
-       guint units_set : 1;
+    /** Forces vector to be built, if not present (i.e. changed) */
+    void ensureVector();
 
-       /** gradientTransform attribute */
-       Geom::Matrix gradientTransform;
-       guint gradientTransform_set : 1;
+    /** Ensures that color array is populated */
+    void ensureColors();
 
-       /** spreadMethod attribute */
-       SPGradientSpread spread;
-       guint spread_set : 1;
+    /**
+     * Set spread property of gradient and emit modified.
+     */
+    void setSpread(SPGradientSpread spread);
 
-       /** Gradient stops */
-       guint has_stops : 1;
+    SPGradientSpread fetchSpread();
+    SPGradientUnits fetchUnits();
 
-       /** Composed vector */
-       SPGradientVector vector;
+    void setSwatch(bool swatch = true);
 
-       /** Rendered color array (4 * 1024 bytes) */
-       guchar *color;
+private:
+    bool invalidateVector();
+    void rebuildVector();
 
-        sigc::connection modified_connection;
+    friend class SPGradientImpl;
+    friend class SPLGPainter;
+    friend class SPRGPainter;
 };
 
 /**
  * The SPGradient vtable.
  */
 struct SPGradientClass {
-       SPPaintServerClass parent_class;
+    SPPaintServerClass parent_class;
 };
 
 
 #include "sp-gradient-fns.h"
 
-#endif /* !__SP_GRADIENT_H__ */
+#endif // SEEN_SP_GRADIENT_H
 
 /*
   Local Variables:
@@ -112,4 +175,4 @@ struct SPGradientClass {
   fill-column:99
   End:
 */
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :