summaryrefslogtreecommitdiff
path: root/vcl/source
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2020-05-14 14:42:24 +0300
committerMike Kaganski <mike.kaganski@collabora.com>2020-05-23 07:06:35 +0200
commit9c621ee8ea41a1c53bfeca49827290826785973e (patch)
tree4283ae45c70154bb4951adc634b749a301d06117 /vcl/source
parent8bc1dcf22df49fa1fb5c858a8f0f44143d41d6f7 (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/source')
-rw-r--r--vcl/source/outdev/bitmap.cxx15
-rw-r--r--vcl/source/outdev/polygon.cxx3
-rw-r--r--vcl/source/outdev/polyline.cxx9
-rw-r--r--vcl/source/outdev/transparent.cxx20
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;
}
}