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