From 62fbbefccbe10ec11e727735e6bfe890003b0af2 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Tue, 21 Aug 2012 02:54:06 +0200 Subject: Added "virtual pad" to - SPPaintServer - SPPattern - SPGradient - SPStop - SPLinearGradient - SPMeshGradient - SPMeshPatch - SPMeshRow - SPRadialGradient As all subclasses of SPPaintServer now have "virtual pads" with correct inheritance, the virtual function call to "onCreatePattern" was converted to C++ style. (bzr r11608.1.35) --- src/sp-gradient.cpp | 539 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 359 insertions(+), 180 deletions(-) (limited to 'src/sp-gradient.cpp') diff --git a/src/sp-gradient.cpp b/src/sp-gradient.cpp index 262c35db1..778d6e52e 100644 --- a/src/sp-gradient.cpp +++ b/src/sp-gradient.cpp @@ -93,28 +93,7 @@ static Inkscape::XML::Node *sp_meshpatch_write(SPObject *object, Inkscape::XML:: static SPObjectClass *meshpatch_parent_class; -class SPGradientImpl -{ - friend class SPGradient; - - static void classInit(SPGradientClass *klass); - - static void init(SPGradient *gr); - static void build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr); - static void release(SPObject *object); - static void modified(SPObject *object, guint flags); - static Inkscape::XML::Node *write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags); - - static void gradientRefModified(SPObject *href, guint flags, SPGradient *gradient); - static void gradientRefChanged(SPObject *old_ref, SPObject *ref, SPGradient *gr); - - static void childAdded(SPObject *object, - Inkscape::XML::Node *child, - Inkscape::XML::Node *ref); - static void removeChild(SPObject *object, Inkscape::XML::Node *child); - static void setGradientAttr(SPObject *object, unsigned key, gchar const *value); -}; /** * Registers SPStop class and returns its type. @@ -153,25 +132,32 @@ static void sp_stop_class_init(SPStopClass *klass) sp_object_class->write = sp_stop_write; } +CStop::CStop(SPStop* stop) : CObject(stop) { + this->spstop = stop; +} + +CStop::~CStop() { +} + /** * Callback to initialize SPStop object. */ static void sp_stop_init(SPStop *stop) { + stop->cstop = new CStop(stop); + stop->cobject = stop->cstop; + stop->offset = 0.0; stop->currentColor = false; stop->specified_color.set( 0x000000ff ); stop->opacity = 1.0; } -/** - * Virtual build: set stop attributes from its associated XML node. - */ -static void sp_stop_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) -{ - if (((SPObjectClass *) stop_parent_class)->build) - (* ((SPObjectClass *) stop_parent_class)->build)(object, document, repr); +void CStop::onBuild(SPDocument* doc, Inkscape::XML::Node* repr) { + SPStop* object = this->spstop; + + CObject::onBuild(doc, repr); object->readAttr( "offset" ); object->readAttr( "stop-color" ); @@ -181,11 +167,16 @@ static void sp_stop_build(SPObject *object, SPDocument *document, Inkscape::XML: } /** - * Virtual set: set attribute to value. + * Virtual build: set stop attributes from its associated XML node. */ -static void -sp_stop_set(SPObject *object, unsigned key, gchar const *value) +static void sp_stop_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) { + ((SPStop*)object)->cstop->onBuild(document, repr); +} + +void CStop::onSet(unsigned int key, const gchar* value) { + SPStop* object = this->spstop; + SPStop *stop = SP_STOP(object); switch (key) { @@ -256,19 +247,24 @@ sp_stop_set(SPObject *object, unsigned key, gchar const *value) break; } default: { - if (((SPObjectClass *) stop_parent_class)->set) - (* ((SPObjectClass *) stop_parent_class)->set)(object, key, value); + CObject::onSet(key, value); break; } } } /** - * Virtual write: write object attributes to repr. + * Virtual set: set attribute to value. */ -static Inkscape::XML::Node * -sp_stop_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) +static void +sp_stop_set(SPObject *object, unsigned key, gchar const *value) { + ((SPStop*)object)->cstop->onSet(key, value); +} + +Inkscape::XML::Node* CStop::onWrite(Inkscape::XML::Document* xml_doc, Inkscape::XML::Node* repr, guint flags) { + SPStop* object = this->spstop; + SPStop *stop = SP_STOP(object); if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) { @@ -278,9 +274,7 @@ sp_stop_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML: Glib::ustring colorStr = stop->specified_color.toString(); gfloat opacity = stop->opacity; - if (((SPObjectClass *) stop_parent_class)->write) { - (* ((SPObjectClass *) stop_parent_class)->write)(object, xml_doc, repr, flags); - } + CObject::onWrite(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 @@ -304,6 +298,15 @@ sp_stop_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML: return repr; } +/** + * Virtual write: write object attributes to repr. + */ +static Inkscape::XML::Node * +sp_stop_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) +{ + return ((SPStop*)object)->cstop->onWrite(xml_doc, repr, flags); +} + bool SPGradient::hasStops() const { @@ -411,12 +414,24 @@ static void sp_meshrow_class_init(SPMeshRowClass *klass) sp_object_class->write = sp_meshrow_write; } +CMeshRow::CMeshRow(SPMeshRow* meshrow) : CObject(meshrow) { + this->spmeshrow = meshrow; +} + +CMeshRow::~CMeshRow() { +} + /** * Callback to initialize SPMeshRow object. */ -static void sp_meshrow_init(SPMeshRow * /*meshrow*/) +static void sp_meshrow_init(SPMeshRow * meshrow) { - // Do nothing + meshrow->cmeshrow = new CMeshRow(meshrow); + meshrow->cobject = meshrow->cmeshrow; +} + +void CMeshRow::onBuild(SPDocument* doc, Inkscape::XML::Node* repr) { + CObject::onBuild(doc, repr); } /** @@ -424,10 +439,11 @@ static void sp_meshrow_init(SPMeshRow * /*meshrow*/) */ static void sp_meshrow_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) { - if (((SPObjectClass *) meshrow_parent_class)->build) - (* ((SPObjectClass *) meshrow_parent_class)->build)(object, document, repr); + ((SPMeshRow*)object)->cmeshrow->onBuild(document, repr); +} + +void CMeshRow::onSet(unsigned int key, const gchar* value) { - // No attributes } /** @@ -438,25 +454,25 @@ static void sp_meshrow_set(SPObject * /*object*/, unsigned /*key*/, gchar const // Do nothing } -/** - * Virtual write: write object attributes to repr. - */ -static Inkscape::XML::Node * -sp_meshrow_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) -{ - //SPMeshRow *meshrow = SP_MESHROW(object); - +Inkscape::XML::Node* CMeshRow::onWrite(Inkscape::XML::Document* xml_doc, Inkscape::XML::Node* repr, guint flags) { if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) { repr = xml_doc->createElement("svg:meshRow"); } - if (((SPObjectClass *) meshrow_parent_class)->write) { - (* ((SPObjectClass *) meshrow_parent_class)->write)(object, xml_doc, repr, flags); - } + CObject::onWrite(xml_doc, repr, flags); return repr; } +/** + * Virtual write: write object attributes to repr. + */ +static Inkscape::XML::Node * +sp_meshrow_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) +{ + return ((SPMeshRow*)object)->cmeshrow->onWrite(xml_doc, repr, flags); +} + /* * Mesh Patch */ @@ -498,12 +514,28 @@ static void sp_meshpatch_class_init(SPMeshPatchClass *klass) sp_object_class->write = sp_meshpatch_write; } +CMeshPatch::CMeshPatch(SPMeshPatch* meshpatch) : CObject(meshpatch) { + this->spmeshpatch = meshpatch; +} + +CMeshPatch::~CMeshPatch() { +} + /** * Callback to initialize SPMeshPatch object. */ -static void sp_meshpatch_init(SPMeshPatch * /*meshpatch*/) +static void sp_meshpatch_init(SPMeshPatch * meshpatch) { - // Do nothing + meshpatch->cmeshpatch = new CMeshPatch(meshpatch); + meshpatch->cobject = meshpatch->cmeshpatch; +} + +void CMeshPatch::onBuild(SPDocument* doc, Inkscape::XML::Node* repr) { + SPMeshPatch* object = this->spmeshpatch; + + CObject::onBuild(doc, repr); + + object->readAttr( "tensor" ); } /** @@ -511,18 +543,12 @@ static void sp_meshpatch_init(SPMeshPatch * /*meshpatch*/) */ static void sp_meshpatch_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) { - if (((SPObjectClass *) meshpatch_parent_class)->build) - (* ((SPObjectClass *) meshpatch_parent_class)->build)(object, document, repr); - - object->readAttr( "tensor" ); + ((SPMeshPatch*)object)->cmeshpatch->onBuild(document, repr); } -/** - * Virtual set: set attribute to value. - */ -static void -sp_meshpatch_set(SPObject *object, unsigned key, gchar const *value) -{ +void CMeshPatch::onSet(unsigned int key, const gchar* value) { + SPMeshPatch* object = this->spmeshpatch; + SPMeshPatch *patch = SP_MESHPATCH(object); switch (key) { @@ -540,24 +566,33 @@ sp_meshpatch_set(SPObject *object, unsigned key, gchar const *value) } /** - * Virtual write: write object attributes to repr. + * Virtual set: set attribute to value. */ -static Inkscape::XML::Node * -sp_meshpatch_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) +static void +sp_meshpatch_set(SPObject *object, unsigned key, gchar const *value) { - //SPMeshPatch *meshpatch = SP_MESHPATCH(object); + ((SPMeshPatch*)object)->cmeshpatch->onSet(key, value); +} +Inkscape::XML::Node* CMeshPatch::onWrite(Inkscape::XML::Document* xml_doc, Inkscape::XML::Node* repr, guint flags) { if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) { repr = xml_doc->createElement("svg:meshPatch"); } - if (((SPObjectClass *) meshpatch_parent_class)->write) { - (* ((SPObjectClass *) meshpatch_parent_class)->write)(object, xml_doc, repr, flags); - } + CObject::onWrite(xml_doc, repr, flags); return repr; } +/** + * Virtual write: write object attributes to repr. + */ +static Inkscape::XML::Node * +sp_meshpatch_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) +{ + return ((SPMeshPatch*)object)->cmeshpatch->onWrite(xml_doc, repr, flags); +} + /* * Gradient @@ -576,11 +611,11 @@ GType SPGradient::getType() GTypeInfo gradient_info = { sizeof(SPGradientClass), NULL, NULL, - (GClassInitFunc) SPGradientImpl::classInit, + (GClassInitFunc) CGradient::classInit, NULL, NULL, sizeof(SPGradient), 16, - (GInstanceInitFunc) SPGradientImpl::init, + (GInstanceInitFunc) CGradient::init, NULL, /* value_table */ }; gradient_type = g_type_register_static(SP_TYPE_PAINT_SERVER, "SPGradient", @@ -589,31 +624,51 @@ GType SPGradient::getType() return gradient_type; } +void spgradient_on_build(SPObject* object, SPDocument *document, Inkscape::XML::Node *repr); +void spgradient_on_release(SPObject* object); +void spgradient_set(SPObject* object, unsigned int key, const gchar* value); +void spgradient_child_added(SPObject* object, Inkscape::XML::Node *child, Inkscape::XML::Node *ref); +void spgradient_remove_child(SPObject* object, Inkscape::XML::Node *child); +void spgradient_modified(SPObject* object, guint flags); +Inkscape::XML::Node* spgradient_write(SPObject* object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags); + + /** * SPGradient vtable initialization. */ -void SPGradientImpl::classInit(SPGradientClass *klass) +void CGradient::classInit(SPGradientClass *klass) { SPObjectClass *sp_object_class = (SPObjectClass *) klass; gradient_parent_class = (SPPaintServerClass *)g_type_class_ref(SP_TYPE_PAINT_SERVER); - sp_object_class->build = SPGradientImpl::build; - sp_object_class->release = SPGradientImpl::release; - sp_object_class->set = SPGradientImpl::setGradientAttr; - sp_object_class->child_added = SPGradientImpl::childAdded; - sp_object_class->remove_child = SPGradientImpl::removeChild; - sp_object_class->modified = SPGradientImpl::modified; - sp_object_class->write = SPGradientImpl::write; + sp_object_class->build = spgradient_on_build; + sp_object_class->release = spgradient_on_release; + sp_object_class->set = spgradient_set; + sp_object_class->child_added = spgradient_child_added; + sp_object_class->remove_child = spgradient_remove_child; + sp_object_class->modified = spgradient_modified; + sp_object_class->write = spgradient_write; +} + +CGradient::CGradient(SPGradient* gradient) : CPaintServer(gradient) { + this->spgradient = gradient; +} + +CGradient::~CGradient() { } /** * Callback for SPGradient object initialization. */ -void SPGradientImpl::init(SPGradient *gr) +void CGradient::init(SPGradient *gr) { + gr->cgradient = new CGradient(gr); + gr->cpaintserver = gr->cgradient; + gr->cobject = gr->cgradient; + gr->ref = new SPGradientReference(gr); - gr->ref->changedSignal().connect(sigc::bind(sigc::ptr_fun(SPGradientImpl::gradientRefChanged), gr)); + gr->ref->changedSignal().connect(sigc::bind(sigc::ptr_fun(CGradient::gradientRefChanged), gr)); /** \todo * Fixme: reprs being rearranged (e.g. via the XML editor) @@ -641,8 +696,9 @@ void SPGradientImpl::init(SPGradient *gr) /** * Virtual build: set gradient attributes from its associated repr. */ -void SPGradientImpl::build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) +void CGradient::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { + SPGradient* object = this->spgradient; SPGradient *gradient = SP_GRADIENT(object); // Work-around in case a swatch had been marked for immediate collection: @@ -650,9 +706,7 @@ void SPGradientImpl::build(SPObject *object, SPDocument *document, Inkscape::XML repr->setAttribute("inkscape:collect", 0); } - if (((SPObjectClass *) gradient_parent_class)->build) { - (* ((SPObjectClass *) gradient_parent_class)->build)(object, document, repr); - } + CPaintServer::onBuild(document, repr); for ( SPObject *ochild = object->firstChild() ; ochild ; ochild = ochild->getNext() ) { if (SP_IS_STOP(ochild)) { @@ -671,11 +725,16 @@ void SPGradientImpl::build(SPObject *object, SPDocument *document, Inkscape::XML document->addResource("gradient", object); } +void spgradient_on_build(SPObject* object, SPDocument *document, Inkscape::XML::Node *repr) { + ((SPGradient*)object)->cgradient->onBuild(document, repr); +} + /** * Virtual release of SPGradient members before destruction. */ -void SPGradientImpl::release(SPObject *object) +void CGradient::onRelease() { + SPGradient* object = this->spgradient; SPGradient *gradient = (SPGradient *) object; #ifdef SP_GRADIENT_VERBOSE @@ -696,15 +755,19 @@ void SPGradientImpl::release(SPObject *object) gradient->modified_connection.~connection(); - if (((SPObjectClass *) gradient_parent_class)->release) - ((SPObjectClass *) gradient_parent_class)->release(object); + CPaintServer::onRelease(); +} + +void spgradient_on_release(SPObject* object) { + ((SPGradient*)object)->cgradient->onRelease(); } /** * Set gradient attribute to value. */ -void SPGradientImpl::setGradientAttr(SPObject *object, unsigned key, gchar const *value) +void CGradient::onSet(unsigned key, gchar const *value) { + SPGradient* object = this->spgradient; SPGradient *gr = SP_GRADIENT(object); switch (key) { @@ -783,17 +846,19 @@ void SPGradientImpl::setGradientAttr(SPObject *object, unsigned key, gchar const } break; default: - if (((SPObjectClass *) gradient_parent_class)->set) { - ((SPObjectClass *) gradient_parent_class)->set(object, key, value); - } + CPaintServer::onSet(key, value); break; } } +void spgradient_set(SPObject* object, unsigned int key, const gchar* value) { + ((SPGradient*)object)->cgradient->onSet(key, value); +} + /** * Gets called when the gradient is (re)attached to another gradient. */ -void SPGradientImpl::gradientRefChanged(SPObject *old_ref, SPObject *ref, SPGradient *gr) +void CGradient::gradientRefChanged(SPObject *old_ref, SPObject *ref, SPGradient *gr) { if (old_ref) { gr->modified_connection.disconnect(); @@ -801,7 +866,7 @@ void SPGradientImpl::gradientRefChanged(SPObject *old_ref, SPObject *ref, SPGrad if ( SP_IS_GRADIENT(ref) && ref != gr ) { - gr->modified_connection = ref->connectModified(sigc::bind<2>(sigc::ptr_fun(&SPGradientImpl::gradientRefModified), gr)); + gr->modified_connection = ref->connectModified(sigc::bind<2>(sigc::ptr_fun(&CGradient::gradientRefModified), gr)); } // Per SVG, all unset attributes must be inherited from linked gradient. @@ -822,15 +887,14 @@ void SPGradientImpl::gradientRefChanged(SPObject *old_ref, SPObject *ref, SPGrad /** * Callback for child_added event. */ -void SPGradientImpl::childAdded(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *ref) +void CGradient::onChildAdded(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) { + SPGradient* object = this->spgradient; SPGradient *gr = SP_GRADIENT(object); gr->invalidateVector(); - if (((SPObjectClass *) gradient_parent_class)->child_added) { - (* ((SPObjectClass *) gradient_parent_class)->child_added)(object, child, ref); - } + CPaintServer::onChildAdded(child, ref); SPObject *ochild = object->get_child_by_repr(child); if ( ochild && SP_IS_STOP(ochild) ) { @@ -847,18 +911,21 @@ void SPGradientImpl::childAdded(SPObject *object, Inkscape::XML::Node *child, In object->requestModified(SP_OBJECT_MODIFIED_FLAG); } +void spgradient_child_added(SPObject* object, Inkscape::XML::Node *child, Inkscape::XML::Node *ref) { + ((SPGradient*)object)->cgradient->onChildAdded(child, ref); +} + /** * Callback for remove_child event. */ -void SPGradientImpl::removeChild(SPObject *object, Inkscape::XML::Node *child) +void CGradient::onRemoveChild(Inkscape::XML::Node *child) { + SPGradient* object = this->spgradient; SPGradient *gr = SP_GRADIENT(object); gr->invalidateVector(); - if (((SPObjectClass *) gradient_parent_class)->remove_child) { - (* ((SPObjectClass *) gradient_parent_class)->remove_child)(object, child); - } + CPaintServer::onRemoveChild(child); gr->has_stops = FALSE; for ( SPObject *ochild = object->firstChild() ; ochild ; ochild = ochild->getNext() ) { @@ -879,11 +946,16 @@ void SPGradientImpl::removeChild(SPObject *object, Inkscape::XML::Node *child) object->requestModified(SP_OBJECT_MODIFIED_FLAG); } +void spgradient_remove_child(SPObject* object, Inkscape::XML::Node *child) { + ((SPGradient*)object)->cgradient->onRemoveChild(child); +} + /** * Callback for modified event. */ -void SPGradientImpl::modified(SPObject *object, guint flags) +void CGradient::onModified(guint flags) { + SPGradient* object = this->spgradient; SPGradient *gr = SP_GRADIENT(object); if (flags & SP_OBJECT_CHILD_MODIFIED_FLAG) { @@ -922,6 +994,10 @@ void SPGradientImpl::modified(SPObject *object, guint flags) } } +void spgradient_modified(SPObject* object, guint flags) { + ((SPGradient*)object)->cgradient->onModified(flags); +} + SPStop* SPGradient::getFirstStop() { SPStop* first = 0; @@ -947,13 +1023,12 @@ int SPGradient::getStopCount() const /** * Write gradient attributes to repr. */ -Inkscape::XML::Node *SPGradientImpl::write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) +Inkscape::XML::Node *CGradient::onWrite(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) { + SPGradient* object = this->spgradient; SPGradient *gr = SP_GRADIENT(object); - if (((SPObjectClass *) gradient_parent_class)->write) { - (* ((SPObjectClass *) gradient_parent_class)->write)(object, xml_doc, repr, flags); - } + CPaintServer::onWrite(xml_doc, repr, flags); if (flags & SP_OBJECT_WRITE_BUILD) { GSList *l = NULL; @@ -1023,6 +1098,10 @@ Inkscape::XML::Node *SPGradientImpl::write(SPObject *object, Inkscape::XML::Docu return repr; } +Inkscape::XML::Node* spgradient_write(SPObject* object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) { + return ((SPGradient*)object)->cgradient->onWrite(xml_doc, repr, flags); +} + /** * Forces the vector to be built, if not present (i.e., changed). * @@ -1243,7 +1322,7 @@ sp_gradient_repr_write_vector(SPGradient *gr) } -void SPGradientImpl::gradientRefModified(SPObject */*href*/, guint /*flags*/, SPGradient *gradient) +void CGradient::gradientRefModified(SPObject */*href*/, guint /*flags*/, SPGradient *gradient) { if ( gradient->invalidateVector() ) { gradient->requestModified(SP_OBJECT_MODIFIED_FLAG); @@ -1514,26 +1593,33 @@ static void sp_lineargradient_class_init(SPLinearGradientClass *klass) ps_class->pattern_new = sp_lineargradient_create_pattern; } +CLinearGradient::CLinearGradient(SPLinearGradient* lineargradient) : CGradient(lineargradient) { + this->splineargradient = lineargradient; +} + +CLinearGradient::~CLinearGradient() { +} + /** * Callback for SPLinearGradient object initialization. */ static void sp_lineargradient_init(SPLinearGradient *lg) { + lg->clineargradient = new CLinearGradient(lg); + lg->cgradient = lg->clineargradient; + lg->cpaintserver = lg->clineargradient; + lg->cobject = lg->clineargradient; + lg->x1.unset(SVGLength::PERCENT, 0.0, 0.0); lg->y1.unset(SVGLength::PERCENT, 0.0, 0.0); lg->x2.unset(SVGLength::PERCENT, 1.0, 1.0); lg->y2.unset(SVGLength::PERCENT, 0.0, 0.0); } -/** - * Callback: set attributes from associated repr. - */ -static void sp_lineargradient_build(SPObject *object, - SPDocument *document, - Inkscape::XML::Node *repr) -{ - if (((SPObjectClass *) lg_parent_class)->build) - (* ((SPObjectClass *) lg_parent_class)->build)(object, document, repr); +void CLinearGradient::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { + SPLinearGradient* object = this->splineargradient; + + CGradient::onBuild(document, repr); object->readAttr( "x1" ); object->readAttr( "y1" ); @@ -1542,11 +1628,18 @@ static void sp_lineargradient_build(SPObject *object, } /** - * Callback: set attribute. + * Callback: set attributes from associated repr. */ -static void -sp_lineargradient_set(SPObject *object, unsigned key, gchar const *value) +static void sp_lineargradient_build(SPObject *object, + SPDocument *document, + Inkscape::XML::Node *repr) { + ((SPLinearGradient*)object)->clineargradient->onBuild(document, repr); +} + +void CLinearGradient::onSet(unsigned int key, const gchar* value) { + SPLinearGradient* object = this->splineargradient; + SPLinearGradient *lg = SP_LINEARGRADIENT(object); switch (key) { @@ -1567,18 +1660,23 @@ sp_lineargradient_set(SPObject *object, unsigned key, gchar const *value) object->requestModified(SP_OBJECT_MODIFIED_FLAG); break; default: - if (((SPObjectClass *) lg_parent_class)->set) - (* ((SPObjectClass *) lg_parent_class)->set)(object, key, value); + CGradient::onSet(key, value); break; } } /** - * Callback: write attributes to associated repr. + * Callback: set attribute. */ -static Inkscape::XML::Node * -sp_lineargradient_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) +static void +sp_lineargradient_set(SPObject *object, unsigned key, gchar const *value) { + ((SPLinearGradient*)object)->clineargradient->onSet(key, value); +} + +Inkscape::XML::Node* CLinearGradient::onWrite(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) { + SPLinearGradient* object = this->splineargradient; + SPLinearGradient *lg = SP_LINEARGRADIENT(object); if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) { @@ -1594,12 +1692,20 @@ sp_lineargradient_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inks if ((flags & SP_OBJECT_WRITE_ALL) || lg->y2._set) sp_repr_set_svg_double(repr, "y2", lg->y2.computed); - if (((SPObjectClass *) lg_parent_class)->write) - (* ((SPObjectClass *) lg_parent_class)->write)(object, xml_doc, repr, flags); + CGradient::onWrite(xml_doc, repr, flags); return repr; } +/** + * Callback: write attributes to associated repr. + */ +static Inkscape::XML::Node * +sp_lineargradient_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) +{ + return ((SPLinearGradient*)object)->clineargradient->onWrite(xml_doc, repr, flags); +} + /** * Directly set properties of linear gradient and request modified. */ @@ -1677,12 +1783,24 @@ static void sp_radialgradient_class_init(SPRadialGradientClass *klass) ps_class->pattern_new = sp_radialgradient_create_pattern; } +CRadialGradient::CRadialGradient(SPRadialGradient* radialgradient) : CGradient(radialgradient) { + this->spradialgradient = radialgradient; +} + +CRadialGradient::~CRadialGradient() { +} + /** * Callback for SPRadialGradient object initialization. */ static void sp_radialgradient_init(SPRadialGradient *rg) { + rg->cradialgradient = new CRadialGradient(rg); + rg->cgradient = rg->cradialgradient; + rg->cpaintserver = rg->cradialgradient; + rg->cobject = rg->cradialgradient; + rg->cx.unset(SVGLength::PERCENT, 0.5, 0.5); rg->cy.unset(SVGLength::PERCENT, 0.5, 0.5); rg->r.unset(SVGLength::PERCENT, 0.5, 0.5); @@ -1690,14 +1808,10 @@ sp_radialgradient_init(SPRadialGradient *rg) rg->fy.unset(SVGLength::PERCENT, 0.5, 0.5); } -/** - * Set radial gradient attributes from associated repr. - */ -static void -sp_radialgradient_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) -{ - if (((SPObjectClass *) rg_parent_class)->build) - (* ((SPObjectClass *) rg_parent_class)->build)(object, document, repr); +void CRadialGradient::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { + SPRadialGradient* object = this->spradialgradient; + + CGradient::onBuild(document, repr); object->readAttr( "cx" ); object->readAttr( "cy" ); @@ -1707,11 +1821,17 @@ sp_radialgradient_build(SPObject *object, SPDocument *document, Inkscape::XML::N } /** - * Set radial gradient attribute. + * Set radial gradient attributes from associated repr. */ static void -sp_radialgradient_set(SPObject *object, unsigned key, gchar const *value) +sp_radialgradient_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) { + ((SPRadialGradient*)object)->cradialgradient->onBuild(document, repr); +} + +void CRadialGradient::onSet(unsigned key, gchar const *value) { + SPRadialGradient* object = this->spradialgradient; + SPRadialGradient *rg = SP_RADIALGRADIENT(object); switch (key) { @@ -1754,18 +1874,23 @@ sp_radialgradient_set(SPObject *object, unsigned key, gchar const *value) object->requestModified(SP_OBJECT_MODIFIED_FLAG); break; default: - if (((SPObjectClass *) rg_parent_class)->set) - ((SPObjectClass *) rg_parent_class)->set(object, key, value); + CGradient::onSet(key, value); break; } } /** - * Write radial gradient attributes to associated repr. + * Set radial gradient attribute. */ -static Inkscape::XML::Node * -sp_radialgradient_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) +static void +sp_radialgradient_set(SPObject *object, unsigned key, gchar const *value) { + ((SPRadialGradient*)object)->cradialgradient->onSet(key, value); +} + +Inkscape::XML::Node* CRadialGradient::onWrite(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) { + SPRadialGradient* object = this->spradialgradient; + SPRadialGradient *rg = SP_RADIALGRADIENT(object); if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) { @@ -1778,12 +1903,20 @@ sp_radialgradient_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inks if ((flags & SP_OBJECT_WRITE_ALL) || rg->fx._set) sp_repr_set_svg_double(repr, "fx", rg->fx.computed); if ((flags & SP_OBJECT_WRITE_ALL) || rg->fy._set) sp_repr_set_svg_double(repr, "fy", rg->fy.computed); - if (((SPObjectClass *) rg_parent_class)->write) - (* ((SPObjectClass *) rg_parent_class)->write)(object, xml_doc, repr, flags); + CGradient::onWrite(xml_doc, repr, flags); return repr; } +/** + * Write radial gradient attributes to associated repr. + */ +static Inkscape::XML::Node * +sp_radialgradient_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) +{ + return ((SPRadialGradient*)object)->cradialgradient->onWrite(xml_doc, repr, flags); +} + /** * Directly set properties of radial gradient and request modified. */ @@ -1866,25 +1999,33 @@ static void sp_meshgradient_class_init(SPMeshGradientClass *klass) ps_class->pattern_new = sp_meshgradient_create_pattern; } +CMeshGradient::CMeshGradient(SPMeshGradient* meshgradient) : CGradient(meshgradient) { + this->spmeshgradient = meshgradient; +} + +CMeshGradient::~CMeshGradient() { +} + /** * Callback for SPMeshGradient object initialization. */ static void sp_meshgradient_init(SPMeshGradient *mg) { + mg->cmeshgradient = new CMeshGradient(mg); + mg->cgradient = mg->cmeshgradient; + mg->cpaintserver = mg->cmeshgradient; + mg->cobject = mg->cmeshgradient; + // Start coordinate of mesh mg->x.unset(SVGLength::NONE, 0.0, 0.0); mg->y.unset(SVGLength::NONE, 0.0, 0.0); } -/** - * Set mesh gradient attributes from associated repr. - */ -static void -sp_meshgradient_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) -{ - if (((SPObjectClass *) mg_parent_class)->build) - (* ((SPObjectClass *) mg_parent_class)->build)(object, document, repr); +void CMeshGradient::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { + SPMeshGradient* object = this->spmeshgradient; + + CGradient::onBuild(document, repr); // Start coordinate of mesh object->readAttr( "x" ); @@ -1892,11 +2033,17 @@ sp_meshgradient_build(SPObject *object, SPDocument *document, Inkscape::XML::Nod } /** - * Set mesh gradient attribute. + * Set mesh gradient attributes from associated repr. */ static void -sp_meshgradient_set(SPObject *object, unsigned key, gchar const *value) +sp_meshgradient_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) { + ((SPMeshGradient*)object)->cmeshgradient->onBuild(document, repr); +} + +void CMeshGradient::onSet(unsigned key, gchar const *value) { + SPMeshGradient* object = this->spmeshgradient; + SPMeshGradient *mg = SP_MESHGRADIENT(object); switch (key) { @@ -1913,18 +2060,22 @@ sp_meshgradient_set(SPObject *object, unsigned key, gchar const *value) object->requestModified(SP_OBJECT_MODIFIED_FLAG); break; default: - if (((SPObjectClass *) mg_parent_class)->set) - ((SPObjectClass *) mg_parent_class)->set(object, key, value); + CGradient::onSet(key, value); break; } } /** - * Write mesh gradient attributes to associated repr. + * Set mesh gradient attribute. */ -static Inkscape::XML::Node * -sp_meshgradient_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) +static void +sp_meshgradient_set(SPObject *object, unsigned key, gchar const *value) { + ((SPMeshGradient*)object)->cmeshgradient->onSet(key, value); +} + +Inkscape::XML::Node* CMeshGradient::onWrite(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) { + SPMeshGradient* object = this->spmeshgradient; #ifdef MESH_DEBUG std::cout << "sp_meshgradient_write() ***************************" << std::endl; @@ -1938,12 +2089,20 @@ sp_meshgradient_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inksca if ((flags & SP_OBJECT_WRITE_ALL) || mg->x._set) sp_repr_set_svg_double(repr, "x", mg->x.computed); if ((flags & SP_OBJECT_WRITE_ALL) || mg->y._set) sp_repr_set_svg_double(repr, "y", mg->y.computed); - if (((SPObjectClass *) mg_parent_class)->write) - (* ((SPObjectClass *) mg_parent_class)->write)(object, xml_doc, repr, flags); + CGradient::onWrite(xml_doc, repr, flags); return repr; } +/** + * Write mesh gradient attributes to associated repr. + */ +static Inkscape::XML::Node * +sp_meshgradient_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) +{ + return ((SPMeshGradient*)object)->cmeshgradient->onWrite(xml_doc, repr, flags); +} + /** * Directly set properties of mesh gradient and request modified. */ @@ -1999,12 +2158,10 @@ sp_gradient_pattern_common_setup(cairo_pattern_t *cp, ink_cairo_pattern_set_matrix(cp, gs2user.inverse()); } -static cairo_pattern_t * -sp_radialgradient_create_pattern(SPPaintServer *ps, - cairo_t *ct, - Geom::OptRect const &bbox, - double opacity) -{ + +cairo_pattern_t* CRadialGradient::onCreatePattern(cairo_t *ct, Geom::OptRect const &bbox, double opacity) { + SPRadialGradient* ps = this->spradialgradient; + SPRadialGradient *rg = SP_RADIALGRADIENT(ps); SPGradient *gr = SP_GRADIENT(ps); @@ -2040,8 +2197,18 @@ sp_radialgradient_create_pattern(SPPaintServer *ps, return cp; } -static cairo_pattern_t *sp_meshgradient_create_pattern(SPPaintServer *ps, - cairo_t * /* ct */, +static cairo_pattern_t * +sp_radialgradient_create_pattern(SPPaintServer *ps, + cairo_t *ct, + Geom::OptRect const &bbox, + double opacity) +{ + return ((SPRadialGradient*)ps)->cradialgradient->onCreatePattern(ct, bbox, opacity); +} + + + +cairo_pattern_t* CMeshGradient::onCreatePattern(cairo_t *ct, #if defined(MESH_DEBUG) || (CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 11, 4)) Geom::OptRect const &bbox, double opacity @@ -2054,6 +2221,8 @@ static cairo_pattern_t *sp_meshgradient_create_pattern(SPPaintServer *ps, using Geom::X; using Geom::Y; + SPMeshGradient* ps = this->spmeshgradient; + #ifdef MESH_DEBUG std::cout << "sp_meshgradient_create_pattern: (" << bbox->x0 << "," << bbox->y0 << ") (" << bbox->x1 << "," << bbox->y1 << ") " << opacity << std::endl; #endif @@ -2163,12 +2332,13 @@ static cairo_pattern_t *sp_meshgradient_create_pattern(SPPaintServer *ps, return cp; } -static cairo_pattern_t * -sp_lineargradient_create_pattern(SPPaintServer *ps, - cairo_t */* ct */, - Geom::OptRect const &bbox, - double opacity) -{ +static cairo_pattern_t *sp_meshgradient_create_pattern(SPPaintServer *ps, cairo_t * ct, Geom::OptRect const &bbox, double opacity) { + return ((SPMeshGradient*)ps)->cmeshgradient->onCreatePattern(ct, bbox, opacity); +} + +cairo_pattern_t* CLinearGradient::onCreatePattern(cairo_t *ct, Geom::OptRect const &bbox, double opacity) { + SPLinearGradient* ps = this->splineargradient; + SPLinearGradient *lg = SP_LINEARGRADIENT(ps); SPGradient *gr = SP_GRADIENT(ps); @@ -2183,6 +2353,15 @@ sp_lineargradient_create_pattern(SPPaintServer *ps, return cp; } +static cairo_pattern_t * +sp_lineargradient_create_pattern(SPPaintServer *ps, + cairo_t *ct, + Geom::OptRect const &bbox, + double opacity) +{ + return ((SPLinearGradient*)ps)->clineargradient->onCreatePattern(ct, bbox, opacity); +} + cairo_pattern_t * sp_gradient_create_preview_pattern(SPGradient *gr, double width) { -- cgit v1.2.3 From a0a8d020201e0e38a63d9aa3dce228d7d9e6fb35 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Thu, 14 Mar 2013 12:42:39 +0100 Subject: Various changes. (bzr r11608.1.48) --- src/sp-gradient.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'src/sp-gradient.cpp') diff --git a/src/sp-gradient.cpp b/src/sp-gradient.cpp index 778d6e52e..f33d67e3f 100644 --- a/src/sp-gradient.cpp +++ b/src/sp-gradient.cpp @@ -127,7 +127,7 @@ static void sp_stop_class_init(SPStopClass *klass) stop_parent_class = (SPObjectClass *) g_type_class_ref(SP_TYPE_OBJECT); - sp_object_class->build = sp_stop_build; + //sp_object_class->build = sp_stop_build; sp_object_class->set = sp_stop_set; sp_object_class->write = sp_stop_write; } @@ -409,7 +409,7 @@ static void sp_meshrow_class_init(SPMeshRowClass *klass) meshrow_parent_class = (SPObjectClass *) g_type_class_ref(SP_TYPE_OBJECT); - sp_object_class->build = sp_meshrow_build; + //sp_object_class->build = sp_meshrow_build; sp_object_class->set = sp_meshrow_set; sp_object_class->write = sp_meshrow_write; } @@ -509,7 +509,7 @@ static void sp_meshpatch_class_init(SPMeshPatchClass *klass) meshpatch_parent_class = (SPObjectClass *) g_type_class_ref(SP_TYPE_OBJECT); - sp_object_class->build = sp_meshpatch_build; + //sp_object_class->build = sp_meshpatch_build; sp_object_class->set = sp_meshpatch_set; sp_object_class->write = sp_meshpatch_write; } @@ -642,7 +642,7 @@ void CGradient::classInit(SPGradientClass *klass) gradient_parent_class = (SPPaintServerClass *)g_type_class_ref(SP_TYPE_PAINT_SERVER); - sp_object_class->build = spgradient_on_build; + //sp_object_class->build = spgradient_on_build; sp_object_class->release = spgradient_on_release; sp_object_class->set = spgradient_set; sp_object_class->child_added = spgradient_child_added; @@ -1586,7 +1586,7 @@ static void sp_lineargradient_class_init(SPLinearGradientClass *klass) lg_parent_class = (SPGradientClass*)g_type_class_ref(SP_TYPE_GRADIENT); - sp_object_class->build = sp_lineargradient_build; + //sp_object_class->build = sp_lineargradient_build; sp_object_class->set = sp_lineargradient_set; sp_object_class->write = sp_lineargradient_write; @@ -1776,7 +1776,7 @@ static void sp_radialgradient_class_init(SPRadialGradientClass *klass) rg_parent_class = (SPGradientClass*)g_type_class_ref(SP_TYPE_GRADIENT); - sp_object_class->build = sp_radialgradient_build; + //sp_object_class->build = sp_radialgradient_build; sp_object_class->set = sp_radialgradient_set; sp_object_class->write = sp_radialgradient_write; @@ -1992,7 +1992,7 @@ static void sp_meshgradient_class_init(SPMeshGradientClass *klass) mg_parent_class = (SPGradientClass*)g_type_class_ref(SP_TYPE_GRADIENT); - sp_object_class->build = sp_meshgradient_build; + //sp_object_class->build = sp_meshgradient_build; sp_object_class->set = sp_meshgradient_set; sp_object_class->write = sp_meshgradient_write; -- cgit v1.2.3 From c8e0129ab4988f2fc5cb06c56ff47b38dfde143f Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Sat, 30 Mar 2013 00:46:44 +0100 Subject: Replaced calls to "pattern_new". (bzr r11608.1.54) --- src/sp-gradient.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/sp-gradient.cpp') diff --git a/src/sp-gradient.cpp b/src/sp-gradient.cpp index f33d67e3f..2faf165f0 100644 --- a/src/sp-gradient.cpp +++ b/src/sp-gradient.cpp @@ -1590,7 +1590,7 @@ static void sp_lineargradient_class_init(SPLinearGradientClass *klass) sp_object_class->set = sp_lineargradient_set; sp_object_class->write = sp_lineargradient_write; - ps_class->pattern_new = sp_lineargradient_create_pattern; + //ps_class->pattern_new = sp_lineargradient_create_pattern; } CLinearGradient::CLinearGradient(SPLinearGradient* lineargradient) : CGradient(lineargradient) { @@ -1780,7 +1780,7 @@ static void sp_radialgradient_class_init(SPRadialGradientClass *klass) sp_object_class->set = sp_radialgradient_set; sp_object_class->write = sp_radialgradient_write; - ps_class->pattern_new = sp_radialgradient_create_pattern; + //ps_class->pattern_new = sp_radialgradient_create_pattern; } CRadialGradient::CRadialGradient(SPRadialGradient* radialgradient) : CGradient(radialgradient) { @@ -1996,7 +1996,7 @@ static void sp_meshgradient_class_init(SPMeshGradientClass *klass) sp_object_class->set = sp_meshgradient_set; sp_object_class->write = sp_meshgradient_write; - ps_class->pattern_new = sp_meshgradient_create_pattern; + //ps_class->pattern_new = sp_meshgradient_create_pattern; } CMeshGradient::CMeshGradient(SPMeshGradient* meshgradient) : CGradient(meshgradient) { -- cgit v1.2.3 From 957c3e4b7909d42c5a13f1b1dd583f877fc32259 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Sat, 30 Mar 2013 00:46:57 +0100 Subject: Removed function pointers from SPObject and subclasses. Added some missing virtual pads for classes that were hidden by preprocessor macros. (bzr r11608.1.55) --- src/sp-gradient.cpp | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) (limited to 'src/sp-gradient.cpp') diff --git a/src/sp-gradient.cpp b/src/sp-gradient.cpp index 2faf165f0..de81b33ff 100644 --- a/src/sp-gradient.cpp +++ b/src/sp-gradient.cpp @@ -128,8 +128,8 @@ static void sp_stop_class_init(SPStopClass *klass) stop_parent_class = (SPObjectClass *) g_type_class_ref(SP_TYPE_OBJECT); //sp_object_class->build = sp_stop_build; - sp_object_class->set = sp_stop_set; - sp_object_class->write = sp_stop_write; +// sp_object_class->set = sp_stop_set; +// sp_object_class->write = sp_stop_write; } CStop::CStop(SPStop* stop) : CObject(stop) { @@ -410,8 +410,8 @@ static void sp_meshrow_class_init(SPMeshRowClass *klass) meshrow_parent_class = (SPObjectClass *) g_type_class_ref(SP_TYPE_OBJECT); //sp_object_class->build = sp_meshrow_build; - sp_object_class->set = sp_meshrow_set; - sp_object_class->write = sp_meshrow_write; +// sp_object_class->set = sp_meshrow_set; +// sp_object_class->write = sp_meshrow_write; } CMeshRow::CMeshRow(SPMeshRow* meshrow) : CObject(meshrow) { @@ -510,8 +510,8 @@ static void sp_meshpatch_class_init(SPMeshPatchClass *klass) meshpatch_parent_class = (SPObjectClass *) g_type_class_ref(SP_TYPE_OBJECT); //sp_object_class->build = sp_meshpatch_build; - sp_object_class->set = sp_meshpatch_set; - sp_object_class->write = sp_meshpatch_write; +// sp_object_class->set = sp_meshpatch_set; +// sp_object_class->write = sp_meshpatch_write; } CMeshPatch::CMeshPatch(SPMeshPatch* meshpatch) : CObject(meshpatch) { @@ -643,12 +643,12 @@ void CGradient::classInit(SPGradientClass *klass) gradient_parent_class = (SPPaintServerClass *)g_type_class_ref(SP_TYPE_PAINT_SERVER); //sp_object_class->build = spgradient_on_build; - sp_object_class->release = spgradient_on_release; - sp_object_class->set = spgradient_set; - sp_object_class->child_added = spgradient_child_added; - sp_object_class->remove_child = spgradient_remove_child; - sp_object_class->modified = spgradient_modified; - sp_object_class->write = spgradient_write; +// sp_object_class->release = spgradient_on_release; +// sp_object_class->set = spgradient_set; +// sp_object_class->child_added = spgradient_child_added; +// sp_object_class->remove_child = spgradient_remove_child; +// sp_object_class->modified = spgradient_modified; +// sp_object_class->write = spgradient_write; } CGradient::CGradient(SPGradient* gradient) : CPaintServer(gradient) { @@ -1587,8 +1587,8 @@ static void sp_lineargradient_class_init(SPLinearGradientClass *klass) lg_parent_class = (SPGradientClass*)g_type_class_ref(SP_TYPE_GRADIENT); //sp_object_class->build = sp_lineargradient_build; - sp_object_class->set = sp_lineargradient_set; - sp_object_class->write = sp_lineargradient_write; +// sp_object_class->set = sp_lineargradient_set; +// sp_object_class->write = sp_lineargradient_write; //ps_class->pattern_new = sp_lineargradient_create_pattern; } @@ -1777,8 +1777,8 @@ static void sp_radialgradient_class_init(SPRadialGradientClass *klass) rg_parent_class = (SPGradientClass*)g_type_class_ref(SP_TYPE_GRADIENT); //sp_object_class->build = sp_radialgradient_build; - sp_object_class->set = sp_radialgradient_set; - sp_object_class->write = sp_radialgradient_write; +// sp_object_class->set = sp_radialgradient_set; +// sp_object_class->write = sp_radialgradient_write; //ps_class->pattern_new = sp_radialgradient_create_pattern; } @@ -1993,8 +1993,8 @@ static void sp_meshgradient_class_init(SPMeshGradientClass *klass) mg_parent_class = (SPGradientClass*)g_type_class_ref(SP_TYPE_GRADIENT); //sp_object_class->build = sp_meshgradient_build; - sp_object_class->set = sp_meshgradient_set; - sp_object_class->write = sp_meshgradient_write; +// sp_object_class->set = sp_meshgradient_set; +// sp_object_class->write = sp_meshgradient_write; //ps_class->pattern_new = sp_meshgradient_create_pattern; } -- cgit v1.2.3 From 7df6616da5ea2debb86838366ddf746841549cdb Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Sat, 30 Mar 2013 00:56:13 +0100 Subject: Renamed virtual function names. (bzr r11608.1.57) --- src/sp-gradient.cpp | 100 ++++++++++++++++++++++++++-------------------------- 1 file changed, 50 insertions(+), 50 deletions(-) (limited to 'src/sp-gradient.cpp') diff --git a/src/sp-gradient.cpp b/src/sp-gradient.cpp index b6b1c5a60..b4bb9243e 100644 --- a/src/sp-gradient.cpp +++ b/src/sp-gradient.cpp @@ -101,10 +101,10 @@ sp_stop_init(SPStop *stop) stop->opacity = 1.0; } -void CStop::onBuild(SPDocument* doc, Inkscape::XML::Node* repr) { +void CStop::build(SPDocument* doc, Inkscape::XML::Node* repr) { SPStop* object = this->spstop; - CObject::onBuild(doc, repr); + CObject::build(doc, repr); object->readAttr( "offset" ); object->readAttr( "stop-color" ); @@ -117,7 +117,7 @@ void CStop::onBuild(SPDocument* doc, Inkscape::XML::Node* repr) { * Virtual build: set stop attributes from its associated XML node. */ -void CStop::onSet(unsigned int key, const gchar* value) { +void CStop::set(unsigned int key, const gchar* value) { SPStop* object = this->spstop; SPStop *stop = SP_STOP(object); @@ -190,7 +190,7 @@ void CStop::onSet(unsigned int key, const gchar* value) { break; } default: { - CObject::onSet(key, value); + CObject::set(key, value); break; } } @@ -200,7 +200,7 @@ void CStop::onSet(unsigned int key, const gchar* value) { * Virtual set: set attribute to value. */ -Inkscape::XML::Node* CStop::onWrite(Inkscape::XML::Document* xml_doc, Inkscape::XML::Node* repr, guint flags) { +Inkscape::XML::Node* CStop::write(Inkscape::XML::Document* xml_doc, Inkscape::XML::Node* repr, guint flags) { SPStop* object = this->spstop; SPStop *stop = SP_STOP(object); @@ -212,7 +212,7 @@ Inkscape::XML::Node* CStop::onWrite(Inkscape::XML::Document* xml_doc, Inkscape:: Glib::ustring colorStr = stop->specified_color.toString(); gfloat opacity = stop->opacity; - CObject::onWrite(xml_doc, repr, flags); + 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 @@ -369,27 +369,27 @@ static void sp_meshrow_init(SPMeshRow * meshrow) meshrow->cobject = meshrow->cmeshrow; } -void CMeshRow::onBuild(SPDocument* doc, Inkscape::XML::Node* repr) { - CObject::onBuild(doc, repr); +void CMeshRow::build(SPDocument* doc, Inkscape::XML::Node* repr) { + CObject::build(doc, repr); } /** * Virtual build: set meshrow attributes from its associated XML node. */ -void CMeshRow::onSet(unsigned int key, const gchar* value) { +void CMeshRow::set(unsigned int key, const gchar* value) { } /** * Virtual set: set attribute to value. */ -Inkscape::XML::Node* CMeshRow::onWrite(Inkscape::XML::Document* xml_doc, Inkscape::XML::Node* repr, guint flags) { +Inkscape::XML::Node* CMeshRow::write(Inkscape::XML::Document* xml_doc, Inkscape::XML::Node* repr, guint flags) { if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) { repr = xml_doc->createElement("svg:meshRow"); } - CObject::onWrite(xml_doc, repr, flags); + CObject::write(xml_doc, repr, flags); return repr; } @@ -427,10 +427,10 @@ static void sp_meshpatch_init(SPMeshPatch * meshpatch) meshpatch->cobject = meshpatch->cmeshpatch; } -void CMeshPatch::onBuild(SPDocument* doc, Inkscape::XML::Node* repr) { +void CMeshPatch::build(SPDocument* doc, Inkscape::XML::Node* repr) { SPMeshPatch* object = this->spmeshpatch; - CObject::onBuild(doc, repr); + CObject::build(doc, repr); object->readAttr( "tensor" ); } @@ -439,7 +439,7 @@ void CMeshPatch::onBuild(SPDocument* doc, Inkscape::XML::Node* repr) { * Virtual build: set meshpatch attributes from its associated XML node. */ -void CMeshPatch::onSet(unsigned int key, const gchar* value) { +void CMeshPatch::set(unsigned int key, const gchar* value) { SPMeshPatch* object = this->spmeshpatch; SPMeshPatch *patch = SP_MESHPATCH(object); @@ -462,12 +462,12 @@ void CMeshPatch::onSet(unsigned int key, const gchar* value) { * Virtual set: set attribute to value. */ -Inkscape::XML::Node* CMeshPatch::onWrite(Inkscape::XML::Document* xml_doc, Inkscape::XML::Node* repr, guint flags) { +Inkscape::XML::Node* CMeshPatch::write(Inkscape::XML::Document* xml_doc, Inkscape::XML::Node* repr, guint flags) { if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) { repr = xml_doc->createElement("svg:meshPatch"); } - CObject::onWrite(xml_doc, repr, flags); + CObject::write(xml_doc, repr, flags); return repr; } @@ -561,7 +561,7 @@ void CGradient::init(SPGradient *gr) /** * Virtual build: set gradient attributes from its associated repr. */ -void CGradient::onBuild(SPDocument *document, Inkscape::XML::Node *repr) +void CGradient::build(SPDocument *document, Inkscape::XML::Node *repr) { SPGradient* object = this->spgradient; SPGradient *gradient = SP_GRADIENT(object); @@ -571,7 +571,7 @@ void CGradient::onBuild(SPDocument *document, Inkscape::XML::Node *repr) repr->setAttribute("inkscape:collect", 0); } - CPaintServer::onBuild(document, repr); + CPaintServer::build(document, repr); for ( SPObject *ochild = object->firstChild() ; ochild ; ochild = ochild->getNext() ) { if (SP_IS_STOP(ochild)) { @@ -593,7 +593,7 @@ void CGradient::onBuild(SPDocument *document, Inkscape::XML::Node *repr) /** * Virtual release of SPGradient members before destruction. */ -void CGradient::onRelease() +void CGradient::release() { SPGradient* object = this->spgradient; SPGradient *gradient = (SPGradient *) object; @@ -616,13 +616,13 @@ void CGradient::onRelease() gradient->modified_connection.~connection(); - CPaintServer::onRelease(); + CPaintServer::release(); } /** * Set gradient attribute to value. */ -void CGradient::onSet(unsigned key, gchar const *value) +void CGradient::set(unsigned key, gchar const *value) { SPGradient* object = this->spgradient; SPGradient *gr = SP_GRADIENT(object); @@ -703,7 +703,7 @@ void CGradient::onSet(unsigned key, gchar const *value) } break; default: - CPaintServer::onSet(key, value); + CPaintServer::set(key, value); break; } } @@ -740,14 +740,14 @@ void CGradient::gradientRefChanged(SPObject *old_ref, SPObject *ref, SPGradient /** * Callback for child_added event. */ -void CGradient::onChildAdded(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) +void CGradient::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) { SPGradient* object = this->spgradient; SPGradient *gr = SP_GRADIENT(object); gr->invalidateVector(); - CPaintServer::onChildAdded(child, ref); + CPaintServer::child_added(child, ref); SPObject *ochild = object->get_child_by_repr(child); if ( ochild && SP_IS_STOP(ochild) ) { @@ -767,14 +767,14 @@ void CGradient::onChildAdded(Inkscape::XML::Node *child, Inkscape::XML::Node *re /** * Callback for remove_child event. */ -void CGradient::onRemoveChild(Inkscape::XML::Node *child) +void CGradient::remove_child(Inkscape::XML::Node *child) { SPGradient* object = this->spgradient; SPGradient *gr = SP_GRADIENT(object); gr->invalidateVector(); - CPaintServer::onRemoveChild(child); + CPaintServer::remove_child(child); gr->has_stops = FALSE; for ( SPObject *ochild = object->firstChild() ; ochild ; ochild = ochild->getNext() ) { @@ -798,7 +798,7 @@ void CGradient::onRemoveChild(Inkscape::XML::Node *child) /** * Callback for modified event. */ -void CGradient::onModified(guint flags) +void CGradient::modified(guint flags) { SPGradient* object = this->spgradient; SPGradient *gr = SP_GRADIENT(object); @@ -864,12 +864,12 @@ int SPGradient::getStopCount() const /** * Write gradient attributes to repr. */ -Inkscape::XML::Node *CGradient::onWrite(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) +Inkscape::XML::Node *CGradient::write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) { SPGradient* object = this->spgradient; SPGradient *gr = SP_GRADIENT(object); - CPaintServer::onWrite(xml_doc, repr, flags); + CPaintServer::write(xml_doc, repr, flags); if (flags & SP_OBJECT_WRITE_BUILD) { GSList *l = NULL; @@ -1410,10 +1410,10 @@ static void sp_lineargradient_init(SPLinearGradient *lg) lg->y2.unset(SVGLength::PERCENT, 0.0, 0.0); } -void CLinearGradient::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { +void CLinearGradient::build(SPDocument *document, Inkscape::XML::Node *repr) { SPLinearGradient* object = this->splineargradient; - CGradient::onBuild(document, repr); + CGradient::build(document, repr); object->readAttr( "x1" ); object->readAttr( "y1" ); @@ -1424,7 +1424,7 @@ void CLinearGradient::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { /** * Callback: set attribute. */ -void CLinearGradient::onSet(unsigned int key, const gchar* value) { +void CLinearGradient::set(unsigned int key, const gchar* value) { SPLinearGradient* object = this->splineargradient; SPLinearGradient *lg = SP_LINEARGRADIENT(object); @@ -1447,7 +1447,7 @@ void CLinearGradient::onSet(unsigned int key, const gchar* value) { object->requestModified(SP_OBJECT_MODIFIED_FLAG); break; default: - CGradient::onSet(key, value); + CGradient::set(key, value); break; } } @@ -1455,7 +1455,7 @@ void CLinearGradient::onSet(unsigned int key, const gchar* value) { /** * Callback: write attributes to associated repr. */ -Inkscape::XML::Node* CLinearGradient::onWrite(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) { +Inkscape::XML::Node* CLinearGradient::write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) { SPLinearGradient* object = this->splineargradient; SPLinearGradient *lg = SP_LINEARGRADIENT(object); @@ -1473,7 +1473,7 @@ Inkscape::XML::Node* CLinearGradient::onWrite(Inkscape::XML::Document *xml_doc, if ((flags & SP_OBJECT_WRITE_ALL) || lg->y2._set) sp_repr_set_svg_double(repr, "y2", lg->y2.computed); - CGradient::onWrite(xml_doc, repr, flags); + CGradient::write(xml_doc, repr, flags); return repr; } @@ -1541,10 +1541,10 @@ sp_radialgradient_init(SPRadialGradient *rg) /** * Set radial gradient attributes from associated repr. */ -void CRadialGradient::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { +void CRadialGradient::build(SPDocument *document, Inkscape::XML::Node *repr) { SPRadialGradient* object = this->spradialgradient; - CGradient::onBuild(document, repr); + CGradient::build(document, repr); object->readAttr( "cx" ); object->readAttr( "cy" ); @@ -1556,7 +1556,7 @@ void CRadialGradient::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { /** * Set radial gradient attribute. */ -void CRadialGradient::onSet(unsigned key, gchar const *value) { +void CRadialGradient::set(unsigned key, gchar const *value) { SPRadialGradient* object = this->spradialgradient; SPRadialGradient *rg = SP_RADIALGRADIENT(object); @@ -1601,7 +1601,7 @@ void CRadialGradient::onSet(unsigned key, gchar const *value) { object->requestModified(SP_OBJECT_MODIFIED_FLAG); break; default: - CGradient::onSet(key, value); + CGradient::set(key, value); break; } } @@ -1609,7 +1609,7 @@ void CRadialGradient::onSet(unsigned key, gchar const *value) { /** * Write radial gradient attributes to associated repr. */ -Inkscape::XML::Node* CRadialGradient::onWrite(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) { +Inkscape::XML::Node* CRadialGradient::write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) { SPRadialGradient* object = this->spradialgradient; SPRadialGradient *rg = SP_RADIALGRADIENT(object); @@ -1624,7 +1624,7 @@ Inkscape::XML::Node* CRadialGradient::onWrite(Inkscape::XML::Document *xml_doc, if ((flags & SP_OBJECT_WRITE_ALL) || rg->fx._set) sp_repr_set_svg_double(repr, "fx", rg->fx.computed); if ((flags & SP_OBJECT_WRITE_ALL) || rg->fy._set) sp_repr_set_svg_double(repr, "fy", rg->fy.computed); - CGradient::onWrite(xml_doc, repr, flags); + CGradient::write(xml_doc, repr, flags); return repr; } @@ -1692,10 +1692,10 @@ sp_meshgradient_init(SPMeshGradient *mg) mg->y.unset(SVGLength::NONE, 0.0, 0.0); } -void CMeshGradient::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { +void CMeshGradient::build(SPDocument *document, Inkscape::XML::Node *repr) { SPMeshGradient* object = this->spmeshgradient; - CGradient::onBuild(document, repr); + CGradient::build(document, repr); // Start coordinate of mesh object->readAttr( "x" ); @@ -1703,7 +1703,7 @@ void CMeshGradient::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { } -void CMeshGradient::onSet(unsigned key, gchar const *value) { +void CMeshGradient::set(unsigned key, gchar const *value) { SPMeshGradient* object = this->spmeshgradient; SPMeshGradient *mg = SP_MESHGRADIENT(object); @@ -1722,7 +1722,7 @@ void CMeshGradient::onSet(unsigned key, gchar const *value) { object->requestModified(SP_OBJECT_MODIFIED_FLAG); break; default: - CGradient::onSet(key, value); + CGradient::set(key, value); break; } } @@ -1730,7 +1730,7 @@ void CMeshGradient::onSet(unsigned key, gchar const *value) { /** * Write mesh gradient attributes to associated repr. */ -Inkscape::XML::Node* CMeshGradient::onWrite(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) { +Inkscape::XML::Node* CMeshGradient::write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) { SPMeshGradient* object = this->spmeshgradient; #ifdef MESH_DEBUG @@ -1745,7 +1745,7 @@ Inkscape::XML::Node* CMeshGradient::onWrite(Inkscape::XML::Document *xml_doc, In if ((flags & SP_OBJECT_WRITE_ALL) || mg->x._set) sp_repr_set_svg_double(repr, "x", mg->x.computed); if ((flags & SP_OBJECT_WRITE_ALL) || mg->y._set) sp_repr_set_svg_double(repr, "y", mg->y.computed); - CGradient::onWrite(xml_doc, repr, flags); + CGradient::write(xml_doc, repr, flags); return repr; } @@ -1806,7 +1806,7 @@ sp_gradient_pattern_common_setup(cairo_pattern_t *cp, } -cairo_pattern_t* CRadialGradient::onCreatePattern(cairo_t *ct, Geom::OptRect const &bbox, double opacity) { +cairo_pattern_t* CRadialGradient::pattern_new(cairo_t *ct, Geom::OptRect const &bbox, double opacity) { SPRadialGradient* ps = this->spradialgradient; SPRadialGradient *rg = SP_RADIALGRADIENT(ps); @@ -1863,7 +1863,7 @@ cairo_pattern_t* CRadialGradient::onCreatePattern(cairo_t *ct, Geom::OptRect con return cp; } -cairo_pattern_t* CMeshGradient::onCreatePattern(cairo_t *ct, +cairo_pattern_t* CMeshGradient::pattern_new(cairo_t *ct, #if defined(MESH_DEBUG) || (CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 11, 4)) Geom::OptRect const &bbox, double opacity @@ -1987,7 +1987,7 @@ cairo_pattern_t* CMeshGradient::onCreatePattern(cairo_t *ct, return cp; } -cairo_pattern_t* CLinearGradient::onCreatePattern(cairo_t *ct, Geom::OptRect const &bbox, double opacity) { +cairo_pattern_t* CLinearGradient::pattern_new(cairo_t *ct, Geom::OptRect const &bbox, double opacity) { SPLinearGradient* ps = this->splineargradient; SPLinearGradient *lg = SP_LINEARGRADIENT(ps); -- cgit v1.2.3 From a5d6e692d661f0bf7648e64e8fcb04588bb8f3ab Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Mon, 1 Apr 2013 00:07:00 +0200 Subject: Prepared exchange of casting macros. (bzr r11608.1.63) --- src/sp-gradient.cpp | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src/sp-gradient.cpp') diff --git a/src/sp-gradient.cpp b/src/sp-gradient.cpp index b4bb9243e..889151cf8 100644 --- a/src/sp-gradient.cpp +++ b/src/sp-gradient.cpp @@ -91,6 +91,7 @@ static void sp_stop_init(SPStop *stop) { stop->cstop = new CStop(stop); + stop->typeHierarchy.insert(typeid(SPStop)); delete stop->cobject; stop->cobject = stop->cstop; @@ -364,6 +365,7 @@ CMeshRow::~CMeshRow() { static void sp_meshrow_init(SPMeshRow * meshrow) { meshrow->cmeshrow = new CMeshRow(meshrow); + meshrow->typeHierarchy.insert(typeid(SPMeshRow)); delete meshrow->cobject; meshrow->cobject = meshrow->cmeshrow; @@ -422,6 +424,7 @@ CMeshPatch::~CMeshPatch() { static void sp_meshpatch_init(SPMeshPatch * meshpatch) { meshpatch->cmeshpatch = new CMeshPatch(meshpatch); + meshpatch->typeHierarchy.insert(typeid(SPMeshPatch)); delete meshpatch->cobject; meshpatch->cobject = meshpatch->cmeshpatch; @@ -527,6 +530,7 @@ CGradient::~CGradient() { void CGradient::init(SPGradient *gr) { gr->cgradient = new CGradient(gr); + gr->typeHierarchy.insert(typeid(SPGradient)); delete gr->cpaintserver; gr->cpaintserver = gr->cgradient; @@ -1398,6 +1402,7 @@ CLinearGradient::~CLinearGradient() { static void sp_lineargradient_init(SPLinearGradient *lg) { lg->clineargradient = new CLinearGradient(lg); + lg->typeHierarchy.insert(typeid(SPLinearGradient)); delete lg->cgradient; lg->cgradient = lg->clineargradient; @@ -1525,6 +1530,7 @@ static void sp_radialgradient_init(SPRadialGradient *rg) { rg->cradialgradient = new CRadialGradient(rg); + rg->typeHierarchy.insert(typeid(SPRadialGradient)); delete rg->cgradient; rg->cgradient = rg->cradialgradient; @@ -1681,6 +1687,7 @@ static void sp_meshgradient_init(SPMeshGradient *mg) { mg->cmeshgradient = new CMeshGradient(mg); + mg->typeHierarchy.insert(typeid(SPMeshGradient)); delete mg->cgradient; mg->cgradient = mg->cmeshgradient; -- cgit v1.2.3 From 7eb077e4097aed62c11e5b4e97ff4b16039e73fa Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Mon, 1 Apr 2013 23:04:54 +0200 Subject: Replaced calls to g_object_(un)ref with sp_object_(un)ref. (bzr r11608.1.65) --- src/sp-gradient.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/sp-gradient.cpp') diff --git a/src/sp-gradient.cpp b/src/sp-gradient.cpp index 889151cf8..b0a0ae816 100644 --- a/src/sp-gradient.cpp +++ b/src/sp-gradient.cpp @@ -829,7 +829,7 @@ void CGradient::modified(guint flags) // FIXME: climb up the ladder of hrefs GSList *l = NULL; for (SPObject *child = object->firstChild() ; child; child = child->getNext() ) { - g_object_ref(G_OBJECT(child)); + sp_object_ref(child); l = g_slist_prepend(l, child); } l = g_slist_reverse(l); @@ -839,7 +839,7 @@ void CGradient::modified(guint flags) if (flags || (child->mflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) { child->emitModified(flags); } - g_object_unref(G_OBJECT(child)); + sp_object_unref(child); } } -- cgit v1.2.3 From 69f3b6f1abb2bb422935d43262e1e99aab359954 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Tue, 2 Apr 2013 01:41:30 +0200 Subject: Added constructors to SP classes. (bzr r11608.1.67) --- src/sp-gradient.cpp | 146 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 100 insertions(+), 46 deletions(-) (limited to 'src/sp-gradient.cpp') diff --git a/src/sp-gradient.cpp b/src/sp-gradient.cpp index b0a0ae816..1a1b1b1e6 100644 --- a/src/sp-gradient.cpp +++ b/src/sp-gradient.cpp @@ -61,13 +61,13 @@ //#define NCOLORS NR_GRADIENT_VECTOR_LENGTH // SPStop -G_DEFINE_TYPE(SPStop, sp_stop, SP_TYPE_OBJECT); +G_DEFINE_TYPE(SPStop, sp_stop, G_TYPE_OBJECT); // SPMeshRow -G_DEFINE_TYPE(SPMeshRow, sp_meshrow, SP_TYPE_OBJECT); +G_DEFINE_TYPE(SPMeshRow, sp_meshrow, G_TYPE_OBJECT); // SPMeshPatch -G_DEFINE_TYPE(SPMeshPatch, sp_meshpatch, SP_TYPE_OBJECT); +G_DEFINE_TYPE(SPMeshPatch, sp_meshpatch, G_TYPE_OBJECT); /** @@ -84,24 +84,32 @@ CStop::CStop(SPStop* stop) : CObject(stop) { CStop::~CStop() { } -/** - * Callback to initialize SPStop object. - */ -static void -sp_stop_init(SPStop *stop) -{ +SPStop::SPStop() : SPObject() { + SPStop* stop = this; + stop->cstop = new CStop(stop); stop->typeHierarchy.insert(typeid(SPStop)); delete stop->cobject; stop->cobject = stop->cstop; + stop->path_string = NULL; + stop->offset = 0.0; stop->currentColor = false; stop->specified_color.set( 0x000000ff ); stop->opacity = 1.0; } +/** + * Callback to initialize SPStop object. + */ +static void +sp_stop_init(SPStop *stop) +{ + new (stop) SPStop(); +} + void CStop::build(SPDocument* doc, Inkscape::XML::Node* repr) { SPStop* object = this->spstop; @@ -359,11 +367,9 @@ CMeshRow::CMeshRow(SPMeshRow* meshrow) : CObject(meshrow) { CMeshRow::~CMeshRow() { } -/** - * Callback to initialize SPMeshRow object. - */ -static void sp_meshrow_init(SPMeshRow * meshrow) -{ +SPMeshRow::SPMeshRow() : SPObject() { + SPMeshRow* meshrow = this; + meshrow->cmeshrow = new CMeshRow(meshrow); meshrow->typeHierarchy.insert(typeid(SPMeshRow)); @@ -371,6 +377,14 @@ static void sp_meshrow_init(SPMeshRow * meshrow) meshrow->cobject = meshrow->cmeshrow; } +/** + * Callback to initialize SPMeshRow object. + */ +static void sp_meshrow_init(SPMeshRow * meshrow) +{ + new (meshrow) SPMeshRow(); +} + void CMeshRow::build(SPDocument* doc, Inkscape::XML::Node* repr) { CObject::build(doc, repr); } @@ -418,16 +432,24 @@ CMeshPatch::CMeshPatch(SPMeshPatch* meshpatch) : CObject(meshpatch) { CMeshPatch::~CMeshPatch() { } -/** - * Callback to initialize SPMeshPatch object. - */ -static void sp_meshpatch_init(SPMeshPatch * meshpatch) -{ +SPMeshPatch::SPMeshPatch() : SPObject() { + SPMeshPatch* meshpatch = this; + meshpatch->cmeshpatch = new CMeshPatch(meshpatch); meshpatch->typeHierarchy.insert(typeid(SPMeshPatch)); delete meshpatch->cobject; meshpatch->cobject = meshpatch->cmeshpatch; + + meshpatch->tensor_string = NULL; +} + +/** + * Callback to initialize SPMeshPatch object. + */ +static void sp_meshpatch_init(SPMeshPatch * meshpatch) +{ + new (meshpatch) SPMeshPatch(); } void CMeshPatch::build(SPDocument* doc, Inkscape::XML::Node* repr) { @@ -496,14 +518,14 @@ GType SPGradient::getType() GTypeInfo gradient_info = { sizeof(SPGradientClass), NULL, NULL, - (GClassInitFunc) CGradient::classInit, + 0, //(GClassInitFunc) CGradient::classInit, NULL, NULL, sizeof(SPGradient), 16, (GInstanceInitFunc) CGradient::init, NULL, /* value_table */ }; - gradient_type = g_type_register_static(SP_TYPE_PAINT_SERVER, "SPGradient", + gradient_type = g_type_register_static(G_TYPE_OBJECT, "SPGradient", &gradient_info, (GTypeFlags)0); } return gradient_type; @@ -524,11 +546,15 @@ CGradient::CGradient(SPGradient* gradient) : CPaintServer(gradient) { CGradient::~CGradient() { } -/** - * Callback for SPGradient object initialization. - */ -void CGradient::init(SPGradient *gr) -{ +SPGradient::SPGradient() : SPPaintServer(), units(), + spread(), + ref(NULL), + state(2), + vector() { + + + SPGradient* gr = this; + gr->cgradient = new CGradient(gr); gr->typeHierarchy.insert(typeid(SPGradient)); @@ -536,6 +562,8 @@ void CGradient::init(SPGradient *gr) gr->cpaintserver = gr->cgradient; gr->cobject = gr->cgradient; + gr->has_patches = 0; + gr->ref = new SPGradientReference(gr); gr->ref->changedSignal().connect(sigc::bind(sigc::ptr_fun(CGradient::gradientRefChanged), gr)); @@ -562,6 +590,14 @@ void CGradient::init(SPGradient *gr) new (&gr->modified_connection) sigc::connection(); } +/** + * Callback for SPGradient object initialization. + */ +void CGradient::init(SPGradient *gr) +{ + new (gr) SPGradient(); +} + /** * Virtual build: set gradient attributes from its associated repr. */ @@ -1380,7 +1416,7 @@ sp_gradient_set_gs2d_matrix(SPGradient *gr, Geom::Affine const &ctm, /* * Linear Gradient */ -G_DEFINE_TYPE(SPLinearGradient, sp_lineargradient, SP_TYPE_GRADIENT); +G_DEFINE_TYPE(SPLinearGradient, sp_lineargradient, G_TYPE_OBJECT); /** * SPLinearGradient vtable initialization. @@ -1396,11 +1432,9 @@ CLinearGradient::CLinearGradient(SPLinearGradient* lineargradient) : CGradient(l CLinearGradient::~CLinearGradient() { } -/** - * Callback for SPLinearGradient object initialization. - */ -static void sp_lineargradient_init(SPLinearGradient *lg) -{ +SPLinearGradient::SPLinearGradient() : SPGradient() { + SPLinearGradient* lg = this; + lg->clineargradient = new CLinearGradient(lg); lg->typeHierarchy.insert(typeid(SPLinearGradient)); @@ -1415,6 +1449,14 @@ static void sp_lineargradient_init(SPLinearGradient *lg) lg->y2.unset(SVGLength::PERCENT, 0.0, 0.0); } +/** + * Callback for SPLinearGradient object initialization. + */ +static void sp_lineargradient_init(SPLinearGradient *lg) +{ + new (lg) SPLinearGradient(); +} + void CLinearGradient::build(SPDocument *document, Inkscape::XML::Node *repr) { SPLinearGradient* object = this->splineargradient; @@ -1507,7 +1549,7 @@ sp_lineargradient_set_position(SPLinearGradient *lg, /* * Radial Gradient */ -G_DEFINE_TYPE(SPRadialGradient, sp_radialgradient, SP_TYPE_GRADIENT); +G_DEFINE_TYPE(SPRadialGradient, sp_radialgradient, G_TYPE_OBJECT); /** * SPRadialGradient vtable initialization. @@ -1523,12 +1565,9 @@ CRadialGradient::CRadialGradient(SPRadialGradient* radialgradient) : CGradient(r CRadialGradient::~CRadialGradient() { } -/** - * Callback for SPRadialGradient object initialization. - */ -static void -sp_radialgradient_init(SPRadialGradient *rg) -{ +SPRadialGradient::SPRadialGradient() : SPGradient() { + SPRadialGradient* rg = this; + rg->cradialgradient = new CRadialGradient(rg); rg->typeHierarchy.insert(typeid(SPRadialGradient)); @@ -1544,6 +1583,15 @@ sp_radialgradient_init(SPRadialGradient *rg) rg->fy.unset(SVGLength::PERCENT, 0.5, 0.5); } +/** + * Callback for SPRadialGradient object initialization. + */ +static void +sp_radialgradient_init(SPRadialGradient *rg) +{ + new (rg) SPRadialGradient(); +} + /** * Set radial gradient attributes from associated repr. */ @@ -1661,7 +1709,7 @@ sp_radialgradient_set_position(SPRadialGradient *rg, //#define MESH_DEBUG -G_DEFINE_TYPE(SPMeshGradient, sp_meshgradient, SP_TYPE_GRADIENT); +G_DEFINE_TYPE(SPMeshGradient, sp_meshgradient, G_TYPE_OBJECT); /** * SPMeshGradient vtable initialization. @@ -1680,12 +1728,9 @@ CMeshGradient::CMeshGradient(SPMeshGradient* meshgradient) : CGradient(meshgradi CMeshGradient::~CMeshGradient() { } -/** - * Callback for SPMeshGradient object initialization. - */ -static void -sp_meshgradient_init(SPMeshGradient *mg) -{ +SPMeshGradient::SPMeshGradient() : SPGradient() { + SPMeshGradient* mg = this; + mg->cmeshgradient = new CMeshGradient(mg); mg->typeHierarchy.insert(typeid(SPMeshGradient)); @@ -1699,6 +1744,15 @@ sp_meshgradient_init(SPMeshGradient *mg) mg->y.unset(SVGLength::NONE, 0.0, 0.0); } +/** + * Callback for SPMeshGradient object initialization. + */ +static void +sp_meshgradient_init(SPMeshGradient *mg) +{ + new (mg) SPMeshGradient(); +} + void CMeshGradient::build(SPDocument *document, Inkscape::XML::Node *repr) { SPMeshGradient* object = this->spmeshgradient; -- cgit v1.2.3 From d1af3566872dfff2aeec84859c87f1f8d13f79df Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Tue, 2 Apr 2013 19:14:36 +0200 Subject: Registered classes with new factory. Hkern, Vkern and FeFuncX have to be rewritten, as they aren't real classes. (bzr r11608.1.69) --- src/sp-gradient.cpp | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'src/sp-gradient.cpp') diff --git a/src/sp-gradient.cpp b/src/sp-gradient.cpp index 1a1b1b1e6..70e90f33c 100644 --- a/src/sp-gradient.cpp +++ b/src/sp-gradient.cpp @@ -60,6 +60,42 @@ /// Has to be power of 2 Seems to be unused. //#define NCOLORS NR_GRADIENT_VECTOR_LENGTH +#include "sp-factory.h" + +namespace { + SPObject* createStop() { + return new SPStop(); + } + + SPObject* createMeshRow() { + return new SPMeshRow(); + } + + SPObject* createMeshPatch() { + return new SPMeshPatch(); + } + + SPObject* createLinearGradient() { + return new SPLinearGradient(); + } + + SPObject* createRadialGradient() { + return new SPRadialGradient(); + } + + SPObject* createMeshGradient() { + return new SPMeshGradient(); + } + + bool stopRegistered = SPFactory::instance().registerObject("svg:stop", createStop); + bool meshRowRegistered = SPFactory::instance().registerObject("svg:meshRow", createMeshRow); + bool meshPatchRegistered = SPFactory::instance().registerObject("svg:meshPatch", createMeshPatch); + bool linearGradientRegistered = SPFactory::instance().registerObject("svg:linearGradient", createLinearGradient); + bool radialGradientRegistered = SPFactory::instance().registerObject("svg:radialGradient", createRadialGradient); + bool meshGradientRegistered = SPFactory::instance().registerObject("svg:meshGradient", createMeshGradient); +} + + // SPStop G_DEFINE_TYPE(SPStop, sp_stop, G_TYPE_OBJECT); -- cgit v1.2.3 From b0cc47554b385fb68643d07efe6e42366c7121ad Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Sat, 6 Apr 2013 01:36:16 +0200 Subject: Merged PaintServer and subclasses; moved Gradient classes to own files. (bzr r11608.1.82) --- src/sp-gradient.cpp | 1333 +++++---------------------------------------------- 1 file changed, 132 insertions(+), 1201 deletions(-) (limited to 'src/sp-gradient.cpp') diff --git a/src/sp-gradient.cpp b/src/sp-gradient.cpp index 70e90f33c..530e5be40 100644 --- a/src/sp-gradient.cpp +++ b/src/sp-gradient.cpp @@ -60,231 +60,6 @@ /// Has to be power of 2 Seems to be unused. //#define NCOLORS NR_GRADIENT_VECTOR_LENGTH -#include "sp-factory.h" - -namespace { - SPObject* createStop() { - return new SPStop(); - } - - SPObject* createMeshRow() { - return new SPMeshRow(); - } - - SPObject* createMeshPatch() { - return new SPMeshPatch(); - } - - SPObject* createLinearGradient() { - return new SPLinearGradient(); - } - - SPObject* createRadialGradient() { - return new SPRadialGradient(); - } - - SPObject* createMeshGradient() { - return new SPMeshGradient(); - } - - bool stopRegistered = SPFactory::instance().registerObject("svg:stop", createStop); - bool meshRowRegistered = SPFactory::instance().registerObject("svg:meshRow", createMeshRow); - bool meshPatchRegistered = SPFactory::instance().registerObject("svg:meshPatch", createMeshPatch); - bool linearGradientRegistered = SPFactory::instance().registerObject("svg:linearGradient", createLinearGradient); - bool radialGradientRegistered = SPFactory::instance().registerObject("svg:radialGradient", createRadialGradient); - bool meshGradientRegistered = SPFactory::instance().registerObject("svg:meshGradient", createMeshGradient); -} - - -// SPStop -G_DEFINE_TYPE(SPStop, sp_stop, G_TYPE_OBJECT); - -// SPMeshRow -G_DEFINE_TYPE(SPMeshRow, sp_meshrow, G_TYPE_OBJECT); - -// SPMeshPatch -G_DEFINE_TYPE(SPMeshPatch, sp_meshpatch, G_TYPE_OBJECT); - - -/** - * Callback to initialize SPStop vtable. - */ -static void sp_stop_class_init(SPStopClass *klass) -{ -} - -CStop::CStop(SPStop* stop) : CObject(stop) { - this->spstop = stop; -} - -CStop::~CStop() { -} - -SPStop::SPStop() : SPObject() { - SPStop* stop = this; - - stop->cstop = new CStop(stop); - stop->typeHierarchy.insert(typeid(SPStop)); - - delete stop->cobject; - stop->cobject = stop->cstop; - - stop->path_string = NULL; - - stop->offset = 0.0; - stop->currentColor = false; - stop->specified_color.set( 0x000000ff ); - stop->opacity = 1.0; -} - -/** - * Callback to initialize SPStop object. - */ -static void -sp_stop_init(SPStop *stop) -{ - new (stop) SPStop(); -} - -void CStop::build(SPDocument* doc, Inkscape::XML::Node* repr) { - SPStop* object = this->spstop; - - 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 CStop::set(unsigned int key, const gchar* value) { - SPStop* object = this->spstop; - - 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* CStop::write(Inkscape::XML::Document* xml_doc, Inkscape::XML::Node* repr, guint flags) { - SPStop* object = this->spstop; - - 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 rather than a CSS one, but exponents make no sense - * for offset proportions. */ - - return repr; -} - -/** - * Virtual write: write object attributes to repr. - */ - bool SPGradient::hasStops() const { return has_stops; @@ -361,425 +136,199 @@ gboolean SPGradient::isEquivalent(SPGradient *that) } -/** - * 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(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 ); - } -} - -/* - * Mesh Row - */ - -/** - * Callback to initialize SPMeshRow vtable. - */ -static void sp_meshrow_class_init(SPMeshRowClass *klass) -{ -} - -CMeshRow::CMeshRow(SPMeshRow* meshrow) : CObject(meshrow) { - this->spmeshrow = meshrow; -} - -CMeshRow::~CMeshRow() { -} - -SPMeshRow::SPMeshRow() : SPObject() { - SPMeshRow* meshrow = this; - - meshrow->cmeshrow = new CMeshRow(meshrow); - meshrow->typeHierarchy.insert(typeid(SPMeshRow)); - - delete meshrow->cobject; - meshrow->cobject = meshrow->cmeshrow; -} - -/** - * Callback to initialize SPMeshRow object. - */ -static void sp_meshrow_init(SPMeshRow * meshrow) -{ - new (meshrow) SPMeshRow(); -} - -void CMeshRow::build(SPDocument* doc, Inkscape::XML::Node* repr) { - CObject::build(doc, repr); -} - -/** - * Virtual build: set meshrow attributes from its associated XML node. - */ - -void CMeshRow::set(unsigned int key, const gchar* value) { -} - -/** - * Virtual set: set attribute to value. - */ - -Inkscape::XML::Node* CMeshRow::write(Inkscape::XML::Document* xml_doc, Inkscape::XML::Node* repr, guint flags) { - if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) { - repr = xml_doc->createElement("svg:meshRow"); - } - - CObject::write(xml_doc, repr, flags); - - return repr; -} - -/** - * Virtual write: write object attributes to repr. - */ - -/* - * Mesh Patch - */ - -/** - * Callback to initialize SPMeshPatch vtable. - */ -static void sp_meshpatch_class_init(SPMeshPatchClass *klass) -{ -} - -CMeshPatch::CMeshPatch(SPMeshPatch* meshpatch) : CObject(meshpatch) { - this->spmeshpatch = meshpatch; -} - -CMeshPatch::~CMeshPatch() { -} - -SPMeshPatch::SPMeshPatch() : SPObject() { - SPMeshPatch* meshpatch = this; - - meshpatch->cmeshpatch = new CMeshPatch(meshpatch); - meshpatch->typeHierarchy.insert(typeid(SPMeshPatch)); - - delete meshpatch->cobject; - meshpatch->cobject = meshpatch->cmeshpatch; - - meshpatch->tensor_string = NULL; -} - -/** - * Callback to initialize SPMeshPatch object. - */ -static void sp_meshpatch_init(SPMeshPatch * meshpatch) -{ - new (meshpatch) SPMeshPatch(); -} - -void CMeshPatch::build(SPDocument* doc, Inkscape::XML::Node* repr) { - SPMeshPatch* object = this->spmeshpatch; - - CObject::build(doc, repr); - - object->readAttr( "tensor" ); -} - -/** - * Virtual build: set meshpatch attributes from its associated XML node. - */ - -void CMeshPatch::set(unsigned int key, const gchar* value) { - SPMeshPatch* object = this->spmeshpatch; - - SPMeshPatch *patch = SP_MESHPATCH(object); - - switch (key) { - case SP_ATTR_TENSOR: { - if (value) { - patch->tensor_string = new Glib::ustring( value ); - // std::cout << "sp_meshpatch_set: Tensor string: " << patch->tensor_string->c_str() << std::endl; - } - break; - } - default: { - // Do nothing - } - } -} - -/** - * Virtual set: set attribute to value. - */ - -Inkscape::XML::Node* CMeshPatch::write(Inkscape::XML::Document* xml_doc, Inkscape::XML::Node* repr, guint flags) { - if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) { - repr = xml_doc->createElement("svg:meshPatch"); - } - - CObject::write(xml_doc, repr, flags); - - return repr; -} - -/** - * Virtual write: write object attributes to repr. - */ - - /* * Gradient */ -static SPPaintServerClass *gradient_parent_class; - -/** - * Registers SPGradient class and returns its type. - */ -GType SPGradient::getType() -{ - static GType gradient_type = 0; - if (!gradient_type) { - - GTypeInfo gradient_info = { - sizeof(SPGradientClass), - NULL, NULL, - 0, //(GClassInitFunc) CGradient::classInit, - NULL, NULL, - sizeof(SPGradient), - 16, - (GInstanceInitFunc) CGradient::init, - NULL, /* value_table */ - }; - gradient_type = g_type_register_static(G_TYPE_OBJECT, "SPGradient", - &gradient_info, (GTypeFlags)0); - } - return gradient_type; -} - -/** - * SPGradient vtable initialization. - */ -void CGradient::classInit(SPGradientClass *klass) -{ - gradient_parent_class = (SPPaintServerClass *)g_type_class_ref(SP_TYPE_PAINT_SERVER); -} - -CGradient::CGradient(SPGradient* gradient) : CPaintServer(gradient) { - this->spgradient = gradient; -} - -CGradient::~CGradient() { -} - -SPGradient::SPGradient() : SPPaintServer(), units(), +SPGradient::SPGradient() : SPPaintServer(), units(), spread(), ref(NULL), state(2), vector() { - SPGradient* gr = this; - - gr->cgradient = new CGradient(gr); - gr->typeHierarchy.insert(typeid(SPGradient)); + this->cobject = this; - delete gr->cpaintserver; - gr->cpaintserver = gr->cgradient; - gr->cobject = gr->cgradient; + this->has_patches = 0; - gr->has_patches = 0; - - gr->ref = new SPGradientReference(gr); - gr->ref->changedSignal().connect(sigc::bind(sigc::ptr_fun(CGradient::gradientRefChanged), gr)); + this->ref = new SPGradientReference(this); + this->ref->changedSignal().connect(sigc::bind(sigc::ptr_fun(SPGradient::gradientRefChanged), this)); /** \todo * Fixme: reprs being rearranged (e.g. via the XML editor) * may require us to clear the state. */ - gr->state = SP_GRADIENT_STATE_UNKNOWN; + this->state = SP_GRADIENT_STATE_UNKNOWN; - gr->units = SP_GRADIENT_UNITS_OBJECTBOUNDINGBOX; - gr->units_set = FALSE; + this->units = SP_GRADIENT_UNITS_OBJECTBOUNDINGBOX; + this->units_set = FALSE; - gr->gradientTransform = Geom::identity(); - gr->gradientTransform_set = FALSE; + this->gradientTransform = Geom::identity(); + this->gradientTransform_set = FALSE; - gr->spread = SP_GRADIENT_SPREAD_PAD; - gr->spread_set = FALSE; + this->spread = SP_GRADIENT_SPREAD_PAD; + this->spread_set = FALSE; - gr->has_stops = FALSE; + this->has_stops = FALSE; - gr->vector.built = false; - gr->vector.stops.clear(); + this->vector.built = false; + this->vector.stops.clear(); - new (&gr->modified_connection) sigc::connection(); + new (&this->modified_connection) sigc::connection(); } -/** - * Callback for SPGradient object initialization. - */ -void CGradient::init(SPGradient *gr) -{ - new (gr) SPGradient(); +SPGradient::~SPGradient() { } /** * Virtual build: set gradient attributes from its associated repr. */ -void CGradient::build(SPDocument *document, Inkscape::XML::Node *repr) +void SPGradient::build(SPDocument *document, Inkscape::XML::Node *repr) { - SPGradient* object = this->spgradient; - SPGradient *gradient = SP_GRADIENT(object); - // Work-around in case a swatch had been marked for immediate collection: if ( repr->attribute("osb:paint") && repr->attribute("inkscape:collect") ) { repr->setAttribute("inkscape:collect", 0); } - CPaintServer::build(document, repr); + SPPaintServer::build(document, repr); - for ( SPObject *ochild = object->firstChild() ; ochild ; ochild = ochild->getNext() ) { + for ( SPObject *ochild = this->firstChild() ; ochild ; ochild = ochild->getNext() ) { if (SP_IS_STOP(ochild)) { - gradient->has_stops = TRUE; + this->has_stops = TRUE; break; } } - object->readAttr( "gradientUnits" ); - object->readAttr( "gradientTransform" ); - object->readAttr( "spreadMethod" ); - object->readAttr( "xlink:href" ); - object->readAttr( "osb:paint" ); + this->readAttr( "gradientUnits" ); + this->readAttr( "gradientTransform" ); + this->readAttr( "spreadMethod" ); + this->readAttr( "xlink:href" ); + this->readAttr( "osb:paint" ); // Register ourselves - document->addResource("gradient", object); + document->addResource("gradient", this); } /** * Virtual release of SPGradient members before destruction. */ -void CGradient::release() +void SPGradient::release() { - SPGradient* object = this->spgradient; - SPGradient *gradient = (SPGradient *) object; #ifdef SP_GRADIENT_VERBOSE - g_print("Releasing gradient %s\n", object->getId()); + g_print("Releasing this %s\n", this->getId()); #endif - if (object->document) { + if (this->document) { // Unregister ourselves - object->document->removeResource("gradient", object); + this->document->removeResource("gradient", this); } - if (gradient->ref) { - gradient->modified_connection.disconnect(); - gradient->ref->detach(); - delete gradient->ref; - gradient->ref = NULL; + if (this->ref) { + this->modified_connection.disconnect(); + this->ref->detach(); + delete this->ref; + this->ref = NULL; } - gradient->modified_connection.~connection(); + this->modified_connection.~connection(); - CPaintServer::release(); + SPPaintServer::release(); } /** * Set gradient attribute to value. */ -void CGradient::set(unsigned key, gchar const *value) +void SPGradient::set(unsigned key, gchar const *value) { - SPGradient* object = this->spgradient; - SPGradient *gr = SP_GRADIENT(object); - switch (key) { case SP_ATTR_GRADIENTUNITS: if (value) { if (!strcmp(value, "userSpaceOnUse")) { - gr->units = SP_GRADIENT_UNITS_USERSPACEONUSE; + this->units = SP_GRADIENT_UNITS_USERSPACEONUSE; } else { - gr->units = SP_GRADIENT_UNITS_OBJECTBOUNDINGBOX; + this->units = SP_GRADIENT_UNITS_OBJECTBOUNDINGBOX; } - gr->units_set = TRUE; + + this->units_set = TRUE; } else { - gr->units = SP_GRADIENT_UNITS_OBJECTBOUNDINGBOX; - gr->units_set = FALSE; + this->units = SP_GRADIENT_UNITS_OBJECTBOUNDINGBOX; + this->units_set = FALSE; } - object->requestModified(SP_OBJECT_MODIFIED_FLAG); + + this->requestModified(SP_OBJECT_MODIFIED_FLAG); break; + case SP_ATTR_GRADIENTTRANSFORM: { Geom::Affine t; if (value && sp_svg_transform_read(value, &t)) { - gr->gradientTransform = t; - gr->gradientTransform_set = TRUE; + this->gradientTransform = t; + this->gradientTransform_set = TRUE; } else { - gr->gradientTransform = Geom::identity(); - gr->gradientTransform_set = FALSE; + this->gradientTransform = Geom::identity(); + this->gradientTransform_set = FALSE; } - object->requestModified(SP_OBJECT_MODIFIED_FLAG); + + this->requestModified(SP_OBJECT_MODIFIED_FLAG); break; } case SP_ATTR_SPREADMETHOD: if (value) { if (!strcmp(value, "reflect")) { - gr->spread = SP_GRADIENT_SPREAD_REFLECT; + this->spread = SP_GRADIENT_SPREAD_REFLECT; } else if (!strcmp(value, "repeat")) { - gr->spread = SP_GRADIENT_SPREAD_REPEAT; + this->spread = SP_GRADIENT_SPREAD_REPEAT; } else { - gr->spread = SP_GRADIENT_SPREAD_PAD; + this->spread = SP_GRADIENT_SPREAD_PAD; } - gr->spread_set = TRUE; + + this->spread_set = TRUE; } else { - gr->spread_set = FALSE; + this->spread_set = FALSE; } - object->requestModified(SP_OBJECT_MODIFIED_FLAG); + + this->requestModified(SP_OBJECT_MODIFIED_FLAG); break; + case SP_ATTR_XLINK_HREF: if (value) { try { - gr->ref->attach(Inkscape::URI(value)); + this->ref->attach(Inkscape::URI(value)); } catch (Inkscape::BadURIException &e) { g_warning("%s", e.what()); - gr->ref->detach(); + this->ref->detach(); } } else { - gr->ref->detach(); + this->ref->detach(); } break; + case SP_ATTR_OSB_SWATCH: { bool newVal = (value != 0); bool modified = false; - if (newVal != gr->swatch) { - gr->swatch = newVal; + + if (newVal != this->swatch) { + this->swatch = newVal; modified = true; } + if (newVal) { // Might need to flip solid/gradient - Glib::ustring paintVal = ( gr->hasStops() && (gr->getStopCount() == 0) ) ? "solid" : "gradient"; + Glib::ustring paintVal = ( this->hasStops() && (this->getStopCount() == 0) ) ? "solid" : "gradient"; + if ( paintVal != value ) { - gr->setAttribute( "osb:paint", paintVal.c_str(), 0 ); + this->setAttribute( "osb:paint", paintVal.c_str(), 0 ); modified = true; } } + if (modified) { - object->requestModified(SP_OBJECT_MODIFIED_FLAG); + this->requestModified(SP_OBJECT_MODIFIED_FLAG); } } break; default: - CPaintServer::set(key, value); + SPPaintServer::set(key, value); break; } } @@ -787,7 +336,7 @@ void CGradient::set(unsigned key, gchar const *value) /** * Gets called when the gradient is (re)attached to another gradient. */ -void CGradient::gradientRefChanged(SPObject *old_ref, SPObject *ref, SPGradient *gr) +void SPGradient::gradientRefChanged(SPObject *old_ref, SPObject *ref, SPGradient *gr) { if (old_ref) { gr->modified_connection.disconnect(); @@ -795,7 +344,7 @@ void CGradient::gradientRefChanged(SPObject *old_ref, SPObject *ref, SPGradient if ( SP_IS_GRADIENT(ref) && ref != gr ) { - gr->modified_connection = ref->connectModified(sigc::bind<2>(sigc::ptr_fun(&CGradient::gradientRefModified), gr)); + gr->modified_connection = ref->connectModified(sigc::bind<2>(sigc::ptr_fun(&SPGradient::gradientRefModified), gr)); } // Per SVG, all unset attributes must be inherited from linked gradient. @@ -816,82 +365,74 @@ void CGradient::gradientRefChanged(SPObject *old_ref, SPObject *ref, SPGradient /** * Callback for child_added event. */ -void CGradient::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) +void SPGradient::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) { - SPGradient* object = this->spgradient; - SPGradient *gr = SP_GRADIENT(object); - - gr->invalidateVector(); + this->invalidateVector(); - CPaintServer::child_added(child, ref); + SPPaintServer::child_added(child, ref); - SPObject *ochild = object->get_child_by_repr(child); + SPObject *ochild = this->get_child_by_repr(child); if ( ochild && SP_IS_STOP(ochild) ) { - gr->has_stops = TRUE; - if ( gr->getStopCount() > 0 ) { - gchar const * attr = gr->getAttribute("osb:paint"); + this->has_stops = TRUE; + if ( this->getStopCount() > 0 ) { + gchar const * attr = this->getAttribute("osb:paint"); if ( attr && strcmp(attr, "gradient") ) { - gr->setAttribute( "osb:paint", "gradient", 0 ); + this->setAttribute( "osb:paint", "gradient", 0 ); } } } /// \todo Fixme: should we schedule "modified" here? - object->requestModified(SP_OBJECT_MODIFIED_FLAG); + this->requestModified(SP_OBJECT_MODIFIED_FLAG); } /** * Callback for remove_child event. */ -void CGradient::remove_child(Inkscape::XML::Node *child) +void SPGradient::remove_child(Inkscape::XML::Node *child) { - SPGradient* object = this->spgradient; - SPGradient *gr = SP_GRADIENT(object); + this->invalidateVector(); - gr->invalidateVector(); + SPPaintServer::remove_child(child); - CPaintServer::remove_child(child); - - gr->has_stops = FALSE; - for ( SPObject *ochild = object->firstChild() ; ochild ; ochild = ochild->getNext() ) { + this->has_stops = FALSE; + for ( SPObject *ochild = this->firstChild() ; ochild ; ochild = ochild->getNext() ) { if (SP_IS_STOP(ochild)) { - gr->has_stops = TRUE; + this->has_stops = TRUE; break; } } - if ( gr->getStopCount() == 0 ) { - gchar const * attr = gr->getAttribute("osb:paint"); + if ( this->getStopCount() == 0 ) { + gchar const * attr = this->getAttribute("osb:paint"); + if ( attr && strcmp(attr, "solid") ) { - gr->setAttribute( "osb:paint", "solid", 0 ); + this->setAttribute( "osb:paint", "solid", 0 ); } } /* Fixme: should we schedule "modified" here? */ - object->requestModified(SP_OBJECT_MODIFIED_FLAG); + this->requestModified(SP_OBJECT_MODIFIED_FLAG); } /** * Callback for modified event. */ -void CGradient::modified(guint flags) +void SPGradient::modified(guint flags) { - SPGradient* object = this->spgradient; - SPGradient *gr = SP_GRADIENT(object); - if (flags & SP_OBJECT_CHILD_MODIFIED_FLAG) { - if( gr->get_type() != SP_GRADIENT_TYPE_MESH ) { - gr->invalidateVector(); + if( this->get_type() != SP_GRADIENT_TYPE_MESH ) { + this->invalidateVector(); } else { - gr->invalidateArray(); + this->invalidateArray(); } } if (flags & SP_OBJECT_STYLE_MODIFIED_FLAG) { - if( gr->get_type() != SP_GRADIENT_TYPE_MESH ) { - gr->ensureVector(); + if( this->get_type() != SP_GRADIENT_TYPE_MESH ) { + this->ensureVector(); } else { - gr->ensureArray(); + this->ensureArray(); } } @@ -900,17 +441,22 @@ void CGradient::modified(guint flags) // FIXME: climb up the ladder of hrefs GSList *l = NULL; - for (SPObject *child = object->firstChild() ; child; child = child->getNext() ) { + + for (SPObject *child = this->firstChild() ; child; child = child->getNext() ) { sp_object_ref(child); l = g_slist_prepend(l, child); } + l = g_slist_reverse(l); + while (l) { SPObject *child = SP_OBJECT(l->data); l = g_slist_remove(l, child); + if (flags || (child->mflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) { child->emitModified(flags); } + sp_object_unref(child); } } @@ -940,21 +486,21 @@ int SPGradient::getStopCount() const /** * Write gradient attributes to repr. */ -Inkscape::XML::Node *CGradient::write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) +Inkscape::XML::Node *SPGradient::write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) { - SPGradient* object = this->spgradient; - SPGradient *gr = SP_GRADIENT(object); - - CPaintServer::write(xml_doc, repr, flags); + SPPaintServer::write(xml_doc, repr, flags); if (flags & SP_OBJECT_WRITE_BUILD) { GSList *l = NULL; - for (SPObject *child = object->firstChild(); child; child = child->getNext()) { + + for (SPObject *child = this->firstChild(); child; child = child->getNext()) { Inkscape::XML::Node *crepr = child->updateRepr(xml_doc, NULL, flags); + if (crepr) { l = g_slist_prepend(l, crepr); } } + while (l) { repr->addChild((Inkscape::XML::Node *) l->data, NULL); Inkscape::GC::release((Inkscape::XML::Node *) l->data); @@ -962,14 +508,14 @@ Inkscape::XML::Node *CGradient::write(Inkscape::XML::Document *xml_doc, Inkscape } } - if (gr->ref->getURI()) { - gchar *uri_string = gr->ref->getURI()->toString(); + if (this->ref->getURI()) { + gchar *uri_string = this->ref->getURI()->toString(); repr->setAttribute("xlink:href", uri_string); g_free(uri_string); } - if ((flags & SP_OBJECT_WRITE_ALL) || gr->units_set) { - switch (gr->units) { + if ((flags & SP_OBJECT_WRITE_ALL) || this->units_set) { + switch (this->units) { case SP_GRADIENT_UNITS_USERSPACEONUSE: repr->setAttribute("gradientUnits", "userSpaceOnUse"); break; @@ -979,17 +525,17 @@ Inkscape::XML::Node *CGradient::write(Inkscape::XML::Document *xml_doc, Inkscape } } - if ((flags & SP_OBJECT_WRITE_ALL) || gr->gradientTransform_set) { - gchar *c=sp_svg_transform_write(gr->gradientTransform); + if ((flags & SP_OBJECT_WRITE_ALL) || this->gradientTransform_set) { + gchar *c=sp_svg_transform_write(this->gradientTransform); repr->setAttribute("gradientTransform", c); g_free(c); } - if ((flags & SP_OBJECT_WRITE_ALL) || gr->spread_set) { - /* FIXME: Ensure that gr->spread is the inherited value - * if !gr->spread_set. Not currently happening: see SPGradient::modified. + if ((flags & SP_OBJECT_WRITE_ALL) || this->spread_set) { + /* FIXME: Ensure that this->spread is the inherited value + * if !this->spread_set. Not currently happening: see SPGradient::modified. */ - switch (gr->spread) { + switch (this->spread) { case SP_GRADIENT_SPREAD_REFLECT: repr->setAttribute("spreadMethod", "reflect"); break; @@ -1002,8 +548,8 @@ Inkscape::XML::Node *CGradient::write(Inkscape::XML::Document *xml_doc, Inkscape } } - if ( (flags & SP_OBJECT_WRITE_EXT) && gr->isSwatch() ) { - if ( gr->isSolid() ) { + if ( (flags & SP_OBJECT_WRITE_EXT) && this->isSwatch() ) { + if ( this->isSolid() ) { repr->setAttribute( "osb:paint", "solid" ); } else { repr->setAttribute( "osb:paint", "gradient" ); @@ -1235,7 +781,7 @@ sp_gradient_repr_write_vector(SPGradient *gr) } -void CGradient::gradientRefModified(SPObject */*href*/, guint /*flags*/, SPGradient *gradient) +void SPGradient::gradientRefModified(SPObject */*href*/, guint /*flags*/, SPGradient *gradient) { if ( gradient->invalidateVector() ) { gradient->requestModified(SP_OBJECT_MODIFIED_FLAG); @@ -1449,422 +995,12 @@ sp_gradient_set_gs2d_matrix(SPGradient *gr, Geom::Affine const &ctm, gr->requestModified(SP_OBJECT_MODIFIED_FLAG); } -/* - * Linear Gradient - */ -G_DEFINE_TYPE(SPLinearGradient, sp_lineargradient, G_TYPE_OBJECT); -/** - * SPLinearGradient vtable initialization. - */ -static void sp_lineargradient_class_init(SPLinearGradientClass *klass) -{ -} - -CLinearGradient::CLinearGradient(SPLinearGradient* lineargradient) : CGradient(lineargradient) { - this->splineargradient = lineargradient; -} - -CLinearGradient::~CLinearGradient() { -} -SPLinearGradient::SPLinearGradient() : SPGradient() { - SPLinearGradient* lg = this; - - lg->clineargradient = new CLinearGradient(lg); - lg->typeHierarchy.insert(typeid(SPLinearGradient)); - - delete lg->cgradient; - lg->cgradient = lg->clineargradient; - lg->cpaintserver = lg->clineargradient; - lg->cobject = lg->clineargradient; - - lg->x1.unset(SVGLength::PERCENT, 0.0, 0.0); - lg->y1.unset(SVGLength::PERCENT, 0.0, 0.0); - lg->x2.unset(SVGLength::PERCENT, 1.0, 1.0); - lg->y2.unset(SVGLength::PERCENT, 0.0, 0.0); -} - -/** - * Callback for SPLinearGradient object initialization. - */ -static void sp_lineargradient_init(SPLinearGradient *lg) -{ - new (lg) SPLinearGradient(); -} - -void CLinearGradient::build(SPDocument *document, Inkscape::XML::Node *repr) { - SPLinearGradient* object = this->splineargradient; - - CGradient::build(document, repr); - - object->readAttr( "x1" ); - object->readAttr( "y1" ); - object->readAttr( "x2" ); - object->readAttr( "y2" ); -} - -/** - * Callback: set attribute. - */ -void CLinearGradient::set(unsigned int key, const gchar* value) { - SPLinearGradient* object = this->splineargradient; - - SPLinearGradient *lg = SP_LINEARGRADIENT(object); - - switch (key) { - case SP_ATTR_X1: - lg->x1.readOrUnset(value, SVGLength::PERCENT, 0.0, 0.0); - object->requestModified(SP_OBJECT_MODIFIED_FLAG); - break; - case SP_ATTR_Y1: - lg->y1.readOrUnset(value, SVGLength::PERCENT, 0.0, 0.0); - object->requestModified(SP_OBJECT_MODIFIED_FLAG); - break; - case SP_ATTR_X2: - lg->x2.readOrUnset(value, SVGLength::PERCENT, 1.0, 1.0); - object->requestModified(SP_OBJECT_MODIFIED_FLAG); - break; - case SP_ATTR_Y2: - lg->y2.readOrUnset(value, SVGLength::PERCENT, 0.0, 0.0); - object->requestModified(SP_OBJECT_MODIFIED_FLAG); - break; - default: - CGradient::set(key, value); - break; - } -} - -/** - * Callback: write attributes to associated repr. - */ -Inkscape::XML::Node* CLinearGradient::write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) { - SPLinearGradient* object = this->splineargradient; - - SPLinearGradient *lg = SP_LINEARGRADIENT(object); - - if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) { - repr = xml_doc->createElement("svg:linearGradient"); - } - - if ((flags & SP_OBJECT_WRITE_ALL) || lg->x1._set) - sp_repr_set_svg_double(repr, "x1", lg->x1.computed); - if ((flags & SP_OBJECT_WRITE_ALL) || lg->y1._set) - sp_repr_set_svg_double(repr, "y1", lg->y1.computed); - if ((flags & SP_OBJECT_WRITE_ALL) || lg->x2._set) - sp_repr_set_svg_double(repr, "x2", lg->x2.computed); - if ((flags & SP_OBJECT_WRITE_ALL) || lg->y2._set) - sp_repr_set_svg_double(repr, "y2", lg->y2.computed); - - CGradient::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); -} - -/* - * Radial Gradient - */ -G_DEFINE_TYPE(SPRadialGradient, sp_radialgradient, G_TYPE_OBJECT); - -/** - * SPRadialGradient vtable initialization. - */ -static void sp_radialgradient_class_init(SPRadialGradientClass *klass) -{ -} - -CRadialGradient::CRadialGradient(SPRadialGradient* radialgradient) : CGradient(radialgradient) { - this->spradialgradient = radialgradient; -} - -CRadialGradient::~CRadialGradient() { -} - -SPRadialGradient::SPRadialGradient() : SPGradient() { - SPRadialGradient* rg = this; - - rg->cradialgradient = new CRadialGradient(rg); - rg->typeHierarchy.insert(typeid(SPRadialGradient)); - - delete rg->cgradient; - rg->cgradient = rg->cradialgradient; - rg->cpaintserver = rg->cradialgradient; - rg->cobject = rg->cradialgradient; - - rg->cx.unset(SVGLength::PERCENT, 0.5, 0.5); - rg->cy.unset(SVGLength::PERCENT, 0.5, 0.5); - rg->r.unset(SVGLength::PERCENT, 0.5, 0.5); - rg->fx.unset(SVGLength::PERCENT, 0.5, 0.5); - rg->fy.unset(SVGLength::PERCENT, 0.5, 0.5); -} - -/** - * Callback for SPRadialGradient object initialization. - */ -static void -sp_radialgradient_init(SPRadialGradient *rg) -{ - new (rg) SPRadialGradient(); -} - -/** - * Set radial gradient attributes from associated repr. - */ -void CRadialGradient::build(SPDocument *document, Inkscape::XML::Node *repr) { - SPRadialGradient* object = this->spradialgradient; - - CGradient::build(document, repr); - - object->readAttr( "cx" ); - object->readAttr( "cy" ); - object->readAttr( "r" ); - object->readAttr( "fx" ); - object->readAttr( "fy" ); -} - -/** - * Set radial gradient attribute. - */ -void CRadialGradient::set(unsigned key, gchar const *value) { - SPRadialGradient* object = this->spradialgradient; - - SPRadialGradient *rg = SP_RADIALGRADIENT(object); - - switch (key) { - case SP_ATTR_CX: - if (!rg->cx.read(value)) { - rg->cx.unset(SVGLength::PERCENT, 0.5, 0.5); - } - if (!rg->fx._set) { - rg->fx.value = rg->cx.value; - rg->fx.computed = rg->cx.computed; - } - object->requestModified(SP_OBJECT_MODIFIED_FLAG); - break; - case SP_ATTR_CY: - if (!rg->cy.read(value)) { - rg->cy.unset(SVGLength::PERCENT, 0.5, 0.5); - } - if (!rg->fy._set) { - rg->fy.value = rg->cy.value; - rg->fy.computed = rg->cy.computed; - } - object->requestModified(SP_OBJECT_MODIFIED_FLAG); - break; - case SP_ATTR_R: - if (!rg->r.read(value)) { - rg->r.unset(SVGLength::PERCENT, 0.5, 0.5); - } - object->requestModified(SP_OBJECT_MODIFIED_FLAG); - break; - case SP_ATTR_FX: - if (!rg->fx.read(value)) { - rg->fx.unset(rg->cx.unit, rg->cx.value, rg->cx.computed); - } - object->requestModified(SP_OBJECT_MODIFIED_FLAG); - break; - case SP_ATTR_FY: - if (!rg->fy.read(value)) { - rg->fy.unset(rg->cy.unit, rg->cy.value, rg->cy.computed); - } - object->requestModified(SP_OBJECT_MODIFIED_FLAG); - break; - default: - CGradient::set(key, value); - break; - } -} - -/** - * Write radial gradient attributes to associated repr. - */ -Inkscape::XML::Node* CRadialGradient::write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) { - SPRadialGradient* object = this->spradialgradient; - - SPRadialGradient *rg = SP_RADIALGRADIENT(object); - - if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) { - repr = xml_doc->createElement("svg:radialGradient"); - } - - if ((flags & SP_OBJECT_WRITE_ALL) || rg->cx._set) sp_repr_set_svg_double(repr, "cx", rg->cx.computed); - if ((flags & SP_OBJECT_WRITE_ALL) || rg->cy._set) sp_repr_set_svg_double(repr, "cy", rg->cy.computed); - if ((flags & SP_OBJECT_WRITE_ALL) || rg->r._set) sp_repr_set_svg_double(repr, "r", rg->r.computed); - if ((flags & SP_OBJECT_WRITE_ALL) || rg->fx._set) sp_repr_set_svg_double(repr, "fx", rg->fx.computed); - if ((flags & SP_OBJECT_WRITE_ALL) || rg->fy._set) sp_repr_set_svg_double(repr, "fy", rg->fy.computed); - - CGradient::write(xml_doc, repr, flags); - - return repr; -} - -/** - * Directly set properties of radial gradient and request modified. - */ -void -sp_radialgradient_set_position(SPRadialGradient *rg, - gdouble cx, gdouble cy, gdouble fx, gdouble fy, gdouble r) -{ - g_return_if_fail(rg != NULL); - g_return_if_fail(SP_IS_RADIALGRADIENT(rg)); - - /* fixme: units? (Lauris) */ - rg->cx.set(SVGLength::NONE, cx, cx); - rg->cy.set(SVGLength::NONE, cy, cy); - rg->fx.set(SVGLength::NONE, fx, fx); - rg->fy.set(SVGLength::NONE, fy, fy); - rg->r.set(SVGLength::NONE, r, r); - - rg->requestModified(SP_OBJECT_MODIFIED_FLAG); -} - -/* - * Mesh Gradient - */ - -//#define MESH_DEBUG - -G_DEFINE_TYPE(SPMeshGradient, sp_meshgradient, G_TYPE_OBJECT); - -/** - * SPMeshGradient vtable initialization. - */ -static void sp_meshgradient_class_init(SPMeshGradientClass *klass) -{ -#ifdef MESH_DEBUG - std::cout << "sp_meshgradient_class_init()" << std::endl; -#endif -} - -CMeshGradient::CMeshGradient(SPMeshGradient* meshgradient) : CGradient(meshgradient) { - this->spmeshgradient = meshgradient; -} - -CMeshGradient::~CMeshGradient() { -} - -SPMeshGradient::SPMeshGradient() : SPGradient() { - SPMeshGradient* mg = this; - - mg->cmeshgradient = new CMeshGradient(mg); - mg->typeHierarchy.insert(typeid(SPMeshGradient)); - - delete mg->cgradient; - mg->cgradient = mg->cmeshgradient; - mg->cpaintserver = mg->cmeshgradient; - mg->cobject = mg->cmeshgradient; - - // Start coordinate of mesh - mg->x.unset(SVGLength::NONE, 0.0, 0.0); - mg->y.unset(SVGLength::NONE, 0.0, 0.0); -} - -/** - * Callback for SPMeshGradient object initialization. - */ -static void -sp_meshgradient_init(SPMeshGradient *mg) -{ - new (mg) SPMeshGradient(); -} - -void CMeshGradient::build(SPDocument *document, Inkscape::XML::Node *repr) { - SPMeshGradient* object = this->spmeshgradient; - - CGradient::build(document, repr); - - // Start coordinate of mesh - object->readAttr( "x" ); - object->readAttr( "y" ); -} - - -void CMeshGradient::set(unsigned key, gchar const *value) { - SPMeshGradient* object = this->spmeshgradient; - - SPMeshGradient *mg = SP_MESHGRADIENT(object); - - switch (key) { - case SP_ATTR_X: - if (!mg->x.read(value)) { - mg->x.unset(SVGLength::NONE, 0.0, 0.0); - } - object->requestModified(SP_OBJECT_MODIFIED_FLAG); - break; - case SP_ATTR_Y: - if (!mg->y.read(value)) { - mg->y.unset(SVGLength::NONE, 0.0, 0.0); - } - object->requestModified(SP_OBJECT_MODIFIED_FLAG); - break; - default: - CGradient::set(key, value); - break; - } -} - -/** - * Write mesh gradient attributes to associated repr. - */ -Inkscape::XML::Node* CMeshGradient::write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) { - SPMeshGradient* object = this->spmeshgradient; - -#ifdef MESH_DEBUG - std::cout << "sp_meshgradient_write() ***************************" << std::endl; -#endif - SPMeshGradient *mg = SP_MESHGRADIENT(object); - - if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) { - repr = xml_doc->createElement("svg:meshGradient"); - } - - if ((flags & SP_OBJECT_WRITE_ALL) || mg->x._set) sp_repr_set_svg_double(repr, "x", mg->x.computed); - if ((flags & SP_OBJECT_WRITE_ALL) || mg->y._set) sp_repr_set_svg_double(repr, "y", mg->y.computed); - - CGradient::write(xml_doc, repr, flags); - - return repr; -} - -/** - * Directly set properties of mesh gradient and request modified. - */ -void -sp_meshgradient_set_position(SPMeshGradient *mg, gdouble x, gdouble y) -{ - g_return_if_fail(mg != NULL); - g_return_if_fail(SP_IS_MESHGRADIENT(mg)); - - mg->x.set(SVGLength::NONE, x, x); - mg->y.set(SVGLength::NONE, y, y); - - mg->requestModified(SP_OBJECT_MODIFIED_FLAG); -} /* CAIRO RENDERING STUFF */ -static void +void sp_gradient_pattern_common_setup(cairo_pattern_t *cp, SPGradient *gr, Geom::OptRect const &bbox, @@ -1902,205 +1038,6 @@ sp_gradient_pattern_common_setup(cairo_pattern_t *cp, ink_cairo_pattern_set_matrix(cp, gs2user.inverse()); } - -cairo_pattern_t* CRadialGradient::pattern_new(cairo_t *ct, Geom::OptRect const &bbox, double opacity) { - SPRadialGradient* ps = this->spradialgradient; - - SPRadialGradient *rg = SP_RADIALGRADIENT(ps); - SPGradient *gr = SP_GRADIENT(ps); - - gr->ensureVector(); - - Geom::Point focus(rg->fx.computed, rg->fy.computed); - Geom::Point center(rg->cx.computed, rg->cy.computed); - double radius = rg->r.computed; - double scale = 1.0; - double tolerance = cairo_get_tolerance(ct); - - // NOTE: SVG2 will allow the use of a focus circle which can - // have its center outside the first circle. - - // code below suggested by Cairo devs to overcome tolerance problems - // more: https://bugs.freedesktop.org/show_bug.cgi?id=40918 - - // Corrected for - // https://bugs.launchpad.net/inkscape/+bug/970355 - - Geom::Affine gs2user = gr->gradientTransform; - Geom::Scale gs2user_scale; - - if (gr->getUnits() == SP_GRADIENT_UNITS_OBJECTBOUNDINGBOX && bbox) { - Geom::Affine bbox2user(bbox->width(), 0, 0, bbox->height(), bbox->left(), bbox->top()); - gs2user *= bbox2user; - gs2user_scale = Geom::Scale( gs2user[0], gs2user[3] ); - } - - Geom::Point d = focus - center; - Geom::Point d_user = d * gs2user_scale; - Geom::Point r_user( radius, 0 ); - r_user *= gs2user_scale; - - if (d_user.length() + tolerance > r_user.length()) { - scale = r_user.length() / d_user.length(); - double dx = d_user.x(), dy = d_user.y(); - cairo_user_to_device_distance(ct, &dx, &dy); - if (!Geom::are_near(dx, 0, tolerance) || - !Geom::are_near(dy, 0, tolerance)) - { - scale *= 1.0 - 2.0 * tolerance / hypot(dx, dy); - } - } - - cairo_pattern_t *cp = cairo_pattern_create_radial( - scale * d.x() + center.x(), scale * d.y() + center.y(), 0, - center.x(), center.y(), radius); - - sp_gradient_pattern_common_setup(cp, gr, bbox, opacity); - - return cp; -} - -cairo_pattern_t* CMeshGradient::pattern_new(cairo_t *ct, -#if defined(MESH_DEBUG) || (CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 11, 4)) - Geom::OptRect const &bbox, - double opacity -#else - Geom::OptRect const & /*bbox*/, - double /*opacity*/ -#endif - ) -{ - using Geom::X; - using Geom::Y; - - SPMeshGradient* ps = this->spmeshgradient; - -#ifdef MESH_DEBUG - std::cout << "sp_meshgradient_create_pattern: (" << bbox->x0 << "," << bbox->y0 << ") (" << bbox->x1 << "," << bbox->y1 << ") " << opacity << std::endl; -#endif - //SPMeshGradient *mg = SP_MESHGRADIENT(ps); - SPGradient *gr = SP_GRADIENT(ps); - - gr->ensureArray(); - - cairo_pattern_t *cp = NULL; - -#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 11, 4) - SPMeshNodeArray* array = &(gr->array); - - cp = cairo_pattern_create_mesh(); - - for( unsigned int i = 0; i < array->patch_rows(); ++i ) { - for( unsigned int j = 0; j < array->patch_columns(); ++j ) { - - SPMeshPatchI patch( &(array->nodes), i, j ); - - cairo_mesh_pattern_begin_patch( cp ); - cairo_mesh_pattern_move_to( cp, patch.getPoint( 0, 0 )[X], patch.getPoint( 0, 0 )[Y] ); - - for( unsigned int k = 0; k < 4; ++k ) { -#ifdef DEBUG_MESH - std::cout << i << " " << j << " " - << patch.getPathType( k ) << " ("; - for( int p = 0; p < 4; ++p ) { - std::cout << patch.getPoint( k, p ); - } - std::cout << ") " - << patch.getColor( k ).toString() << std::endl; -#endif - - switch ( patch.getPathType( k ) ) { - case 'l': - case 'L': - case 'z': - case 'Z': - cairo_mesh_pattern_line_to( cp, - patch.getPoint( k, 3 )[X], - patch.getPoint( k, 3 )[Y] ); - break; - case 'c': - case 'C': - { - std::vector< Geom::Point > pts = patch.getPointsForSide( k ); - cairo_mesh_pattern_curve_to( cp, - pts[1][X], pts[1][Y], - pts[2][X], pts[2][Y], - pts[3][X], pts[3][Y] ); - break; - } - default: - // Shouldn't happen - std::cout << "sp_meshgradient_create_pattern: path error" << std::endl; - } - - if( patch.tensorIsSet(k) ) { - // Tensor point defined relative to corner. - Geom::Point t = patch.getTensorPoint(k); - cairo_mesh_pattern_set_control_point( cp, k, t[X], t[Y] ); - //std::cout << " sp_meshgradient_create_pattern: tensor " << k - // << " set to " << t << "." << std::endl; - } else { - // Geom::Point t = patch.coonsTensorPoint(k); - //std::cout << " sp_meshgradient_create_pattern: tensor " << k - // << " calculated as " << t << "." <gradientTransform; - if (gr->getUnits() == SP_GRADIENT_UNITS_OBJECTBOUNDINGBOX) { - Geom::Affine bbox2user(bbox->width(), 0, 0, bbox->height(), bbox->left(), bbox->top()); - gs2user *= bbox2user; - } - ink_cairo_pattern_set_matrix(cp, gs2user.inverse()); - -#else - static bool shown = false; - if( !shown ) { - std::cout << "sp_meshgradient_create_pattern: needs cairo >= 1.11.4, using " - << cairo_version_string() << std::endl; - shown = true; - } -#endif - -/* - cairo_pattern_t *cp = cairo_pattern_create_radial( - rg->fx.computed, rg->fy.computed, 0, - rg->cx.computed, rg->cy.computed, rg->r.computed); - sp_gradient_pattern_common_setup(cp, gr, bbox, opacity); -*/ - - return cp; -} - -cairo_pattern_t* CLinearGradient::pattern_new(cairo_t *ct, Geom::OptRect const &bbox, double opacity) { - SPLinearGradient* ps = this->splineargradient; - - SPLinearGradient *lg = SP_LINEARGRADIENT(ps); - SPGradient *gr = SP_GRADIENT(ps); - - gr->ensureVector(); - - cairo_pattern_t *cp = cairo_pattern_create_linear( - lg->x1.computed, lg->y1.computed, - lg->x2.computed, lg->y2.computed); - - sp_gradient_pattern_common_setup(cp, gr, bbox, opacity); - - return cp; -} - cairo_pattern_t * sp_gradient_create_preview_pattern(SPGradient *gr, double width) { @@ -2123,12 +1060,6 @@ sp_gradient_create_preview_pattern(SPGradient *gr, double width) return pat; } -void -sp_meshgradient_repr_write(SPMeshGradient *mg) -{ - mg->array.write( mg ); -} - /* Local Variables: mode:c++ -- cgit v1.2.3 From 27e2102f96a5554bcd5310ec11435d155773b279 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Sun, 7 Apr 2013 18:28:22 +0200 Subject: Merge Object and subclasses. Merging of SP- and C-classes complete. (bzr r11608.1.86) --- src/sp-gradient.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'src/sp-gradient.cpp') diff --git a/src/sp-gradient.cpp b/src/sp-gradient.cpp index 530e5be40..2cdf2198f 100644 --- a/src/sp-gradient.cpp +++ b/src/sp-gradient.cpp @@ -145,9 +145,6 @@ SPGradient::SPGradient() : SPPaintServer(), units(), state(2), vector() { - - this->cobject = this; - this->has_patches = 0; this->ref = new SPGradientReference(this); @@ -421,7 +418,9 @@ void SPGradient::remove_child(Inkscape::XML::Node *child) void SPGradient::modified(guint flags) { if (flags & SP_OBJECT_CHILD_MODIFIED_FLAG) { - if( this->get_type() != SP_GRADIENT_TYPE_MESH ) { + // CPPIFY + //if( this->get_type() != SP_GRADIENT_TYPE_MESH ) { + if (!SP_IS_MESHGRADIENT(this)) { this->invalidateVector(); } else { this->invalidateArray(); @@ -429,7 +428,9 @@ void SPGradient::modified(guint flags) } if (flags & SP_OBJECT_STYLE_MODIFIED_FLAG) { - if( this->get_type() != SP_GRADIENT_TYPE_MESH ) { + // CPPIFY + //if( this->get_type() != SP_GRADIENT_TYPE_MESH ) { + if (!SP_IS_MESHGRADIENT(this)) { this->ensureVector(); } else { this->ensureArray(); @@ -1043,8 +1044,9 @@ sp_gradient_create_preview_pattern(SPGradient *gr, double width) { cairo_pattern_t *pat = NULL; - if( gr->get_type() != SP_GRADIENT_TYPE_MESH ) { - + // CPPIFY + //if( gr->get_type() != SP_GRADIENT_TYPE_MESH ) { + if (!SP_IS_MESHGRADIENT(gr)) { gr->ensureVector(); pat = cairo_pattern_create_linear(0, 0, width, 0); -- cgit v1.2.3 From 127543bae3c0a76770e197c7058a783dea18fe3e Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Wed, 31 Jul 2013 23:23:10 +0200 Subject: Removed placement news / explicit destructor calls. (bzr r11608.1.113) --- src/sp-gradient.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/sp-gradient.cpp') diff --git a/src/sp-gradient.cpp b/src/sp-gradient.cpp index 2cdf2198f..adfff3609 100644 --- a/src/sp-gradient.cpp +++ b/src/sp-gradient.cpp @@ -170,7 +170,7 @@ SPGradient::SPGradient() : SPPaintServer(), units(), this->vector.built = false; this->vector.stops.clear(); - new (&this->modified_connection) sigc::connection(); + //new (&this->modified_connection) sigc::connection(); } SPGradient::~SPGradient() { @@ -227,7 +227,7 @@ void SPGradient::release() this->ref = NULL; } - this->modified_connection.~connection(); + //this->modified_connection.~connection(); SPPaintServer::release(); } -- cgit v1.2.3