You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by al...@apache.org on 2013/08/29 15:04:19 UTC
svn commit: r1518629 - in /openoffice/branches/AOO401/main: drawinglayer/
drawinglayer/source/processor2d/vclprocessor2d.cxx vcl/source/gdi/outdev2.cxx
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