1ddde725dSArmin Le Grand /************************************************************** 2ddde725dSArmin Le Grand * 3ddde725dSArmin Le Grand * Licensed to the Apache Software Foundation (ASF) under one 4ddde725dSArmin Le Grand * or more contributor license agreements. See the NOTICE file 5ddde725dSArmin Le Grand * distributed with this work for additional information 6ddde725dSArmin Le Grand * regarding copyright ownership. The ASF licenses this file 7ddde725dSArmin Le Grand * to you under the Apache License, Version 2.0 (the 8ddde725dSArmin Le Grand * "License"); you may not use this file except in compliance 9ddde725dSArmin Le Grand * with the License. You may obtain a copy of the License at 10ddde725dSArmin Le Grand * 11ddde725dSArmin Le Grand * http://www.apache.org/licenses/LICENSE-2.0 12ddde725dSArmin Le Grand * 13ddde725dSArmin Le Grand * Unless required by applicable law or agreed to in writing, 14ddde725dSArmin Le Grand * software distributed under the License is distributed on an 15ddde725dSArmin Le Grand * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16ddde725dSArmin Le Grand * KIND, either express or implied. See the License for the 17ddde725dSArmin Le Grand * specific language governing permissions and limitations 18ddde725dSArmin Le Grand * under the License. 19ddde725dSArmin Le Grand * 20ddde725dSArmin Le Grand *************************************************************/ 21ddde725dSArmin Le Grand 22ddde725dSArmin Le Grand // MARKER(update_precomp.py): autogen include statement, do not remove 23ddde725dSArmin Le Grand #include "precompiled_svgio.hxx" 24ddde725dSArmin Le Grand 25ddde725dSArmin Le Grand #include <svgio/svgreader/svgrectnode.hxx> 26ddde725dSArmin Le Grand #include <basegfx/polygon/b2dpolygon.hxx> 27ddde725dSArmin Le Grand #include <basegfx/polygon/b2dpolygontools.hxx> 28ddde725dSArmin Le Grand 29ddde725dSArmin Le Grand ////////////////////////////////////////////////////////////////////////////// 30ddde725dSArmin Le Grand 31ddde725dSArmin Le Grand namespace svgio 32ddde725dSArmin Le Grand { 33ddde725dSArmin Le Grand namespace svgreader 34ddde725dSArmin Le Grand { 35ddde725dSArmin Le Grand SvgRectNode::SvgRectNode( 36ddde725dSArmin Le Grand SvgDocument& rDocument, 37ddde725dSArmin Le Grand SvgNode* pParent) 38ddde725dSArmin Le Grand : SvgNode(SVGTokenRect, rDocument, pParent), 39ddde725dSArmin Le Grand maSvgStyleAttributes(*this), 40ddde725dSArmin Le Grand maX(0), 41ddde725dSArmin Le Grand maY(0), 42ddde725dSArmin Le Grand maWidth(0), 43ddde725dSArmin Le Grand maHeight(0), 44ddde725dSArmin Le Grand maRx(0), 45ddde725dSArmin Le Grand maRy(0), 46ddde725dSArmin Le Grand mpaTransform(0) 47ddde725dSArmin Le Grand { 48ddde725dSArmin Le Grand } 49ddde725dSArmin Le Grand 50ddde725dSArmin Le Grand SvgRectNode::~SvgRectNode() 51ddde725dSArmin Le Grand { 52ddde725dSArmin Le Grand if(mpaTransform) delete mpaTransform; 53ddde725dSArmin Le Grand } 54ddde725dSArmin Le Grand 55ddde725dSArmin Le Grand const SvgStyleAttributes* SvgRectNode::getSvgStyleAttributes() const 56ddde725dSArmin Le Grand { 57ddde725dSArmin Le Grand static rtl::OUString aClassStr(rtl::OUString::createFromAscii("rect")); 58ddde725dSArmin Le Grand maSvgStyleAttributes.checkForCssStyle(aClassStr); 59ddde725dSArmin Le Grand 60ddde725dSArmin Le Grand return &maSvgStyleAttributes; 61ddde725dSArmin Le Grand } 62ddde725dSArmin Le Grand 63ddde725dSArmin Le Grand void SvgRectNode::parseAttribute(const rtl::OUString& rTokenName, SVGToken aSVGToken, const rtl::OUString& aContent) 64ddde725dSArmin Le Grand { 65ddde725dSArmin Le Grand // call parent 66ddde725dSArmin Le Grand SvgNode::parseAttribute(rTokenName, aSVGToken, aContent); 67ddde725dSArmin Le Grand 68ddde725dSArmin Le Grand // read style attributes 69ddde725dSArmin Le Grand maSvgStyleAttributes.parseStyleAttribute(rTokenName, aSVGToken, aContent); 70ddde725dSArmin Le Grand 71ddde725dSArmin Le Grand // parse own 72ddde725dSArmin Le Grand switch(aSVGToken) 73ddde725dSArmin Le Grand { 74ddde725dSArmin Le Grand case SVGTokenStyle: 75ddde725dSArmin Le Grand { 76ddde725dSArmin Le Grand maSvgStyleAttributes.readStyle(aContent); 77ddde725dSArmin Le Grand break; 78ddde725dSArmin Le Grand } 79ddde725dSArmin Le Grand case SVGTokenX: 80ddde725dSArmin Le Grand { 81ddde725dSArmin Le Grand SvgNumber aNum; 82ddde725dSArmin Le Grand 83ddde725dSArmin Le Grand if(readSingleNumber(aContent, aNum)) 84ddde725dSArmin Le Grand { 85ddde725dSArmin Le Grand setX(aNum); 86ddde725dSArmin Le Grand } 87ddde725dSArmin Le Grand break; 88ddde725dSArmin Le Grand } 89ddde725dSArmin Le Grand case SVGTokenY: 90ddde725dSArmin Le Grand { 91ddde725dSArmin Le Grand SvgNumber aNum; 92ddde725dSArmin Le Grand 93ddde725dSArmin Le Grand if(readSingleNumber(aContent, aNum)) 94ddde725dSArmin Le Grand { 95ddde725dSArmin Le Grand setY(aNum); 96ddde725dSArmin Le Grand } 97ddde725dSArmin Le Grand break; 98ddde725dSArmin Le Grand } 99ddde725dSArmin Le Grand case SVGTokenWidth: 100ddde725dSArmin Le Grand { 101ddde725dSArmin Le Grand SvgNumber aNum; 102ddde725dSArmin Le Grand 103ddde725dSArmin Le Grand if(readSingleNumber(aContent, aNum)) 104ddde725dSArmin Le Grand { 105ddde725dSArmin Le Grand if(aNum.isPositive()) 106ddde725dSArmin Le Grand { 107ddde725dSArmin Le Grand setWidth(aNum); 108ddde725dSArmin Le Grand } 109ddde725dSArmin Le Grand } 110ddde725dSArmin Le Grand break; 111ddde725dSArmin Le Grand } 112ddde725dSArmin Le Grand case SVGTokenHeight: 113ddde725dSArmin Le Grand { 114ddde725dSArmin Le Grand SvgNumber aNum; 115ddde725dSArmin Le Grand 116ddde725dSArmin Le Grand if(readSingleNumber(aContent, aNum)) 117ddde725dSArmin Le Grand { 118ddde725dSArmin Le Grand if(aNum.isPositive()) 119ddde725dSArmin Le Grand { 120ddde725dSArmin Le Grand setHeight(aNum); 121ddde725dSArmin Le Grand } 122ddde725dSArmin Le Grand } 123ddde725dSArmin Le Grand break; 124ddde725dSArmin Le Grand } 125ddde725dSArmin Le Grand case SVGTokenRx: 126ddde725dSArmin Le Grand { 127ddde725dSArmin Le Grand SvgNumber aNum; 128ddde725dSArmin Le Grand 129ddde725dSArmin Le Grand if(readSingleNumber(aContent, aNum)) 130ddde725dSArmin Le Grand { 131ddde725dSArmin Le Grand if(aNum.isPositive()) 132ddde725dSArmin Le Grand { 133ddde725dSArmin Le Grand setRx(aNum); 134ddde725dSArmin Le Grand } 135ddde725dSArmin Le Grand } 136ddde725dSArmin Le Grand break; 137ddde725dSArmin Le Grand } 138ddde725dSArmin Le Grand case SVGTokenRy: 139ddde725dSArmin Le Grand { 140ddde725dSArmin Le Grand SvgNumber aNum; 141ddde725dSArmin Le Grand 142ddde725dSArmin Le Grand if(readSingleNumber(aContent, aNum)) 143ddde725dSArmin Le Grand { 144ddde725dSArmin Le Grand if(aNum.isPositive()) 145ddde725dSArmin Le Grand { 146ddde725dSArmin Le Grand setRy(aNum); 147ddde725dSArmin Le Grand } 148ddde725dSArmin Le Grand } 149ddde725dSArmin Le Grand break; 150ddde725dSArmin Le Grand } 151ddde725dSArmin Le Grand case SVGTokenTransform: 152ddde725dSArmin Le Grand { 153ddde725dSArmin Le Grand const basegfx::B2DHomMatrix aMatrix(readTransform(aContent, *this)); 154ddde725dSArmin Le Grand 155ddde725dSArmin Le Grand if(!aMatrix.isIdentity()) 156ddde725dSArmin Le Grand { 157ddde725dSArmin Le Grand setTransform(&aMatrix); 158ddde725dSArmin Le Grand } 159ddde725dSArmin Le Grand break; 160ddde725dSArmin Le Grand } 161*e2bf1e9dSArmin Le Grand default: 162*e2bf1e9dSArmin Le Grand { 163*e2bf1e9dSArmin Le Grand break; 164*e2bf1e9dSArmin Le Grand } 165ddde725dSArmin Le Grand } 166ddde725dSArmin Le Grand } 167ddde725dSArmin Le Grand 168*e2bf1e9dSArmin Le Grand void SvgRectNode::decomposeSvgNode(drawinglayer::primitive2d::Primitive2DSequence& rTarget, bool /*bReferenced*/) const 169ddde725dSArmin Le Grand { 170ddde725dSArmin Le Grand // get size range and create path 171ddde725dSArmin Le Grand const SvgStyleAttributes* pStyle = getSvgStyleAttributes(); 172ddde725dSArmin Le Grand 173ddde725dSArmin Le Grand if(pStyle && getWidth().isSet() && getHeight().isSet()) 174ddde725dSArmin Le Grand { 175ddde725dSArmin Le Grand const double fWidth(getWidth().solve(*this, xcoordinate)); 176ddde725dSArmin Le Grand const double fHeight(getHeight().solve(*this, ycoordinate)); 177ddde725dSArmin Le Grand 178ddde725dSArmin Le Grand if(fWidth > 0.0 && fHeight > 0.0) 179ddde725dSArmin Le Grand { 180ddde725dSArmin Le Grand const double fX(getX().isSet() ? getX().solve(*this, xcoordinate) : 0.0); 181ddde725dSArmin Le Grand const double fY(getY().isSet() ? getY().solve(*this, ycoordinate) : 0.0); 182ddde725dSArmin Le Grand const basegfx::B2DRange aRange(fX, fY, fX + fWidth, fY + fHeight); 183ddde725dSArmin Le Grand basegfx::B2DPolygon aPath; 184ddde725dSArmin Le Grand 185ddde725dSArmin Le Grand if(getRx().isSet() || getRy().isSet()) 186ddde725dSArmin Le Grand { 187ddde725dSArmin Le Grand double frX(getRx().isSet() ? getRx().solve(*this, xcoordinate) : 0.0); 188ddde725dSArmin Le Grand double frY(getRy().isSet() ? getRy().solve(*this, ycoordinate) : 0.0); 189ddde725dSArmin Le Grand 190ddde725dSArmin Le Grand frX = std::max(0.0, frX); 191ddde725dSArmin Le Grand frY = std::max(0.0, frY); 192ddde725dSArmin Le Grand 193ddde725dSArmin Le Grand if(0.0 == frY && frX > 0.0) 194ddde725dSArmin Le Grand { 195ddde725dSArmin Le Grand frY = frX; 196ddde725dSArmin Le Grand } 197ddde725dSArmin Le Grand else if(0.0 == frX && frY > 0.0) 198ddde725dSArmin Le Grand { 199ddde725dSArmin Le Grand frX = frY; 200ddde725dSArmin Le Grand } 201ddde725dSArmin Le Grand 202ddde725dSArmin Le Grand frX /= fWidth; 203ddde725dSArmin Le Grand frY /= fHeight; 204ddde725dSArmin Le Grand 205ddde725dSArmin Le Grand frX = std::min(0.5, frX); 206ddde725dSArmin Le Grand frY = std::min(0.5, frY); 207ddde725dSArmin Le Grand 208ddde725dSArmin Le Grand aPath = basegfx::tools::createPolygonFromRect(aRange, frX * 2.0, frY * 2.0); 209ddde725dSArmin Le Grand } 210ddde725dSArmin Le Grand else 211ddde725dSArmin Le Grand { 212ddde725dSArmin Le Grand aPath = basegfx::tools::createPolygonFromRect(aRange); 213ddde725dSArmin Le Grand } 214ddde725dSArmin Le Grand 215ddde725dSArmin Le Grand drawinglayer::primitive2d::Primitive2DSequence aNewTarget; 216ddde725dSArmin Le Grand 217ddde725dSArmin Le Grand pStyle->add_path(basegfx::B2DPolyPolygon(aPath), aNewTarget); 218ddde725dSArmin Le Grand 219ddde725dSArmin Le Grand if(aNewTarget.hasElements()) 220ddde725dSArmin Le Grand { 221ddde725dSArmin Le Grand pStyle->add_postProcess(rTarget, aNewTarget, getTransform()); 222ddde725dSArmin Le Grand } 223ddde725dSArmin Le Grand } 224ddde725dSArmin Le Grand } 225ddde725dSArmin Le Grand } 226ddde725dSArmin Le Grand } // end of namespace svgreader 227ddde725dSArmin Le Grand } // end of namespace svgio 228ddde725dSArmin Le Grand 229ddde725dSArmin Le Grand ////////////////////////////////////////////////////////////////////////////// 230ddde725dSArmin Le Grand // eof 231