X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsp-gradient.cpp;h=1b8f9a11137a0e1e311200c2c00ca7ad97a81145;hb=c7cf14ac71346f76ae219ce67fb88c1bd34832e2;hp=34912d1dafc11b0dccb1f9f78d0c7b93161327d7;hpb=046ed087d5e6545bf509deb9dbf06e21f858bfbd;p=inkscape.git diff --git a/src/sp-gradient.cpp b/src/sp-gradient.cpp index 34912d1da..1b8f9a111 100644 --- a/src/sp-gradient.cpp +++ b/src/sp-gradient.cpp @@ -6,6 +6,8 @@ * Lauris Kaplinski * bulia byak * Jasper van de Gronde + * Jon A. Cruz + * Abhishek Sharma * * Copyright (C) 1999-2002 Lauris Kaplinski * Copyright (C) 2000-2001 Ximian, Inc. @@ -45,6 +47,7 @@ #include "streq.h" #include "uri.h" #include "xml/repr.h" +#include "style.h" #define SP_MACROS_SILENT #include "macros.h" @@ -141,10 +144,10 @@ static void sp_stop_build(SPObject *object, SPDocument *document, Inkscape::XML: if (((SPObjectClass *) stop_parent_class)->build) (* ((SPObjectClass *) stop_parent_class)->build)(object, document, repr); - sp_object_read_attr(object, "offset"); - sp_object_read_attr(object, "stop-color"); - sp_object_read_attr(object, "stop-opacity"); - sp_object_read_attr(object, "style"); + object->readAttr( "offset" ); + object->readAttr( "stop-color" ); + object->readAttr( "stop-opacity" ); + object->readAttr( "style" ); } /** @@ -168,17 +171,15 @@ sp_stop_set(SPObject *object, unsigned key, gchar const *value) * stop-color and stop-opacity properties. */ { - gchar const *p = sp_object_get_style_property(object, "stop-color", "black"); + gchar const *p = object->getStyleProperty( "stop-color", "black"); if (streq(p, "currentColor")) { stop->currentColor = true; } else { - // TODO need to properly read full color, including icc - guint32 const color = sp_svg_read_color(p, 0); - stop->specified_color.set( color ); + stop->specified_color = SPStop::readStopColor( p ); } } { - gchar const *p = sp_object_get_style_property(object, "stop-opacity", "1"); + gchar const *p = object->getStyleProperty( "stop-opacity", "1"); gdouble opacity = sp_svg_read_percentage(p, stop->opacity); stop->opacity = opacity; } @@ -187,13 +188,12 @@ sp_stop_set(SPObject *object, unsigned key, gchar const *value) } case SP_PROP_STOP_COLOR: { { - gchar const *p = sp_object_get_style_property(object, "stop-color", "black"); + gchar const *p = object->getStyleProperty( "stop-color", "black"); if (streq(p, "currentColor")) { stop->currentColor = true; } else { stop->currentColor = false; - guint32 const color = sp_svg_read_color(p, 0); - stop->specified_color.set( color ); + stop->specified_color = SPStop::readStopColor( p ); } } object->requestModified(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG); @@ -201,7 +201,7 @@ sp_stop_set(SPObject *object, unsigned key, gchar const *value) } case SP_PROP_STOP_OPACITY: { { - gchar const *p = sp_object_get_style_property(object, "stop-opacity", "1"); + gchar const *p = object->getStyleProperty( "stop-opacity", "1"); gdouble opacity = sp_svg_read_percentage(p, stop->opacity); stop->opacity = opacity; } @@ -233,11 +233,12 @@ sp_stop_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML: repr = xml_doc->createElement("svg:stop"); } - guint32 specifiedcolor = stop->specified_color.toRGBA32( 255 ); + Glib::ustring colorStr = stop->specified_color.toString(); gfloat opacity = stop->opacity; - if (((SPObjectClass *) stop_parent_class)->write) + if (((SPObjectClass *) stop_parent_class)->write) { (* ((SPObjectClass *) stop_parent_class)->write)(object, 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 @@ -248,9 +249,7 @@ sp_stop_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML: if (stop->currentColor) { os << "currentColor"; } else { - gchar c[64]; - sp_svg_write_color(c, sizeof(c), specifiedcolor); - os << c; + os << colorStr; } os << ";stop-opacity:" << opacity; repr->setAttribute("style", os.str().c_str()); @@ -294,7 +293,7 @@ void SPGradient::setSwatch( bool swatch ) if ( swatch != isSwatch() ) { this->swatch = swatch; // to make isSolid() work, this happens first gchar const* paintVal = swatch ? (isSolid() ? "solid" : "gradient") : 0; - sp_object_setAttribute( this, "osb:paint", paintVal, 0 ); + setAttribute( "osb:paint", paintVal, 0 ); requestModified( SP_OBJECT_MODIFIED_FLAG ); } @@ -311,7 +310,7 @@ sp_stop_get_rgba32(SPStop const *const stop) * value depends on user agent, and don't give any further restrictions that I can * see.) */ if (stop->currentColor) { - char const *str = sp_object_get_style_property(stop, "color", NULL); + char const *str = stop->getStyleProperty( "color", NULL); if (str) { rgb0 = sp_svg_read_color(str, rgb0); } @@ -324,29 +323,6 @@ sp_stop_get_rgba32(SPStop const *const stop) } } -/** - * Return stop's color as SPColor. - */ -static SPColor -sp_stop_get_color(SPStop const *const stop) -{ - if (stop->currentColor) { - char const *str = sp_object_get_style_property(stop, "color", NULL); - guint32 const dfl = 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.) */ - guint32 color = dfl; - if (str) { - color = sp_svg_read_color(str, dfl); - } - SPColor ret( color ); - return ret; - } else { - return stop->specified_color; - } -} - /* * Gradient */ @@ -443,21 +419,21 @@ void SPGradientImpl::build(SPObject *object, SPDocument *document, Inkscape::XML (* ((SPObjectClass *) gradient_parent_class)->build)(object, document, repr); } - for ( SPObject *ochild = sp_object_first_child(object); ochild; ochild = ochild->next ) { + for ( SPObject *ochild = object->firstChild() ; ochild ; ochild = ochild->getNext() ) { if (SP_IS_STOP(ochild)) { gradient->has_stops = TRUE; break; } } - sp_object_read_attr(object, "gradientUnits"); - sp_object_read_attr(object, "gradientTransform"); - sp_object_read_attr(object, "spreadMethod"); - sp_object_read_attr(object, "xlink:href"); - sp_object_read_attr(object, "osb:paint"); + object->readAttr( "gradientUnits" ); + object->readAttr( "gradientTransform" ); + object->readAttr( "spreadMethod" ); + object->readAttr( "xlink:href" ); + object->readAttr( "osb:paint" ); - /* Register ourselves */ - sp_document_add_resource(document, "gradient", object); + // Register ourselves + document->addResource("gradient", object); } /** @@ -468,12 +444,12 @@ void SPGradientImpl::release(SPObject *object) SPGradient *gradient = (SPGradient *) object; #ifdef SP_GRADIENT_VERBOSE - g_print("Releasing gradient %s\n", SP_OBJECT_ID(object)); + g_print("Releasing gradient %s\n", object->getId()); #endif if (SP_OBJECT_DOCUMENT(object)) { /* Unregister ourselves */ - sp_document_remove_resource(SP_OBJECT_DOCUMENT(object), "gradient", SP_OBJECT(object)); + SP_OBJECT_DOCUMENT(object)->removeResource("gradient", SP_OBJECT(object)); } if (gradient->ref) { @@ -567,7 +543,7 @@ void SPGradientImpl::setGradientAttr(SPObject *object, unsigned key, gchar const // Might need to flip solid/gradient Glib::ustring paintVal = ( gr->hasStops() && (gr->getStopCount() == 0) ) ? "solid" : "gradient"; if ( paintVal != value ) { - sp_object_setAttribute( gr, "osb:paint", paintVal.c_str(), 0 ); + gr->setAttribute( "osb:paint", paintVal.c_str(), 0 ); modified = true; } } @@ -626,13 +602,13 @@ void SPGradientImpl::childAdded(SPObject *object, Inkscape::XML::Node *child, In (* ((SPObjectClass *) gradient_parent_class)->child_added)(object, child, ref); } - SPObject *ochild = sp_object_get_child_by_repr(object, child); + SPObject *ochild = object->get_child_by_repr(child); if ( ochild && SP_IS_STOP(ochild) ) { gr->has_stops = TRUE; if ( gr->getStopCount() > 0 ) { - gchar const * attr = gr->repr->attribute("osb:paint"); + gchar const * attr = gr->getAttribute("osb:paint"); if ( attr && strcmp(attr, "gradient") ) { - sp_object_setAttribute( gr, "osb:paint", "gradient", 0 ); + gr->setAttribute( "osb:paint", "gradient", 0 ); } } } @@ -655,8 +631,7 @@ void SPGradientImpl::removeChild(SPObject *object, Inkscape::XML::Node *child) } gr->has_stops = FALSE; - SPObject *ochild; - for ( ochild = sp_object_first_child(object) ; ochild ; ochild = SP_OBJECT_NEXT(ochild) ) { + for ( SPObject *ochild = object->firstChild() ; ochild ; ochild = ochild->getNext() ) { if (SP_IS_STOP(ochild)) { gr->has_stops = TRUE; break; @@ -664,10 +639,9 @@ void SPGradientImpl::removeChild(SPObject *object, Inkscape::XML::Node *child) } if ( gr->getStopCount() == 0 ) { - g_message("Check on remove"); - gchar const * attr = gr->repr->attribute("osb:paint"); + gchar const * attr = gr->getAttribute("osb:paint"); if ( attr && strcmp(attr, "solid") ) { - sp_object_setAttribute( gr, "osb:paint", "solid", 0 ); + gr->setAttribute( "osb:paint", "solid", 0 ); } } @@ -695,7 +669,7 @@ void SPGradientImpl::modified(SPObject *object, guint flags) // FIXME: climb up the ladder of hrefs GSList *l = NULL; - for (SPObject *child = sp_object_first_child(object) ; child != NULL; child = SP_OBJECT_NEXT(child) ) { + for (SPObject *child = object->firstChild() ; child; child = child->getNext() ) { g_object_ref(G_OBJECT(child)); l = g_slist_prepend(l, child); } @@ -713,7 +687,7 @@ void SPGradientImpl::modified(SPObject *object, guint flags) SPStop* SPGradient::getFirstStop() { SPStop* first = 0; - for (SPObject *ochild = sp_object_first_child(this); ochild && !first; ochild = SP_OBJECT_NEXT(ochild)) { + for (SPObject *ochild = firstChild(); ochild && !first; ochild = ochild->getNext()) { if (SP_IS_STOP(ochild)) { first = SP_STOP(ochild); } @@ -745,7 +719,7 @@ Inkscape::XML::Node *SPGradientImpl::write(SPObject *object, Inkscape::XML::Docu if (flags & SP_OBJECT_WRITE_BUILD) { GSList *l = NULL; - for (SPObject *child = sp_object_first_child(object); child; child = SP_OBJECT_NEXT(child)) { + for (SPObject *child = object->firstChild(); child; child = child->getNext()) { Inkscape::XML::Node *crepr = child->updateRepr(xml_doc, NULL, flags); if (crepr) { l = g_slist_prepend(l, crepr); @@ -988,7 +962,7 @@ sp_gradient_repr_write_vector(SPGradient *gr) g_return_if_fail(gr != NULL); g_return_if_fail(SP_IS_GRADIENT(gr)); - Inkscape::XML::Document *xml_doc = sp_document_repr_doc(SP_OBJECT_DOCUMENT(gr)); + Inkscape::XML::Document *xml_doc = SP_OBJECT_DOCUMENT(gr)->getReprDoc(); Inkscape::XML::Node *repr = SP_OBJECT_REPR(gr); /* We have to be careful, as vector may be our own, so construct repr list at first */ @@ -1000,9 +974,7 @@ sp_gradient_repr_write_vector(SPGradient *gr) sp_repr_set_css_double(child, "offset", gr->vector.stops[i].offset); /* strictly speaking, offset an SVG rather than a CSS one, but exponents make no * sense for offset proportions. */ - gchar c[64]; - sp_svg_write_color(c, sizeof(c), gr->vector.stops[i].color.toRGBA32( 0x00 )); - os << "stop-color:" << c << ";stop-opacity:" << gr->vector.stops[i].opacity; + os << "stop-color:" << gr->vector.stops[i].color.toString() << ";stop-opacity:" << gr->vector.stops[i].opacity; child->setAttribute("style", os.str().c_str()); /* Order will be reversed here */ cl = g_slist_prepend(cl, child); @@ -1052,9 +1024,7 @@ bool SPGradient::invalidateVector() void SPGradient::rebuildVector() { gint len = 0; - for ( SPObject *child = sp_object_first_child(SP_OBJECT(this)) ; - child != NULL ; - child = SP_OBJECT_NEXT(child) ) { + for ( SPObject *child = firstChild() ; child ; child = child->getNext() ) { if (SP_IS_STOP(child)) { len ++; } @@ -1076,9 +1046,7 @@ void SPGradient::rebuildVector() } } - for (SPObject *child = sp_object_first_child(SP_OBJECT(this)) ; - child != NULL; - child = SP_OBJECT_NEXT(child) ) { + for ( SPObject *child = firstChild(); child; child = child->getNext() ) { if (SP_IS_STOP(child)) { SPStop *stop = SP_STOP(child); @@ -1099,7 +1067,7 @@ void SPGradient::rebuildVector() // down to 100%." gstop.offset = CLAMP(gstop.offset, 0, 1); - gstop.color = sp_stop_get_color(stop); + gstop.color = stop->getEffectiveColor(); gstop.opacity = stop->opacity; vector.stops.push_back(gstop); @@ -1559,10 +1527,10 @@ static void sp_lineargradient_build(SPObject *object, if (((SPObjectClass *) lg_parent_class)->build) (* ((SPObjectClass *) lg_parent_class)->build)(object, document, repr); - sp_object_read_attr(object, "x1"); - sp_object_read_attr(object, "y1"); - sp_object_read_attr(object, "x2"); - sp_object_read_attr(object, "y2"); + object->readAttr( "x1" ); + object->readAttr( "y1" ); + object->readAttr( "x2" ); + object->readAttr( "y2" ); } /** @@ -1836,11 +1804,11 @@ sp_radialgradient_build(SPObject *object, SPDocument *document, Inkscape::XML::N if (((SPObjectClass *) rg_parent_class)->build) (* ((SPObjectClass *) rg_parent_class)->build)(object, document, repr); - sp_object_read_attr(object, "cx"); - sp_object_read_attr(object, "cy"); - sp_object_read_attr(object, "r"); - sp_object_read_attr(object, "fx"); - sp_object_read_attr(object, "fy"); + object->readAttr( "cx" ); + object->readAttr( "cy" ); + object->readAttr( "r" ); + object->readAttr( "fx" ); + object->readAttr( "fy" ); } /** @@ -2028,4 +1996,4 @@ sp_rg_fill(SPPainter *painter, NRPixBlock *pb) fill-column:99 End: */ -// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 : +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :