1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove 23*b1cdbd2cSJim Jagielski #include "precompiled_svgio.hxx" 24*b1cdbd2cSJim Jagielski 25*b1cdbd2cSJim Jagielski #include <svgio/svgreader/svgusenode.hxx> 26*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/transformprimitive2d.hxx> 27*b1cdbd2cSJim Jagielski #include <svgio/svgreader/svgdocument.hxx> 28*b1cdbd2cSJim Jagielski 29*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////// 30*b1cdbd2cSJim Jagielski 31*b1cdbd2cSJim Jagielski namespace svgio 32*b1cdbd2cSJim Jagielski { 33*b1cdbd2cSJim Jagielski namespace svgreader 34*b1cdbd2cSJim Jagielski { SvgUseNode(SvgDocument & rDocument,SvgNode * pParent)35*b1cdbd2cSJim Jagielski SvgUseNode::SvgUseNode( 36*b1cdbd2cSJim Jagielski SvgDocument& rDocument, 37*b1cdbd2cSJim Jagielski SvgNode* pParent) 38*b1cdbd2cSJim Jagielski : SvgNode(SVGTokenG, rDocument, pParent), 39*b1cdbd2cSJim Jagielski maSvgStyleAttributes(*this), 40*b1cdbd2cSJim Jagielski mpaTransform(0), 41*b1cdbd2cSJim Jagielski maX(), 42*b1cdbd2cSJim Jagielski maY(), 43*b1cdbd2cSJim Jagielski maWidth(), 44*b1cdbd2cSJim Jagielski maHeight(), 45*b1cdbd2cSJim Jagielski maXLink() 46*b1cdbd2cSJim Jagielski { 47*b1cdbd2cSJim Jagielski } 48*b1cdbd2cSJim Jagielski ~SvgUseNode()49*b1cdbd2cSJim Jagielski SvgUseNode::~SvgUseNode() 50*b1cdbd2cSJim Jagielski { 51*b1cdbd2cSJim Jagielski if(mpaTransform) delete mpaTransform; 52*b1cdbd2cSJim Jagielski } 53*b1cdbd2cSJim Jagielski getSvgStyleAttributes() const54*b1cdbd2cSJim Jagielski const SvgStyleAttributes* SvgUseNode::getSvgStyleAttributes() const 55*b1cdbd2cSJim Jagielski { 56*b1cdbd2cSJim Jagielski static rtl::OUString aClassStr(rtl::OUString::createFromAscii("use")); 57*b1cdbd2cSJim Jagielski 58*b1cdbd2cSJim Jagielski return checkForCssStyle(aClassStr, maSvgStyleAttributes); 59*b1cdbd2cSJim Jagielski } 60*b1cdbd2cSJim Jagielski parseAttribute(const rtl::OUString & rTokenName,SVGToken aSVGToken,const rtl::OUString & aContent)61*b1cdbd2cSJim Jagielski void SvgUseNode::parseAttribute(const rtl::OUString& rTokenName, SVGToken aSVGToken, const rtl::OUString& aContent) 62*b1cdbd2cSJim Jagielski { 63*b1cdbd2cSJim Jagielski // call parent 64*b1cdbd2cSJim Jagielski SvgNode::parseAttribute(rTokenName, aSVGToken, aContent); 65*b1cdbd2cSJim Jagielski 66*b1cdbd2cSJim Jagielski // read style attributes 67*b1cdbd2cSJim Jagielski maSvgStyleAttributes.parseStyleAttribute(rTokenName, aSVGToken, aContent); 68*b1cdbd2cSJim Jagielski 69*b1cdbd2cSJim Jagielski // parse own 70*b1cdbd2cSJim Jagielski switch(aSVGToken) 71*b1cdbd2cSJim Jagielski { 72*b1cdbd2cSJim Jagielski case SVGTokenStyle: 73*b1cdbd2cSJim Jagielski { 74*b1cdbd2cSJim Jagielski maSvgStyleAttributes.readStyle(aContent); 75*b1cdbd2cSJim Jagielski break; 76*b1cdbd2cSJim Jagielski } 77*b1cdbd2cSJim Jagielski case SVGTokenTransform: 78*b1cdbd2cSJim Jagielski { 79*b1cdbd2cSJim Jagielski const basegfx::B2DHomMatrix aMatrix(readTransform(aContent, *this)); 80*b1cdbd2cSJim Jagielski 81*b1cdbd2cSJim Jagielski if(!aMatrix.isIdentity()) 82*b1cdbd2cSJim Jagielski { 83*b1cdbd2cSJim Jagielski setTransform(&aMatrix); 84*b1cdbd2cSJim Jagielski } 85*b1cdbd2cSJim Jagielski break; 86*b1cdbd2cSJim Jagielski } 87*b1cdbd2cSJim Jagielski case SVGTokenX: 88*b1cdbd2cSJim Jagielski { 89*b1cdbd2cSJim Jagielski SvgNumber aNum; 90*b1cdbd2cSJim Jagielski 91*b1cdbd2cSJim Jagielski if(readSingleNumber(aContent, aNum)) 92*b1cdbd2cSJim Jagielski { 93*b1cdbd2cSJim Jagielski setX(aNum); 94*b1cdbd2cSJim Jagielski } 95*b1cdbd2cSJim Jagielski break; 96*b1cdbd2cSJim Jagielski } 97*b1cdbd2cSJim Jagielski case SVGTokenY: 98*b1cdbd2cSJim Jagielski { 99*b1cdbd2cSJim Jagielski SvgNumber aNum; 100*b1cdbd2cSJim Jagielski 101*b1cdbd2cSJim Jagielski if(readSingleNumber(aContent, aNum)) 102*b1cdbd2cSJim Jagielski { 103*b1cdbd2cSJim Jagielski setY(aNum); 104*b1cdbd2cSJim Jagielski } 105*b1cdbd2cSJim Jagielski break; 106*b1cdbd2cSJim Jagielski } 107*b1cdbd2cSJim Jagielski case SVGTokenWidth: 108*b1cdbd2cSJim Jagielski { 109*b1cdbd2cSJim Jagielski SvgNumber aNum; 110*b1cdbd2cSJim Jagielski 111*b1cdbd2cSJim Jagielski if(readSingleNumber(aContent, aNum)) 112*b1cdbd2cSJim Jagielski { 113*b1cdbd2cSJim Jagielski if(aNum.isPositive()) 114*b1cdbd2cSJim Jagielski { 115*b1cdbd2cSJim Jagielski setWidth(aNum); 116*b1cdbd2cSJim Jagielski } 117*b1cdbd2cSJim Jagielski } 118*b1cdbd2cSJim Jagielski break; 119*b1cdbd2cSJim Jagielski } 120*b1cdbd2cSJim Jagielski case SVGTokenHeight: 121*b1cdbd2cSJim Jagielski { 122*b1cdbd2cSJim Jagielski SvgNumber aNum; 123*b1cdbd2cSJim Jagielski 124*b1cdbd2cSJim Jagielski if(readSingleNumber(aContent, aNum)) 125*b1cdbd2cSJim Jagielski { 126*b1cdbd2cSJim Jagielski if(aNum.isPositive()) 127*b1cdbd2cSJim Jagielski { 128*b1cdbd2cSJim Jagielski setHeight(aNum); 129*b1cdbd2cSJim Jagielski } 130*b1cdbd2cSJim Jagielski } 131*b1cdbd2cSJim Jagielski } 132*b1cdbd2cSJim Jagielski case SVGTokenXlinkHref: 133*b1cdbd2cSJim Jagielski { 134*b1cdbd2cSJim Jagielski const sal_Int32 nLen(aContent.getLength()); 135*b1cdbd2cSJim Jagielski 136*b1cdbd2cSJim Jagielski if(nLen && sal_Unicode('#') == aContent[0]) 137*b1cdbd2cSJim Jagielski { 138*b1cdbd2cSJim Jagielski maXLink = aContent.copy(1); 139*b1cdbd2cSJim Jagielski } 140*b1cdbd2cSJim Jagielski break; 141*b1cdbd2cSJim Jagielski } 142*b1cdbd2cSJim Jagielski default: 143*b1cdbd2cSJim Jagielski { 144*b1cdbd2cSJim Jagielski break; 145*b1cdbd2cSJim Jagielski } 146*b1cdbd2cSJim Jagielski } 147*b1cdbd2cSJim Jagielski } 148*b1cdbd2cSJim Jagielski decomposeSvgNode(drawinglayer::primitive2d::Primitive2DSequence & rTarget,bool) const149*b1cdbd2cSJim Jagielski void SvgUseNode::decomposeSvgNode(drawinglayer::primitive2d::Primitive2DSequence& rTarget, bool /*bReferenced*/) const 150*b1cdbd2cSJim Jagielski { 151*b1cdbd2cSJim Jagielski // try to access link to content 152*b1cdbd2cSJim Jagielski const SvgNode* mpXLink = getDocument().findSvgNodeById(maXLink); 153*b1cdbd2cSJim Jagielski 154*b1cdbd2cSJim Jagielski if(mpXLink && Display_none != mpXLink->getDisplay()) 155*b1cdbd2cSJim Jagielski { 156*b1cdbd2cSJim Jagielski // decompose childs 157*b1cdbd2cSJim Jagielski drawinglayer::primitive2d::Primitive2DSequence aNewTarget; 158*b1cdbd2cSJim Jagielski 159*b1cdbd2cSJim Jagielski // todo: in case mpXLink is a SVGTokenSvg or SVGTokenSymbol the 160*b1cdbd2cSJim Jagielski // SVG docs want the getWidth() and getHeight() from this node 161*b1cdbd2cSJim Jagielski // to be valid for the subtree. 162*b1cdbd2cSJim Jagielski const_cast< SvgNode* >(mpXLink)->setAlternativeParent(this); 163*b1cdbd2cSJim Jagielski mpXLink->decomposeSvgNode(aNewTarget, true); 164*b1cdbd2cSJim Jagielski const_cast< SvgNode* >(mpXLink)->setAlternativeParent(0); 165*b1cdbd2cSJim Jagielski 166*b1cdbd2cSJim Jagielski if(aNewTarget.hasElements()) 167*b1cdbd2cSJim Jagielski { 168*b1cdbd2cSJim Jagielski basegfx::B2DHomMatrix aTransform; 169*b1cdbd2cSJim Jagielski 170*b1cdbd2cSJim Jagielski if(getX().isSet() || getY().isSet()) 171*b1cdbd2cSJim Jagielski { 172*b1cdbd2cSJim Jagielski aTransform.translate( 173*b1cdbd2cSJim Jagielski getX().solve(*this, xcoordinate), 174*b1cdbd2cSJim Jagielski getY().solve(*this, ycoordinate)); 175*b1cdbd2cSJim Jagielski } 176*b1cdbd2cSJim Jagielski 177*b1cdbd2cSJim Jagielski if(getTransform()) 178*b1cdbd2cSJim Jagielski { 179*b1cdbd2cSJim Jagielski aTransform = *getTransform() * aTransform; 180*b1cdbd2cSJim Jagielski } 181*b1cdbd2cSJim Jagielski 182*b1cdbd2cSJim Jagielski if(!aTransform.isIdentity()) 183*b1cdbd2cSJim Jagielski { 184*b1cdbd2cSJim Jagielski const drawinglayer::primitive2d::Primitive2DReference xRef( 185*b1cdbd2cSJim Jagielski new drawinglayer::primitive2d::TransformPrimitive2D( 186*b1cdbd2cSJim Jagielski aTransform, 187*b1cdbd2cSJim Jagielski aNewTarget)); 188*b1cdbd2cSJim Jagielski 189*b1cdbd2cSJim Jagielski drawinglayer::primitive2d::appendPrimitive2DReferenceToPrimitive2DSequence(rTarget, xRef); 190*b1cdbd2cSJim Jagielski } 191*b1cdbd2cSJim Jagielski else 192*b1cdbd2cSJim Jagielski { 193*b1cdbd2cSJim Jagielski drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(rTarget, aNewTarget); 194*b1cdbd2cSJim Jagielski } 195*b1cdbd2cSJim Jagielski } 196*b1cdbd2cSJim Jagielski } 197*b1cdbd2cSJim Jagielski } 198*b1cdbd2cSJim Jagielski 199*b1cdbd2cSJim Jagielski } // end of namespace svgreader 200*b1cdbd2cSJim Jagielski } // end of namespace svgio 201*b1cdbd2cSJim Jagielski 202*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////// 203*b1cdbd2cSJim Jagielski // eof 204