Resolves: #i122923# optimize place to add alpha to bitmaps which need rotation
(cherry picked from commit 2178fea0941c4abb624ecddf2453f670ba68878f) Change-Id: Ib83d10bcd2d0950fbb8afe8894caa9c0b60e6a5d
This commit is contained in:
parent
284a03b4d2
commit
03e73d57f1
@ -435,28 +435,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);
|
||||
|
@ -765,7 +765,13 @@ void OutputDevice::DrawTransformedBitmapEx(
|
||||
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)
|
||||
{
|
||||
@ -848,12 +854,30 @@ void OutputDevice::DrawTransformedBitmapEx(
|
||||
if(!aVisibleRange.isEmpty())
|
||||
{
|
||||
static bool bDoSmoothAtAll(true);
|
||||
const BitmapEx aTransformed(
|
||||
rBitmapEx.getTransformed(
|
||||
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));
|
||||
bDoSmoothAtAll);
|
||||
basegfx::B2DRange aTargetRange(0.0, 0.0, 1.0, 1.0);
|
||||
|
||||
// get logic object target range
|
||||
|
Loading…
x
Reference in New Issue
Block a user