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 201035a2f44SArmin Le Grand 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 785035a2f44SArmin 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 918*49c58f9bSArmin Le Grand ////////////////////////////////////////////////////////////////////////////// 919035a2f44SArmin Le Grand // eof 920