[Libreoffice-commits] core.git: vcl/qa vcl/source
Tomaž Vajngerl (via logerrit)
logerrit at kemper.freedesktop.org
Tue Apr 16 09:14:53 UTC 2019
vcl/qa/cppunit/bitmaprender/BitmapRenderTest.cxx | 69 +++++++++++++++++++++++
vcl/source/outdev/pixel.cxx | 29 ++++++---
2 files changed, 88 insertions(+), 10 deletions(-)
New commits:
commit ba9e513ee8305c668c94b6ba59e26da278581652
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Tue Apr 16 13:25:05 2019 +0900
Commit: Tomaž Vajngerl <quikee at gmail.com>
CommitDate: Tue Apr 16 11:14:18 2019 +0200
Test an alpha VirtualDevice and fix GetPixel and DrawPixel
This adds an test for a VirtualDevice with an alpha channel,
which checks that getting a BitmapEx from the alpha VirtualDevice
is has a alpha channel properly set.
Test that using GetPixel and DrawPixel properly handle an alpha
based Color, which they didn't, so this also includes the fix for
thouse 2 methods.
Change-Id: I419b8e0f66ab5f8266c6129e501ed75ef517fd44
Reviewed-on: https://gerrit.libreoffice.org/70805
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee at gmail.com>
diff --git a/vcl/qa/cppunit/bitmaprender/BitmapRenderTest.cxx b/vcl/qa/cppunit/bitmaprender/BitmapRenderTest.cxx
index 5fc6c5b7b53c..efb3dcfbcb2e 100644
--- a/vcl/qa/cppunit/bitmaprender/BitmapRenderTest.cxx
+++ b/vcl/qa/cppunit/bitmaprender/BitmapRenderTest.cxx
@@ -42,12 +42,14 @@ public:
void testTdf104141();
void testTdf113918();
void testDrawAlphaBitmapEx();
+ void testAlphaVirtualDevice();
void testTdf116888();
CPPUNIT_TEST_SUITE(BitmapRenderTest);
CPPUNIT_TEST(testTdf104141);
CPPUNIT_TEST(testTdf113918);
CPPUNIT_TEST(testDrawAlphaBitmapEx);
+ CPPUNIT_TEST(testAlphaVirtualDevice);
CPPUNIT_TEST(testTdf116888);
CPPUNIT_TEST_SUITE_END();
@@ -150,6 +152,73 @@ void BitmapRenderTest::testDrawAlphaBitmapEx()
#endif
}
+void BitmapRenderTest::testAlphaVirtualDevice()
+{
+ // Create an alpha virtual device
+ ScopedVclPtr<VirtualDevice> pAlphaVirtualDevice(VclPtr<VirtualDevice>::Create(
+ *Application::GetDefaultDevice(), DeviceFormat::DEFAULT, DeviceFormat::DEFAULT));
+
+ // Set it up
+ pAlphaVirtualDevice->SetOutputSizePixel(Size(4, 4));
+ pAlphaVirtualDevice->SetBackground(Wallpaper(COL_TRANSPARENT));
+ pAlphaVirtualDevice->Erase();
+
+ // Get a BitmapEx from the VirDev -> Colors should have alpha
+ BitmapEx aBitmap = pAlphaVirtualDevice->GetBitmapEx(Point(), Size(4, 4));
+ CPPUNIT_ASSERT_EQUAL(long(4), aBitmap.GetSizePixel().Width());
+ CPPUNIT_ASSERT_EQUAL(long(4), aBitmap.GetSizePixel().Height());
+ Color aColor = aBitmap.GetPixelColor(1, 1);
+ CPPUNIT_ASSERT_EQUAL(Color(0xff, 0xff, 0xff, 0xff), aColor);
+
+ // Draw an opaque pixel to the VirDev
+ pAlphaVirtualDevice->DrawPixel(Point(1, 1), Color(0x00, 0x22, 0xff, 0x55));
+
+ // Read back the opaque pixel
+#ifdef MACOSX
+ // Oh no.. what we input is not the same as what we get out!
+ CPPUNIT_ASSERT_EQUAL(Color(0x00, 0x2C, 0xff, 0x44), pAlphaVirtualDevice->GetPixel(Point(1, 1)));
+#else
+ CPPUNIT_ASSERT_EQUAL(Color(0x00, 0x22, 0xff, 0x55), pAlphaVirtualDevice->GetPixel(Point(1, 1)));
+#endif
+
+ // Read back the BitmapEx and check the opaque pixel
+ aBitmap = pAlphaVirtualDevice->GetBitmapEx(Point(), Size(4, 4));
+ CPPUNIT_ASSERT_EQUAL(long(4), aBitmap.GetSizePixel().Width());
+ CPPUNIT_ASSERT_EQUAL(long(4), aBitmap.GetSizePixel().Height());
+
+ aColor = aBitmap.GetPixelColor(1, 1);
+#ifdef MACOSX
+ // Oh no.. what we input is not the same as what we get out!
+ CPPUNIT_ASSERT_EQUAL(Color(0x00, 0x2C, 0xff, 0x44), aColor);
+#else
+ CPPUNIT_ASSERT_EQUAL(Color(0x00, 0x22, 0xff, 0x55), aColor);
+#endif
+
+ // Draw an semi-transparent pixel
+ pAlphaVirtualDevice->DrawPixel(Point(0, 0), Color(0x44, 0x22, 0xff, 0x55));
+
+ // Read back the semi-transparent pixel
+#ifdef MACOSX
+ // Oh no.. what we input is not the same as what we get out!
+ CPPUNIT_ASSERT_EQUAL(Color(0x34, 0x2C, 0xFF, 0x44), pAlphaVirtualDevice->GetPixel(Point(0, 0)));
+#else
+ CPPUNIT_ASSERT_EQUAL(Color(0x44, 0x22, 0xFF, 0x55), pAlphaVirtualDevice->GetPixel(Point(0, 0)));
+#endif
+
+ // Read back the BitmapEx and check the semi-transparent pixel
+ aBitmap = pAlphaVirtualDevice->GetBitmapEx(Point(), Size(4, 4));
+ CPPUNIT_ASSERT_EQUAL(long(4), aBitmap.GetSizePixel().Width());
+ CPPUNIT_ASSERT_EQUAL(long(4), aBitmap.GetSizePixel().Height());
+
+ aColor = aBitmap.GetPixelColor(0, 0);
+#ifdef MACOSX
+ // Oh no.. what we input is not the same as what we get out!
+ CPPUNIT_ASSERT_EQUAL(Color(0x34, 0x2C, 0xFF, 0x44), aColor);
+#else
+ CPPUNIT_ASSERT_EQUAL(Color(0x44, 0x22, 0xFF, 0x55), aColor);
+#endif
+}
+
void BitmapRenderTest::testTdf116888()
{
// The image is a 8bit image with a non-grayscale palette. In OpenGL mode
diff --git a/vcl/source/outdev/pixel.cxx b/vcl/source/outdev/pixel.cxx
index b00835fe96db..ecde4564f4ac 100644
--- a/vcl/source/outdev/pixel.cxx
+++ b/vcl/source/outdev/pixel.cxx
@@ -32,20 +32,26 @@
#include <outdata.hxx>
#include <salgdi.hxx>
-Color OutputDevice::GetPixel( const Point& rPt ) const
+Color OutputDevice::GetPixel(const Point& rPoint) const
{
Color aColor;
- if ( mpGraphics || AcquireGraphics() )
+ if (mpGraphics || AcquireGraphics())
{
- if ( mbInitClipRegion )
+ if (mbInitClipRegion)
const_cast<OutputDevice*>(this)->InitClipRegion();
- if ( !mbOutputClipped )
+ if (!mbOutputClipped)
{
- const long nX = ImplLogicXToDevicePixel( rPt.X() );
- const long nY = ImplLogicYToDevicePixel( rPt.Y() );
- aColor = mpGraphics->GetPixel( nX, nY, this );
+ const long nX = ImplLogicXToDevicePixel(rPoint.X());
+ const long nY = ImplLogicYToDevicePixel(rPoint.Y());
+ aColor = mpGraphics->GetPixel(nX, nY, this);
+
+ if (mpAlphaVDev)
+ {
+ Color aAlphaColor = mpAlphaVDev->GetPixel(rPoint);
+ aColor.SetTransparency(aAlphaColor.GetBlue());
+ }
}
}
return aColor;
@@ -90,7 +96,7 @@ void OutputDevice::DrawPixel( const Point& rPt, const Color& rColor )
if ( mpMetaFile )
mpMetaFile->AddAction( new MetaPixelAction( rPt, aColor ) );
- if ( !IsDeviceOutputNecessary() || ImplIsColorTransparent( aColor ) || ImplIsRecordLayout() )
+ if ( !IsDeviceOutputNecessary() || ImplIsRecordLayout() )
return;
Point aPt = ImplLogicToDevicePixel( rPt );
@@ -106,8 +112,11 @@ void OutputDevice::DrawPixel( const Point& rPt, const Color& rColor )
mpGraphics->DrawPixel( aPt.X(), aPt.Y(), aColor, this );
- if( mpAlphaVDev )
- mpAlphaVDev->DrawPixel( rPt );
+ if (mpAlphaVDev)
+ {
+ Color aAlphaColor(rColor.GetTransparency(), rColor.GetTransparency(), rColor.GetTransparency());
+ mpAlphaVDev->DrawPixel(rPt, aAlphaColor);
+ }
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
More information about the Libreoffice-commits
mailing list