[Libreoffice-commits] core.git: Branch 'feature/skia' - 8 commits - include/vcl vcl/backendtest vcl/inc vcl/qa vcl/skia
Tomaž Vajngerl (via logerrit)
logerrit at kemper.freedesktop.org
Thu Oct 31 20:45:39 UTC 2019
include/vcl/virdev.hxx | 9 ++
vcl/backendtest/outputdevice/bitmap.cxx | 47 +++++++++++++
vcl/backendtest/outputdevice/common.cxx | 8 +-
vcl/inc/skia/gdiimpl.hxx | 6 +
vcl/inc/test/outputdevice.hxx | 6 +
vcl/qa/cppunit/BackendTest.cxx | 22 ++++++
vcl/skia/gdiimpl.cxx | 108 ++++++++++++++++++++++----------
7 files changed, 165 insertions(+), 41 deletions(-)
New commits:
commit 796d3d40d056ff0395b0f983198a9af922b76b4a
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Thu Oct 31 21:41:42 2019 +0100
Commit: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
CommitDate: Thu Oct 31 21:41:42 2019 +0100
skia: drawMask can be simplified with drawBitmap call
Change-Id: Ie01c9dba1287495db9f176c1e1e25799e5f3e872
diff --git a/vcl/skia/gdiimpl.cxx b/vcl/skia/gdiimpl.cxx
index d0c2c1a08058..35bb44f02f2a 100644
--- a/vcl/skia/gdiimpl.cxx
+++ b/vcl/skia/gdiimpl.cxx
@@ -728,7 +728,6 @@ void SkiaSalGraphicsImpl::drawMask(const SalTwoRect& rPosAry, const SalBitmap& r
void SkiaSalGraphicsImpl::drawMask(const SalTwoRect& rPosAry, const SkBitmap& rBitmap,
Color nMaskColor)
{
- preDraw();
SkBitmap tmpBitmap;
if (!tmpBitmap.tryAllocN32Pixels(rBitmap.width(), rBitmap.height()))
abort();
@@ -739,13 +738,8 @@ void SkiaSalGraphicsImpl::drawMask(const SalTwoRect& rPosAry, const SkBitmap& rB
paint.setBlendMode(SkBlendMode::kDstOut);
SkCanvas canvas(tmpBitmap);
canvas.drawBitmap(rBitmap, 0, 0, &paint);
- mSurface->getCanvas()->drawBitmapRect(
- tmpBitmap,
- SkRect::MakeXYWH(rPosAry.mnSrcX, rPosAry.mnSrcY, rPosAry.mnSrcWidth, rPosAry.mnSrcHeight),
- SkRect::MakeXYWH(rPosAry.mnDestX, rPosAry.mnDestY, rPosAry.mnDestWidth,
- rPosAry.mnDestHeight),
- nullptr);
- postDraw();
+
+ drawBitmap(rPosAry, tmpBitmap);
}
std::shared_ptr<SalBitmap> SkiaSalGraphicsImpl::getBitmap(long nX, long nY, long nWidth,
commit 080bf40c2b81360a2eaf25fceee1c6007b595548
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Thu Oct 31 21:30:27 2019 +0100
Commit: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
CommitDate: Thu Oct 31 21:36:14 2019 +0100
skia: add common function to check the input SalTwoRects
function is checkInvalidSourceOrDestination
Change-Id: Id3b5dc69a3949f01b5335a9bdf0ce0ad165adab1
diff --git a/vcl/skia/gdiimpl.cxx b/vcl/skia/gdiimpl.cxx
index 0ab8be2f98cf..d0c2c1a08058 100644
--- a/vcl/skia/gdiimpl.cxx
+++ b/vcl/skia/gdiimpl.cxx
@@ -133,6 +133,14 @@ Color fromSkColor(SkColor color)
return Color(255 - SkColorGetA(color), SkColorGetR(color), SkColorGetG(color),
SkColorGetB(color));
}
+
+// returns true if the source or destination rectangles are invalid
+bool checkInvalidSourceOrDestination(SalTwoRect const& rPosAry)
+{
+ return rPosAry.mnSrcWidth <= 0 || rPosAry.mnSrcHeight <= 0 || rPosAry.mnDestWidth <= 0
+ || rPosAry.mnDestHeight <= 0;
+}
+
} // end anonymous namespace
// Class that triggers flushing the backing buffer when idle.
@@ -642,11 +650,8 @@ void SkiaSalGraphicsImpl::copyBits(const SalTwoRect& rPosAry, SalGraphics* pSrcG
bool SkiaSalGraphicsImpl::blendBitmap(const SalTwoRect& rPosAry, const SalBitmap& rBitmap)
{
- if (rPosAry.mnSrcWidth <= 0 || rPosAry.mnSrcHeight <= 0 || rPosAry.mnDestWidth <= 0
- || rPosAry.mnDestHeight <= 0)
- {
+ if (checkInvalidSourceOrDestination(rPosAry))
return false;
- }
assert(dynamic_cast<const SkiaSalBitmap*>(&rBitmap));
@@ -661,11 +666,8 @@ bool SkiaSalGraphicsImpl::blendAlphaBitmap(const SalTwoRect& rPosAry,
const SalBitmap& rMaskBitmap,
const SalBitmap& rAlphaBitmap)
{
- if (rPosAry.mnSrcWidth <= 0 || rPosAry.mnSrcHeight <= 0 || rPosAry.mnDestWidth <= 0
- || rPosAry.mnDestHeight <= 0)
- {
+ if (checkInvalidSourceOrDestination(rPosAry))
return false;
- }
assert(dynamic_cast<const SkiaSalBitmap*>(&rSrcBitmap));
assert(dynamic_cast<const SkiaSalBitmap*>(&rMaskBitmap));
@@ -701,11 +703,8 @@ bool SkiaSalGraphicsImpl::blendAlphaBitmap(const SalTwoRect& rPosAry,
void SkiaSalGraphicsImpl::drawBitmap(const SalTwoRect& rPosAry, const SalBitmap& rSalBitmap)
{
- if (rPosAry.mnSrcWidth <= 0 || rPosAry.mnSrcHeight <= 0 || rPosAry.mnDestWidth <= 0
- || rPosAry.mnDestHeight <= 0)
- {
+ if (checkInvalidSourceOrDestination(rPosAry))
return;
- }
assert(dynamic_cast<const SkiaSalBitmap*>(&rSalBitmap));
const SkiaSalBitmap& rSkiaSourceBitmap = static_cast<const SkiaSalBitmap&>(rSalBitmap);
commit 672aa1c44b217d378a1bb58d133665acf82ae655
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Thu Oct 31 21:17:25 2019 +0100
Commit: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
CommitDate: Thu Oct 31 21:17:25 2019 +0100
skia: use a common drawBitmap in more cases
Add an additional parameter to drawBitmap - blend mode, so we can
also use the same bitmap drawing code for blendBitmap.
Change-Id: Iaa0aff6724c6644d80056097e7477b31c8412b29
diff --git a/vcl/inc/skia/gdiimpl.hxx b/vcl/inc/skia/gdiimpl.hxx
index 828f7d916aaf..432f8f2512e5 100644
--- a/vcl/inc/skia/gdiimpl.hxx
+++ b/vcl/inc/skia/gdiimpl.hxx
@@ -185,8 +185,6 @@ public:
virtual bool drawGradient(const tools::PolyPolygon& rPolygon,
const Gradient& rGradient) override;
- void drawBitmap(const SalTwoRect& rPosAry, const SkBitmap& bitmap);
-
virtual bool supportsOperation(OutDevSupportType eType) const override;
#ifdef DBG_UTIL
@@ -194,6 +192,10 @@ public:
static void dump(const SkBitmap& bitmap, const char* file);
#endif
+ // Default blend mode for SkPaint is SkBlendMode::kSrcOver
+ void drawBitmap(const SalTwoRect& rPosAry, const SkBitmap& aBitmap,
+ SkBlendMode eBlendMode = SkBlendMode::kSrcOver);
+
protected:
// To be called before any drawing.
void preDraw();
diff --git a/vcl/skia/gdiimpl.cxx b/vcl/skia/gdiimpl.cxx
index 150b47e83aa6..0ab8be2f98cf 100644
--- a/vcl/skia/gdiimpl.cxx
+++ b/vcl/skia/gdiimpl.cxx
@@ -650,21 +650,8 @@ bool SkiaSalGraphicsImpl::blendBitmap(const SalTwoRect& rPosAry, const SalBitmap
assert(dynamic_cast<const SkiaSalBitmap*>(&rBitmap));
- preDraw();
-
const SkiaSalBitmap& rSkiaBitmap = static_cast<const SkiaSalBitmap&>(rBitmap);
-
- SkRect aSourceRect
- = SkRect::MakeXYWH(rPosAry.mnSrcX, rPosAry.mnSrcY, rPosAry.mnSrcWidth, rPosAry.mnSrcHeight);
- SkRect aDestinationRect = SkRect::MakeXYWH(rPosAry.mnDestX, rPosAry.mnDestY,
- rPosAry.mnDestWidth, rPosAry.mnDestHeight);
-
- SkPaint aPaint;
- aPaint.setBlendMode(SkBlendMode::kMultiply);
- mSurface->getCanvas()->drawBitmapRect(rSkiaBitmap.GetSkBitmap(), aSourceRect, aDestinationRect,
- &aPaint);
-
- postDraw();
+ drawBitmap(rPosAry, rSkiaBitmap.GetSkBitmap(), SkBlendMode::kMultiply);
return true;
}
@@ -716,16 +703,14 @@ void SkiaSalGraphicsImpl::drawBitmap(const SalTwoRect& rPosAry, const SalBitmap&
{
if (rPosAry.mnSrcWidth <= 0 || rPosAry.mnSrcHeight <= 0 || rPosAry.mnDestWidth <= 0
|| rPosAry.mnDestHeight <= 0)
+ {
return;
- preDraw();
+ }
+
assert(dynamic_cast<const SkiaSalBitmap*>(&rSalBitmap));
- mSurface->getCanvas()->drawBitmapRect(
- static_cast<const SkiaSalBitmap&>(rSalBitmap).GetSkBitmap(),
- SkRect::MakeXYWH(rPosAry.mnSrcX, rPosAry.mnSrcY, rPosAry.mnSrcWidth, rPosAry.mnSrcHeight),
- SkRect::MakeXYWH(rPosAry.mnDestX, rPosAry.mnDestY, rPosAry.mnDestWidth,
- rPosAry.mnDestHeight),
- nullptr);
- postDraw();
+ const SkiaSalBitmap& rSkiaSourceBitmap = static_cast<const SkiaSalBitmap&>(rSalBitmap);
+
+ drawBitmap(rPosAry, rSkiaSourceBitmap.GetSkBitmap());
}
void SkiaSalGraphicsImpl::drawBitmap(const SalTwoRect& rPosAry, const SalBitmap& rSalBitmap,
@@ -905,15 +890,19 @@ bool SkiaSalGraphicsImpl::drawAlphaBitmap(const SalTwoRect& rPosAry, const SalBi
return true;
}
-void SkiaSalGraphicsImpl::drawBitmap(const SalTwoRect& rPosAry, const SkBitmap& bitmap)
+void SkiaSalGraphicsImpl::drawBitmap(const SalTwoRect& rPosAry, const SkBitmap& aBitmap,
+ SkBlendMode eBlendMode)
{
+ SkRect aSourceRect
+ = SkRect::MakeXYWH(rPosAry.mnSrcX, rPosAry.mnSrcY, rPosAry.mnSrcWidth, rPosAry.mnSrcHeight);
+ SkRect aDestinationRect = SkRect::MakeXYWH(rPosAry.mnDestX, rPosAry.mnDestY,
+ rPosAry.mnDestWidth, rPosAry.mnDestHeight);
+
+ SkPaint aPaint;
+ aPaint.setBlendMode(eBlendMode);
+
preDraw();
- mSurface->getCanvas()->drawBitmapRect(
- bitmap,
- SkRect::MakeXYWH(rPosAry.mnSrcX, rPosAry.mnSrcY, rPosAry.mnSrcWidth, rPosAry.mnSrcHeight),
- SkRect::MakeXYWH(rPosAry.mnDestX, rPosAry.mnDestY, rPosAry.mnDestWidth,
- rPosAry.mnDestHeight),
- nullptr);
+ mSurface->getCanvas()->drawBitmapRect(aBitmap, aSourceRect, aDestinationRect, &aPaint);
postDraw();
}
commit 8d2a357f001c7d4b304dcf7ed43257ce57f03ce6
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Thu Oct 31 20:45:25 2019 +0100
Commit: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
CommitDate: Thu Oct 31 21:10:52 2019 +0100
skia: implement blendAlphaBitmap and blendBitmap
Change-Id: I83f33795bea5ed72f1f3269f30f64b1b24566538
diff --git a/vcl/skia/gdiimpl.cxx b/vcl/skia/gdiimpl.cxx
index a406d85e924d..150b47e83aa6 100644
--- a/vcl/skia/gdiimpl.cxx
+++ b/vcl/skia/gdiimpl.cxx
@@ -640,20 +640,76 @@ void SkiaSalGraphicsImpl::copyBits(const SalTwoRect& rPosAry, SalGraphics* pSrcG
postDraw();
}
-bool SkiaSalGraphicsImpl::blendBitmap(const SalTwoRect&, const SalBitmap& rBitmap)
+bool SkiaSalGraphicsImpl::blendBitmap(const SalTwoRect& rPosAry, const SalBitmap& rBitmap)
{
- (void)rBitmap;
- return false;
+ if (rPosAry.mnSrcWidth <= 0 || rPosAry.mnSrcHeight <= 0 || rPosAry.mnDestWidth <= 0
+ || rPosAry.mnDestHeight <= 0)
+ {
+ return false;
+ }
+
+ assert(dynamic_cast<const SkiaSalBitmap*>(&rBitmap));
+
+ preDraw();
+
+ const SkiaSalBitmap& rSkiaBitmap = static_cast<const SkiaSalBitmap&>(rBitmap);
+
+ SkRect aSourceRect
+ = SkRect::MakeXYWH(rPosAry.mnSrcX, rPosAry.mnSrcY, rPosAry.mnSrcWidth, rPosAry.mnSrcHeight);
+ SkRect aDestinationRect = SkRect::MakeXYWH(rPosAry.mnDestX, rPosAry.mnDestY,
+ rPosAry.mnDestWidth, rPosAry.mnDestHeight);
+
+ SkPaint aPaint;
+ aPaint.setBlendMode(SkBlendMode::kMultiply);
+ mSurface->getCanvas()->drawBitmapRect(rSkiaBitmap.GetSkBitmap(), aSourceRect, aDestinationRect,
+ &aPaint);
+
+ postDraw();
+
+ return true;
}
-bool SkiaSalGraphicsImpl::blendAlphaBitmap(const SalTwoRect&, const SalBitmap& rSrcBitmap,
+bool SkiaSalGraphicsImpl::blendAlphaBitmap(const SalTwoRect& rPosAry,
+ const SalBitmap& rSourceBitmap,
const SalBitmap& rMaskBitmap,
const SalBitmap& rAlphaBitmap)
{
- (void)rSrcBitmap;
- (void)rMaskBitmap;
- (void)rAlphaBitmap;
- return false;
+ if (rPosAry.mnSrcWidth <= 0 || rPosAry.mnSrcHeight <= 0 || rPosAry.mnDestWidth <= 0
+ || rPosAry.mnDestHeight <= 0)
+ {
+ return false;
+ }
+
+ assert(dynamic_cast<const SkiaSalBitmap*>(&rSrcBitmap));
+ assert(dynamic_cast<const SkiaSalBitmap*>(&rMaskBitmap));
+ assert(dynamic_cast<const SkiaSalBitmap*>(&rAlphaBitmap));
+
+ SkBitmap aTempBitmap;
+ if (!aTempBitmap.tryAllocN32Pixels(rSourceBitmap.GetSize().Width(),
+ rSourceBitmap.GetSize().Height()))
+ {
+ return false;
+ }
+
+ const SkiaSalBitmap& rSkiaSourceBitmap = static_cast<const SkiaSalBitmap&>(rSourceBitmap);
+ const SkiaSalBitmap& rSkiaMaskBitmap = static_cast<const SkiaSalBitmap&>(rMaskBitmap);
+ const SkiaSalBitmap& rSkiaAlphaBitmap = static_cast<const SkiaSalBitmap&>(rAlphaBitmap);
+
+ SkCanvas aCanvas(aTempBitmap);
+ SkPaint aPaint;
+
+ aPaint.setBlendMode(SkBlendMode::kSrc);
+ aCanvas.drawBitmap(rSkiaMaskBitmap.GetAlphaSkBitmap(), 0, 0, &aPaint);
+
+ aPaint.setBlendMode(SkBlendMode::kSrcIn);
+ aCanvas.drawBitmap(rSkiaAlphaBitmap.GetAlphaSkBitmap(), 0, 0, &aPaint);
+
+ aPaint.setBlendMode(SkBlendMode::kSrcOut);
+ aCanvas.drawBitmap(rSkiaSourceBitmap.GetSkBitmap(), 0, 0, &aPaint);
+
+ drawBitmap(rPosAry, aTempBitmap);
+
+ return true;
}
void SkiaSalGraphicsImpl::drawBitmap(const SalTwoRect& rPosAry, const SalBitmap& rSalBitmap)
commit 52737fc3fbb5e90eea04bfe39ea7a7fe4cfba0d5
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Thu Oct 31 20:26:44 2019 +0100
Commit: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
CommitDate: Thu Oct 31 20:26:44 2019 +0100
skia: don't loop to first point if the polygon is not closed
This fixes drawing of non-closed polylines. Without this fix the
non-closed polylines an extra step is still drawn from the last
point in the polygon to the first one (as if the polyline would be
closed).
Change-Id: I0171aede3dc03f83b7dd8ae699e6b505b3fd4f7f
diff --git a/vcl/skia/gdiimpl.cxx b/vcl/skia/gdiimpl.cxx
index b375b39d1c28..a406d85e924d 100644
--- a/vcl/skia/gdiimpl.cxx
+++ b/vcl/skia/gdiimpl.cxx
@@ -59,6 +59,10 @@ void lclPolygonToPath(const basegfx::B2DPolygon& rPolygon, SkPath& rPath)
for (sal_uInt32 nIndex = 0; nIndex <= nPointCount; nIndex++)
{
+ if (nIndex == nPointCount && !bClosePath)
+ continue;
+
+ // Make sure we loop the last point to first point
nCurrentIndex = nIndex % nPointCount;
aCurrentPoint = rPolygon.getB2DPoint(nCurrentIndex);
commit e74002d7e02ed1245183db310cddf54d80c5a294
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Thu Oct 31 20:22:17 2019 +0100
Commit: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
CommitDate: Thu Oct 31 20:24:14 2019 +0100
backendtest: test blending of bitmap
This forces a blending of an alpha virtualdevice with a BitmapEx
which has an alpha component. This tries a fast-path with using
blendAlphaBitmap in the backend and does blending manually and
slower if the fast-path is not available.
Change-Id: I7e45dc78ce3e61ede408aa8388802a193cbc577a
diff --git a/vcl/backendtest/outputdevice/bitmap.cxx b/vcl/backendtest/outputdevice/bitmap.cxx
index dbbb052c122e..58b7c5f03ff0 100644
--- a/vcl/backendtest/outputdevice/bitmap.cxx
+++ b/vcl/backendtest/outputdevice/bitmap.cxx
@@ -112,6 +112,39 @@ Bitmap OutputDeviceTestBitmap::setupDrawMask()
return mpVirtualDevice->GetBitmap(maVDRectangle.TopLeft(), maVDRectangle.GetSize());
}
+BitmapEx OutputDeviceTestBitmap::setupDrawBlend()
+{
+ Size aBitmapSize(9, 9);
+ Bitmap aBitmap(aBitmapSize, 24);
+ {
+ BitmapScopedWriteAccess aWriteAccess(aBitmap);
+ aWriteAccess->Erase(COL_WHITE);
+ aWriteAccess->SetLineColor(Color(0xFF, 0xFF, 0x00));
+ aWriteAccess->DrawRect(tools::Rectangle(0, 0, 8, 8));
+ aWriteAccess->DrawRect(tools::Rectangle(3, 3, 5, 5));
+ }
+
+ AlphaMask aAlpha(aBitmapSize);
+ {
+ AlphaScopedWriteAccess aWriteAccess(aAlpha);
+ aWriteAccess->Erase(COL_WHITE);
+ aWriteAccess->SetLineColor(Color(0x44, 0x44, 0x44));
+ aWriteAccess->DrawRect(tools::Rectangle(0, 0, 8, 8));
+ aWriteAccess->DrawRect(tools::Rectangle(3, 3, 5, 5));
+ }
+
+ initialSetup(13, 13, constBackgroundColor, false, true);
+ mpVirtualDevice->SetFillColor(constBackgroundColor);
+ mpVirtualDevice->SetLineColor(constBackgroundColor);
+ mpVirtualDevice->DrawRect(maVDRectangle);
+
+ Point aPoint(alignToCenter(maVDRectangle, tools::Rectangle(Point(), aBitmapSize)).TopLeft());
+
+ mpVirtualDevice->DrawBitmapEx(aPoint, BitmapEx(aBitmap, aAlpha));
+
+ return mpVirtualDevice->GetBitmapEx(maVDRectangle.TopLeft(), maVDRectangle.GetSize());
+}
+
TestResult OutputDeviceTestBitmap::checkTransformedBitmap(Bitmap& rBitmap)
{
std::vector<Color> aExpected
@@ -140,6 +173,20 @@ TestResult OutputDeviceTestBitmap::checkMask(Bitmap& rBitmap)
return checkRectangle(rBitmap);
}
+TestResult OutputDeviceTestBitmap::checkBlend(BitmapEx& rBitmapEx)
+{
+ const Color aBlendedColor(0xEE, 0xEE, 0x33);
+
+ std::vector<Color> aExpected
+ {
+ constBackgroundColor, constBackgroundColor,
+ aBlendedColor, constBackgroundColor, constBackgroundColor,
+ aBlendedColor, constBackgroundColor
+ };
+ Bitmap aBitmap(rBitmapEx.GetBitmap());
+ return checkRectangles(aBitmap, aExpected);
+}
+
}} // end namespace vcl::test
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/inc/test/outputdevice.hxx b/vcl/inc/test/outputdevice.hxx
index 587bb7507d2e..fb625d7987f3 100644
--- a/vcl/inc/test/outputdevice.hxx
+++ b/vcl/inc/test/outputdevice.hxx
@@ -88,10 +88,12 @@ public:
Bitmap setupDrawBitmap();
Bitmap setupDrawBitmapExWithAlpha();
Bitmap setupDrawMask();
+ BitmapEx setupDrawBlend();
static TestResult checkTransformedBitmap(Bitmap& rBitmap);
static TestResult checkBitmapExWithAlpha(Bitmap& rBitmap);
static TestResult checkMask(Bitmap& rBitmap);
+ static TestResult checkBlend(BitmapEx& rBitmap);
};
class VCL_DLLPUBLIC OutputDeviceTestAnotherOutDev : public OutputDeviceTestCommon
diff --git a/vcl/qa/cppunit/BackendTest.cxx b/vcl/qa/cppunit/BackendTest.cxx
index 50e3981cc591..928d7746827b 100644
--- a/vcl/qa/cppunit/BackendTest.cxx
+++ b/vcl/qa/cppunit/BackendTest.cxx
@@ -22,6 +22,17 @@ class BackendTest : public test::BootstrapFixture
// "xdg-open ./workdir/CppunitTest/vcl_backend_test.test.core/"
static constexpr const bool mbExportBitmap = false;
+ void exportImage(OUString const& rsFilename, BitmapEx const& rBitmapEx)
+ {
+ if (mbExportBitmap)
+ {
+ BitmapEx aBitmapEx(rBitmapEx);
+ aBitmapEx.Scale(Size(128, 128), BmpScaleFlag::Fast);
+ SvFileStream aStream(rsFilename, StreamMode::WRITE | StreamMode::TRUNC);
+ GraphicFilter::GetGraphicFilter().compressAsPNG(aBitmapEx, aStream);
+ }
+ }
+
void exportImage(OUString const& rsFilename, Bitmap const& rBitmap)
{
if (mbExportBitmap)
@@ -377,6 +388,16 @@ public:
CPPUNIT_ASSERT(eResult != vcl::test::TestResult::Failed);
}
+ void testDrawBlend()
+ {
+ vcl::test::OutputDeviceTestBitmap aOutDevTest;
+ BitmapEx aBitmapEx = aOutDevTest.setupDrawBlend();
+ auto eResult = vcl::test::OutputDeviceTestBitmap::checkBlend(aBitmapEx);
+ exportImage("08-05_blend_test.png", aBitmapEx);
+ if (aOutDevTest.getRenderBackendName() == "skia")
+ CPPUNIT_ASSERT(eResult != vcl::test::TestResult::Failed);
+ }
+
CPPUNIT_TEST_SUITE(BackendTest);
CPPUNIT_TEST(testDrawRectWithRectangle);
CPPUNIT_TEST(testDrawRectWithPixel);
@@ -417,6 +438,7 @@ public:
CPPUNIT_TEST(testDrawTransformedBitmap);
CPPUNIT_TEST(testDrawBitmapExWithAlpha);
CPPUNIT_TEST(testDrawMask);
+ CPPUNIT_TEST(testDrawBlend);
CPPUNIT_TEST_SUITE_END();
};
commit 71ffd66f465a75b3df13910078e109ad6b6a9158
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Thu Oct 31 20:17:50 2019 +0100
Commit: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
CommitDate: Thu Oct 31 20:17:50 2019 +0100
backendtest: support creating VirtualDevice with alpha
Change-Id: I74c428b9b31b89536e72d53e418fc11b3f7e4e32
diff --git a/vcl/backendtest/outputdevice/common.cxx b/vcl/backendtest/outputdevice/common.cxx
index 167664d0e3d9..00c7b473e88a 100644
--- a/vcl/backendtest/outputdevice/common.cxx
+++ b/vcl/backendtest/outputdevice/common.cxx
@@ -223,7 +223,6 @@ const Color OutputDeviceTestCommon::constLineColor(COL_LIGHTBLUE);
const Color OutputDeviceTestCommon::constFillColor(COL_LIGHTBLUE);
OutputDeviceTestCommon::OutputDeviceTestCommon()
- : mpVirtualDevice(VclPtr<VirtualDevice>::Create())
{}
OUString OutputDeviceTestCommon::getRenderBackendName() const
@@ -236,8 +235,13 @@ OUString OutputDeviceTestCommon::getRenderBackendName() const
return OUString();
}
-void OutputDeviceTestCommon::initialSetup(long nWidth, long nHeight, Color aColor, bool bEnableAA)
+void OutputDeviceTestCommon::initialSetup(long nWidth, long nHeight, Color aColor, bool bEnableAA, bool bAlphaVirtualDevice)
{
+ if (bAlphaVirtualDevice)
+ mpVirtualDevice = VclPtr<VirtualDevice>::Create(DeviceFormat::DEFAULT, DeviceFormat::DEFAULT);
+ else
+ mpVirtualDevice = VclPtr<VirtualDevice>::Create(DeviceFormat::DEFAULT);
+
maVDRectangle = tools::Rectangle(Point(), Size (nWidth, nHeight));
mpVirtualDevice->SetOutputSizePixel(maVDRectangle.GetSize());
if (bEnableAA)
diff --git a/vcl/inc/test/outputdevice.hxx b/vcl/inc/test/outputdevice.hxx
index 7c7e71c975e2..587bb7507d2e 100644
--- a/vcl/inc/test/outputdevice.hxx
+++ b/vcl/inc/test/outputdevice.hxx
@@ -34,7 +34,7 @@ class VCL_DLLPUBLIC OutputDeviceTestCommon
{
protected:
- ScopedVclPtr<VirtualDevice> mpVirtualDevice;
+ VclPtr<VirtualDevice> mpVirtualDevice;
tools::Rectangle maVDRectangle;
static const Color constBackgroundColor;
@@ -46,7 +46,7 @@ public:
OUString getRenderBackendName() const;
- void initialSetup(long nWidth, long nHeight, Color aColor, bool bEnableAA = false);
+ void initialSetup(long nWidth, long nHeight, Color aColor, bool bEnableAA = false, bool bAlphaVirtualDevice = false);
static TestResult checkRectangle(Bitmap& rBitmap);
static TestResult checkRectangleAA(Bitmap& rBitmap);
commit d84cb4a2d05b284b6d88b6e4ec7e47d451a63bb5
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Thu Oct 31 20:14:22 2019 +0100
Commit: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
CommitDate: Thu Oct 31 20:14:22 2019 +0100
vcl: allow creating a VirtualDevice with alpha sufrace
Change-Id: Ie181eeb984d8531b437c267b410eeb3c552f844f
diff --git a/include/vcl/virdev.hxx b/include/vcl/virdev.hxx
index 9baba707e23a..a70f8a110a5d 100644
--- a/include/vcl/virdev.hxx
+++ b/include/vcl/virdev.hxx
@@ -104,9 +104,14 @@ public:
Device format of the generated virtual device. Use DeviceFormat::DEFAULT here, to
indicate: take default screen depth. Only DeviceFormat::BITMASK
is the other possibility to denote a binary mask.
+
+ @param eAlphaFormat
+ Device format of the generated virtual device. Use DeviceFormat::DEFAULT here, to
+ indicate: take default screen depth. Only DeviceFormat::BITMASK
+ is the other possibility to denote a binary mask.
*/
- explicit VirtualDevice(DeviceFormat eFormat = DeviceFormat::DEFAULT)
- : VirtualDevice(nullptr, eFormat, DeviceFormat::NONE, OUTDEV_VIRDEV) {}
+ explicit VirtualDevice(DeviceFormat eFormat = DeviceFormat::DEFAULT, DeviceFormat eAlphaFormat = DeviceFormat::NONE)
+ : VirtualDevice(nullptr, eFormat, eAlphaFormat, OUTDEV_VIRDEV) {}
/** Create a virtual device of size 1x1
More information about the Libreoffice-commits
mailing list