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-linear-gradient.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-linear-gradient.cpp')
| -rw-r--r-- | src/sp-linear-gradient.cpp | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/src/sp-linear-gradient.cpp b/src/sp-linear-gradient.cpp new file mode 100644 index 000000000..d1d3f9d74 --- /dev/null +++ b/src/sp-linear-gradient.cpp @@ -0,0 +1,133 @@ +#include "sp-linear-gradient.h" + +#include "attributes.h" +#include "xml/repr.h" + +#include "sp-factory.h" + +namespace { + SPObject* createLinearGradient() { + return new SPLinearGradient(); + } + + bool linearGradientRegistered = SPFactory::instance().registerObject("svg:linearGradient", createLinearGradient); +} + + +/* + * Linear Gradient + */ +SPLinearGradient::SPLinearGradient() : SPGradient() { + this->cobject = this; + + this->x1.unset(SVGLength::PERCENT, 0.0, 0.0); + this->y1.unset(SVGLength::PERCENT, 0.0, 0.0); + this->x2.unset(SVGLength::PERCENT, 1.0, 1.0); + this->y2.unset(SVGLength::PERCENT, 0.0, 0.0); +} + +SPLinearGradient::~SPLinearGradient() { +} + +void SPLinearGradient::build(SPDocument *document, Inkscape::XML::Node *repr) { + SPGradient::build(document, repr); + + this->readAttr( "x1" ); + this->readAttr( "y1" ); + this->readAttr( "x2" ); + this->readAttr( "y2" ); +} + +/** + * Callback: set attribute. + */ +void SPLinearGradient::set(unsigned int key, const gchar* value) { + switch (key) { + case SP_ATTR_X1: + this->x1.readOrUnset(value, SVGLength::PERCENT, 0.0, 0.0); + this->requestModified(SP_OBJECT_MODIFIED_FLAG); + break; + + case SP_ATTR_Y1: + this->y1.readOrUnset(value, SVGLength::PERCENT, 0.0, 0.0); + this->requestModified(SP_OBJECT_MODIFIED_FLAG); + break; + + case SP_ATTR_X2: + this->x2.readOrUnset(value, SVGLength::PERCENT, 1.0, 1.0); + this->requestModified(SP_OBJECT_MODIFIED_FLAG); + break; + + case SP_ATTR_Y2: + this->y2.readOrUnset(value, SVGLength::PERCENT, 0.0, 0.0); + this->requestModified(SP_OBJECT_MODIFIED_FLAG); + break; + + default: + SPGradient::set(key, value); + break; + } +} + +/** + * Callback: write attributes to associated repr. + */ +Inkscape::XML::Node* SPLinearGradient::write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) { + if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) { + repr = xml_doc->createElement("svg:linearGradient"); + } + + if ((flags & SP_OBJECT_WRITE_ALL) || this->x1._set) { + sp_repr_set_svg_double(repr, "x1", this->x1.computed); + } + + if ((flags & SP_OBJECT_WRITE_ALL) || this->y1._set) { + sp_repr_set_svg_double(repr, "y1", this->y1.computed); + } + + if ((flags & SP_OBJECT_WRITE_ALL) || this->x2._set) { + sp_repr_set_svg_double(repr, "x2", this->x2.computed); + } + + if ((flags & SP_OBJECT_WRITE_ALL) || this->y2._set) { + sp_repr_set_svg_double(repr, "y2", this->y2.computed); + } + + SPGradient::write(xml_doc, repr, flags); + + return repr; +} + + +/** + * Directly set properties of linear gradient and request modified. + */ +void +sp_lineargradient_set_position(SPLinearGradient *lg, + gdouble x1, gdouble y1, + gdouble x2, gdouble y2) +{ + g_return_if_fail(lg != NULL); + g_return_if_fail(SP_IS_LINEARGRADIENT(lg)); + + /* fixme: units? (Lauris) */ + lg->x1.set(SVGLength::NONE, x1, x1); + lg->y1.set(SVGLength::NONE, y1, y1); + lg->x2.set(SVGLength::NONE, x2, x2); + lg->y2.set(SVGLength::NONE, y2, y2); + + lg->requestModified(SP_OBJECT_MODIFIED_FLAG); +} + + +cairo_pattern_t* SPLinearGradient::pattern_new(cairo_t *ct, Geom::OptRect const &bbox, double opacity) { + this->ensureVector(); + + cairo_pattern_t *cp = cairo_pattern_create_linear( + this->x1.computed, this->y1.computed, + this->x2.computed, this->y2.computed); + + sp_gradient_pattern_common_setup(cp, this, bbox, opacity); + + return cp; +} |
