LCOV - code coverage report
Current view: top level - svgio/source/svgreader - svgpatternnode.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 0 172 0.0 %
Date: 2014-11-03 Functions: 0 18 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <svgio/svgreader/svgpatternnode.hxx>
      21             : #include <svgio/svgreader/svgdocument.hxx>
      22             : 
      23             : namespace svgio
      24             : {
      25             :     namespace svgreader
      26             :     {
      27           0 :         void SvgPatternNode::tryToFindLink()
      28             :         {
      29           0 :             if(!mpXLink && !maXLink.isEmpty())
      30             :             {
      31           0 :                 mpXLink = dynamic_cast< const SvgPatternNode* >(getDocument().findSvgNodeById(maXLink));
      32             :             }
      33           0 :         }
      34             : 
      35           0 :         SvgPatternNode::SvgPatternNode(
      36             :             SvgDocument& rDocument,
      37             :             SvgNode* pParent)
      38             :         :   SvgNode(SVGTokenPattern, rDocument, pParent),
      39             :             aPrimitives(),
      40             :             maSvgStyleAttributes(*this),
      41             :             mpViewBox(0),
      42             :             maSvgAspectRatio(),
      43             :             maX(),
      44             :             maY(),
      45             :             maWidth(),
      46             :             maHeight(),
      47             :             mpPatternUnits(0),
      48             :             mpPatternContentUnits(0),
      49             :             mpaPatternTransform(0),
      50             :             maXLink(),
      51           0 :             mpXLink(0)
      52             :         {
      53           0 :         }
      54             : 
      55           0 :         SvgPatternNode::~SvgPatternNode()
      56             :         {
      57           0 :             if(mpViewBox) delete mpViewBox;
      58           0 :             if(mpaPatternTransform) delete mpaPatternTransform;
      59           0 :             if(mpPatternUnits) delete mpPatternUnits;
      60           0 :             if(mpPatternContentUnits) delete mpPatternContentUnits;
      61           0 :         }
      62             : 
      63           0 :         const SvgStyleAttributes* SvgPatternNode::getSvgStyleAttributes() const
      64             :         {
      65           0 :             return checkForCssStyle(OUString("pattern"), maSvgStyleAttributes);
      66             :         }
      67             : 
      68           0 :         void SvgPatternNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent)
      69             :         {
      70             :             // call parent
      71           0 :             SvgNode::parseAttribute(rTokenName, aSVGToken, aContent);
      72             : 
      73             :             // read style attributes
      74           0 :             maSvgStyleAttributes.parseStyleAttribute(rTokenName, aSVGToken, aContent, false);
      75             : 
      76             :             // parse own
      77           0 :             switch(aSVGToken)
      78             :             {
      79             :                 case SVGTokenStyle:
      80             :                 {
      81           0 :                     readLocalCssStyle(aContent);
      82           0 :                     break;
      83             :                 }
      84             :                 case SVGTokenViewBox:
      85             :                 {
      86           0 :                     const basegfx::B2DRange aRange(readViewBox(aContent, *this));
      87             : 
      88           0 :                     if(!aRange.isEmpty())
      89             :                     {
      90           0 :                         setViewBox(&aRange);
      91             :                     }
      92           0 :                     break;
      93             :                 }
      94             :                 case SVGTokenPreserveAspectRatio:
      95             :                 {
      96           0 :                     setSvgAspectRatio(readSvgAspectRatio(aContent));
      97           0 :                     break;
      98             :                 }
      99             :                 case SVGTokenX:
     100             :                 {
     101           0 :                     SvgNumber aNum;
     102             : 
     103           0 :                     if(readSingleNumber(aContent, aNum))
     104             :                     {
     105           0 :                         setX(aNum);
     106             :                     }
     107           0 :                     break;
     108             :                 }
     109             :                 case SVGTokenY:
     110             :                 {
     111           0 :                     SvgNumber aNum;
     112             : 
     113           0 :                     if(readSingleNumber(aContent, aNum))
     114             :                     {
     115           0 :                         setY(aNum);
     116             :                     }
     117           0 :                     break;
     118             :                 }
     119             :                 case SVGTokenWidth:
     120             :                 {
     121           0 :                     SvgNumber aNum;
     122             : 
     123           0 :                     if(readSingleNumber(aContent, aNum))
     124             :                     {
     125           0 :                         if(aNum.isPositive())
     126             :                         {
     127           0 :                             setWidth(aNum);
     128             :                         }
     129             :                     }
     130           0 :                     break;
     131             :                 }
     132             :                 case SVGTokenHeight:
     133             :                 {
     134           0 :                     SvgNumber aNum;
     135             : 
     136           0 :                     if(readSingleNumber(aContent, aNum))
     137             :                     {
     138           0 :                         if(aNum.isPositive())
     139             :                         {
     140           0 :                             setHeight(aNum);
     141             :                         }
     142             :                     }
     143           0 :                     break;
     144             :                 }
     145             :                 case SVGTokenPatternUnits:
     146             :                 {
     147           0 :                     if(!aContent.isEmpty())
     148             :                     {
     149           0 :                         if(aContent.match(commonStrings::aStrUserSpaceOnUse, 0))
     150             :                         {
     151           0 :                             setPatternUnits(userSpaceOnUse);
     152             :                         }
     153           0 :                         else if(aContent.match(commonStrings::aStrObjectBoundingBox, 0))
     154             :                         {
     155           0 :                             setPatternUnits(objectBoundingBox);
     156             :                         }
     157             :                     }
     158           0 :                     break;
     159             :                 }
     160             :                 case SVGTokenPatternContentUnits:
     161             :                 {
     162           0 :                     if(!aContent.isEmpty())
     163             :                     {
     164           0 :                         if(aContent.match(commonStrings::aStrUserSpaceOnUse, 0))
     165             :                         {
     166           0 :                             setPatternContentUnits(userSpaceOnUse);
     167             :                         }
     168           0 :                         else if(aContent.match(commonStrings::aStrObjectBoundingBox, 0))
     169             :                         {
     170           0 :                             setPatternContentUnits(objectBoundingBox);
     171             :                         }
     172             :                     }
     173           0 :                     break;
     174             :                 }
     175             :                 case SVGTokenPatternTransform:
     176             :                 {
     177           0 :                     const basegfx::B2DHomMatrix aMatrix(readTransform(aContent, *this));
     178             : 
     179           0 :                     if(!aMatrix.isIdentity())
     180             :                     {
     181           0 :                         setPatternTransform(&aMatrix);
     182             :                     }
     183           0 :                     break;
     184             :                 }
     185             :                 case SVGTokenXlinkHref:
     186             :                 {
     187           0 :                     const sal_Int32 nLen(aContent.getLength());
     188             : 
     189           0 :                     if(nLen && '#' == aContent[0])
     190             :                     {
     191           0 :                         maXLink = aContent.copy(1);
     192           0 :                         tryToFindLink();
     193             :                     }
     194           0 :                     break;
     195             :                 }
     196             :                 default:
     197             :                 {
     198           0 :                     break;
     199             :                 }
     200             :             }
     201           0 :         }
     202             : 
     203           0 :         void SvgPatternNode::getValuesRelative(double& rfX, double& rfY, double& rfW, double& rfH, const basegfx::B2DRange& rGeoRange, SvgNode& rUser) const
     204             :         {
     205           0 :             double fTargetWidth(rGeoRange.getWidth());
     206           0 :             double fTargetHeight(rGeoRange.getHeight());
     207             : 
     208           0 :             if(fTargetWidth > 0.0 && fTargetHeight > 0.0)
     209             :             {
     210           0 :                 const SvgUnits aPatternUnits(getPatternUnits() ? *getPatternUnits() : objectBoundingBox);
     211             : 
     212           0 :                 if(objectBoundingBox == aPatternUnits)
     213             :                 {
     214           0 :                     rfW = (getWidth().isSet()) ? getWidth().getNumber() : 0.0;
     215           0 :                     rfH = (getHeight().isSet()) ? getHeight().getNumber() : 0.0;
     216             : 
     217           0 :                     if(Unit_percent == getWidth().getUnit())
     218             :                     {
     219           0 :                         rfW *= 0.01;
     220             :                     }
     221             : 
     222           0 :                     if(Unit_percent == getHeight().getUnit())
     223             :                     {
     224           0 :                         rfH *= 0.01;
     225             :                     }
     226             :                 }
     227             :                 else
     228             :                 {
     229           0 :                     rfW = (getWidth().isSet()) ? getWidth().solve(rUser, xcoordinate) : 0.0;
     230           0 :                     rfH = (getHeight().isSet()) ? getHeight().solve(rUser, ycoordinate) : 0.0;
     231             : 
     232             :                     // make relative to rGeoRange
     233           0 :                     rfW /= fTargetWidth;
     234           0 :                     rfH /= fTargetHeight;
     235             :                 }
     236             : 
     237           0 :                 if(rfW > 0.0 && rfH > 0.0)
     238             :                 {
     239           0 :                     if(objectBoundingBox == aPatternUnits)
     240             :                     {
     241           0 :                         rfX = (getX().isSet()) ? getX().getNumber() : 0.0;
     242           0 :                         rfY = (getY().isSet()) ? getY().getNumber() : 0.0;
     243             : 
     244           0 :                         if(Unit_percent == getX().getUnit())
     245             :                         {
     246           0 :                             rfX *= 0.01;
     247             :                         }
     248             : 
     249           0 :                         if(Unit_percent == getY().getUnit())
     250             :                         {
     251           0 :                             rfY *= 0.01;
     252             :                         }
     253             :                     }
     254             :                     else
     255             :                     {
     256           0 :                         rfX = (getX().isSet()) ? getX().solve(rUser, xcoordinate) : 0.0;
     257           0 :                         rfY = (getY().isSet()) ? getY().solve(rUser, ycoordinate) : 0.0;
     258             : 
     259             :                         // make relative to rGeoRange
     260           0 :                         rfX = (rfX - rGeoRange.getMinX()) / fTargetWidth;
     261           0 :                         rfY = (rfY - rGeoRange.getMinY()) / fTargetHeight;
     262             :                     }
     263             :                 }
     264             :             }
     265           0 :         }
     266             : 
     267           0 :         const drawinglayer::primitive2d::Primitive2DSequence& SvgPatternNode::getPatternPrimitives() const
     268             :         {
     269           0 :             if(!aPrimitives.hasElements() && Display_none != getDisplay())
     270             :             {
     271           0 :                 decomposeSvgNode(const_cast< SvgPatternNode* >(this)->aPrimitives, true);
     272             :             }
     273             : 
     274           0 :             if(!aPrimitives.hasElements() && !maXLink.isEmpty())
     275             :             {
     276           0 :                 const_cast< SvgPatternNode* >(this)->tryToFindLink();
     277             : 
     278           0 :                 if(mpXLink)
     279             :                 {
     280           0 :                     return mpXLink->getPatternPrimitives();
     281             :                 }
     282             :             }
     283             : 
     284           0 :             return aPrimitives;
     285             :         }
     286             : 
     287           0 :         const basegfx::B2DRange SvgPatternNode::getCurrentViewPort() const
     288             :         {
     289           0 :             if(getViewBox())
     290             :             {
     291           0 :                 return *(getViewBox());
     292             :             }
     293             :             else
     294             :             {
     295           0 :                 return SvgNode::getCurrentViewPort();
     296             :             }
     297             :         }
     298             : 
     299           0 :         const basegfx::B2DRange* SvgPatternNode::getViewBox() const
     300             :         {
     301           0 :             if(mpViewBox)
     302             :             {
     303           0 :                 return mpViewBox;
     304             :             }
     305             : 
     306           0 :             const_cast< SvgPatternNode* >(this)->tryToFindLink();
     307             : 
     308           0 :             if(mpXLink)
     309             :             {
     310           0 :                 return mpXLink->getViewBox();
     311             :             }
     312             : 
     313           0 :             return 0;
     314             :         }
     315             : 
     316           0 :         const SvgAspectRatio& SvgPatternNode::getSvgAspectRatio() const
     317             :         {
     318           0 :             if(maSvgAspectRatio.isSet())
     319             :             {
     320           0 :                 return maSvgAspectRatio;
     321             :             }
     322             : 
     323           0 :             const_cast< SvgPatternNode* >(this)->tryToFindLink();
     324             : 
     325           0 :             if(mpXLink)
     326             :             {
     327           0 :                 return mpXLink->getSvgAspectRatio();
     328             :             }
     329             : 
     330           0 :             return maSvgAspectRatio;
     331             :         }
     332             : 
     333           0 :         const SvgNumber& SvgPatternNode::getX() const
     334             :         {
     335           0 :             if(maX.isSet())
     336             :             {
     337           0 :                 return maX;
     338             :             }
     339             : 
     340           0 :             const_cast< SvgPatternNode* >(this)->tryToFindLink();
     341             : 
     342           0 :             if(mpXLink)
     343             :             {
     344           0 :                 return mpXLink->getX();
     345             :             }
     346             : 
     347           0 :             return maX;
     348             :         }
     349             : 
     350           0 :         const SvgNumber& SvgPatternNode::getY() const
     351             :         {
     352           0 :             if(maY.isSet())
     353             :             {
     354           0 :                 return maY;
     355             :             }
     356             : 
     357           0 :             const_cast< SvgPatternNode* >(this)->tryToFindLink();
     358             : 
     359           0 :             if(mpXLink)
     360             :             {
     361           0 :                 return mpXLink->getY();
     362             :             }
     363             : 
     364           0 :             return maY;
     365             :         }
     366             : 
     367           0 :         const SvgNumber& SvgPatternNode::getWidth() const
     368             :         {
     369           0 :             if(maWidth.isSet())
     370             :             {
     371           0 :                 return maWidth;
     372             :             }
     373             : 
     374           0 :             const_cast< SvgPatternNode* >(this)->tryToFindLink();
     375             : 
     376           0 :             if(mpXLink)
     377             :             {
     378           0 :                 return mpXLink->getWidth();
     379             :             }
     380             : 
     381           0 :             return maWidth;
     382             :         }
     383             : 
     384           0 :         const SvgNumber& SvgPatternNode::getHeight() const
     385             :         {
     386           0 :             if(maHeight.isSet())
     387             :             {
     388           0 :                 return maHeight;
     389             :             }
     390             : 
     391           0 :             const_cast< SvgPatternNode* >(this)->tryToFindLink();
     392             : 
     393           0 :             if(mpXLink)
     394             :             {
     395           0 :                 return mpXLink->getHeight();
     396             :             }
     397             : 
     398           0 :             return maHeight;
     399             :         }
     400             : 
     401           0 :         const SvgUnits* SvgPatternNode::getPatternUnits() const
     402             :         {
     403           0 :             if(mpPatternUnits)
     404             :             {
     405           0 :                 return mpPatternUnits;
     406             :             }
     407             : 
     408           0 :             const_cast< SvgPatternNode* >(this)->tryToFindLink();
     409             : 
     410           0 :             if(mpXLink)
     411             :             {
     412           0 :                 return mpXLink->getPatternUnits();
     413             :             }
     414             : 
     415           0 :             return 0;
     416             :         }
     417             : 
     418           0 :         const SvgUnits* SvgPatternNode::getPatternContentUnits() const
     419             :         {
     420           0 :             if(mpPatternContentUnits)
     421             :             {
     422           0 :                 return mpPatternContentUnits;
     423             :             }
     424             : 
     425           0 :             const_cast< SvgPatternNode* >(this)->tryToFindLink();
     426             : 
     427           0 :             if(mpXLink)
     428             :             {
     429           0 :                 return mpXLink->getPatternContentUnits();
     430             :             }
     431             : 
     432           0 :             return 0;
     433             :         }
     434             : 
     435           0 :         const basegfx::B2DHomMatrix* SvgPatternNode::getPatternTransform() const
     436             :         {
     437           0 :             if(mpaPatternTransform)
     438             :             {
     439           0 :                 return mpaPatternTransform;
     440             :             }
     441             : 
     442           0 :             const_cast< SvgPatternNode* >(this)->tryToFindLink();
     443             : 
     444           0 :             if(mpXLink)
     445             :             {
     446           0 :                 return mpXLink->getPatternTransform();
     447             :             }
     448             : 
     449           0 :             return 0;
     450             :         }
     451             : 
     452             :     } // end of namespace svgreader
     453             : } // end of namespace svgio
     454             : 
     455             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10