Author: alg
Date: Thu Aug 29 13:04:18 2013
New Revision: 1518629

URL: http://svn.apache.org/r1518629
Log:
i122923 optimize place to add alpha to bitmaps which need rotation

Modified:
    openoffice/branches/AOO401/main/drawinglayer/   (props changed)
    
openoffice/branches/AOO401/main/drawinglayer/source/processor2d/vclprocessor2d.cxx
    openoffice/branches/AOO401/main/vcl/source/gdi/outdev2.cxx

Propchange: openoffice/branches/AOO401/main/drawinglayer/
------------------------------------------------------------------------------
  Merged /openoffice/trunk/main/drawinglayer:r1518176

Modified: 
openoffice/branches/AOO401/main/drawinglayer/source/processor2d/vclprocessor2d.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/branches/AOO401/main/drawinglayer/source/processor2d/vclprocessor2d.cxx?rev=1518629&r1=1518628&r2=1518629&view=diff
==============================================================================
--- 
openoffice/branches/AOO401/main/drawinglayer/source/processor2d/vclprocessor2d.cxx
 (original)
+++ 
openoffice/branches/AOO401/main/drawinglayer/source/processor2d/vclprocessor2d.cxx
 Thu Aug 29 13:04:18 2013
@@ -409,28 +409,8 @@ namespace drawinglayer
                                }
                        }
 
-                       // decompose matrix to check for shear, rotate and 
mirroring
-                       basegfx::B2DVector aScale, aTranslate;
-                       double fRotate, fShearX;
-
-            aLocalTransform.decompose(aScale, aTranslate, fRotate, fShearX);
-
-            const bool bRotated(!basegfx::fTools::equalZero(fRotate));
-            const bool bSheared(!basegfx::fTools::equalZero(fShearX));
-
-                       if(!aBitmapEx.IsTransparent() && (bSheared || bRotated))
-                       {
-                               // parts will be uncovered, extend aBitmapEx 
with a mask bitmap
-                               const Bitmap aContent(aBitmapEx.GetBitmap());
-#if defined(MACOSX)
-                               AlphaMask aMaskBmp( aContent.GetSizePixel());
-                               aMaskBmp.Erase( 0);
-#else
-                               Bitmap aMaskBmp( aContent.GetSizePixel(), 1);
-                               aMaskBmp.Erase(Color(COL_BLACK)); // #122758# 
Initialize to non-transparent
-#endif
-                               aBitmapEx = BitmapEx(aContent, aMaskBmp);
-                       }
+            // #122923# do no longer add Alpha channel here; the right place 
to do this is when really 
+            // the own transformer is used (see 
OutputDevice::DrawTransformedBitmapEx).
 
             // draw using OutputDevice'sDrawTransformedBitmapEx
             mpOutputDevice->DrawTransformedBitmapEx(aLocalTransform, 
aBitmapEx);

Modified: openoffice/branches/AOO401/main/vcl/source/gdi/outdev2.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/branches/AOO401/main/vcl/source/gdi/outdev2.cxx?rev=1518629&r1=1518628&r2=1518629&view=diff
==============================================================================
--- openoffice/branches/AOO401/main/vcl/source/gdi/outdev2.cxx (original)
+++ openoffice/branches/AOO401/main/vcl/source/gdi/outdev2.cxx Thu Aug 29 
13:04:18 2013
@@ -891,7 +891,13 @@ void OutputDevice::DrawTransformedBitmap
         basegfx::B2DRange aVisibleRange(0.0, 0.0, 1.0, 1.0);
 
         // limit maximum area to something looking good for non-pixel-based 
targets (metafile, printer)
-        double fMaximumArea(1000000.0);
+        // by using a fixed minimum (allow at least, but no need to utilize) 
for good smooting and an area 
+        // dependent of original size for good quality when e.g. 
rotated/sheared. Still, limit to a maximum 
+        // to avoid crashes/ressource problems (ca. 1500x3000 here)
+        const Size& rOriginalSizePixel(rBitmapEx.GetSizePixel());
+        const double fOrigArea(rOriginalSizePixel.Width() * 
rOriginalSizePixel.Height() * 0.5);
+        const double fOrigAreaScaled(bSheared || bRotated ? fOrigArea * 1.44 : 
fOrigArea);
+        double fMaximumArea(std::min(4500000.0, std::max(1000000.0, 
fOrigAreaScaled)));
 
         if(!bMetafile && !bPrinter)
         {
@@ -974,12 +980,30 @@ void OutputDevice::DrawTransformedBitmap
         if(!aVisibleRange.isEmpty())
         {
             static bool bDoSmoothAtAll(true);
-            const BitmapEx aTransformed(
-                rBitmapEx.getTransformed(
-                    aFullTransform, 
-                    aVisibleRange, 
-                    fMaximumArea, 
-                    bDoSmoothAtAll));
+            BitmapEx aTransformed(rBitmapEx);
+
+            // #122923# when the result needs an alpha channel due to being 
rotated or sheared
+            // and thus uncovering areas, add these channels so that the own 
transformer (used
+            // in getTransformed) also creates a transformed alpha channel
+            if(!aTransformed.IsTransparent() && (bSheared || bRotated))
+            {
+                // parts will be uncovered, extend aTransformed with a mask 
bitmap
+                const Bitmap aContent(aTransformed.GetBitmap());
+#if defined(MACOSX)
+                AlphaMask aMaskBmp(aContent.GetSizePixel());
+                aMaskBmp.Erase(0);
+#else
+                Bitmap aMaskBmp(aContent.GetSizePixel(), 1);
+                aMaskBmp.Erase(Color(COL_BLACK)); // #122758# Initialize to 
non-transparent
+#endif
+                aTransformed = BitmapEx(aContent, aMaskBmp);
+            }
+
+            aTransformed = aTransformed.getTransformed(
+                aFullTransform, 
+                aVisibleRange, 
+                fMaximumArea, 
+                bDoSmoothAtAll);
             basegfx::B2DRange aTargetRange(0.0, 0.0, 1.0, 1.0);
 
             // get logic object target range


Reply via email to