1035a2f44SArmin Le Grand /**************************************************************
2035a2f44SArmin Le Grand  *
3035a2f44SArmin Le Grand  * Licensed to the Apache Software Foundation (ASF) under one
4035a2f44SArmin Le Grand  * or more contributor license agreements.  See the NOTICE file
5035a2f44SArmin Le Grand  * distributed with this work for additional information
6035a2f44SArmin Le Grand  * regarding copyright ownership.  The ASF licenses this file
7035a2f44SArmin Le Grand  * to you under the Apache License, Version 2.0 (the
8035a2f44SArmin Le Grand  * "License"); you may not use this file except in compliance
9035a2f44SArmin Le Grand  * with the License.  You may obtain a copy of the License at
10035a2f44SArmin Le Grand  *
11035a2f44SArmin Le Grand  *   http://www.apache.org/licenses/LICENSE-2.0
12035a2f44SArmin Le Grand  *
13035a2f44SArmin Le Grand  * Unless required by applicable law or agreed to in writing,
14035a2f44SArmin Le Grand  * software distributed under the License is distributed on an
15035a2f44SArmin Le Grand  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16035a2f44SArmin Le Grand  * KIND, either express or implied.  See the License for the
17035a2f44SArmin Le Grand  * specific language governing permissions and limitations
18035a2f44SArmin Le Grand  * under the License.
19035a2f44SArmin Le Grand  *
20035a2f44SArmin Le Grand  *************************************************************/
21035a2f44SArmin Le Grand 
22035a2f44SArmin Le Grand // MARKER(update_precomp.py): autogen include statement, do not remove
23035a2f44SArmin Le Grand #include "precompiled_drawinglayer.hxx"
24035a2f44SArmin Le Grand 
25035a2f44SArmin Le Grand #include <drawinglayer/primitive2d/graphicprimitivehelper2d.hxx>
26035a2f44SArmin Le Grand #include <drawinglayer/animation/animationtiming.hxx>
27035a2f44SArmin Le Grand #include <drawinglayer/primitive2d/bitmapprimitive2d.hxx>
28035a2f44SArmin Le Grand #include <drawinglayer/primitive2d/animatedprimitive2d.hxx>
29035a2f44SArmin Le Grand #include <drawinglayer/primitive2d/metafileprimitive2d.hxx>
30035a2f44SArmin Le Grand #include <drawinglayer/primitive2d/transformprimitive2d.hxx>
31035a2f44SArmin Le Grand #include <drawinglayer/primitive2d/maskprimitive2d.hxx>
32*49c58f9bSArmin Le Grand #include <drawinglayer/primitive2d/modifiedcolorprimitive2d.hxx>
33035a2f44SArmin Le Grand #include <basegfx/polygon/b2dpolygon.hxx>
34035a2f44SArmin Le Grand #include <basegfx/polygon/b2dpolygontools.hxx>
35*49c58f9bSArmin Le Grand #include <basegfx/numeric/ftools.hxx>
36035a2f44SArmin Le Grand 
37035a2f44SArmin Le Grand //////////////////////////////////////////////////////////////////////////////
38035a2f44SArmin Le Grand // helper class for animated graphics
39035a2f44SArmin Le Grand 
40035a2f44SArmin Le Grand #include <vcl/animate.hxx>
41035a2f44SArmin Le Grand #include <vcl/graph.hxx>
42035a2f44SArmin Le Grand #include <vcl/virdev.hxx>
43035a2f44SArmin Le Grand #include <vcl/svapp.hxx>
44035a2f44SArmin Le Grand #include <vcl/metaact.hxx>
45035a2f44SArmin Le Grand 
46035a2f44SArmin Le Grand //////////////////////////////////////////////////////////////////////////////
47035a2f44SArmin Le Grand // includes for testing MetafilePrimitive2D::create2DDecomposition
48035a2f44SArmin Le Grand 
49035a2f44SArmin Le Grand // this switch defines if the test code is included or not
50035a2f44SArmin Le Grand #undef USE_DEBUG_CODE_TO_TEST_METAFILE_DECOMPOSE
51035a2f44SArmin Le Grand 
52035a2f44SArmin Le Grand #ifdef USE_DEBUG_CODE_TO_TEST_METAFILE_DECOMPOSE
53035a2f44SArmin Le Grand #include <vcl/gradient.hxx>
54035a2f44SArmin Le Grand #include <vcl/pngread.hxx>
55035a2f44SArmin Le Grand #include <vcl/lineinfo.hxx>
56035a2f44SArmin Le Grand #endif // USE_DEBUG_CODE_TO_TEST_METAFILE_DECOMPOSE
57035a2f44SArmin Le Grand 
58035a2f44SArmin Le Grand //////////////////////////////////////////////////////////////////////////////
59035a2f44SArmin Le Grand 
60035a2f44SArmin Le Grand namespace
61035a2f44SArmin Le Grand {
62035a2f44SArmin Le Grand 	struct animationStep
63035a2f44SArmin Le Grand 	{
64035a2f44SArmin Le Grand 		BitmapEx								maBitmapEx;
65035a2f44SArmin Le Grand 		sal_uInt32								mnTime;
66035a2f44SArmin Le Grand 	};
67035a2f44SArmin Le Grand 
68035a2f44SArmin Le Grand 	class animatedBitmapExPreparator
69035a2f44SArmin Le Grand 	{
70035a2f44SArmin Le Grand 		::Animation								maAnimation;
71035a2f44SArmin Le Grand 		::std::vector< animationStep >			maSteps;
72035a2f44SArmin Le Grand 
73035a2f44SArmin Le Grand 		sal_uInt32 generateStepTime(sal_uInt32 nIndex) const;
74035a2f44SArmin Le Grand 
75035a2f44SArmin Le Grand 	public:
76035a2f44SArmin Le Grand 		animatedBitmapExPreparator(const Graphic& rGraphic);
77035a2f44SArmin Le Grand 
78035a2f44SArmin Le Grand 		sal_uInt32 count() const { return maSteps.size(); }
79035a2f44SArmin Le Grand 		sal_uInt32 loopCount() const { return (sal_uInt32)maAnimation.GetLoopCount(); }
80035a2f44SArmin Le Grand 		sal_uInt32 stepTime(sal_uInt32 a) const { return maSteps[a].mnTime; }
81035a2f44SArmin Le Grand 		const BitmapEx& stepBitmapEx(sal_uInt32 a) const { return maSteps[a].maBitmapEx; }
82035a2f44SArmin Le Grand 	};
83035a2f44SArmin Le Grand 
84035a2f44SArmin Le Grand 	sal_uInt32 animatedBitmapExPreparator::generateStepTime(sal_uInt32 nIndex) const
85035a2f44SArmin Le Grand 	{
86035a2f44SArmin Le Grand 		const AnimationBitmap& rAnimBitmap = maAnimation.Get(sal_uInt16(nIndex));
87035a2f44SArmin Le Grand 		sal_uInt32 nWaitTime(rAnimBitmap.nWait * 10);
88035a2f44SArmin Le Grand 
89035a2f44SArmin Le Grand 		// #115934#
90035a2f44SArmin Le Grand 		// Take care of special value for MultiPage TIFFs. ATM these shall just
91035a2f44SArmin Le Grand 		// show their first page. Later we will offer some switching when object
92035a2f44SArmin Le Grand 		// is selected.
93035a2f44SArmin Le Grand 		if(ANIMATION_TIMEOUT_ON_CLICK == rAnimBitmap.nWait)
94035a2f44SArmin Le Grand 		{
95035a2f44SArmin Le Grand 			// ATM the huge value would block the timer, so
96035a2f44SArmin Le Grand 			// use a long time to show first page (whole day)
97035a2f44SArmin Le Grand 			nWaitTime = 100 * 60 * 60 * 24;
98035a2f44SArmin Le Grand 		}
99035a2f44SArmin Le Grand 
100035a2f44SArmin Le Grand 		// Bad trap: There are animated gifs with no set WaitTime (!).
101035a2f44SArmin Le Grand 		// In that case use a default value.
102035a2f44SArmin Le Grand 		if(0L == nWaitTime)
103035a2f44SArmin Le Grand 		{
104035a2f44SArmin Le Grand 			nWaitTime = 100L;
105035a2f44SArmin Le Grand 		}
106035a2f44SArmin Le Grand 
107035a2f44SArmin Le Grand 		return nWaitTime;
108035a2f44SArmin Le Grand 	}
109035a2f44SArmin Le Grand 
110035a2f44SArmin Le Grand 	animatedBitmapExPreparator::animatedBitmapExPreparator(const Graphic& rGraphic)
111035a2f44SArmin Le Grand 	:	maAnimation(rGraphic.GetAnimation())
112035a2f44SArmin Le Grand 	{
113035a2f44SArmin Le Grand 		OSL_ENSURE(GRAPHIC_BITMAP == rGraphic.GetType() && rGraphic.IsAnimated(), "animatedBitmapExPreparator: graphic is not animated (!)");
114035a2f44SArmin Le Grand 
115035a2f44SArmin Le Grand 		// #128539# secure access to Animation, looks like there exist animated GIFs out there
116035a2f44SArmin Le Grand 		// with a step count of zero
117035a2f44SArmin Le Grand 		if(maAnimation.Count())
118035a2f44SArmin Le Grand 		{
119035a2f44SArmin Le Grand 			VirtualDevice aVirtualDevice(*Application::GetDefaultDevice());
120035a2f44SArmin Le Grand 			VirtualDevice aVirtualDeviceMask(*Application::GetDefaultDevice(), 1L);
121035a2f44SArmin Le Grand 
122035a2f44SArmin Le Grand 			// Prepare VirtualDevices and their states
123035a2f44SArmin Le Grand 			aVirtualDevice.EnableMapMode(sal_False);
124035a2f44SArmin Le Grand 			aVirtualDeviceMask.EnableMapMode(sal_False);
125035a2f44SArmin Le Grand 			aVirtualDevice.SetOutputSizePixel(maAnimation.GetDisplaySizePixel());
126035a2f44SArmin Le Grand 			aVirtualDeviceMask.SetOutputSizePixel(maAnimation.GetDisplaySizePixel());
127035a2f44SArmin Le Grand 			aVirtualDevice.Erase();
128035a2f44SArmin Le Grand 			aVirtualDeviceMask.Erase();
129035a2f44SArmin Le Grand 
130035a2f44SArmin Le Grand 			for(sal_uInt16 a(0L); a < maAnimation.Count(); a++)
131035a2f44SArmin Le Grand 			{
132035a2f44SArmin Le Grand 				animationStep aNextStep;
133035a2f44SArmin Le Grand 				aNextStep.mnTime = generateStepTime(a);
134035a2f44SArmin Le Grand 
135035a2f44SArmin Le Grand 				// prepare step
136035a2f44SArmin Le Grand 				const AnimationBitmap& rAnimBitmap = maAnimation.Get(sal_uInt16(a));
137035a2f44SArmin Le Grand 
138035a2f44SArmin Le Grand 				switch(rAnimBitmap.eDisposal)
139035a2f44SArmin Le Grand 				{
140035a2f44SArmin Le Grand 					case DISPOSE_NOT:
141035a2f44SArmin Le Grand 					{
142035a2f44SArmin Le Grand 						aVirtualDevice.DrawBitmapEx(rAnimBitmap.aPosPix, rAnimBitmap.aBmpEx);
143035a2f44SArmin Le Grand 						Bitmap aMask = rAnimBitmap.aBmpEx.GetMask();
144035a2f44SArmin Le Grand 
145035a2f44SArmin Le Grand 						if(aMask.IsEmpty())
146035a2f44SArmin Le Grand 						{
147035a2f44SArmin Le Grand 							const Point aEmpty;
148035a2f44SArmin Le Grand 							const Rectangle aRect(aEmpty, aVirtualDeviceMask.GetOutputSizePixel());
149035a2f44SArmin Le Grand 							const Wallpaper aWallpaper(COL_BLACK);
150035a2f44SArmin Le Grand 							aVirtualDeviceMask.DrawWallpaper(aRect, aWallpaper);
151035a2f44SArmin Le Grand 						}
152035a2f44SArmin Le Grand 						else
153035a2f44SArmin Le Grand 						{
154035a2f44SArmin Le Grand 							BitmapEx aExpandVisibilityMask = BitmapEx(aMask, aMask);
155035a2f44SArmin Le Grand 							aVirtualDeviceMask.DrawBitmapEx(rAnimBitmap.aPosPix, aExpandVisibilityMask);
156035a2f44SArmin Le Grand 						}
157035a2f44SArmin Le Grand 
158035a2f44SArmin Le Grand 						break;
159035a2f44SArmin Le Grand 					}
160035a2f44SArmin Le Grand 					case DISPOSE_BACK:
161035a2f44SArmin Le Grand 					{
162035a2f44SArmin Le Grand 						// #i70772# react on no mask, for primitives, too.
163035a2f44SArmin Le Grand 						const Bitmap aMask(rAnimBitmap.aBmpEx.GetMask());
164035a2f44SArmin Le Grand 						const Bitmap aContent(rAnimBitmap.aBmpEx.GetBitmap());
165035a2f44SArmin Le Grand 
166035a2f44SArmin Le Grand 						aVirtualDeviceMask.Erase();
167035a2f44SArmin Le Grand 						aVirtualDevice.DrawBitmap(rAnimBitmap.aPosPix, aContent);
168035a2f44SArmin Le Grand 
169035a2f44SArmin Le Grand 						if(aMask.IsEmpty())
170035a2f44SArmin Le Grand 						{
171035a2f44SArmin Le Grand 							const Rectangle aRect(rAnimBitmap.aPosPix, aContent.GetSizePixel());
172035a2f44SArmin Le Grand 							aVirtualDeviceMask.SetFillColor(COL_BLACK);
173035a2f44SArmin Le Grand 							aVirtualDeviceMask.SetLineColor();
174035a2f44SArmin Le Grand 							aVirtualDeviceMask.DrawRect(aRect);
175035a2f44SArmin Le Grand 						}
176035a2f44SArmin Le Grand 						else
177035a2f44SArmin Le Grand 						{
178035a2f44SArmin Le Grand 							aVirtualDeviceMask.DrawBitmap(rAnimBitmap.aPosPix, aMask);
179035a2f44SArmin Le Grand 						}
180035a2f44SArmin Le Grand 
181035a2f44SArmin Le Grand 						break;
182035a2f44SArmin Le Grand 					}
183035a2f44SArmin Le Grand 					case DISPOSE_FULL:
184035a2f44SArmin Le Grand 					{
185035a2f44SArmin Le Grand 						aVirtualDevice.DrawBitmapEx(rAnimBitmap.aPosPix, rAnimBitmap.aBmpEx);
186035a2f44SArmin Le Grand 						break;
187035a2f44SArmin Le Grand 					}
188035a2f44SArmin Le Grand 					case DISPOSE_PREVIOUS :
189035a2f44SArmin Le Grand 					{
190035a2f44SArmin Le Grand 						aVirtualDevice.DrawBitmapEx(rAnimBitmap.aPosPix, rAnimBitmap.aBmpEx);
191035a2f44SArmin Le Grand 						aVirtualDeviceMask.DrawBitmap(rAnimBitmap.aPosPix, rAnimBitmap.aBmpEx.GetMask());
192035a2f44SArmin Le Grand 						break;
193035a2f44SArmin Le Grand 					}
194035a2f44SArmin Le Grand 				}
195035a2f44SArmin Le Grand 
196035a2f44SArmin Le Grand 				// create BitmapEx
197035a2f44SArmin Le Grand 				Bitmap aMainBitmap = aVirtualDevice.GetBitmap(Point(), aVirtualDevice.GetOutputSizePixel());
198e4172a75SHerbert Dürr #if defined(MACOSX)
199e4172a75SHerbert Dürr 				AlphaMask aMaskBitmap( aVirtualDeviceMask.GetBitmap( Point(), aVirtualDeviceMask.GetOutputSizePixel()));
200e4172a75SHerbert Dürr #else
201e4172a75SHerbert Dürr 				Bitmap aMaskBitmap = aVirtualDeviceMask.GetBitmap( Point(), aVirtualDeviceMask.GetOutputSizePixel());
202e4172a75SHerbert Dürr #endif
203035a2f44SArmin Le Grand 				aNextStep.maBitmapEx = BitmapEx(aMainBitmap, aMaskBitmap);
204035a2f44SArmin Le Grand 
205035a2f44SArmin Le Grand 				// add to vector
206035a2f44SArmin Le Grand 				maSteps.push_back(aNextStep);
207035a2f44SArmin Le Grand 			}
208035a2f44SArmin Le Grand 		}
209035a2f44SArmin Le Grand 	}
210035a2f44SArmin Le Grand } // end of anonymous namespace
211035a2f44SArmin Le Grand 
212035a2f44SArmin Le Grand //////////////////////////////////////////////////////////////////////////////
213035a2f44SArmin Le Grand 
214035a2f44SArmin Le Grand namespace drawinglayer
215035a2f44SArmin Le Grand {
216035a2f44SArmin Le Grand 	namespace primitive2d
217035a2f44SArmin Le Grand 	{
218035a2f44SArmin Le Grand 		Primitive2DSequence create2DDecompositionOfGraphic(
219035a2f44SArmin Le Grand             const Graphic& rGraphic,
220035a2f44SArmin Le Grand             const basegfx::B2DHomMatrix& rTransform)
221035a2f44SArmin Le Grand 		{
222035a2f44SArmin Le Grand 			Primitive2DSequence aRetval;
223035a2f44SArmin Le Grand 
224035a2f44SArmin Le Grand             switch(rGraphic.GetType())
225035a2f44SArmin Le Grand 			{
226035a2f44SArmin Le Grand 				case GRAPHIC_BITMAP :
227035a2f44SArmin Le Grand 				{
228035a2f44SArmin Le Grand                     if(rGraphic.IsAnimated())
229035a2f44SArmin Le Grand 					{
230035a2f44SArmin Le Grand 						// prepare animation data
231035a2f44SArmin Le Grand 						animatedBitmapExPreparator aData(rGraphic);
232035a2f44SArmin Le Grand 
233035a2f44SArmin Le Grand 						if(aData.count())
234035a2f44SArmin Le Grand 						{
235035a2f44SArmin Le Grand 							// create sub-primitives for animated bitmap and the needed animation loop
236035a2f44SArmin Le Grand 							animation::AnimationEntryLoop aAnimationLoop(aData.loopCount() ? aData.loopCount() : 0xffff);
237035a2f44SArmin Le Grand 							Primitive2DSequence aBitmapPrimitives(aData.count());
238035a2f44SArmin Le Grand 
239035a2f44SArmin Le Grand 							for(sal_uInt32 a(0); a < aData.count(); a++)
240035a2f44SArmin Le Grand 							{
241035a2f44SArmin Le Grand                                 animation::AnimationEntryFixed aTime((double)aData.stepTime(a), (double)a / (double)aData.count());
242035a2f44SArmin Le Grand 								aAnimationLoop.append(aTime);
243035a2f44SArmin Le Grand 								aBitmapPrimitives[a] = new BitmapPrimitive2D(
244035a2f44SArmin Le Grand                                     aData.stepBitmapEx(a),
245035a2f44SArmin Le Grand                                     rTransform);
246035a2f44SArmin Le Grand 							}
247035a2f44SArmin Le Grand 
248035a2f44SArmin Le Grand 							// prepare animation list
249035a2f44SArmin Le Grand 							animation::AnimationEntryList aAnimationList;
250035a2f44SArmin Le Grand 							aAnimationList.append(aAnimationLoop);
251035a2f44SArmin Le Grand 
252035a2f44SArmin Le Grand 							// create and add animated switch primitive
253035a2f44SArmin Le Grand                             aRetval.realloc(1);
254035a2f44SArmin Le Grand 							aRetval[0] = new AnimatedSwitchPrimitive2D(
255035a2f44SArmin Le Grand                                 aAnimationList,
256035a2f44SArmin Le Grand                                 aBitmapPrimitives,
257035a2f44SArmin Le Grand                                 false);
258035a2f44SArmin Le Grand 						}
259035a2f44SArmin Le Grand 					}
260035a2f44SArmin Le Grand                     else if(rGraphic.getSvgData().get())
261035a2f44SArmin Le Grand                     {
262035a2f44SArmin Le Grand                         // embedded Svg fill, create embed transform
263035a2f44SArmin Le Grand                         const basegfx::B2DRange& rSvgRange(rGraphic.getSvgData()->getRange());
264035a2f44SArmin Le Grand 
265035a2f44SArmin Le Grand                         if(basegfx::fTools::more(rSvgRange.getWidth(), 0.0) && basegfx::fTools::more(rSvgRange.getHeight(), 0.0))
266035a2f44SArmin Le Grand                         {
267035a2f44SArmin Le Grand                             // translate back to origin, scale to unit coordinates
268035a2f44SArmin Le Grand                             basegfx::B2DHomMatrix aEmbedSvg(
269035a2f44SArmin Le Grand                                 basegfx::tools::createTranslateB2DHomMatrix(
270035a2f44SArmin Le Grand                                     -rSvgRange.getMinX(),
271035a2f44SArmin Le Grand                                     -rSvgRange.getMinY()));
272035a2f44SArmin Le Grand 
273035a2f44SArmin Le Grand                             aEmbedSvg.scale(
274035a2f44SArmin Le Grand                                 1.0 / rSvgRange.getWidth(),
275035a2f44SArmin Le Grand                                 1.0 / rSvgRange.getHeight());
276035a2f44SArmin Le Grand 
277035a2f44SArmin Le Grand                             // apply created object transformation
278035a2f44SArmin Le Grand                             aEmbedSvg = rTransform * aEmbedSvg;
279035a2f44SArmin Le Grand 
280035a2f44SArmin Le Grand                             // add Svg primitives embedded
281035a2f44SArmin Le Grand                             aRetval.realloc(1);
282035a2f44SArmin Le Grand                             aRetval[0] = new TransformPrimitive2D(
283035a2f44SArmin Le Grand                                 aEmbedSvg,
284035a2f44SArmin Le Grand                                 rGraphic.getSvgData()->getPrimitive2DSequence());
285035a2f44SArmin Le Grand                         }
286035a2f44SArmin Le Grand                     }
287035a2f44SArmin Le Grand 					else
288035a2f44SArmin Le Grand 					{
289035a2f44SArmin Le Grand                         aRetval.realloc(1);
290035a2f44SArmin Le Grand 						aRetval[0] = new BitmapPrimitive2D(
291035a2f44SArmin Le Grand                             rGraphic.GetBitmapEx(),
292035a2f44SArmin Le Grand                             rTransform);
293035a2f44SArmin Le Grand 					}
294035a2f44SArmin Le Grand 
295035a2f44SArmin Le Grand 					break;
296035a2f44SArmin Le Grand 				}
297035a2f44SArmin Le Grand 
298035a2f44SArmin Le Grand 				case GRAPHIC_GDIMETAFILE :
299035a2f44SArmin Le Grand 				{
300035a2f44SArmin Le Grand #ifdef USE_DEBUG_CODE_TO_TEST_METAFILE_DECOMPOSE
301035a2f44SArmin Le Grand                     static bool bDoTest(false);
302035a2f44SArmin Le Grand 
303035a2f44SArmin Le Grand                     if(bDoTest)
304035a2f44SArmin Le Grand                     {
305035a2f44SArmin Le Grand 						// All this is/was test code for testing MetafilePrimitive2D::create2DDecomposition
306035a2f44SArmin Le Grand 						// extensively. It may be needed again when diverse actions need debugging, so i leave
307035a2f44SArmin Le Grand 						// it in here, but take it out using USE_DEBUG_CODE_TO_TEST_METAFILE_DECOMPOSE.
308035a2f44SArmin Le Grand 						// Use it by compiling with the code, insert any DrawObject, convert to Metafile. The
309035a2f44SArmin Le Grand 						// debugger will then stop here (when breakpoint set, of course). You may enter single
310035a2f44SArmin Le Grand 						// parts of actions and/or change to true what You want to check.
311035a2f44SArmin Le Grand                         GDIMetaFile aMtf;
312035a2f44SArmin Le Grand 			            VirtualDevice aOut;
313035a2f44SArmin Le Grand         		        const basegfx::B2DRange aRange(getB2DRange(rViewInformation));
314035a2f44SArmin Le Grand                         const Rectangle aRectangle(
315035a2f44SArmin Le Grand                             basegfx::fround(aRange.getMinX()), basegfx::fround(aRange.getMinY()),
316035a2f44SArmin Le Grand                             basegfx::fround(aRange.getMaxX()), basegfx::fround(aRange.getMaxY()));
317035a2f44SArmin Le Grand                         const Point aOrigin(aRectangle.TopLeft());
318035a2f44SArmin Le Grand                         const Fraction aScaleX(aRectangle.getWidth());
319035a2f44SArmin Le Grand                         const Fraction aScaleY(aRectangle.getHeight());
320035a2f44SArmin Le Grand                         MapMode aMapMode(MAP_100TH_MM, aOrigin, aScaleX, aScaleY);
321035a2f44SArmin Le Grand 
322035a2f44SArmin Le Grand                         Size aDummySize(2, 2);
323035a2f44SArmin Le Grand                         aOut.SetOutputSizePixel(aDummySize);
324035a2f44SArmin Le Grand 			            aOut.EnableOutput(FALSE);
325035a2f44SArmin Le Grand 			            aOut.SetMapMode(aMapMode);
326035a2f44SArmin Le Grand 
327035a2f44SArmin Le Grand                         aMtf.Clear();
328035a2f44SArmin Le Grand 			            aMtf.Record(&aOut);
329035a2f44SArmin Le Grand 
330035a2f44SArmin Le Grand 			            const Fraction aNeutralFraction(1, 1);
331035a2f44SArmin Le Grand 			            const MapMode aRelativeMapMode(
332035a2f44SArmin Le Grand                             MAP_RELATIVE,
333035a2f44SArmin Le Grand                             Point(-aRectangle.Left(), -aRectangle.Top()),
334035a2f44SArmin Le Grand                             aNeutralFraction, aNeutralFraction);
335035a2f44SArmin Le Grand 			            aOut.SetMapMode(aRelativeMapMode);
336035a2f44SArmin Le Grand 
337035a2f44SArmin Le Grand                         if(false)
338035a2f44SArmin Le Grand                         {
339035a2f44SArmin Le Grand                             const sal_Int32 nHor(aRectangle.getWidth() / 4);
340035a2f44SArmin Le Grand                             const sal_Int32 nVer(aRectangle.getHeight() / 4);
341035a2f44SArmin Le Grand                             const Rectangle aCenteredRectangle(
342035a2f44SArmin Le Grand                                 aRectangle.Left() + nHor, aRectangle.Top() + nVer,
343035a2f44SArmin Le Grand                                 aRectangle.Right() - nHor, aRectangle.Bottom() - nVer);
344035a2f44SArmin Le Grand                             aOut.SetClipRegion(aCenteredRectangle);
345035a2f44SArmin Le Grand                         }
346035a2f44SArmin Le Grand 
347035a2f44SArmin Le Grand                         if(false)
348035a2f44SArmin Le Grand                         {
349035a2f44SArmin Le Grand                             const Rectangle aRightRectangle(aRectangle.TopCenter(), aRectangle.BottomRight());
350035a2f44SArmin Le Grand                             aOut.IntersectClipRegion(aRightRectangle);
351035a2f44SArmin Le Grand                         }
352035a2f44SArmin Le Grand 
353035a2f44SArmin Le Grand                         if(false)
354035a2f44SArmin Le Grand                         {
355035a2f44SArmin Le Grand                             const Rectangle aRightRectangle(aRectangle.TopCenter(), aRectangle.BottomRight());
356035a2f44SArmin Le Grand                             const Rectangle aBottomRectangle(aRectangle.LeftCenter(), aRectangle.BottomRight());
357035a2f44SArmin Le Grand                             Region aRegion(aRightRectangle);
358035a2f44SArmin Le Grand                             aRegion.Intersect(aBottomRectangle);
359035a2f44SArmin Le Grand                             aOut.IntersectClipRegion(aRegion);
360035a2f44SArmin Le Grand                         }
361035a2f44SArmin Le Grand 
362035a2f44SArmin Le Grand                         if(false)
363035a2f44SArmin Le Grand                         {
364035a2f44SArmin Le Grand                             const sal_Int32 nHor(aRectangle.getWidth() / 10);
365035a2f44SArmin Le Grand                             const sal_Int32 nVer(aRectangle.getHeight() / 10);
366035a2f44SArmin Le Grand                             aOut.MoveClipRegion(nHor, nVer);
367035a2f44SArmin Le Grand                         }
368035a2f44SArmin Le Grand 
369035a2f44SArmin Le Grand                         if(false)
370035a2f44SArmin Le Grand                         {
371035a2f44SArmin Le Grand                             Wallpaper aWallpaper(Color(COL_BLACK));
372035a2f44SArmin Le Grand                             aOut.DrawWallpaper(aRectangle, aWallpaper);
373035a2f44SArmin Le Grand                         }
374035a2f44SArmin Le Grand 
375035a2f44SArmin Le Grand                         if(false)
376035a2f44SArmin Le Grand                         {
377035a2f44SArmin Le Grand                             Wallpaper aWallpaper(Gradient(GRADIENT_LINEAR, Color(COL_RED), Color(COL_GREEN)));
378035a2f44SArmin Le Grand                             aOut.DrawWallpaper(aRectangle, aWallpaper);
379035a2f44SArmin Le Grand                         }
380035a2f44SArmin Le Grand 
381035a2f44SArmin Le Grand                         if(false)
382035a2f44SArmin Le Grand                         {
383035a2f44SArmin Le Grand             				SvFileStream aRead((const String&)String(ByteString( "c:\\test.png" ), RTL_TEXTENCODING_UTF8), STREAM_READ);
384035a2f44SArmin Le Grand                             vcl::PNGReader aPNGReader(aRead);
385035a2f44SArmin Le Grand 		                    BitmapEx aBitmapEx(aPNGReader.Read());
386035a2f44SArmin Le Grand                             Wallpaper aWallpaper(aBitmapEx);
387035a2f44SArmin Le Grand                             aOut.DrawWallpaper(aRectangle, aWallpaper);
388035a2f44SArmin Le Grand                         }
389035a2f44SArmin Le Grand 
390035a2f44SArmin Le Grand                         if(false)
391035a2f44SArmin Le Grand                         {
392035a2f44SArmin Le Grand                             const double fHor(aRectangle.getWidth());
393035a2f44SArmin Le Grand                             const double fVer(aRectangle.getHeight());
394035a2f44SArmin Le Grand 							Color aColor(basegfx::BColor(rand() / 32767.0, rand() / 32767.0, rand() / 32767.0));
395035a2f44SArmin Le Grand 
396035a2f44SArmin Le Grand 							for(sal_uInt32 a(0); a < 5000; a++)
397035a2f44SArmin Le Grand 							{
398035a2f44SArmin Le Grand 								const Point aPoint(
399035a2f44SArmin Le Grand 									aRectangle.Left() + basegfx::fround(rand() * (fHor / 32767.0)),
400035a2f44SArmin Le Grand 									aRectangle.Top() + basegfx::fround(rand() * (fVer / 32767.0)));
401035a2f44SArmin Le Grand 
402035a2f44SArmin Le Grand 								if(!(a % 3))
403035a2f44SArmin Le Grand 								{
404035a2f44SArmin Le Grand 									aColor = Color(basegfx::BColor(rand() / 32767.0, rand() / 32767.0, rand() / 32767.0));
405035a2f44SArmin Le Grand 								}
406035a2f44SArmin Le Grand 
407035a2f44SArmin Le Grand 								aOut.DrawPixel(aPoint, aColor);
408035a2f44SArmin Le Grand 							}
409035a2f44SArmin Le Grand 						}
410035a2f44SArmin Le Grand 
411035a2f44SArmin Le Grand                         if(false)
412035a2f44SArmin Le Grand                         {
413035a2f44SArmin Le Grand                             const double fHor(aRectangle.getWidth());
414035a2f44SArmin Le Grand                             const double fVer(aRectangle.getHeight());
415035a2f44SArmin Le Grand 
416035a2f44SArmin Le Grand 							aOut.SetLineColor(Color(basegfx::BColor(rand() / 32767.0, rand() / 32767.0, rand() / 32767.0)));
417035a2f44SArmin Le Grand 							aOut.SetFillColor();
418035a2f44SArmin Le Grand 
419035a2f44SArmin Le Grand 							for(sal_uInt32 a(0); a < 5000; a++)
420035a2f44SArmin Le Grand 							{
421035a2f44SArmin Le Grand 								const Point aPoint(
422035a2f44SArmin Le Grand 									aRectangle.Left() + basegfx::fround(rand() * (fHor / 32767.0)),
423035a2f44SArmin Le Grand 									aRectangle.Top() + basegfx::fround(rand() * (fVer / 32767.0)));
424035a2f44SArmin Le Grand 								aOut.DrawPixel(aPoint);
425035a2f44SArmin Le Grand 							}
426035a2f44SArmin Le Grand 						}
427035a2f44SArmin Le Grand 
428035a2f44SArmin Le Grand                         if(false)
429035a2f44SArmin Le Grand                         {
430035a2f44SArmin Le Grand                             const double fHor(aRectangle.getWidth());
431035a2f44SArmin Le Grand                             const double fVer(aRectangle.getHeight());
432035a2f44SArmin Le Grand 
433035a2f44SArmin Le Grand 							aOut.SetLineColor(Color(basegfx::BColor(rand() / 32767.0, rand() / 32767.0, rand() / 32767.0)));
434035a2f44SArmin Le Grand 							aOut.SetFillColor();
435035a2f44SArmin Le Grand 
436035a2f44SArmin Le Grand 							Point aStart(
437035a2f44SArmin Le Grand 								aRectangle.Left() + basegfx::fround(rand() * (fHor / 32767.0)),
438035a2f44SArmin Le Grand 								aRectangle.Top() + basegfx::fround(rand() * (fVer / 32767.0)));
439035a2f44SArmin Le Grand 							Point aStop(
440035a2f44SArmin Le Grand 								aRectangle.Left() + basegfx::fround(rand() * (fHor / 32767.0)),
441035a2f44SArmin Le Grand 								aRectangle.Top() + basegfx::fround(rand() * (fVer / 32767.0)));
442035a2f44SArmin Le Grand 
443035a2f44SArmin Le Grand 							LineInfo aLineInfo(LINE_SOLID, basegfx::fround(fHor / 50.0));
444035a2f44SArmin Le Grand 							bool bUseLineInfo(false);
445035a2f44SArmin Le Grand 
446035a2f44SArmin Le Grand 							for(sal_uInt32 a(0); a < 20; a++)
447035a2f44SArmin Le Grand 							{
448035a2f44SArmin Le Grand 								if(!(a%6))
449035a2f44SArmin Le Grand 								{
450035a2f44SArmin Le Grand 									bUseLineInfo = !bUseLineInfo;
451035a2f44SArmin Le Grand 								}
452035a2f44SArmin Le Grand 
453035a2f44SArmin Le Grand 								if(!(a%4))
454035a2f44SArmin Le Grand 								{
455035a2f44SArmin Le Grand 									aOut.SetLineColor(Color(basegfx::BColor(rand() / 32767.0, rand() / 32767.0, rand() / 32767.0)));
456035a2f44SArmin Le Grand 								}
457035a2f44SArmin Le Grand 
458035a2f44SArmin Le Grand 								if(a%3)
459035a2f44SArmin Le Grand 								{
460035a2f44SArmin Le Grand 									aStart = aStop;
461035a2f44SArmin Le Grand 									aStop = Point(
462035a2f44SArmin Le Grand 										aRectangle.Left() + basegfx::fround(rand() * (fHor / 32767.0)),
463035a2f44SArmin Le Grand 										aRectangle.Top() + basegfx::fround(rand() * (fVer / 32767.0)));
464035a2f44SArmin Le Grand 								}
465035a2f44SArmin Le Grand 								else
466035a2f44SArmin Le Grand 								{
467035a2f44SArmin Le Grand 									aStart = Point(
468035a2f44SArmin Le Grand 										aRectangle.Left() + basegfx::fround(rand() * (fHor / 32767.0)),
469035a2f44SArmin Le Grand 										aRectangle.Top() + basegfx::fround(rand() * (fVer / 32767.0)));
470035a2f44SArmin Le Grand 									aStop = Point(
471035a2f44SArmin Le Grand 										aRectangle.Left() + basegfx::fround(rand() * (fHor / 32767.0)),
472035a2f44SArmin Le Grand 										aRectangle.Top() + basegfx::fround(rand() * (fVer / 32767.0)));
473035a2f44SArmin Le Grand 								}
474035a2f44SArmin Le Grand 
475035a2f44SArmin Le Grand 								if(bUseLineInfo)
476035a2f44SArmin Le Grand 								{
477035a2f44SArmin Le Grand 									aOut.DrawLine(aStart, aStop, aLineInfo);
478035a2f44SArmin Le Grand 								}
479035a2f44SArmin Le Grand 								else
480035a2f44SArmin Le Grand 								{
481035a2f44SArmin Le Grand 									aOut.DrawLine(aStart, aStop);
482035a2f44SArmin Le Grand 								}
483035a2f44SArmin Le Grand 							}
484035a2f44SArmin Le Grand 						}
485035a2f44SArmin Le Grand 
486035a2f44SArmin Le Grand                         if(false)
487035a2f44SArmin Le Grand                         {
488035a2f44SArmin Le Grand 							aOut.SetLineColor(Color(basegfx::BColor(rand() / 32767.0, rand() / 32767.0, rand() / 32767.0)));
489035a2f44SArmin Le Grand 							aOut.SetFillColor(Color(basegfx::BColor(rand() / 32767.0, rand() / 32767.0, rand() / 32767.0)));
490035a2f44SArmin Le Grand 							aOut.DrawRect(aRectangle);
491035a2f44SArmin Le Grand 						}
492035a2f44SArmin Le Grand 
493035a2f44SArmin Le Grand                         if(false)
494035a2f44SArmin Le Grand                         {
495035a2f44SArmin Le Grand 							aOut.SetLineColor(Color(basegfx::BColor(rand() / 32767.0, rand() / 32767.0, rand() / 32767.0)));
496035a2f44SArmin Le Grand 							aOut.SetFillColor(Color(basegfx::BColor(rand() / 32767.0, rand() / 32767.0, rand() / 32767.0)));
497035a2f44SArmin Le Grand                             const sal_uInt32 nHor(aRectangle.getWidth() / 10);
498035a2f44SArmin Le Grand                             const sal_uInt32 nVer(aRectangle.getHeight() / 10);
499035a2f44SArmin Le Grand 							aOut.DrawRect(aRectangle, nHor, nVer);
500035a2f44SArmin Le Grand 						}
501035a2f44SArmin Le Grand 
502035a2f44SArmin Le Grand                         if(false)
503035a2f44SArmin Le Grand                         {
504035a2f44SArmin Le Grand 							aOut.SetLineColor(Color(basegfx::BColor(rand() / 32767.0, rand() / 32767.0, rand() / 32767.0)));
505035a2f44SArmin Le Grand 							aOut.SetFillColor(Color(basegfx::BColor(rand() / 32767.0, rand() / 32767.0, rand() / 32767.0)));
506035a2f44SArmin Le Grand 							aOut.DrawEllipse(aRectangle);
507035a2f44SArmin Le Grand 						}
508035a2f44SArmin Le Grand 
509035a2f44SArmin Le Grand                         if(false)
510035a2f44SArmin Le Grand                         {
511035a2f44SArmin Le Grand 							aOut.SetLineColor(Color(basegfx::BColor(rand() / 32767.0, rand() / 32767.0, rand() / 32767.0)));
512035a2f44SArmin Le Grand 							aOut.SetFillColor(Color(basegfx::BColor(rand() / 32767.0, rand() / 32767.0, rand() / 32767.0)));
513035a2f44SArmin Le Grand 							aOut.DrawArc(aRectangle, aRectangle.TopLeft(), aRectangle.BottomCenter());
514035a2f44SArmin Le Grand 						}
515035a2f44SArmin Le Grand 
516035a2f44SArmin Le Grand                         if(false)
517035a2f44SArmin Le Grand                         {
518035a2f44SArmin Le Grand 							aOut.SetLineColor(Color(basegfx::BColor(rand() / 32767.0, rand() / 32767.0, rand() / 32767.0)));
519035a2f44SArmin Le Grand 							aOut.SetFillColor(Color(basegfx::BColor(rand() / 32767.0, rand() / 32767.0, rand() / 32767.0)));
520035a2f44SArmin Le Grand 							aOut.DrawPie(aRectangle, aRectangle.TopLeft(), aRectangle.BottomCenter());
521035a2f44SArmin Le Grand 						}
522035a2f44SArmin Le Grand 
523035a2f44SArmin Le Grand                         if(false)
524035a2f44SArmin Le Grand                         {
525035a2f44SArmin Le Grand 							aOut.SetLineColor(Color(basegfx::BColor(rand() / 32767.0, rand() / 32767.0, rand() / 32767.0)));
526035a2f44SArmin Le Grand 							aOut.SetFillColor(Color(basegfx::BColor(rand() / 32767.0, rand() / 32767.0, rand() / 32767.0)));
527035a2f44SArmin Le Grand 							aOut.DrawChord(aRectangle, aRectangle.TopLeft(), aRectangle.BottomCenter());
528035a2f44SArmin Le Grand 						}
529035a2f44SArmin Le Grand 
530035a2f44SArmin Le Grand                         if(false)
531035a2f44SArmin Le Grand                         {
532035a2f44SArmin Le Grand                             const double fHor(aRectangle.getWidth());
533035a2f44SArmin Le Grand                             const double fVer(aRectangle.getHeight());
534035a2f44SArmin Le Grand 
535035a2f44SArmin Le Grand 							for(sal_uInt32 b(0); b < 5; b++)
536035a2f44SArmin Le Grand 							{
537035a2f44SArmin Le Grand 								const sal_uInt32 nCount(basegfx::fround(rand() * (20 / 32767.0)));
538035a2f44SArmin Le Grand 								const bool bClose(basegfx::fround(rand() / 32767.0));
539035a2f44SArmin Le Grand 								Polygon aPolygon(nCount + (bClose ? 1 : 0));
540035a2f44SArmin Le Grand 
541035a2f44SArmin Le Grand 								for(sal_uInt32 a(0); a < nCount; a++)
542035a2f44SArmin Le Grand 								{
543035a2f44SArmin Le Grand 									const Point aPoint(
544035a2f44SArmin Le Grand 										aRectangle.Left() + basegfx::fround(rand() * (fHor / 32767.0)),
545035a2f44SArmin Le Grand 										aRectangle.Top() + basegfx::fround(rand() * (fVer / 32767.0)));
546035a2f44SArmin Le Grand 									aPolygon[a] = aPoint;
547035a2f44SArmin Le Grand 								}
548035a2f44SArmin Le Grand 
549035a2f44SArmin Le Grand 								if(bClose)
550035a2f44SArmin Le Grand 								{
551035a2f44SArmin Le Grand 									aPolygon[aPolygon.GetSize() - 1] = aPolygon[0];
552035a2f44SArmin Le Grand 								}
553035a2f44SArmin Le Grand 
554035a2f44SArmin Le Grand 								aOut.SetLineColor(Color(basegfx::BColor(rand() / 32767.0, rand() / 32767.0, rand() / 32767.0)));
555035a2f44SArmin Le Grand 								aOut.SetFillColor(Color(basegfx::BColor(rand() / 32767.0, rand() / 32767.0, rand() / 32767.0)));
556035a2f44SArmin Le Grand 
557035a2f44SArmin Le Grand 								if(!(b%2))
558035a2f44SArmin Le Grand 								{
559035a2f44SArmin Le Grand 									const LineInfo aLineInfo(LINE_SOLID, basegfx::fround(fHor / 50.0));
560035a2f44SArmin Le Grand 									aOut.DrawPolyLine(aPolygon, aLineInfo);
561035a2f44SArmin Le Grand 								}
562035a2f44SArmin Le Grand 								else
563035a2f44SArmin Le Grand 								{
564035a2f44SArmin Le Grand 									aOut.DrawPolyLine(aPolygon);
565035a2f44SArmin Le Grand 								}
566035a2f44SArmin Le Grand 							}
567035a2f44SArmin Le Grand 						}
568035a2f44SArmin Le Grand 
569035a2f44SArmin Le Grand                         if(false)
570035a2f44SArmin Le Grand                         {
571035a2f44SArmin Le Grand                             const double fHor(aRectangle.getWidth());
572035a2f44SArmin Le Grand                             const double fVer(aRectangle.getHeight());
573035a2f44SArmin Le Grand 
574035a2f44SArmin Le Grand 							for(sal_uInt32 b(0); b < 5; b++)
575035a2f44SArmin Le Grand 							{
576035a2f44SArmin Le Grand 								const sal_uInt32 nCount(basegfx::fround(rand() * (20 / 32767.0)));
577035a2f44SArmin Le Grand 								const bool bClose(basegfx::fround(rand() / 32767.0));
578035a2f44SArmin Le Grand 								Polygon aPolygon(nCount + (bClose ? 1 : 0));
579035a2f44SArmin Le Grand 
580035a2f44SArmin Le Grand 								for(sal_uInt32 a(0); a < nCount; a++)
581035a2f44SArmin Le Grand 								{
582035a2f44SArmin Le Grand 									const Point aPoint(
583035a2f44SArmin Le Grand 										aRectangle.Left() + basegfx::fround(rand() * (fHor / 32767.0)),
584035a2f44SArmin Le Grand 										aRectangle.Top() + basegfx::fround(rand() * (fVer / 32767.0)));
585035a2f44SArmin Le Grand 									aPolygon[a] = aPoint;
586035a2f44SArmin Le Grand 								}
587035a2f44SArmin Le Grand 
588035a2f44SArmin Le Grand 								if(bClose)
589035a2f44SArmin Le Grand 								{
590035a2f44SArmin Le Grand 									aPolygon[aPolygon.GetSize() - 1] = aPolygon[0];
591035a2f44SArmin Le Grand 								}
592035a2f44SArmin Le Grand 
593035a2f44SArmin Le Grand 								aOut.SetLineColor(Color(basegfx::BColor(rand() / 32767.0, rand() / 32767.0, rand() / 32767.0)));
594035a2f44SArmin Le Grand 								aOut.SetFillColor(Color(basegfx::BColor(rand() / 32767.0, rand() / 32767.0, rand() / 32767.0)));
595035a2f44SArmin Le Grand 								aOut.DrawPolygon(aPolygon);
596035a2f44SArmin Le Grand 							}
597035a2f44SArmin Le Grand 						}
598035a2f44SArmin Le Grand 
599035a2f44SArmin Le Grand                         if(false)
600035a2f44SArmin Le Grand                         {
601035a2f44SArmin Le Grand                             const double fHor(aRectangle.getWidth());
602035a2f44SArmin Le Grand                             const double fVer(aRectangle.getHeight());
603035a2f44SArmin Le Grand 							PolyPolygon aPolyPolygon;
604035a2f44SArmin Le Grand 
605035a2f44SArmin Le Grand 							for(sal_uInt32 b(0); b < 3; b++)
606035a2f44SArmin Le Grand 							{
607035a2f44SArmin Le Grand 								const sal_uInt32 nCount(basegfx::fround(rand() * (6 / 32767.0)));
608035a2f44SArmin Le Grand 								const bool bClose(basegfx::fround(rand() / 32767.0));
609035a2f44SArmin Le Grand 								Polygon aPolygon(nCount + (bClose ? 1 : 0));
610035a2f44SArmin Le Grand 
611035a2f44SArmin Le Grand 								for(sal_uInt32 a(0); a < nCount; a++)
612035a2f44SArmin Le Grand 								{
613035a2f44SArmin Le Grand 									const Point aPoint(
614035a2f44SArmin Le Grand 										aRectangle.Left() + basegfx::fround(rand() * (fHor / 32767.0)),
615035a2f44SArmin Le Grand 										aRectangle.Top() + basegfx::fround(rand() * (fVer / 32767.0)));
616035a2f44SArmin Le Grand 									aPolygon[a] = aPoint;
617035a2f44SArmin Le Grand 								}
618035a2f44SArmin Le Grand 
619035a2f44SArmin Le Grand 								if(bClose)
620035a2f44SArmin Le Grand 								{
621035a2f44SArmin Le Grand 									aPolygon[aPolygon.GetSize() - 1] = aPolygon[0];
622035a2f44SArmin Le Grand 								}
623035a2f44SArmin Le Grand 
624035a2f44SArmin Le Grand 								aPolyPolygon.Insert(aPolygon);
625035a2f44SArmin Le Grand 							}
626035a2f44SArmin Le Grand 
627035a2f44SArmin Le Grand 							aOut.SetLineColor(Color(basegfx::BColor(rand() / 32767.0, rand() / 32767.0, rand() / 32767.0)));
628035a2f44SArmin Le Grand 							aOut.SetFillColor(Color(basegfx::BColor(rand() / 32767.0, rand() / 32767.0, rand() / 32767.0)));
629035a2f44SArmin Le Grand 							aOut.DrawPolyPolygon(aPolyPolygon);
630035a2f44SArmin Le Grand 						}
631035a2f44SArmin Le Grand 
632035a2f44SArmin Le Grand                         if(false)
633035a2f44SArmin Le Grand                         {
634035a2f44SArmin Le Grand             				SvFileStream aRead((const String&)String(ByteString( "c:\\test.png" ), RTL_TEXTENCODING_UTF8), STREAM_READ);
635035a2f44SArmin Le Grand                             vcl::PNGReader aPNGReader(aRead);
636035a2f44SArmin Le Grand 		                    BitmapEx aBitmapEx(aPNGReader.Read());
637035a2f44SArmin Le Grand 							aOut.DrawBitmapEx(aRectangle.TopLeft(), aBitmapEx);
638035a2f44SArmin Le Grand 						}
639035a2f44SArmin Le Grand 
640035a2f44SArmin Le Grand                         if(false)
641035a2f44SArmin Le Grand                         {
642035a2f44SArmin Le Grand             				SvFileStream aRead((const String&)String(ByteString( "c:\\test.png" ), RTL_TEXTENCODING_UTF8), STREAM_READ);
643035a2f44SArmin Le Grand                             vcl::PNGReader aPNGReader(aRead);
644035a2f44SArmin Le Grand 		                    BitmapEx aBitmapEx(aPNGReader.Read());
645035a2f44SArmin Le Grand 							aOut.DrawBitmapEx(aRectangle.TopLeft(), aRectangle.GetSize(), aBitmapEx);
646035a2f44SArmin Le Grand 						}
647035a2f44SArmin Le Grand 
648035a2f44SArmin Le Grand                         if(false)
649035a2f44SArmin Le Grand                         {
650035a2f44SArmin Le Grand             				SvFileStream aRead((const String&)String(ByteString( "c:\\test.png" ), RTL_TEXTENCODING_UTF8), STREAM_READ);
651035a2f44SArmin Le Grand                             vcl::PNGReader aPNGReader(aRead);
652035a2f44SArmin Le Grand 		                    BitmapEx aBitmapEx(aPNGReader.Read());
653035a2f44SArmin Le Grand 							const Size aSizePixel(aBitmapEx.GetSizePixel());
654035a2f44SArmin Le Grand 							aOut.DrawBitmapEx(
655035a2f44SArmin Le Grand 								aRectangle.TopLeft(),
656035a2f44SArmin Le Grand 								aRectangle.GetSize(),
657035a2f44SArmin Le Grand 								Point(0, 0),
658035a2f44SArmin Le Grand 								Size(aSizePixel.Width() /2, aSizePixel.Height() / 2),
659035a2f44SArmin Le Grand 								aBitmapEx);
660035a2f44SArmin Le Grand 						}
661035a2f44SArmin Le Grand 
662035a2f44SArmin Le Grand                         if(false)
663035a2f44SArmin Le Grand                         {
664035a2f44SArmin Le Grand                             const double fHor(aRectangle.getWidth());
665035a2f44SArmin Le Grand                             const double fVer(aRectangle.getHeight());
666035a2f44SArmin Le Grand 							const Point aPointA(
667035a2f44SArmin Le Grand 								aRectangle.Left() + basegfx::fround(fHor * 0.2),
668035a2f44SArmin Le Grand 								aRectangle.Top() + basegfx::fround(fVer * 0.3));
669035a2f44SArmin Le Grand 							const Point aPointB(
670035a2f44SArmin Le Grand 								aRectangle.Left() + basegfx::fround(fHor * 0.2),
671035a2f44SArmin Le Grand 								aRectangle.Top() + basegfx::fround(fVer * 0.5));
672035a2f44SArmin Le Grand 							const Point aPointC(
673035a2f44SArmin Le Grand 								aRectangle.Left() + basegfx::fround(fHor * 0.2),
674035a2f44SArmin Le Grand 								aRectangle.Top() + basegfx::fround(fVer * 0.7));
675035a2f44SArmin Le Grand                             const String aText(ByteString("Hello, World!"), RTL_TEXTENCODING_UTF8);
676035a2f44SArmin Le Grand 
677035a2f44SArmin Le Grand                             const String aFontName(ByteString("Comic Sans MS"), RTL_TEXTENCODING_UTF8);
678035a2f44SArmin Le Grand                             Font aFont(aFontName, Size(0, 1000));
679035a2f44SArmin Le Grand                             aFont.SetAlign(ALIGN_BASELINE);
680035a2f44SArmin Le Grand                             aFont.SetColor(COL_RED);
681035a2f44SArmin Le Grand                             //sal_Int32* pDXArray = new sal_Int32[aText.Len()];
682035a2f44SArmin Le Grand 
683035a2f44SArmin Le Grand                             aFont.SetOutline(true);
684035a2f44SArmin Le Grand                             aOut.SetFont(aFont);
685035a2f44SArmin Le Grand                             aOut.DrawText(aPointA, aText, 0, aText.Len());
686035a2f44SArmin Le Grand 
687035a2f44SArmin Le Grand                             aFont.SetShadow(true);
688035a2f44SArmin Le Grand                             aOut.SetFont(aFont);
689035a2f44SArmin Le Grand                             aOut.DrawText(aPointB, aText, 0, aText.Len());
690035a2f44SArmin Le Grand 
691035a2f44SArmin Le Grand                             aFont.SetRelief(RELIEF_EMBOSSED);
692035a2f44SArmin Le Grand                             aOut.SetFont(aFont);
693035a2f44SArmin Le Grand                             aOut.DrawText(aPointC, aText, 0, aText.Len());
694035a2f44SArmin Le Grand 
695035a2f44SArmin Le Grand                             //delete pDXArray;
696035a2f44SArmin Le Grand                         }
697035a2f44SArmin Le Grand 
698035a2f44SArmin Le Grand                         if(false)
699035a2f44SArmin Le Grand                         {
700035a2f44SArmin Le Grand                             const double fHor(aRectangle.getWidth());
701035a2f44SArmin Le Grand                             const double fVer(aRectangle.getHeight());
702035a2f44SArmin Le Grand 							const Point aPointA(
703035a2f44SArmin Le Grand 								aRectangle.Left() + basegfx::fround(fHor * 0.2),
704035a2f44SArmin Le Grand 								aRectangle.Top() + basegfx::fround(fVer * 0.3));
705035a2f44SArmin Le Grand 							const Point aPointB(
706035a2f44SArmin Le Grand 								aRectangle.Left() + basegfx::fround(fHor * 0.2),
707035a2f44SArmin Le Grand 								aRectangle.Top() + basegfx::fround(fVer * 0.5));
708035a2f44SArmin Le Grand 							const Point aPointC(
709035a2f44SArmin Le Grand 								aRectangle.Left() + basegfx::fround(fHor * 0.2),
710035a2f44SArmin Le Grand 								aRectangle.Top() + basegfx::fround(fVer * 0.7));
711035a2f44SArmin Le Grand                             const String aText(ByteString("Hello, World!"), RTL_TEXTENCODING_UTF8);
712035a2f44SArmin Le Grand 
713035a2f44SArmin Le Grand                             const String aFontName(ByteString("Comic Sans MS"), RTL_TEXTENCODING_UTF8);
714035a2f44SArmin Le Grand                             Font aFont(aFontName, Size(0, 1000));
715035a2f44SArmin Le Grand                             aFont.SetAlign(ALIGN_BASELINE);
716035a2f44SArmin Le Grand                             aFont.SetColor(COL_RED);
717035a2f44SArmin Le Grand 
718035a2f44SArmin Le Grand                             aOut.SetFont(aFont);
719035a2f44SArmin Le Grand 							const sal_Int32 nWidth(aOut.GetTextWidth(aText, 0, aText.Len()));
720035a2f44SArmin Le Grand                             aOut.DrawText(aPointA, aText, 0, aText.Len());
721035a2f44SArmin Le Grand                             aOut.DrawTextLine(aPointA, nWidth, STRIKEOUT_SINGLE, UNDERLINE_SINGLE, UNDERLINE_SMALLWAVE);
722035a2f44SArmin Le Grand                             aOut.DrawTextLine(aPointB, nWidth, STRIKEOUT_SINGLE, UNDERLINE_SINGLE, UNDERLINE_SMALLWAVE);
723035a2f44SArmin Le Grand                             aOut.DrawTextLine(aPointC, nWidth, STRIKEOUT_SINGLE, UNDERLINE_SINGLE, UNDERLINE_SMALLWAVE);
724035a2f44SArmin Le Grand                         }
725035a2f44SArmin Le Grand 
726035a2f44SArmin Le Grand                         aMtf.Stop();
727035a2f44SArmin Le Grand 			            aMtf.WindStart();
728035a2f44SArmin Le Grand 		                aMtf.SetPrefMapMode(MapMode(MAP_100TH_MM));
729035a2f44SArmin Le Grand 			            aMtf.SetPrefSize(Size(aRectangle.getWidth(), aRectangle.getHeight()));
730035a2f44SArmin Le Grand 
731035a2f44SArmin Le Grand                         aRetval.realloc(1);
732035a2f44SArmin Le Grand                         aRetval[0] = new MetafilePrimitive2D(
733035a2f44SArmin Le Grand                             rTransform,
734035a2f44SArmin Le Grand                             aMtf);
735035a2f44SArmin Le Grand                     }
736035a2f44SArmin Le Grand                     else
737035a2f44SArmin Le Grand                     {
738035a2f44SArmin Le Grand #endif // USE_DEBUG_CODE_TO_TEST_METAFILE_DECOMPOSE
739035a2f44SArmin Le Grand                         // create MetafilePrimitive2D
740035a2f44SArmin Le Grand                         const GDIMetaFile& rMetafile = rGraphic.GetGDIMetaFile();
741035a2f44SArmin Le Grand 
742035a2f44SArmin Le Grand                         aRetval.realloc(1);
743035a2f44SArmin Le Grand                         aRetval[0] = new MetafilePrimitive2D(
744035a2f44SArmin Le Grand                             rTransform,
745035a2f44SArmin Le Grand                             rMetafile);
746035a2f44SArmin Le Grand 
747035a2f44SArmin Le Grand                         // #i100357# find out if clipping is needed for this primitive. Unfortunately,
748035a2f44SArmin Le Grand                         // there exist Metafiles who's content is bigger than the proposed PrefSize set
749035a2f44SArmin Le Grand                         // at them. This is an error, but we need to work around this
750035a2f44SArmin Le Grand                         const Size aMetaFilePrefSize(rMetafile.GetPrefSize());
751035a2f44SArmin Le Grand                         const Size aMetaFileRealSize(
752035a2f44SArmin Le Grand                             const_cast< GDIMetaFile& >(rMetafile).GetBoundRect(
753035a2f44SArmin Le Grand                                 *Application::GetDefaultDevice()).GetSize());
754035a2f44SArmin Le Grand 
755035a2f44SArmin Le Grand                         if(aMetaFileRealSize.getWidth() > aMetaFilePrefSize.getWidth()
756035a2f44SArmin Le Grand                             || aMetaFileRealSize.getHeight() > aMetaFilePrefSize.getHeight())
757035a2f44SArmin Le Grand                         {
758035a2f44SArmin Le Grand                             // clipping needed. Embed to MaskPrimitive2D. Create childs and mask polygon
759035a2f44SArmin Le Grand                             basegfx::B2DPolygon aMaskPolygon(basegfx::tools::createUnitPolygon());
760035a2f44SArmin Le Grand                             aMaskPolygon.transform(rTransform);
761035a2f44SArmin Le Grand 
762035a2f44SArmin Le Grand                             aRetval[0] = new MaskPrimitive2D(
763035a2f44SArmin Le Grand                                 basegfx::B2DPolyPolygon(aMaskPolygon),
764035a2f44SArmin Le Grand                                 aRetval);
765035a2f44SArmin Le Grand                         }
766035a2f44SArmin Le Grand #ifdef USE_DEBUG_CODE_TO_TEST_METAFILE_DECOMPOSE
767035a2f44SArmin Le Grand                     }
768035a2f44SArmin Le Grand #endif // USE_DEBUG_CODE_TO_TEST_METAFILE_DECOMPOSE
769035a2f44SArmin Le Grand 
770035a2f44SArmin Le Grand 					break;
771035a2f44SArmin Le Grand 				}
772035a2f44SArmin Le Grand 
773035a2f44SArmin Le Grand 				default:
774035a2f44SArmin Le Grand 				{
775035a2f44SArmin Le Grand 					// nothing to create
776035a2f44SArmin Le Grand 					break;
777035a2f44SArmin Le Grand 				}
778035a2f44SArmin Le Grand 			}
779035a2f44SArmin Le Grand 
780035a2f44SArmin Le Grand 			return aRetval;
781035a2f44SArmin Le Grand 		}
782035a2f44SArmin Le Grand 	} // end of namespace primitive2d
783035a2f44SArmin Le Grand } // end of namespace drawinglayer
784035a2f44SArmin Le Grand 
785*49c58f9bSArmin Le Grand //////////////////////////////////////////////////////////////////////////////
786*49c58f9bSArmin Le Grand 
787*49c58f9bSArmin Le Grand namespace drawinglayer
788*49c58f9bSArmin Le Grand {
789*49c58f9bSArmin Le Grand     namespace primitive2d
790*49c58f9bSArmin Le Grand     {
791*49c58f9bSArmin Le Grand         Primitive2DSequence create2DColorModifierEmbeddingsAsNeeded(
792*49c58f9bSArmin Le Grand             const Primitive2DSequence& rChildren,
793*49c58f9bSArmin Le Grand             GraphicDrawMode aGraphicDrawMode,
794*49c58f9bSArmin Le Grand             double fLuminance,
795*49c58f9bSArmin Le Grand             double fContrast,
796*49c58f9bSArmin Le Grand             double fRed,
797*49c58f9bSArmin Le Grand             double fGreen,
798*49c58f9bSArmin Le Grand             double fBlue,
799*49c58f9bSArmin Le Grand             double fGamma,
800*49c58f9bSArmin Le Grand             bool bInvert)
801*49c58f9bSArmin Le Grand         {
802*49c58f9bSArmin Le Grand             Primitive2DSequence aRetval;
803*49c58f9bSArmin Le Grand 
804*49c58f9bSArmin Le Grand             if(!rChildren.getLength())
805*49c58f9bSArmin Le Grand             {
806*49c58f9bSArmin Le Grand                 // no child content, done
807*49c58f9bSArmin Le Grand                 return aRetval;
808*49c58f9bSArmin Le Grand             }
809*49c58f9bSArmin Le Grand 
810*49c58f9bSArmin Le Grand             // set child content as retval; that is what will be used as child content in all
811*49c58f9bSArmin Le Grand             // embeddings from here
812*49c58f9bSArmin Le Grand             aRetval = rChildren;
813*49c58f9bSArmin Le Grand 
814*49c58f9bSArmin Le Grand             if(GRAPHICDRAWMODE_WATERMARK == aGraphicDrawMode)
815*49c58f9bSArmin Le Grand             {
816*49c58f9bSArmin Le Grand                 // this is solved by applying fixed values additionally to luminance
817*49c58f9bSArmin Le Grand                 // and contrast, do it here and reset DrawMode to GRAPHICDRAWMODE_STANDARD
818*49c58f9bSArmin Le Grand                 // original in svtools uses:
819*49c58f9bSArmin Le Grand                 // #define WATERMARK_LUM_OFFSET        50
820*49c58f9bSArmin Le Grand                 // #define WATERMARK_CON_OFFSET        -70
821*49c58f9bSArmin Le Grand                 fLuminance = basegfx::clamp(fLuminance + 0.5, -1.0, 1.0);
822*49c58f9bSArmin Le Grand                 fContrast = basegfx::clamp(fContrast - 0.7, -1.0, 1.0);
823*49c58f9bSArmin Le Grand                 aGraphicDrawMode = GRAPHICDRAWMODE_STANDARD;
824*49c58f9bSArmin Le Grand             }
825*49c58f9bSArmin Le Grand 
826*49c58f9bSArmin Le Grand             // DrawMode (GRAPHICDRAWMODE_WATERMARK already handled)
827*49c58f9bSArmin Le Grand             switch(aGraphicDrawMode)
828*49c58f9bSArmin Le Grand             {
829*49c58f9bSArmin Le Grand                 case GRAPHICDRAWMODE_GREYS:
830*49c58f9bSArmin Le Grand                 {
831*49c58f9bSArmin Le Grand                     // convert to grey
832*49c58f9bSArmin Le Grand                     const Primitive2DReference aPrimitiveGrey(
833*49c58f9bSArmin Le Grand                         new ModifiedColorPrimitive2D(
834*49c58f9bSArmin Le Grand                             aRetval,
835*49c58f9bSArmin Le Grand                             basegfx::BColorModifierSharedPtr(
836*49c58f9bSArmin Le Grand                                 new basegfx::BColorModifier_gray())));
837*49c58f9bSArmin Le Grand 
838*49c58f9bSArmin Le Grand                     aRetval = Primitive2DSequence(&aPrimitiveGrey, 1);
839*49c58f9bSArmin Le Grand                     break;
840*49c58f9bSArmin Le Grand                 }
841*49c58f9bSArmin Le Grand                 case GRAPHICDRAWMODE_MONO:
842*49c58f9bSArmin Le Grand                 {
843*49c58f9bSArmin Le Grand                     // convert to mono (black/white with threshold 0.5)
844*49c58f9bSArmin Le Grand                     const Primitive2DReference aPrimitiveBlackAndWhite(
845*49c58f9bSArmin Le Grand                         new ModifiedColorPrimitive2D(
846*49c58f9bSArmin Le Grand                             aRetval,
847*49c58f9bSArmin Le Grand                             basegfx::BColorModifierSharedPtr(
848*49c58f9bSArmin Le Grand                                 new basegfx::BColorModifier_black_and_white(0.5))));
849*49c58f9bSArmin Le Grand 
850*49c58f9bSArmin Le Grand                     aRetval = Primitive2DSequence(&aPrimitiveBlackAndWhite, 1);
851*49c58f9bSArmin Le Grand                     break;
852*49c58f9bSArmin Le Grand                 }
853*49c58f9bSArmin Le Grand                 case GRAPHICDRAWMODE_WATERMARK:
854*49c58f9bSArmin Le Grand                 {
855*49c58f9bSArmin Le Grand                     OSL_ENSURE(false, "OOps, GRAPHICDRAWMODE_WATERMARK should already be handled (see above)");
856*49c58f9bSArmin Le Grand                     // fallthrough intended
857*49c58f9bSArmin Le Grand                 }
858*49c58f9bSArmin Le Grand                 default: // case GRAPHICDRAWMODE_STANDARD:
859*49c58f9bSArmin Le Grand                 {
860*49c58f9bSArmin Le Grand                     // nothing to do
861*49c58f9bSArmin Le Grand                     break;
862*49c58f9bSArmin Le Grand                 }
863*49c58f9bSArmin Le Grand             }
864*49c58f9bSArmin Le Grand 
865*49c58f9bSArmin Le Grand             // mnContPercent, mnLumPercent, mnRPercent, mnGPercent, mnBPercent
866*49c58f9bSArmin Le Grand             // handled in a single call
867*49c58f9bSArmin Le Grand             if(!basegfx::fTools::equalZero(fLuminance)
868*49c58f9bSArmin Le Grand                 || !basegfx::fTools::equalZero(fContrast)
869*49c58f9bSArmin Le Grand                 || !basegfx::fTools::equalZero(fRed)
870*49c58f9bSArmin Le Grand                 || !basegfx::fTools::equalZero(fGreen)
871*49c58f9bSArmin Le Grand                 || !basegfx::fTools::equalZero(fBlue))
872*49c58f9bSArmin Le Grand             {
873*49c58f9bSArmin Le Grand                 const Primitive2DReference aPrimitiveRGBLuminannceContrast(
874*49c58f9bSArmin Le Grand                     new ModifiedColorPrimitive2D(
875*49c58f9bSArmin Le Grand                         aRetval,
876*49c58f9bSArmin Le Grand                         basegfx::BColorModifierSharedPtr(
877*49c58f9bSArmin Le Grand                             new basegfx::BColorModifier_RGBLuminanceContrast(
878*49c58f9bSArmin Le Grand                                 fRed,
879*49c58f9bSArmin Le Grand                                 fGreen,
880*49c58f9bSArmin Le Grand                                 fBlue,
881*49c58f9bSArmin Le Grand                                 fLuminance,
882*49c58f9bSArmin Le Grand                                 fContrast))));
883*49c58f9bSArmin Le Grand 
884*49c58f9bSArmin Le Grand                 aRetval = Primitive2DSequence(&aPrimitiveRGBLuminannceContrast, 1);
885*49c58f9bSArmin Le Grand             }
886*49c58f9bSArmin Le Grand 
887*49c58f9bSArmin Le Grand             // gamma (boolean)
888*49c58f9bSArmin Le Grand             if(!basegfx::fTools::equal(fGamma, 1.0))
889*49c58f9bSArmin Le Grand             {
890*49c58f9bSArmin Le Grand                 const Primitive2DReference aPrimitiveGamma(
891*49c58f9bSArmin Le Grand                     new ModifiedColorPrimitive2D(
892*49c58f9bSArmin Le Grand                         aRetval,
893*49c58f9bSArmin Le Grand                         basegfx::BColorModifierSharedPtr(
894*49c58f9bSArmin Le Grand                             new basegfx::BColorModifier_gamma(
895*49c58f9bSArmin Le Grand                                 fGamma))));
896*49c58f9bSArmin Le Grand 
897*49c58f9bSArmin Le Grand                 aRetval = Primitive2DSequence(&aPrimitiveGamma, 1);
898*49c58f9bSArmin Le Grand             }
899*49c58f9bSArmin Le Grand 
900*49c58f9bSArmin Le Grand             // invert (boolean)
901*49c58f9bSArmin Le Grand             if(bInvert)
902*49c58f9bSArmin Le Grand             {
903*49c58f9bSArmin Le Grand                 const Primitive2DReference aPrimitiveInvert(
904*49c58f9bSArmin Le Grand                     new ModifiedColorPrimitive2D(
905*49c58f9bSArmin Le Grand                         aRetval,
906*49c58f9bSArmin Le Grand                         basegfx::BColorModifierSharedPtr(
907*49c58f9bSArmin Le Grand                             new basegfx::BColorModifier_invert())));
908*49c58f9bSArmin Le Grand 
909*49c58f9bSArmin Le Grand                 aRetval = Primitive2DSequence(&aPrimitiveInvert, 1);
910*49c58f9bSArmin Le Grand             }
911*49c58f9bSArmin Le Grand 
912*49c58f9bSArmin Le Grand             return aRetval;
913*49c58f9bSArmin Le Grand         }
914*49c58f9bSArmin Le Grand 
915*49c58f9bSArmin Le Grand     } // end of namespace primitive2d
916*49c58f9bSArmin Le Grand } // end of namespace drawinglayer
917*49c58f9bSArmin Le Grand 
918035a2f44SArmin Le Grand //////////////////////////////////////////////////////////////////////////////
919035a2f44SArmin Le Grand // eof
920