Code

Correct desktop tracking for layers dialog. Fixes bug #427514.
[inkscape.git] / src / style.h
index a7572317e3b897209b4395e43abfefd92323cb42..f1b5ec534cb622263372bb439e22cc174e8c15b4 100644 (file)
@@ -1,12 +1,14 @@
-#ifndef __SP_STYLE_H__
-#define __SP_STYLE_H__
+#ifndef SEEN_SP_STYLE_H
+#define SEEN_SP_STYLE_H
 
 /** \file
  * SPStyle - a style object for SPItem objects
- *
- * Authors:
+ */
+/* Authors:
  *   Lauris Kaplinski <lauris@kaplinski.com>
+ *   Jon A. Cruz <jon@joncruz.org>
  *
+ * Copyright (C) 2010 Jon A. Cruz
  * Copyright (C) 2001-2002 Lauris Kaplinski
  * Copyright (C) 2001 Ximian, Inc.
  *
 #include "forward.h"
 #include "sp-marker-loc.h"
 #include "sp-filter.h"
+#include "sp-filter-reference.h"
+#include "uri-references.h"
+#include "uri.h"
+#include "sp-paint-server.h"
 
 #include <sigc++/connection.h>
 
@@ -28,10 +34,6 @@ class Node;
 
 class SPCSSAttr;
 
-namespace Inkscape {
-gchar *parse_css_url(gchar const *string);
-}
-
 class SPIFloat;
 class SPIScale24;
 class SPIInt;
@@ -139,17 +141,10 @@ struct SPILength {
     float computed;
 };
 
-#define SP_STYLE_FILL_SERVER(s) (((SPStyle *) (s))->fill.value.paint.server)
-#define SP_STYLE_STROKE_SERVER(s) (((SPStyle *) (s))->stroke.value.paint.server)
-#define SP_OBJECT_STYLE_FILL_SERVER(o) (SP_OBJECT (o)->style->fill.value.paint.server)
-#define SP_OBJECT_STYLE_STROKE_SERVER(o) (SP_OBJECT (o)->style->stroke.value.paint.server)
-
-enum {
-    SP_PAINT_TYPE_NONE,
-    SP_PAINT_TYPE_COLOR,
-    SP_PAINT_TYPE_PAINTSERVER,
-    SP_PAINT_TYPE_IMPOSSIBLE
-};
+#define SP_STYLE_FILL_SERVER(s) (((SPStyle *) (s))->getFillPaintServer())
+#define SP_STYLE_STROKE_SERVER(s) (((SPStyle *) (s))->getStrokePaintServer())
+#define SP_OBJECT_STYLE_FILL_SERVER(o) (SP_OBJECT (o)->style->getFillPaintServer())
+#define SP_OBJECT_STYLE_STROKE_SERVER(o) (SP_OBJECT (o)->style->getStrokePaintServer())
 
 class SVGICCColor;
 
@@ -158,23 +153,35 @@ struct SPIPaint {
     unsigned set : 1;
     unsigned inherit : 1;
     unsigned currentcolor : 1;
-    unsigned type : 2;
-    union {
-        SPColor color;
-        struct {
-            SPPaintServer *server;
-            gchar *uri;
-        } paint;
+    unsigned int colorSet : 1;
+    unsigned int noneSet : 1;
+    struct {
+         SPPaintServerReference *href;
+         SPColor color;
     } value;
-    SVGICCColor *iccColor;
+
+
+    bool isSet() const { return true; /* set || colorSet*/}
+    bool isSameType( SPIPaint const & other ) const {return (isPaintserver() == other.isPaintserver()) && (colorSet == other.colorSet) && (currentcolor == other.currentcolor);}
+
+    bool isNoneSet() const {return noneSet;}
+
+    bool isNone() const {return !currentcolor && !colorSet && !isPaintserver();} // TODO refine
+    bool isColor() const {return colorSet && !isPaintserver();}
+    bool isPaintserver() const {return value.href && value.href->getObject();}
+
+    void clear();
+
+    void setColor( float r, float g, float b ) {value.color.set( r, g, b ); colorSet = true;}
+    void setColor( guint32 val ) {value.color.set( val ); colorSet = true;}
+    void setColor( SPColor const& color ) {value.color = color; colorSet = true;}
 };
 
 /// Filter type internal to SPStyle
 struct SPIFilter {
     unsigned set : 1;
     unsigned inherit : 1;
-    SPFilter *filter;
-    gchar *uri;
+    SPFilterReference *href;
 };
 
 enum {
@@ -234,8 +241,12 @@ public:
 /// An SVG style object.
 struct SPStyle {
     int refcount;
+
     /** Object we are attached to */
     SPObject *object;
+    /** Document we are associated with */
+    SPDocument *document;
+
     /** Our text style component */
     SPTextStyle *text;
     unsigned text_private : 1;
@@ -327,6 +338,7 @@ struct SPStyle {
     unsigned stroke_dasharray_set : 1;
     unsigned stroke_dasharray_inherit : 1;
     unsigned stroke_dashoffset_set : 1;
+    unsigned stroke_dashoffset_inherit : 1;
     /** stroke-opacity */
     SPIScale24 stroke_opacity;
 
@@ -336,6 +348,8 @@ struct SPStyle {
     /** Filter effect */
     SPIFilter filter;
 
+    SPIEnum filter_blend_mode;
+
    /** normally not used, but duplicates the Gaussian blur deviation (if any) from the attached
         filter when the style is used for querying */
     SPILength filter_gaussianBlur_deviation;
@@ -344,23 +358,29 @@ struct SPStyle {
      * their background image */
     SPIEnum enable_background;
 
-    /// style belongs to a cloned object, must not href anything
-    bool cloned; 
-    /// style has hreffed its fill/stroke paintservers, needs to release.
-    bool fill_hreffed; 
-    bool stroke_hreffed; 
-    bool filter_hreffed; 
+    /// style belongs to a cloned object
+    bool cloned;
 
     sigc::connection release_connection;
 
-    sigc::connection fill_release_connection;
-    sigc::connection fill_modified_connection;
+    sigc::connection filter_modified_connection;
+    sigc::connection fill_ps_modified_connection;
+    sigc::connection stroke_ps_modified_connection;
 
-    sigc::connection stroke_release_connection;
-    sigc::connection stroke_modified_connection;
+    SPObject *getFilter() { return (filter.href) ? filter.href->getObject() : 0; }
+    SPObject const *getFilter() const { return (filter.href) ? filter.href->getObject() : 0; }
+    gchar const *getFilterURI() const { return (filter.href) ? filter.href->getURI()->toString() : 0; }
+
+    SPPaintServer *getFillPaintServer() { return (fill.value.href) ? fill.value.href->getObject() : 0; }
+    SPPaintServer const *getFillPaintServer() const { return (fill.value.href) ? fill.value.href->getObject() : 0; }
+    gchar const *getFillURI() const { return (fill.value.href) ? fill.value.href->getURI()->toString() : 0; }
+
+    SPPaintServer *getStrokePaintServer() { return (stroke.value.href) ? stroke.value.href->getObject() : 0; }
+    SPPaintServer const *getStrokePaintServer() const { return (stroke.value.href) ? stroke.value.href->getObject() : 0; }
+    gchar const  *getStrokeURI() const { return (stroke.value.href) ? stroke.value.href->getURI()->toString() : 0; }
 };
 
-SPStyle *sp_style_new();
+SPStyle *sp_style_new(SPDocument *document);
 
 SPStyle *sp_style_new_from_object(SPObject *object);
 
@@ -370,7 +390,7 @@ SPStyle *sp_style_unref(SPStyle *style);
 
 void sp_style_read_from_object(SPStyle *style, SPObject *object);
 
-void sp_style_read_from_repr(SPStyle *style, Inkscape::XML::Node *repr);
+void sp_style_read_from_prefs(SPStyle *style, Glib::ustring const &path);
 
 void sp_style_merge_from_style_string(SPStyle *style, gchar const *p);
 
@@ -382,6 +402,8 @@ gchar *sp_style_write_string(SPStyle const *style, guint flags = SP_STYLE_FLAG_I
 
 gchar *sp_style_write_difference(SPStyle const *from, SPStyle const *to);
 
+void sp_style_set_to_uri_string (SPStyle *style, bool isfill, const gchar *uri);
+
 /* SPTextStyle */
 
 enum SPCSSFontSize {
@@ -524,6 +546,9 @@ struct SPTextStyle {
     /* CSS font properties */
     SPIString font_family;
 
+    /* Full font name, as font_factory::ConstructFontSpecification would give */
+    SPIString font_specification;
+
     /** \todo fixme: The 'font' property is ugly, and not working (lauris) */
     SPIString font;
 };
@@ -536,7 +561,12 @@ SPCSSAttr *sp_css_attr_scale(SPCSSAttr *css, double ex);
 
 void sp_style_unset_property_attrs(SPObject *o);
 
-#endif
+void sp_style_set_property_url (SPObject *item, gchar const *property, SPObject *linked, bool recursive);
+
+gchar *attribute_unquote(gchar const *val);
+gchar *css2_escape_quote(gchar const *val);
+
+#endif // SEEN_SP_STYLE_H
 
 
 /*