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