/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svgio.hxx" #include #include #include #include #include ////////////////////////////////////////////////////////////////////////////// namespace svgio { namespace svgreader { const SvgStyleAttributes* SvgNode::getSvgStyleAttributes() const { return 0; } SvgNode::SvgNode( SVGToken aType, SvgDocument& rDocument, SvgNode* pParent) : maType(aType), mrDocument(rDocument), mpParent(pParent), mpAlternativeParent(0), maChildren(), mpId(0), mpClass(0), maXmlSpace(XmlSpace_notset) { OSL_ENSURE(SVGTokenUnknown != maType, "SvgNode with unknown type created (!)"); if(pParent) { pParent->maChildren.push_back(this); } else { #ifdef DBG_UTIL if(SVGTokenSvg != getType()) { OSL_ENSURE(false, "No parent for this node (!)"); } #endif } } SvgNode::~SvgNode() { while(maChildren.size()) { delete maChildren[maChildren.size() - 1]; maChildren.pop_back(); } if(mpId) delete mpId; if(mpClass) delete mpClass; } void SvgNode::parseAttributes(const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList >& xAttribs) { const sal_uInt32 nAttributes(xAttribs->getLength()); for(sal_uInt32 a(0); a < nAttributes; a++) { const ::rtl::OUString aTokenName(xAttribs->getNameByIndex(a)); parseAttribute(aTokenName, StrToSVGToken(aTokenName), xAttribs->getValueByIndex(a)); } } void SvgNode::parseAttribute(const rtl::OUString& rTokenName, SVGToken aSVGToken, const rtl::OUString& aContent) { switch(aSVGToken) { case SVGTokenId: { if(aContent.getLength()) { setId(&aContent); } break; } case SVGTokenClass: { if(aContent.getLength()) { setClass(&aContent); } break; } case SVGTokenXmlSpace: { if(aContent.getLength()) { static rtl::OUString aStrDefault(rtl::OUString::createFromAscii("default")); static rtl::OUString aStrPreserve(rtl::OUString::createFromAscii("preserve")); if(aContent.match(aStrDefault)) { setXmlSpace(XmlSpace_default); } else if(aContent.match(aStrPreserve)) { setXmlSpace(XmlSpace_preserve); } } break; } } } void SvgNode::decomposeSvgNode(drawinglayer::primitive2d::Primitive2DSequence& rTarget, bool bReferenced) const { if(!bReferenced) { if(SVGTokenDefs == getType() || SVGTokenSymbol == getType() || SVGTokenClipPathNode == getType() || SVGTokenMask == getType() || SVGTokenMarker == getType() || SVGTokenPattern == getType()) { // do not decompose defs or symbol nodes (these hold only style-like // objects which may be used by referencing them) except when doing // so controlled referenced // also do not decompose ClipPaths and Masks. These should be embedded // in a defs node (which gets not decomposed by itself), but you never // know // also not directly used are Markers and Patterns, only indirecty used // by reference return; } } const SvgNodeVector& rChildren = getChildren(); if(!rChildren.empty()) { const sal_uInt32 nCount(rChildren.size()); for(sal_uInt32 a(0); a < nCount; a++) { SvgNode* pCandidate = rChildren[a]; if(pCandidate) { drawinglayer::primitive2d::Primitive2DSequence aNewTarget; pCandidate->decomposeSvgNode(aNewTarget, bReferenced); if(aNewTarget.hasElements()) { drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(rTarget, aNewTarget); } } else { OSL_ENSURE(false, "Null-Pointer in child node list (!)"); } } } } const basegfx::B2DRange* SvgNode::getCurrentViewPort() const { if(getParent()) { return getParent()->getCurrentViewPort(); } else { return 0; } } double SvgNode::getCurrentFontSize() const { if(getSvgStyleAttributes()) { return getSvgStyleAttributes()->getFontSize().solve(*this, xcoordinate); } else if(getParent()) { return getParent()->getCurrentFontSize(); } else { return 0.0; } } double SvgNode::getCurrentXHeight() const { if(getSvgStyleAttributes()) { // for XHeight, use FontSize currently return getSvgStyleAttributes()->getFontSize().solve(*this, ycoordinate); } else if(getParent()) { return getParent()->getCurrentXHeight(); } else { return 0.0; } } void SvgNode::setId(const rtl::OUString* pfId) { if(mpId) { mrDocument.removeSvgNodeFromMapper(*mpId); delete mpId; mpId = 0; } if(pfId) { mpId = new rtl::OUString(*pfId); mrDocument.addSvgNodeToMapper(*mpId, *this); } } void SvgNode::setClass(const rtl::OUString* pfClass) { if(mpClass) { mrDocument.removeSvgNodeFromMapper(*mpClass); delete mpClass; mpClass = 0; } if(pfClass) { mpClass = new rtl::OUString(*pfClass); mrDocument.addSvgNodeToMapper(*mpClass, *this); } } XmlSpace SvgNode::getXmlSpace() const { if(maXmlSpace != XmlSpace_notset) { return maXmlSpace; } if(getParent()) { return getParent()->getXmlSpace(); } // default is XmlSpace_default return XmlSpace_default; } } // end of namespace svgreader } // end of namespace svgio ////////////////////////////////////////////////////////////////////////////// // eof