Code

Indent support for XSLT extensions output.
[inkscape.git] / src / style.h
index 3a547bfb90b2e6431782690a8b86a1dd5feab940..b4663e8f6c043cb86434eafb514e9a08306611a6 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.
  *
@@ -41,6 +43,7 @@ class SPIString;
 class SPILength;
 class SPIPaint;
 class SPIFontSize;
+class SPIBaselineShift;
 
 /// Float type internal to SPStyle.
 struct SPIFloat {
@@ -141,15 +144,6 @@ struct SPILength {
 
 #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())
-
-enum {
-    SP_PAINT_TYPE_NONE,
-    SP_PAINT_TYPE_COLOR,
-    SP_PAINT_TYPE_PAINTSERVER,
-    SP_PAINT_TYPE_IMPOSSIBLE
-};
 
 class SVGICCColor;
 
@@ -158,14 +152,38 @@ struct SPIPaint {
     unsigned set : 1;
     unsigned inherit : 1;
     unsigned currentcolor : 1;
-    unsigned type : 2;
     unsigned int colorSet : 1;
     unsigned int noneSet : 1;
     struct {
-        SPPaintServerReference *href; 
-        SPColor color;
-        SVGICCColor *iccColor;
+         SPPaintServerReference *href;
+         SPColor color;
     } value;
+
+    SPIPaint();
+
+    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;}
+
+    void read( gchar const *str, SPStyle &tyle, SPDocument *document = 0);
+
+    // Win32 is a temp work-around until the emf extension is fixed:
+#ifndef WIN32
+private:
+    SPIPaint(SPIPaint const&);
+    SPIPaint &operator=(SPIPaint const &);
+#endif // WIN32
 };
 
 /// Filter type internal to SPStyle
@@ -181,6 +199,12 @@ enum {
     SP_FONT_SIZE_PERCENTAGE
 };
 
+enum {
+    SP_BASELINE_SHIFT_LITERAL,
+    SP_BASELINE_SHIFT_LENGTH,
+    SP_BASELINE_SHIFT_PERCENTAGE
+};
+
 #define SP_FONT_SIZE ((1 << 24) - 1)
 
 #define SP_F8_16_TO_FLOAT(v) ((gdouble) (v) / (1 << 16))
@@ -199,6 +223,17 @@ struct SPIFontSize {
     float computed;
 };
 
+/// Baseline shift type internal to SPStyle.
+struct SPIBaselineShift {
+    unsigned set : 1;
+    unsigned inherit : 1;
+    unsigned type : 2;
+    unsigned unit : 4;
+    unsigned literal: 2;
+    float value; // Can be negative
+    float computed;
+};
+
 /// Text decoration type internal to SPStyle.
 struct SPITextDecoration {
     unsigned set : 1;
@@ -278,6 +313,8 @@ struct SPStyle {
     SPIEnum block_progression;
     /** Writing mode (css3 text 3.2 and svg1.1 10.7.2) */
     SPIEnum writing_mode;
+    /** Baseline shift (svg1.1 10.9.2) */
+    SPIBaselineShift baseline_shift;
 
     /* SVG */
     /** Anchor of the text (svg1.1 10.9.1) */
@@ -329,6 +366,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;
 
@@ -349,7 +387,7 @@ struct SPStyle {
     SPIEnum enable_background;
 
     /// style belongs to a cloned object
-    bool cloned; 
+    bool cloned;
 
     sigc::connection release_connection;
 
@@ -357,12 +395,17 @@ struct SPStyle {
     sigc::connection fill_ps_modified_connection;
     sigc::connection stroke_ps_modified_connection;
 
-    SPObject *getFilter() {if (filter.href) return filter.href->getObject(); else return NULL;}
-    const gchar *getFilterURI() {if (filter.href) return filter.href->getURI()->toString(); else return NULL;}
-    SPPaintServer *getFillPaintServer() {if (fill.value.href) return fill.value.href->getObject(); else return NULL;}
-    const gchar *getFillURI() {if (fill.value.href) return fill.value.href->getURI()->toString(); else return NULL;}
-    SPPaintServer *getStrokePaintServer() {if (stroke.value.href) return stroke.value.href->getObject(); else return NULL;}
-    const gchar *getStrokeURI() {if (stroke.value.href) return stroke.value.href->getURI()->toString(); else return NULL;}
+    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(SPDocument *document);
@@ -375,7 +418,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);
 
@@ -485,6 +528,12 @@ enum SPTextAnchor {
     SP_CSS_TEXT_ANCHOR_END
 };
 
+enum SPCSSBaselineShift {
+  SP_CSS_BASELINE_SHIFT_BASELINE,
+  SP_CSS_BASELINE_SHIFT_SUB,
+  SP_CSS_BASELINE_SHIFT_SUPER
+};
+
 enum SPVisibility {
     SP_CSS_VISIBILITY_HIDDEN,
     SP_CSS_VISIBILITY_COLLAPSE,
@@ -531,6 +580,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;
 };
@@ -548,7 +600,7 @@ void sp_style_set_property_url (SPObject *item, gchar const *property, SPObject
 gchar *attribute_unquote(gchar const *val);
 gchar *css2_escape_quote(gchar const *val);
 
-#endif
+#endif // SEEN_SP_STYLE_H
 
 
 /*
@@ -560,4 +612,4 @@ gchar *css2_escape_quote(gchar const *val);
   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 :