LCOV - code coverage report
Current view: top level - drawinglayer/source/attribute - sdrfillgraphicattribute.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 94 101 93.1 %
Date: 2015-06-13 12:38:46 Functions: 30 30 100.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 <drawinglayer/attribute/sdrfillgraphicattribute.hxx>
      21             : #include <drawinglayer/attribute/fillgraphicattribute.hxx>
      22             : #include <rtl/instance.hxx>
      23             : #include <vcl/graph.hxx>
      24             : 
      25             : 
      26             : 
      27             : namespace drawinglayer
      28             : {
      29             :     namespace attribute
      30             :     {
      31        2335 :         class ImpSdrFillGraphicAttribute
      32             :         {
      33             :         public:
      34             :             // data definitions
      35             :             Graphic                                 maFillGraphic;
      36             :             basegfx::B2DVector                      maGraphicLogicSize;
      37             :             basegfx::B2DVector                      maSize;
      38             :             basegfx::B2DVector                      maOffset;
      39             :             basegfx::B2DVector                      maOffsetPosition;
      40             :             basegfx::B2DVector                      maRectPoint;
      41             : 
      42             :             // bitfield
      43             :             bool                                    mbTiling : 1;
      44             :             bool                                    mbStretch : 1;
      45             :             bool                                    mbLogSize : 1;
      46             : 
      47         753 :             ImpSdrFillGraphicAttribute(
      48             :                 const Graphic& rFillGraphic,
      49             :                 const basegfx::B2DVector& rGraphicLogicSize,
      50             :                 const basegfx::B2DVector& rSize,
      51             :                 const basegfx::B2DVector& rOffset,
      52             :                 const basegfx::B2DVector& rOffsetPosition,
      53             :                 const basegfx::B2DVector& rRectPoint,
      54             :                 bool bTiling,
      55             :                 bool bStretch,
      56             :                 bool bLogSize)
      57             :             :   maFillGraphic(rFillGraphic),
      58             :                 maGraphicLogicSize(rGraphicLogicSize),
      59             :                 maSize(rSize),
      60             :                 maOffset(rOffset),
      61             :                 maOffsetPosition(rOffsetPosition),
      62             :                 maRectPoint(rRectPoint),
      63             :                 mbTiling(bTiling),
      64             :                 mbStretch(bStretch),
      65         753 :                 mbLogSize(bLogSize)
      66             :             {
      67         753 :             }
      68             : 
      69          87 :             ImpSdrFillGraphicAttribute()
      70             :             :   maFillGraphic(Graphic()),
      71             :                 maGraphicLogicSize(basegfx::B2DVector()),
      72             :                 maSize(basegfx::B2DVector()),
      73             :                 maOffset(basegfx::B2DVector()),
      74             :                 maOffsetPosition(basegfx::B2DVector()),
      75             :                 maRectPoint(basegfx::B2DVector()),
      76             :                 mbTiling(false),
      77             :                 mbStretch(false),
      78          87 :                 mbLogSize(false)
      79             :             {
      80          87 :             }
      81             : 
      82             :             // data read access
      83        3097 :             const Graphic& getFillGraphic() const { return maFillGraphic; }
      84        1258 :             const basegfx::B2DVector& getGraphicLogicSize() const { return maGraphicLogicSize; }
      85        1318 :             const basegfx::B2DVector& getSize() const { return maSize; }
      86        1488 :             const basegfx::B2DVector& getOffset() const { return maOffset; }
      87        1278 :             const basegfx::B2DVector& getOffsetPosition() const { return maOffsetPosition; }
      88        1294 :             const basegfx::B2DVector& getRectPoint() const { return maRectPoint; }
      89        2098 :             bool getTiling() const { return mbTiling; }
      90         773 :             bool getStretch() const { return mbStretch; }
      91         668 :             bool getLogSize() const { return mbLogSize; }
      92             : 
      93         334 :             bool operator==(const ImpSdrFillGraphicAttribute& rCandidate) const
      94             :             {
      95         334 :                 return (getFillGraphic() == rCandidate.getFillGraphic()
      96         334 :                     && getGraphicLogicSize() == rCandidate.getGraphicLogicSize()
      97         334 :                     && getSize() == rCandidate.getSize()
      98         334 :                     && getOffset() == rCandidate.getOffset()
      99         334 :                     && getOffsetPosition() == rCandidate.getOffsetPosition()
     100         334 :                     && getRectPoint() == rCandidate.getRectPoint()
     101         334 :                     && getTiling() == rCandidate.getTiling()
     102         334 :                     && getStretch() == rCandidate.getStretch()
     103         668 :                     && getLogSize() == rCandidate.getLogSize());
     104             :             }
     105             :         };
     106             : 
     107             :         namespace
     108             :         {
     109             :             struct theGlobalDefault :
     110             :                 public rtl::Static< SdrFillGraphicAttribute::ImplType, theGlobalDefault > {};
     111             :         }
     112             : 
     113         753 :         SdrFillGraphicAttribute::SdrFillGraphicAttribute(
     114             :             const Graphic& rFillGraphic,
     115             :             const basegfx::B2DVector& rGraphicLogicSize,
     116             :             const basegfx::B2DVector& rSize,
     117             :             const basegfx::B2DVector& rOffset,
     118             :             const basegfx::B2DVector& rOffsetPosition,
     119             :             const basegfx::B2DVector& rRectPoint,
     120             :             bool bTiling,
     121             :             bool bStretch,
     122             :             bool bLogSize)
     123             :         :   mpSdrFillGraphicAttribute(
     124             :                 ImpSdrFillGraphicAttribute(
     125             :                     rFillGraphic,
     126             :                     rGraphicLogicSize,
     127             :                     rSize,
     128             :                     rOffset,
     129             :                     rOffsetPosition,
     130             :                     rRectPoint,
     131             :                     bTiling,
     132             :                     bStretch,
     133         753 :                     bLogSize))
     134             :         {
     135         753 :         }
     136             : 
     137       53633 :         SdrFillGraphicAttribute::SdrFillGraphicAttribute()
     138       53633 :         :   mpSdrFillGraphicAttribute(theGlobalDefault::get())
     139             :         {
     140       53633 :         }
     141             : 
     142      107086 :         SdrFillGraphicAttribute::SdrFillGraphicAttribute(const SdrFillGraphicAttribute& rCandidate)
     143      107086 :         :   mpSdrFillGraphicAttribute(rCandidate.mpSdrFillGraphicAttribute)
     144             :         {
     145      107086 :         }
     146             : 
     147      161150 :         SdrFillGraphicAttribute::~SdrFillGraphicAttribute()
     148             :         {
     149      161150 :         }
     150             : 
     151       66467 :         bool SdrFillGraphicAttribute::isDefault() const
     152             :         {
     153       66467 :             return mpSdrFillGraphicAttribute.same_object(theGlobalDefault::get());
     154             :         }
     155             : 
     156         756 :         SdrFillGraphicAttribute& SdrFillGraphicAttribute::operator=(const SdrFillGraphicAttribute& rCandidate)
     157             :         {
     158         756 :             mpSdrFillGraphicAttribute = rCandidate.mpSdrFillGraphicAttribute;
     159         756 :             return *this;
     160             :         }
     161             : 
     162       24166 :         bool SdrFillGraphicAttribute::operator==(const SdrFillGraphicAttribute& rCandidate) const
     163             :         {
     164             :             // tdf#87509 default attr is always != non-default attr, even with same values
     165       24166 :             if(rCandidate.isDefault() != isDefault())
     166           0 :                 return false;
     167             : 
     168       24166 :             return rCandidate.mpSdrFillGraphicAttribute == mpSdrFillGraphicAttribute;
     169             :         }
     170             : 
     171        2429 :         const Graphic& SdrFillGraphicAttribute::getFillGraphic() const
     172             :         {
     173        2429 :             return mpSdrFillGraphicAttribute->getFillGraphic();
     174             :         }
     175             : 
     176         590 :         const basegfx::B2DVector& SdrFillGraphicAttribute::getGraphicLogicSize() const
     177             :         {
     178         590 :             return mpSdrFillGraphicAttribute->getGraphicLogicSize();
     179             :         }
     180             : 
     181         650 :         const basegfx::B2DVector& SdrFillGraphicAttribute::getSize() const
     182             :         {
     183         650 :             return mpSdrFillGraphicAttribute->getSize();
     184             :         }
     185             : 
     186         820 :         const basegfx::B2DVector& SdrFillGraphicAttribute::getOffset() const
     187             :         {
     188         820 :             return mpSdrFillGraphicAttribute->getOffset();
     189             :         }
     190             : 
     191         610 :         const basegfx::B2DVector& SdrFillGraphicAttribute::getOffsetPosition() const
     192             :         {
     193         610 :             return mpSdrFillGraphicAttribute->getOffsetPosition();
     194             :         }
     195             : 
     196         626 :         const basegfx::B2DVector& SdrFillGraphicAttribute::getRectPoint() const
     197             :         {
     198         626 :             return mpSdrFillGraphicAttribute->getRectPoint();
     199             :         }
     200             : 
     201        1430 :         bool SdrFillGraphicAttribute::getTiling() const
     202             :         {
     203        1430 :             return mpSdrFillGraphicAttribute->getTiling();
     204             :         }
     205             : 
     206         105 :         bool SdrFillGraphicAttribute::getStretch() const
     207             :         {
     208         105 :             return mpSdrFillGraphicAttribute->getStretch();
     209             :         }
     210             : 
     211         410 :         FillGraphicAttribute SdrFillGraphicAttribute::createFillGraphicAttribute(const basegfx::B2DRange& rRange) const
     212             :         {
     213             :             // get logical size of bitmap (before possibly expanding it)
     214         410 :             Graphic aGraphic(getFillGraphic());
     215             : 
     216             :             // init values with defaults for stretched
     217         820 :             basegfx::B2DPoint aBitmapSize(1.0, 1.0);
     218         820 :             basegfx::B2DVector aBitmapTopLeft(0.0, 0.0);
     219             : 
     220             :             //UUUU are changes needed? When stretched we are already done, all other values will have no influence
     221         410 :             if(getTiling() || !getStretch())
     222             :             {
     223             :                 // init values with range sizes
     224         305 :                 const double fRangeWidth(0.0 != rRange.getWidth() ? rRange.getWidth() : 1.0);
     225         305 :                 const double fRangeHeight(0.0 != rRange.getHeight() ? rRange.getHeight() : 1.0);
     226         305 :                 aBitmapSize = basegfx::B2DPoint(fRangeWidth, fRangeHeight);
     227             : 
     228             :                 // size changes
     229         305 :                 if(0.0 != getSize().getX())
     230             :                 {
     231          10 :                     if(getSize().getX() < 0.0)
     232             :                     {
     233           0 :                         aBitmapSize.setX(aBitmapSize.getX() * (getSize().getX() * -0.01));
     234             :                     }
     235             :                     else
     236             :                     {
     237          10 :                         aBitmapSize.setX(getSize().getX());
     238             :                     }
     239             :                 }
     240             :                 else
     241             :                 {
     242             :                     // #i124002# use GraphicLogicSize directly, do not try to use GetPrefSize
     243             :                     // of the graphic, that may not be adapted to the MapMode of the target
     244         295 :                     aBitmapSize.setX(getGraphicLogicSize().getX());
     245             :                 }
     246             : 
     247         305 :                 if(0.0 != getSize().getY())
     248             :                 {
     249          10 :                     if(getSize().getY() < 0.0)
     250             :                     {
     251           0 :                         aBitmapSize.setY(aBitmapSize.getY() * (getSize().getY() * -0.01));
     252             :                     }
     253             :                     else
     254             :                     {
     255          10 :                         aBitmapSize.setY(getSize().getY());
     256             :                     }
     257             :                 }
     258             :                 else
     259             :                 {
     260             :                     // #i124002# use GraphicLogicSize directly, do not try to use GetPrefSize
     261             :                     // of the graphic, that may not be adapted to the MapMode of the target
     262         295 :                     aBitmapSize.setY(getGraphicLogicSize().getY());
     263             :                 }
     264             : 
     265             :                 // position changes X
     266         305 :                 if(0.0 == getRectPoint().getX())
     267             :                 {
     268         297 :                     aBitmapTopLeft.setX((fRangeWidth - aBitmapSize.getX()) * 0.5);
     269             :                 }
     270           8 :                 else if(1.0 == getRectPoint().getX())
     271             :                 {
     272           0 :                     aBitmapTopLeft.setX(fRangeWidth - aBitmapSize.getX());
     273             :                 }
     274             : 
     275             :                 // offset positions are only meaningful when tiled
     276         305 :                 if(getTiling() && 0.0 != getOffsetPosition().getX())
     277             :                 {
     278           0 :                     aBitmapTopLeft.setX(aBitmapTopLeft.getX() + (aBitmapSize.getX() * (getOffsetPosition().getX() * 0.01)));
     279             :                 }
     280             : 
     281             :                 // position changes Y
     282         305 :                 if(0.0 == getRectPoint().getY())
     283             :                 {
     284         297 :                     aBitmapTopLeft.setY((fRangeHeight - aBitmapSize.getY()) * 0.5);
     285             :                 }
     286           8 :                 else if(1.0 == getRectPoint().getY())
     287             :                 {
     288           0 :                     aBitmapTopLeft.setY(fRangeHeight - aBitmapSize.getY());
     289             :                 }
     290             : 
     291             :                 // offset positions are only meaningful when tiled
     292         305 :                 if(getTiling() && 0.0 != getOffsetPosition().getY())
     293             :                 {
     294           0 :                     aBitmapTopLeft.setY(aBitmapTopLeft.getY() + (aBitmapSize.getY() * (getOffsetPosition().getY() * 0.01)));
     295             :                 }
     296             : 
     297             :                 // apply bitmap size scaling to unit rectangle
     298         305 :                 aBitmapTopLeft.setX(aBitmapTopLeft.getX() / fRangeWidth);
     299         305 :                 aBitmapTopLeft.setY(aBitmapTopLeft.getY() / fRangeHeight);
     300         305 :                 aBitmapSize.setX(aBitmapSize.getX() / fRangeWidth);
     301         305 :                 aBitmapSize.setY(aBitmapSize.getY() / fRangeHeight);
     302             :             }
     303             : 
     304             :             // get offset in percent
     305         410 :             const double fOffsetX(basegfx::clamp(getOffset().getX() * 0.01, 0.0, 1.0));
     306         410 :             const double fOffsetY(basegfx::clamp(getOffset().getY() * 0.01, 0.0, 1.0));
     307             : 
     308             :             // create FillGraphicAttribute
     309             :             return FillGraphicAttribute(
     310             :                 aGraphic,
     311         820 :                 basegfx::B2DRange(aBitmapTopLeft, aBitmapTopLeft + aBitmapSize),
     312         410 :                 getTiling(),
     313             :                 fOffsetX,
     314        1230 :                 fOffsetY);
     315             :         }
     316             :     } // end of namespace attribute
     317             : } // end of namespace drawinglayer
     318             : 
     319             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11