sp-linear-gradient.cpp revision 1375fe5c9f0af935233ad027bad7e14094a3414e
#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->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;
}
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;
}