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