xref: /AOO41X/main/drawinglayer/source/texture/texture.cxx (revision 464702f4578bd67db020a330afd07883930c5e07)
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