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
|
// #122923# do no longer add Alpha channel here; the right place to do this is when really
|
||||||
basegfx::B2DVector aScale, aTranslate;
|
// the own transformer is used (see OutputDevice::DrawTransformedBitmapEx).
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
// draw using OutputDevice'sDrawTransformedBitmapEx
|
// draw using OutputDevice'sDrawTransformedBitmapEx
|
||||||
mpOutputDevice->DrawTransformedBitmapEx(aLocalTransform, aBitmapEx);
|
mpOutputDevice->DrawTransformedBitmapEx(aLocalTransform, aBitmapEx);
|
||||||
|
@ -765,7 +765,13 @@ void OutputDevice::DrawTransformedBitmapEx(
|
|||||||
basegfx::B2DRange aVisibleRange(0.0, 0.0, 1.0, 1.0);
|
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)
|
// 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)
|
if(!bMetafile && !bPrinter)
|
||||||
{
|
{
|
||||||
@ -848,12 +854,30 @@ void OutputDevice::DrawTransformedBitmapEx(
|
|||||||
if(!aVisibleRange.isEmpty())
|
if(!aVisibleRange.isEmpty())
|
||||||
{
|
{
|
||||||
static bool bDoSmoothAtAll(true);
|
static bool bDoSmoothAtAll(true);
|
||||||
const BitmapEx aTransformed(
|
BitmapEx aTransformed(rBitmapEx);
|
||||||
rBitmapEx.getTransformed(
|
|
||||||
aFullTransform,
|
// #122923# when the result needs an alpha channel due to being rotated or sheared
|
||||||
aVisibleRange,
|
// and thus uncovering areas, add these channels so that the own transformer (used
|
||||||
fMaximumArea,
|
// in getTransformed) also creates a transformed alpha channel
|
||||||
bDoSmoothAtAll));
|
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);
|
basegfx::B2DRange aTargetRange(0.0, 0.0, 1.0, 1.0);
|
||||||
|
|
||||||
// get logic object target range
|
// get logic object target range
|
||||||
|
Loading…
x
Reference in New Issue
Block a user