diff options
author | Jan Holesovsky <kendy@collabora.com> | 2014-01-27 20:11:26 +0100 |
---|---|---|
committer | Andras Timar <andras.timar@collabora.com> | 2014-01-27 20:25:01 +0000 |
commit | 39f0062a074c24fd2bdc5b20f457e51fc322c82b (patch) | |
tree | 432247980de9cb03b88b5b119da8478c376b5a38 | |
parent | 649eba4229cc0a22bdd8160cf4d19470aae9300c (diff) |
fdo#74124: Scale the pictures before calling ImplDrawAlpha().
When the source and destination bitmap do not have the same size,
ImplDrawAlpha() does not use direct paint, but instead it gets the image from
the screen, blends it with the provided bitmap, and again draws it.
Unfortunately, the blending uses the most trivial (and ugly) way of scaling;
so to produce much better results, let's scale to the destination size before
even calling ImplDrawAlpha().
The sideeffect is that we use the direct paint in most cases now; so hopefully
it pays off to do the (a bit more expensive) scale first.
Change-Id: I3b6b275710220910709ae4345ad6be3d6e4bf79c
Reviewed-on: https://gerrit.libreoffice.org/7701
Reviewed-by: Andras Timar <andras.timar@collabora.com>
Tested-by: Andras Timar <andras.timar@collabora.com>
-rw-r--r-- | vcl/source/gdi/outdev2.cxx | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/vcl/source/gdi/outdev2.cxx b/vcl/source/gdi/outdev2.cxx index 759c3b47b57f..8ec9c211919a 100644 --- a/vcl/source/gdi/outdev2.cxx +++ b/vcl/source/gdi/outdev2.cxx @@ -1001,7 +1001,25 @@ void OutputDevice::ImplDrawBitmapEx( const Point& rDestPt, const Size& rDestSize if(aBmpEx.IsAlpha()) { - ImplDrawAlpha( aBmpEx.GetBitmap(), aBmpEx.GetAlpha(), rDestPt, rDestSize, rSrcPtPixel, rSrcSizePixel ); + Size aDestSizePixel(LogicToPixel(rDestSize)); + + BitmapEx aScaledBitmapEx(aBmpEx); + Point aSrcPtPixel(rSrcPtPixel); + Size aSrcSizePixel(rSrcSizePixel); + + // we have beautiful scaling algorithms, let's use them + if (aDestSizePixel != rSrcSizePixel && rSrcSizePixel.Width() != 0 && rSrcSizePixel.Height() != 0) + { + double fScaleX = double(aDestSizePixel.Width()) / rSrcSizePixel.Width(); + double fScaleY = double(aDestSizePixel.Height()) / rSrcSizePixel.Height(); + + aScaledBitmapEx.Scale(fScaleX, fScaleY); + + aSrcSizePixel = aDestSizePixel; + aSrcPtPixel.X() = rSrcPtPixel.X() * fScaleX; + aSrcPtPixel.Y() = rSrcPtPixel.Y() * fScaleY; + } + ImplDrawAlpha(aScaledBitmapEx.GetBitmap(), aScaledBitmapEx.GetAlpha(), rDestPt, rDestSize, aSrcPtPixel, aSrcSizePixel); return; } @@ -2063,6 +2081,9 @@ void OutputDevice::ImplDrawAlpha( const Bitmap& rBmp, const AlphaMask& rAlpha, if( !bNativeAlpha && !aBmpRect.Intersection( Rectangle( rSrcPtPixel, rSrcSizePixel ) ).IsEmpty() ) { + // The scaling in this code path produces really ugly results - it + // does the most trivial scaling with no smoothing. + GDIMetaFile* pOldMetaFile = mpMetaFile; const bool bOldMap = mbMap; mpMetaFile = NULL; // fdo#55044 reset before GetBitmap! |