LCOV - code coverage report
Current view: top level - libreoffice/drawinglayer/source/texture - texture.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 38 266 14.3 %
Date: 2012-12-27 Functions: 9 60 15.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/texture/texture.hxx>
      21             : #include <basegfx/numeric/ftools.hxx>
      22             : #include <basegfx/tools/gradienttools.hxx>
      23             : #include <basegfx/matrix/b2dhommatrixtools.hxx>
      24             : 
      25             : //////////////////////////////////////////////////////////////////////////////
      26             : 
      27             : namespace drawinglayer
      28             : {
      29             :     namespace texture
      30             :     {
      31           3 :         GeoTexSvx::GeoTexSvx()
      32             :         {
      33           3 :         }
      34             : 
      35           3 :         GeoTexSvx::~GeoTexSvx()
      36             :         {
      37           3 :         }
      38             : 
      39           0 :         bool GeoTexSvx::operator==(const GeoTexSvx& /*rGeoTexSvx*/) const
      40             :         {
      41             :             // default implementation says yes (no data -> no difference)
      42           0 :             return true;
      43             :         }
      44             : 
      45           0 :         void GeoTexSvx::appendTransformations(::std::vector< basegfx::B2DHomMatrix >& /*rMatrices*/)
      46             :         {
      47             :             // default implementation does nothing
      48           0 :         }
      49             : 
      50           0 :         void GeoTexSvx::modifyBColor(const basegfx::B2DPoint& /*rUV*/, basegfx::BColor& rBColor, double& /*rfOpacity*/) const
      51             :         {
      52             :             // base implementation creates random color (for testing only, may also be pure virtual)
      53           0 :             rBColor.setRed((rand() & 0x7fff) / 32767.0);
      54           0 :             rBColor.setGreen((rand() & 0x7fff) / 32767.0);
      55           0 :             rBColor.setBlue((rand() & 0x7fff) / 32767.0);
      56           0 :         }
      57             : 
      58           0 :         void GeoTexSvx::modifyOpacity(const basegfx::B2DPoint& rUV, double& rfOpacity) const
      59             :         {
      60             :             // base implementation uses inverse of luminance of solved color (for testing only, may also be pure virtual)
      61           0 :             basegfx::BColor aBaseColor;
      62           0 :             modifyBColor(rUV, aBaseColor, rfOpacity);
      63           0 :             rfOpacity = 1.0 - aBaseColor.luminance();
      64           0 :         }
      65             :     } // end of namespace texture
      66             : } // end of namespace drawinglayer
      67             : 
      68             : //////////////////////////////////////////////////////////////////////////////
      69             : 
      70             : namespace drawinglayer
      71             : {
      72             :     namespace texture
      73             :     {
      74           3 :         void GeoTexSvxGradient::impAppendMatrix(::std::vector< basegfx::B2DHomMatrix >& rMatrices, const basegfx::B2DRange& rRange)
      75             :         {
      76           3 :             basegfx::B2DHomMatrix aNew;
      77           3 :             aNew.set(0, 0, rRange.getWidth());
      78           3 :             aNew.set(1, 1, rRange.getHeight());
      79           3 :             aNew.set(0, 2, rRange.getMinX());
      80           3 :             aNew.set(1, 2, rRange.getMinY());
      81           3 :             rMatrices.push_back(maGradientInfo.maTextureTransform * aNew);
      82           3 :         }
      83             : 
      84           0 :         void GeoTexSvxGradient::impAppendColorsRadial(::std::vector< basegfx::BColor >& rColors)
      85             :         {
      86           0 :             if(maGradientInfo.mnSteps)
      87             :             {
      88           0 :                 rColors.push_back(maStart);
      89             : 
      90           0 :                 for(sal_uInt32 a(1L); a < maGradientInfo.mnSteps - 1L; a++)
      91             :                 {
      92           0 :                     rColors.push_back(interpolate(maStart, maEnd, (double)a / (double)maGradientInfo.mnSteps));
      93             :                 }
      94             : 
      95           0 :                 rColors.push_back(maEnd);
      96             :             }
      97           0 :         }
      98             : 
      99           3 :         GeoTexSvxGradient::GeoTexSvxGradient(const basegfx::B2DRange& rTargetRange, const basegfx::BColor& rStart, const basegfx::BColor& rEnd, sal_uInt32 nSteps, double fBorder)
     100             :         :   maTargetRange(rTargetRange),
     101             :             maStart(rStart),
     102             :             maEnd(rEnd),
     103           3 :             mfBorder(fBorder)
     104             :         {
     105           3 :             maGradientInfo.mnSteps = nSteps;
     106           3 :             maGradientInfo.mfAspectRatio = 1.0;
     107           3 :         }
     108             : 
     109           3 :         GeoTexSvxGradient::~GeoTexSvxGradient()
     110             :         {
     111           3 :         }
     112             : 
     113           0 :         bool GeoTexSvxGradient::operator==(const GeoTexSvx& rGeoTexSvx) const
     114             :         {
     115           0 :             const GeoTexSvxGradient* pCompare = dynamic_cast< const GeoTexSvxGradient* >(&rGeoTexSvx);
     116             :             return (pCompare
     117           0 :                 && maGradientInfo.maTextureTransform == pCompare->maGradientInfo.maTextureTransform
     118           0 :                 && maTargetRange == pCompare->maTargetRange
     119             :                 && maGradientInfo.mnSteps == pCompare->maGradientInfo.mnSteps
     120             :                 && maGradientInfo.mfAspectRatio == pCompare->maGradientInfo.mfAspectRatio
     121           0 :                 && mfBorder == pCompare->mfBorder);
     122             :         }
     123             :     } // end of namespace texture
     124             : } // end of namespace drawinglayer
     125             : 
     126             : //////////////////////////////////////////////////////////////////////////////
     127             : 
     128             : namespace drawinglayer
     129             : {
     130             :     namespace texture
     131             :     {
     132           3 :         GeoTexSvxGradientLinear::GeoTexSvxGradientLinear(const basegfx::B2DRange& rTargetRange, const basegfx::BColor& rStart, const basegfx::BColor& rEnd, sal_uInt32 nSteps, double fBorder, double fAngle)
     133           3 :         :   GeoTexSvxGradient(rTargetRange, rStart, rEnd, nSteps, fBorder)
     134             :         {
     135             :             basegfx::tools::createLinearODFGradientInfo(maGradientInfo,
     136             :                                                         rTargetRange,
     137             :                                                         nSteps,
     138             :                                                         fBorder,
     139           3 :                                                         fAngle);
     140           3 :         }
     141             : 
     142           3 :         GeoTexSvxGradientLinear::~GeoTexSvxGradientLinear()
     143             :         {
     144           3 :         }
     145             : 
     146           3 :         void GeoTexSvxGradientLinear::appendTransformations(::std::vector< basegfx::B2DHomMatrix >& rMatrices)
     147             :         {
     148           3 :             if(maGradientInfo.mnSteps)
     149             :             {
     150           3 :                 const double fStripeWidth(1.0 / maGradientInfo.mnSteps);
     151           6 :                 for(sal_uInt32 a(1L); a < maGradientInfo.mnSteps; a++)
     152             :                 {
     153           3 :                     const basegfx::B2DRange aRect(0.0, fStripeWidth * a, 1.0, 1.0);
     154           3 :                     impAppendMatrix(rMatrices, aRect);
     155             :                 }
     156             :             }
     157           3 :         }
     158             : 
     159           3 :         void GeoTexSvxGradientLinear::appendColors(::std::vector< basegfx::BColor >& rColors)
     160             :         {
     161           3 :             if(maGradientInfo.mnSteps)
     162             :             {
     163           3 :                 rColors.push_back(maStart);
     164             : 
     165           6 :                 for(sal_uInt32 a(1L); a < maGradientInfo.mnSteps; a++)
     166             :                 {
     167           3 :                     rColors.push_back(interpolate(maStart, maEnd, (double)a / (double)(maGradientInfo.mnSteps + 1L)));
     168             :                 }
     169             :             }
     170           3 :         }
     171             : 
     172           0 :         void GeoTexSvxGradientLinear::modifyBColor(const basegfx::B2DPoint& rUV, basegfx::BColor& rBColor, double& /*rfOpacity*/) const
     173             :         {
     174           0 :             const double fScaler(basegfx::tools::getLinearGradientAlpha(rUV, maGradientInfo));
     175             : 
     176           0 :             rBColor = (maStart * (1.0 - fScaler)) + (maEnd * fScaler);
     177           0 :         }
     178             :     } // end of namespace texture
     179             : } // end of namespace drawinglayer
     180             : 
     181             : //////////////////////////////////////////////////////////////////////////////
     182             : 
     183             : namespace drawinglayer
     184             : {
     185             :     namespace texture
     186             :     {
     187           0 :         GeoTexSvxGradientAxial::GeoTexSvxGradientAxial(const basegfx::B2DRange& rTargetRange, const basegfx::BColor& rStart, const basegfx::BColor& rEnd, sal_uInt32 nSteps, double fBorder, double fAngle)
     188           0 :         :   GeoTexSvxGradient(rTargetRange, rStart, rEnd, nSteps, fBorder)
     189             :         {
     190             :             basegfx::tools::createAxialODFGradientInfo(maGradientInfo,
     191             :                                                        rTargetRange,
     192             :                                                        nSteps,
     193             :                                                        fBorder,
     194           0 :                                                        fAngle);
     195           0 :         }
     196             : 
     197           0 :         GeoTexSvxGradientAxial::~GeoTexSvxGradientAxial()
     198             :         {
     199           0 :         }
     200             : 
     201           0 :         void GeoTexSvxGradientAxial::appendTransformations(::std::vector< basegfx::B2DHomMatrix >& rMatrices)
     202             :         {
     203           0 :             if(maGradientInfo.mnSteps)
     204             :             {
     205           0 :                 const double fStripeWidth=1.0 / (maGradientInfo.mnSteps - 1L);
     206           0 :                 for(sal_uInt32 a(maGradientInfo.mnSteps-1L); a != 0; a--)
     207             :                 {
     208           0 :                     const basegfx::B2DRange aRect(0, 0, 1.0, fStripeWidth * a);
     209           0 :                     impAppendMatrix(rMatrices, aRect);
     210             :                 }
     211             :             }
     212           0 :         }
     213             : 
     214           0 :         void GeoTexSvxGradientAxial::appendColors(::std::vector< basegfx::BColor >& rColors)
     215             :         {
     216           0 :             if(maGradientInfo.mnSteps)
     217             :             {
     218           0 :                 rColors.push_back(maEnd);
     219             : 
     220           0 :                 for(sal_uInt32 a(1L); a < maGradientInfo.mnSteps; a++)
     221             :                 {
     222           0 :                     rColors.push_back(interpolate(maEnd, maStart, (double)a / (double)maGradientInfo.mnSteps));
     223             :                 }
     224             :             }
     225           0 :         }
     226             : 
     227           0 :         void GeoTexSvxGradientAxial::modifyBColor(const basegfx::B2DPoint& rUV, basegfx::BColor& rBColor, double& /*rfOpacity*/) const
     228             :         {
     229           0 :             const double fScaler(basegfx::tools::getAxialGradientAlpha(rUV, maGradientInfo));
     230             : 
     231           0 :             rBColor = (maStart * (1.0 - fScaler)) + (maEnd * fScaler);
     232           0 :         }
     233             :     } // end of namespace texture
     234             : } // end of namespace drawinglayer
     235             : 
     236             : //////////////////////////////////////////////////////////////////////////////
     237             : 
     238             : namespace drawinglayer
     239             : {
     240             :     namespace texture
     241             :     {
     242           0 :         GeoTexSvxGradientRadial::GeoTexSvxGradientRadial(const basegfx::B2DRange& rTargetRange, const basegfx::BColor& rStart, const basegfx::BColor& rEnd, sal_uInt32 nSteps, double fBorder, double fOffsetX, double fOffsetY)
     243           0 :         :   GeoTexSvxGradient(rTargetRange, rStart, rEnd, nSteps, fBorder)
     244             :         {
     245             :             basegfx::tools::createRadialODFGradientInfo(maGradientInfo,
     246             :                                                         rTargetRange,
     247             :                                                         basegfx::B2DVector(fOffsetX,fOffsetY),
     248             :                                                         nSteps,
     249           0 :                                                         fBorder);
     250           0 :         }
     251             : 
     252           0 :         GeoTexSvxGradientRadial::~GeoTexSvxGradientRadial()
     253             :         {
     254           0 :         }
     255             : 
     256           0 :         void GeoTexSvxGradientRadial::appendTransformations(::std::vector< basegfx::B2DHomMatrix >& rMatrices)
     257             :         {
     258           0 :             if(maGradientInfo.mnSteps)
     259             :             {
     260           0 :                 const double fStepSize=1.0 / maGradientInfo.mnSteps;
     261           0 :                 for(sal_uInt32 a(maGradientInfo.mnSteps-1L); a > 0; a--)
     262             :                 {
     263           0 :                     const basegfx::B2DRange aRect(0, 0, fStepSize*a, fStepSize*a);
     264           0 :                     impAppendMatrix(rMatrices, aRect);
     265             :                 }
     266             :             }
     267           0 :         }
     268             : 
     269           0 :         void GeoTexSvxGradientRadial::appendColors(::std::vector< basegfx::BColor >& rColors)
     270             :         {
     271           0 :             impAppendColorsRadial(rColors);
     272           0 :         }
     273             : 
     274           0 :         void GeoTexSvxGradientRadial::modifyBColor(const basegfx::B2DPoint& rUV, basegfx::BColor& rBColor, double& /*rfOpacity*/) const
     275             :         {
     276           0 :             const double fScaler(basegfx::tools::getRadialGradientAlpha(rUV, maGradientInfo));
     277             : 
     278           0 :             rBColor = (maStart * (1.0 - fScaler)) + (maEnd * fScaler);
     279           0 :         }
     280             :     } // end of namespace texture
     281             : } // end of namespace drawinglayer
     282             : 
     283             : //////////////////////////////////////////////////////////////////////////////
     284             : 
     285             : namespace drawinglayer
     286             : {
     287             :     namespace texture
     288             :     {
     289           0 :         GeoTexSvxGradientElliptical::GeoTexSvxGradientElliptical(const basegfx::B2DRange& rTargetRange, const basegfx::BColor& rStart, const basegfx::BColor& rEnd, sal_uInt32 nSteps, double fBorder, double fOffsetX, double fOffsetY, double fAngle)
     290           0 :         :   GeoTexSvxGradient(rTargetRange, rStart, rEnd, nSteps, fBorder)
     291             :         {
     292             :             basegfx::tools::createEllipticalODFGradientInfo(maGradientInfo,
     293             :                                                             rTargetRange,
     294             :                                                             basegfx::B2DVector(fOffsetX,fOffsetY),
     295             :                                                             nSteps,
     296             :                                                             fBorder,
     297           0 :                                                             fAngle);
     298           0 :         }
     299             : 
     300           0 :         GeoTexSvxGradientElliptical::~GeoTexSvxGradientElliptical()
     301             :         {
     302           0 :         }
     303             : 
     304           0 :         void GeoTexSvxGradientElliptical::appendTransformations(::std::vector< basegfx::B2DHomMatrix >& rMatrices)
     305             :         {
     306           0 :             if(maGradientInfo.mnSteps)
     307             :             {
     308           0 :                 double fWidth(1);
     309           0 :                 double fHeight(1);
     310             :                 double fIncrementX, fIncrementY;
     311             : 
     312           0 :                 if(maGradientInfo.mfAspectRatio > 1.0)
     313             :                 {
     314           0 :                     fIncrementY = fHeight / maGradientInfo.mnSteps;
     315           0 :                     fIncrementX = fIncrementY / maGradientInfo.mfAspectRatio;
     316             :                 }
     317             :                 else
     318             :                 {
     319           0 :                     fIncrementX = fWidth / maGradientInfo.mnSteps;
     320           0 :                     fIncrementY = fIncrementX * maGradientInfo.mfAspectRatio;
     321             :                 }
     322             : 
     323           0 :                 for(sal_uInt32 a(1L); a < maGradientInfo.mnSteps; a++)
     324             :                 {
     325             :                     // next step
     326           0 :                     fWidth  -= fIncrementX;
     327           0 :                     fHeight -= fIncrementY;
     328             : 
     329             :                     // create matrix
     330           0 :                     const basegfx::B2DRange aRect(0, 0, fWidth, fHeight);
     331           0 :                     impAppendMatrix(rMatrices, aRect);
     332             :                 }
     333             :             }
     334           0 :         }
     335             : 
     336           0 :         void GeoTexSvxGradientElliptical::appendColors(::std::vector< basegfx::BColor >& rColors)
     337             :         {
     338           0 :             impAppendColorsRadial(rColors);
     339           0 :         }
     340             : 
     341           0 :         void GeoTexSvxGradientElliptical::modifyBColor(const basegfx::B2DPoint& rUV, basegfx::BColor& rBColor, double& /*rfOpacity*/) const
     342             :         {
     343           0 :             const double fScaler(basegfx::tools::getEllipticalGradientAlpha(rUV, maGradientInfo));
     344             : 
     345           0 :             rBColor = (maStart * (1.0 - fScaler)) + (maEnd * fScaler);
     346           0 :         }
     347             :     } // end of namespace texture
     348             : } // end of namespace drawinglayer
     349             : 
     350             : //////////////////////////////////////////////////////////////////////////////
     351             : 
     352             : namespace drawinglayer
     353             : {
     354             :     namespace texture
     355             :     {
     356           0 :         GeoTexSvxGradientSquare::GeoTexSvxGradientSquare(const basegfx::B2DRange& rTargetRange, const basegfx::BColor& rStart, const basegfx::BColor& rEnd, sal_uInt32 nSteps, double fBorder, double fOffsetX, double fOffsetY, double fAngle)
     357           0 :         :   GeoTexSvxGradient(rTargetRange, rStart, rEnd, nSteps, fBorder)
     358             :         {
     359             :             basegfx::tools::createSquareODFGradientInfo(maGradientInfo,
     360             :                                                         rTargetRange,
     361             :                                                         basegfx::B2DVector(fOffsetX,fOffsetY),
     362             :                                                         nSteps,
     363             :                                                         fBorder,
     364           0 :                                                         fAngle);
     365           0 :         }
     366             : 
     367           0 :         GeoTexSvxGradientSquare::~GeoTexSvxGradientSquare()
     368             :         {
     369           0 :         }
     370             : 
     371           0 :         void GeoTexSvxGradientSquare::appendTransformations(::std::vector< basegfx::B2DHomMatrix >& rMatrices)
     372             :         {
     373           0 :             if(maGradientInfo.mnSteps)
     374             :             {
     375           0 :                 const double fStepSize=1.0 / maGradientInfo.mnSteps;
     376           0 :                 for(sal_uInt32 a(maGradientInfo.mnSteps-1L); a > 0; a--)
     377             :                 {
     378           0 :                     const basegfx::B2DRange aRect(0, 0, fStepSize*a, fStepSize*a);
     379           0 :                     impAppendMatrix(rMatrices, aRect);
     380             :                 }
     381             :             }
     382           0 :         }
     383             : 
     384           0 :         void GeoTexSvxGradientSquare::appendColors(::std::vector< basegfx::BColor >& rColors)
     385             :         {
     386           0 :             impAppendColorsRadial(rColors);
     387           0 :         }
     388             : 
     389           0 :         void GeoTexSvxGradientSquare::modifyBColor(const basegfx::B2DPoint& rUV, basegfx::BColor& rBColor, double& /*rfOpacity*/) const
     390             :         {
     391           0 :             const double fScaler(basegfx::tools::getSquareGradientAlpha(rUV, maGradientInfo));
     392             : 
     393           0 :             rBColor = (maStart * (1.0 - fScaler)) + (maEnd * fScaler);
     394           0 :         }
     395             :     } // end of namespace texture
     396             : } // end of namespace drawinglayer
     397             : 
     398             : //////////////////////////////////////////////////////////////////////////////
     399             : 
     400             : namespace drawinglayer
     401             : {
     402             :     namespace texture
     403             :     {
     404           0 :         GeoTexSvxGradientRect::GeoTexSvxGradientRect(const basegfx::B2DRange& rTargetRange, const basegfx::BColor& rStart, const basegfx::BColor& rEnd, sal_uInt32 nSteps, double fBorder, double fOffsetX, double fOffsetY, double fAngle)
     405           0 :         :   GeoTexSvxGradient(rTargetRange, rStart, rEnd, nSteps, fBorder)
     406             :         {
     407             :             basegfx::tools::createRectangularODFGradientInfo(maGradientInfo,
     408             :                                                              rTargetRange,
     409             :                                                              basegfx::B2DVector(fOffsetX,fOffsetY),
     410             :                                                              nSteps,
     411             :                                                              fBorder,
     412           0 :                                                              fAngle);
     413           0 :         }
     414             : 
     415           0 :         GeoTexSvxGradientRect::~GeoTexSvxGradientRect()
     416             :         {
     417           0 :         }
     418             : 
     419           0 :         void GeoTexSvxGradientRect::appendTransformations(::std::vector< basegfx::B2DHomMatrix >& rMatrices)
     420             :         {
     421           0 :             if(maGradientInfo.mnSteps)
     422             :             {
     423           0 :                 double fWidth(1);
     424           0 :                 double fHeight(1);
     425             :                 double fIncrementX, fIncrementY;
     426             : 
     427           0 :                 if(maGradientInfo.mfAspectRatio > 1.0)
     428             :                 {
     429           0 :                     fIncrementY = fHeight / maGradientInfo.mnSteps;
     430           0 :                     fIncrementX = fIncrementY / maGradientInfo.mfAspectRatio;
     431             :                 }
     432             :                 else
     433             :                 {
     434           0 :                     fIncrementX = fWidth / maGradientInfo.mnSteps;
     435           0 :                     fIncrementY = fIncrementX * maGradientInfo.mfAspectRatio;
     436             :                 }
     437             : 
     438           0 :                 for(sal_uInt32 a(1L); a < maGradientInfo.mnSteps; a++)
     439             :                 {
     440             :                     // next step
     441           0 :                     fWidth  -= fIncrementX;
     442           0 :                     fHeight -= fIncrementY;
     443             : 
     444             :                     // create matrix
     445           0 :                     const basegfx::B2DRange aRect(0, 0, fWidth, fHeight);
     446           0 :                     impAppendMatrix(rMatrices, aRect);
     447             :                 }
     448             :             }
     449           0 :         }
     450             : 
     451           0 :         void GeoTexSvxGradientRect::appendColors(::std::vector< basegfx::BColor >& rColors)
     452             :         {
     453           0 :             impAppendColorsRadial(rColors);
     454           0 :         }
     455             : 
     456           0 :         void GeoTexSvxGradientRect::modifyBColor(const basegfx::B2DPoint& rUV, basegfx::BColor& rBColor, double& /*rfOpacity*/) const
     457             :         {
     458           0 :             const double fScaler(basegfx::tools::getRectangularGradientAlpha(rUV, maGradientInfo));
     459             : 
     460           0 :             rBColor = (maStart * (1.0 - fScaler)) + (maEnd * fScaler);
     461           0 :         }
     462             :     } // end of namespace texture
     463             : } // end of namespace drawinglayer
     464             : 
     465             : //////////////////////////////////////////////////////////////////////////////
     466             : 
     467             : namespace drawinglayer
     468             : {
     469             :     namespace texture
     470             :     {
     471           0 :         GeoTexSvxHatch::GeoTexSvxHatch(const basegfx::B2DRange& rTargetRange, double fDistance, double fAngle)
     472             :         :   mfDistance(0.1),
     473             :             mfAngle(fAngle),
     474           0 :             mnSteps(10L)
     475             :         {
     476           0 :             double fTargetSizeX(rTargetRange.getWidth());
     477           0 :             double fTargetSizeY(rTargetRange.getHeight());
     478           0 :             double fTargetOffsetX(rTargetRange.getMinX());
     479           0 :             double fTargetOffsetY(rTargetRange.getMinY());
     480             : 
     481           0 :             fAngle = -fAngle;
     482             : 
     483             :             // add object expansion
     484           0 :             if(0.0 != fAngle)
     485             :             {
     486           0 :                 const double fAbsCos(fabs(cos(fAngle)));
     487           0 :                 const double fAbsSin(fabs(sin(fAngle)));
     488           0 :                 const double fNewX(fTargetSizeX * fAbsCos + fTargetSizeY * fAbsSin);
     489           0 :                 const double fNewY(fTargetSizeY * fAbsCos + fTargetSizeX * fAbsSin);
     490           0 :                 fTargetOffsetX -= (fNewX - fTargetSizeX) / 2.0;
     491           0 :                 fTargetOffsetY -= (fNewY - fTargetSizeY) / 2.0;
     492           0 :                 fTargetSizeX = fNewX;
     493           0 :                 fTargetSizeY = fNewY;
     494             :             }
     495             : 
     496             :             // add object scale before rotate
     497           0 :             maTextureTransform.scale(fTargetSizeX, fTargetSizeY);
     498             : 
     499             :             // add texture rotate after scale to keep perpendicular angles
     500           0 :             if(0.0 != fAngle)
     501             :             {
     502           0 :                 basegfx::B2DPoint aCenter(0.5, 0.5);
     503           0 :                 aCenter *= maTextureTransform;
     504             : 
     505             :                 maTextureTransform = basegfx::tools::createRotateAroundPoint(aCenter, fAngle)
     506           0 :                     * maTextureTransform;
     507             :             }
     508             : 
     509             :             // add object translate
     510           0 :             maTextureTransform.translate(fTargetOffsetX, fTargetOffsetY);
     511             : 
     512             :             // prepare height for texture
     513           0 :             const double fSteps((0.0 != fDistance) ? fTargetSizeY / fDistance : 10.0);
     514           0 :             mnSteps = basegfx::fround(fSteps + 0.5);
     515           0 :             mfDistance = 1.0 / fSteps;
     516             : 
     517             :             // build transform from u,v to [0.0 .. 1.0]. As base, use inverse texture transform
     518           0 :             maBackTextureTransform = maTextureTransform;
     519           0 :             maBackTextureTransform.invert();
     520           0 :         }
     521             : 
     522           0 :         GeoTexSvxHatch::~GeoTexSvxHatch()
     523             :         {
     524           0 :         }
     525             : 
     526           0 :         bool GeoTexSvxHatch::operator==(const GeoTexSvx& rGeoTexSvx) const
     527             :         {
     528           0 :             const GeoTexSvxHatch* pCompare = dynamic_cast< const GeoTexSvxHatch* >(&rGeoTexSvx);
     529             :             return (pCompare
     530           0 :                 && maTextureTransform == pCompare->maTextureTransform
     531             :                 && mfDistance == pCompare->mfDistance
     532             :                 && mfAngle == pCompare->mfAngle
     533           0 :                 && mnSteps == pCompare->mnSteps);
     534             :         }
     535             : 
     536           0 :         void GeoTexSvxHatch::appendTransformations(::std::vector< basegfx::B2DHomMatrix >& rMatrices)
     537             :         {
     538           0 :             for(sal_uInt32 a(1L); a < mnSteps; a++)
     539             :             {
     540             :                 // create matrix
     541           0 :                 const double fOffset(mfDistance * (double)a);
     542           0 :                 basegfx::B2DHomMatrix aNew;
     543           0 :                 aNew.set(1, 2, fOffset);
     544           0 :                 rMatrices.push_back(maTextureTransform * aNew);
     545           0 :             }
     546           0 :         }
     547             : 
     548           0 :         double GeoTexSvxHatch::getDistanceToHatch(const basegfx::B2DPoint& rUV) const
     549             :         {
     550           0 :             const basegfx::B2DPoint aCoor(maBackTextureTransform * rUV);
     551           0 :             return fmod(aCoor.getY(), mfDistance);
     552             :         }
     553             :     } // end of namespace texture
     554             : } // end of namespace drawinglayer
     555             : 
     556             : //////////////////////////////////////////////////////////////////////////////
     557             : 
     558             : namespace drawinglayer
     559             : {
     560             :     namespace texture
     561             :     {
     562           0 :         GeoTexSvxTiled::GeoTexSvxTiled(const basegfx::B2DPoint& rTopLeft, const basegfx::B2DVector& rSize)
     563             :         :   maTopLeft(rTopLeft),
     564           0 :             maSize(rSize)
     565             :         {
     566           0 :             if(basegfx::fTools::lessOrEqual(maSize.getX(), 0.0))
     567             :             {
     568           0 :                 maSize.setX(1.0);
     569             :             }
     570             : 
     571           0 :             if(basegfx::fTools::lessOrEqual(maSize.getY(), 0.0))
     572             :             {
     573           0 :                 maSize.setY(1.0);
     574             :             }
     575           0 :         }
     576             : 
     577           0 :         GeoTexSvxTiled::~GeoTexSvxTiled()
     578             :         {
     579           0 :         }
     580             : 
     581           0 :         bool GeoTexSvxTiled::operator==(const GeoTexSvx& rGeoTexSvx) const
     582             :         {
     583           0 :             const GeoTexSvxTiled* pCompare = dynamic_cast< const GeoTexSvxTiled* >(&rGeoTexSvx);
     584             :             return (pCompare
     585           0 :                 && maTopLeft == pCompare->maTopLeft
     586           0 :                 && maSize == pCompare->maSize);
     587             :         }
     588             : 
     589           0 :         void GeoTexSvxTiled::appendTransformations(::std::vector< basegfx::B2DHomMatrix >& rMatrices)
     590             :         {
     591           0 :             double fStartX(maTopLeft.getX());
     592           0 :             double fStartY(maTopLeft.getY());
     593             : 
     594           0 :             if(basegfx::fTools::more(fStartX, 0.0))
     595             :             {
     596           0 :                 fStartX -= (floor(fStartX / maSize.getX()) + 1.0) * maSize.getX();
     597             :             }
     598             : 
     599           0 :             if(basegfx::fTools::less(fStartX + maSize.getX(), 0.0))
     600             :             {
     601           0 :                 fStartX += floor(-fStartX / maSize.getX()) * maSize.getX();
     602             :             }
     603             : 
     604           0 :             if(basegfx::fTools::more(fStartY, 0.0))
     605             :             {
     606           0 :                 fStartY -= (floor(fStartY / maSize.getY()) + 1.0) * maSize.getY();
     607             :             }
     608             : 
     609           0 :             if(basegfx::fTools::less(fStartY + maSize.getY(), 0.0))
     610             :             {
     611           0 :                 fStartY += floor(-fStartY / maSize.getY()) * maSize.getY();
     612             :             }
     613             : 
     614           0 :             for(double fPosY(fStartY); basegfx::fTools::less(fPosY, 1.0); fPosY += maSize.getY())
     615             :             {
     616           0 :                 for(double fPosX(fStartX); basegfx::fTools::less(fPosX, 1.0); fPosX += maSize.getX())
     617             :                 {
     618           0 :                     basegfx::B2DHomMatrix aNew;
     619             : 
     620           0 :                     aNew.set(0, 0, maSize.getX());
     621           0 :                     aNew.set(1, 1, maSize.getY());
     622           0 :                     aNew.set(0, 2, fPosX);
     623           0 :                     aNew.set(1, 2, fPosY);
     624             : 
     625           0 :                     rMatrices.push_back(aNew);
     626           0 :                 }
     627             :             }
     628           0 :         }
     629             :     } // end of namespace texture
     630             : } // end of namespace drawinglayer
     631             : 
     632             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10