diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2020-05-14 14:42:24 +0300 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2020-05-23 07:06:35 +0200 |
commit | 9c621ee8ea41a1c53bfeca49827290826785973e (patch) | |
tree | 4283ae45c70154bb4951adc634b749a301d06117 /vcl | |
parent | 8bc1dcf22df49fa1fb5c858a8f0f44143d41d6f7 (diff) |
Add missing mpAlphaVDev handling
... a pre-requisite for re-implementing soft edge to use mpAlphaVDev
necessary to keep objects' transparency when applying the effect
Change-Id: I56f5c0f2468c32843abbc1f14e06861a22f6919d
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/94662
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/source/outdev/bitmap.cxx | 15 | ||||
-rw-r--r-- | vcl/source/outdev/polygon.cxx | 3 | ||||
-rw-r--r-- | vcl/source/outdev/polyline.cxx | 9 | ||||
-rw-r--r-- | vcl/source/outdev/transparent.cxx | 20 |
4 files changed, 42 insertions, 5 deletions
diff --git a/vcl/source/outdev/bitmap.cxx b/vcl/source/outdev/bitmap.cxx index 44d28e15229a..401ebd6a77f2 100644 --- a/vcl/source/outdev/bitmap.cxx +++ b/vcl/source/outdev/bitmap.cxx @@ -1051,17 +1051,25 @@ bool OutputDevice::DrawTransformBitmapExDirect( const basegfx::B2DPoint aTopY(aFullTransform * basegfx::B2DPoint(0.0, 1.0)); SalBitmap* pSalSrcBmp = rBitmapEx.GetBitmap().ImplGetSalBitmap().get(); SalBitmap* pSalAlphaBmp = nullptr; + Bitmap aAlphaBitmap; if(rBitmapEx.IsTransparent()) { if(rBitmapEx.IsAlpha()) { - pSalAlphaBmp = rBitmapEx.GetAlpha().ImplGetSalBitmap().get(); + aAlphaBitmap = rBitmapEx.GetAlpha(); } else { - pSalAlphaBmp = rBitmapEx.GetMask().ImplGetSalBitmap().get(); + aAlphaBitmap = rBitmapEx.GetMask(); } + if (!mpAlphaVDev) + pSalAlphaBmp = aAlphaBitmap.ImplGetSalBitmap().get(); + } + else if (mpAlphaVDev) + { + aAlphaBitmap = Bitmap(rBitmapEx.GetSizePixel(), 1); + aAlphaBitmap.Erase(COL_BLACK); } bDone = mpGraphics->DrawTransformedBitmap( @@ -1072,6 +1080,9 @@ bool OutputDevice::DrawTransformBitmapExDirect( pSalAlphaBmp, this); + if (mpAlphaVDev) + mpAlphaVDev->DrawTransformBitmapExDirect(aFullTransform, BitmapEx(aAlphaBitmap)); + return bDone; }; diff --git a/vcl/source/outdev/polygon.cxx b/vcl/source/outdev/polygon.cxx index 60deaceb822c..77e0564ba16f 100644 --- a/vcl/source/outdev/polygon.cxx +++ b/vcl/source/outdev/polygon.cxx @@ -338,6 +338,9 @@ void OutputDevice::ImplDrawPolyPolygonWithB2DPolyPolygon(const basegfx::B2DPolyP if(bSuccess) { + if (mpAlphaVDev) + mpAlphaVDev->ImplDrawPolyPolygonWithB2DPolyPolygon(rB2DPolyPoly); + return; } } diff --git a/vcl/source/outdev/polyline.cxx b/vcl/source/outdev/polyline.cxx index d17056d58e13..672854a9ed55 100644 --- a/vcl/source/outdev/polyline.cxx +++ b/vcl/source/outdev/polyline.cxx @@ -342,11 +342,12 @@ bool OutputDevice::DrawPolyLineDirect( const basegfx::B2DHomMatrix aTransform(ImplGetDeviceTransformation() * rObjectTransform); const bool bPixelSnapHairline((mnAntialiasing & AntialiasingFlags::PixelSnapHairline) && rB2DPolygon.count() < 1000); + const double fAdjustedTransparency = mpAlphaVDev ? 0 : fTransparency; // draw the polyline bool bDrawSuccess = mpGraphics->DrawPolyLine( aTransform, rB2DPolygon, - fTransparency, + fAdjustedTransparency, fLineWidth, // tdf#124848 use LineWidth direct, do not try to solve for zero-case (aka hairline) pStroke, // MM01 eLineJoin, @@ -370,6 +371,12 @@ bool OutputDevice::DrawPolyLineDirect( const tools::Polygon aToolsPolygon( rB2DPolygon ); mpMetaFile->AddAction( new MetaPolyLineAction( aToolsPolygon, aLineInfo ) ); } + + if (mpAlphaVDev) + mpAlphaVDev->DrawPolyLineDirect(rObjectTransform, rB2DPolygon, fLineWidth, + fTransparency, pStroke, eLineJoin, eLineCap, + fMiterMinimumAngle, bBypassAACheck); + return true; } } diff --git a/vcl/source/outdev/transparent.cxx b/vcl/source/outdev/transparent.cxx index e35d4dfbf959..a9e2ae080e8c 100644 --- a/vcl/source/outdev/transparent.cxx +++ b/vcl/source/outdev/transparent.cxx @@ -248,6 +248,7 @@ void OutputDevice::DrawTransparent( // create ObjectToDevice transformation const basegfx::B2DHomMatrix aFullTransform(ImplGetDeviceTransformation() * rObjectTransform); + const double fAdjustedTransparency = mpAlphaVDev ? 0 : fTransparency; bool bDrawnOk(true); if( IsFillColor() ) @@ -255,7 +256,7 @@ void OutputDevice::DrawTransparent( bDrawnOk = mpGraphics->DrawPolyPolygon( aFullTransform, aB2DPolyPolygon, - fTransparency, + fAdjustedTransparency, this); } @@ -268,7 +269,7 @@ void OutputDevice::DrawTransparent( mpGraphics->DrawPolyLine( aFullTransform, rPolygon, - fTransparency, + fAdjustedTransparency, 0.0, // tdf#124848 hairline nullptr, // MM01 basegfx::B2DLineJoin::NONE, @@ -292,6 +293,21 @@ void OutputDevice::DrawTransparent( static_cast< sal_uInt16 >(fTransparency * 100.0))); } + if (mpAlphaVDev) + { + const Color aFillCol(mpAlphaVDev->GetFillColor()); + const Color aLineColor(mpAlphaVDev->GetLineColor()); + const auto nGreyScale = static_cast<sal_uInt8>(std::round(255 * fTransparency)); + const Color aNewColor(nGreyScale, nGreyScale, nGreyScale); + mpAlphaVDev->SetFillColor(aNewColor); + mpAlphaVDev->SetLineColor(aNewColor); + + mpAlphaVDev->DrawTransparent(rObjectTransform, rB2DPolyPoly, fTransparency); + + mpAlphaVDev->SetFillColor(aFillCol); + mpAlphaVDev->SetLineColor(aLineColor); + } + return; } } |