diff options
| author | Markus Engel <markus.engel@tum.de> | 2013-04-05 23:36:16 +0000 |
|---|---|---|
| committer | Markus Engel <markus.engel@tum.de> | 2013-04-05 23:36:16 +0000 |
| commit | b0cc47554b385fb68643d07efe6e42366c7121ad (patch) | |
| tree | bb7fb4babd001b1397386197d7e486187fd0db4d /src/sp-stop.cpp | |
| parent | Merged Item. (diff) | |
| download | inkscape-b0cc47554b385fb68643d07efe6e42366c7121ad.tar.gz inkscape-b0cc47554b385fb68643d07efe6e42366c7121ad.zip | |
Merged PaintServer and subclasses; moved Gradient classes to own files.
(bzr r11608.1.82)
Diffstat (limited to 'src/sp-stop.cpp')
| -rw-r--r-- | src/sp-stop.cpp | 195 |
1 files changed, 194 insertions, 1 deletions
diff --git a/src/sp-stop.cpp b/src/sp-stop.cpp index 0c0a3b03a..71d06ced9 100644 --- a/src/sp-stop.cpp +++ b/src/sp-stop.cpp @@ -17,6 +17,177 @@ #include "sp-stop.h" #include "style.h" +#include "attributes.h" +#include "streq.h" +#include "svg/svg.h" +#include "svg/svg-color.h" +#include "svg/css-ostringstream.h" +#include "xml/repr.h" + +#include "sp-factory.h" + +namespace { + SPObject* createStop() { + return new SPStop(); + } + + bool stopRegistered = SPFactory::instance().registerObject("svg:stop", createStop); +} + +SPStop::SPStop() : SPObject(), CObject(this) { + delete this->cobject; + this->cobject = this; + + this->path_string = NULL; + + this->offset = 0.0; + this->currentColor = false; + this->specified_color.set( 0x000000ff ); + this->opacity = 1.0; +} + +SPStop::~SPStop() { +} + +void SPStop::build(SPDocument* doc, Inkscape::XML::Node* repr) { + SPStop* object = this; + + CObject::build(doc, repr); + + object->readAttr( "offset" ); + object->readAttr( "stop-color" ); + object->readAttr( "stop-opacity" ); + object->readAttr( "style" ); + object->readAttr( "path" ); // For mesh +} + +/** + * Virtual build: set stop attributes from its associated XML node. + */ + +void SPStop::set(unsigned int key, const gchar* value) { + SPStop* object = this; + + SPStop *stop = SP_STOP(object); + + switch (key) { + case SP_ATTR_STYLE: { + /** \todo + * fixme: We are reading simple values 3 times during build (Lauris). + * \par + * We need presentation attributes etc. + * \par + * remove the hackish "style reading" from here: see comments in + * sp_object_get_style_property about the bugs in our current + * approach. However, note that SPStyle doesn't currently have + * stop-color and stop-opacity properties. + */ + { + gchar const *p = object->getStyleProperty( "stop-color", "black"); + if (streq(p, "currentColor")) { + stop->currentColor = true; + } else { + stop->specified_color = SPStop::readStopColor( p ); + } + } + { + gchar const *p = object->getStyleProperty( "stop-opacity", "1"); + gdouble opacity = sp_svg_read_percentage(p, stop->opacity); + stop->opacity = opacity; + } + object->requestModified(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG); + break; + } + case SP_PROP_STOP_COLOR: { + { + gchar const *p = object->getStyleProperty( "stop-color", "black"); + if (streq(p, "currentColor")) { + stop->currentColor = true; + } else { + stop->currentColor = false; + stop->specified_color = SPStop::readStopColor( p ); + } + } + object->requestModified(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG); + break; + } + case SP_PROP_STOP_OPACITY: { + { + gchar const *p = object->getStyleProperty( "stop-opacity", "1"); + gdouble opacity = sp_svg_read_percentage(p, stop->opacity); + stop->opacity = opacity; + } + object->requestModified(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG); + break; + } + case SP_ATTR_OFFSET: { + stop->offset = sp_svg_read_percentage(value, 0.0); + object->requestModified(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG); + break; + } + case SP_PROP_STOP_PATH: { + if (value) { + stop->path_string = new Glib::ustring( value ); + //Geom::PathVector pv = sp_svg_read_pathv(value); + //SPCurve *curve = new SPCurve(pv); + //if( curve ) { + // std::cout << "Got Curve" << std::endl; + //curve->unref(); + //} + } + break; + } + default: { + CObject::set(key, value); + break; + } + } +} + +/** + * Virtual set: set attribute to value. + */ + +Inkscape::XML::Node* SPStop::write(Inkscape::XML::Document* xml_doc, Inkscape::XML::Node* repr, guint flags) { + SPStop* object = this; + + SPStop *stop = SP_STOP(object); + + if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) { + repr = xml_doc->createElement("svg:stop"); + } + + Glib::ustring colorStr = stop->specified_color.toString(); + gfloat opacity = stop->opacity; + + CObject::write(xml_doc, repr, flags); + + // Since we do a hackish style setting here (because SPStyle does not support stop-color and + // stop-opacity), we must do it AFTER calling the parent write method; otherwise + // sp_object_write would clear our style= attribute (bug 1695287) + + Inkscape::CSSOStringStream os; + os << "stop-color:"; + if (stop->currentColor) { + os << "currentColor"; + } else { + os << colorStr; + } + os << ";stop-opacity:" << opacity; + repr->setAttribute("style", os.str().c_str()); + repr->setAttribute("stop-color", NULL); + repr->setAttribute("stop-opacity", NULL); + sp_repr_set_css_double(repr, "offset", stop->offset); + /* strictly speaking, offset an SVG <number> rather than a CSS one, but exponents make no sense + * for offset proportions. */ + + return repr; +} + +/** + * Virtual write: write object attributes to repr. + */ + // A stop might have some non-stop siblings SPStop* SPStop::getNextStop() { @@ -80,7 +251,29 @@ SPColor SPStop::getEffectiveColor() const return ret; } - +/** + * Return stop's color as 32bit value. + */ +guint32 +sp_stop_get_rgba32(SPStop const *const stop) +{ + guint32 rgb0 = 0; + /* Default value: arbitrarily black. (SVG1.1 and CSS2 both say that the initial + * value depends on user agent, and don't give any further restrictions that I can + * see.) */ + if (stop->currentColor) { + char const *str = stop->getStyleProperty( "color", NULL); + if (str) { + rgb0 = sp_svg_read_color(str, rgb0); + } + unsigned const alpha = static_cast<unsigned>(stop->opacity * 0xff + 0.5); + g_return_val_if_fail((alpha & ~0xff) == 0, + rgb0 | 0xff); + return rgb0 | alpha; + } else { + return stop->specified_color.toRGBA32( stop->opacity ); + } +} /* Local Variables: |
