[Libreoffice-commits] core.git: include/vcl vcl/qa vcl/source
Chris Sherlock (via logerrit)
logerrit at kemper.freedesktop.org
Wed Sep 8 08:12:16 UTC 2021
include/vcl/BitmapTools.hxx | 10 +++++
include/vcl/outdev.hxx | 15 --------
vcl/qa/cppunit/BitmapTest.cxx | 25 +++++++++----
vcl/qa/cppunit/outdev.cxx | 71 --------------------------------------
vcl/source/bitmap/BitmapTools.cxx | 68 ++++++++++++++++++++++++++++++++++++
vcl/source/outdev/bitmap.cxx | 68 ------------------------------------
vcl/source/outdev/transparent.cxx | 5 +-
7 files changed, 99 insertions(+), 163 deletions(-)
New commits:
commit 6d6c0e2c35186323bb5af35f5a58a2c9d9baa1ed
Author: Chris Sherlock <chris.sherlock79 at gmail.com>
AuthorDate: Fri Sep 3 18:55:08 2021 +1000
Commit: Tomaž Vajngerl <quikee at gmail.com>
CommitDate: Wed Sep 8 10:11:42 2021 +0200
vcl: migrate GetDownsampledBitmap() from OutputDevice to vcl::bitmap
Change-Id: Iee6caa8292472a3acca66d670a113b701f4b637e
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/121581
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee at gmail.com>
diff --git a/include/vcl/BitmapTools.hxx b/include/vcl/BitmapTools.hxx
index 7ca5891f5f90..aebe6ad82424 100644
--- a/include/vcl/BitmapTools.hxx
+++ b/include/vcl/BitmapTools.hxx
@@ -83,6 +83,16 @@ bool VCL_DLLPUBLIC isHistorical8x8(const BitmapEx& rBitmapEx, Color& o_rBack, Co
VCL_DLLPUBLIC bool convertBitmap32To24Plus8(BitmapEx const & rInput, BitmapEx & rResult);
+/** Retrieve downsampled and cropped bitmap
+
+ Takes destination size in twips units.
+
+ @attention This method ignores negative rDstSz values, thus
+ mirroring must happen outside this method (e.g. in DrawBitmap)
+ */
+VCL_DLLPUBLIC Bitmap GetDownsampledBitmap(Size const& rDstSizeTwip, Point const& rSrcPt, Size const& rSrcSz,
+ Bitmap const& rBmp, tools::Long nMaxBmpDPIX, tools::Long nMaxBmpDPIY);
+
} // end vcl::bitmap
#endif // INCLUDED_VCL_BITMAP_TOOLS_HXX
diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx
index fbebf0a1a3d8..f5f398a1e0b9 100644
--- a/include/vcl/outdev.hxx
+++ b/include/vcl/outdev.hxx
@@ -1414,21 +1414,6 @@ protected:
basegfx::B2DRange &aVisibleRange,
double &fMaximumArea);
- /** Retrieve downsampled and cropped bitmap
-
- Takes destination size in twips units.
-
- @attention This method ignores negative rDstSz values, thus
- mirroring must happen outside this method (e.g. in DrawBitmap)
- */
- static Bitmap GetDownsampledBitmap(
- const Size& rDstSz,
- const Point& rSrcPt,
- const Size& rSrcSz,
- const Bitmap& rBmp,
- tools::Long nMaxBmpDPIX,
- tools::Long nMaxBmpDPIY );
-
private:
SAL_DLLPRIVATE void DrawDeviceAlphaBitmap(
diff --git a/vcl/qa/cppunit/BitmapTest.cxx b/vcl/qa/cppunit/BitmapTest.cxx
index 25630ea9cabb..9d4cbb592f68 100644
--- a/vcl/qa/cppunit/BitmapTest.cxx
+++ b/vcl/qa/cppunit/BitmapTest.cxx
@@ -11,21 +11,22 @@
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/plugin/TestPlugIn.h>
-#include <unordered_map>
+#include <config_features.h>
+#include <rtl/strbuf.hxx>
+
+#include <vcl/BitmapTools.hxx>
#include <vcl/bitmap.hxx>
#include <vcl/virdev.hxx>
-
-#include <rtl/strbuf.hxx>
-#include <config_features.h>
#include <vcl/skia/SkiaHelper.hxx>
#include <vcl/BitmapMonochromeFilter.hxx>
#include <bitmap/BitmapWriteAccess.hxx>
-
-#include <svdata.hxx>
-#include <salinst.hxx>
#include <bitmap/Octree.hxx>
+#include <salinst.hxx>
+#include <svdata.hxx>
+
+#include <unordered_map>
namespace
{
@@ -46,6 +47,7 @@ class BitmapTest : public CppUnit::TestFixture
void testDitherSize();
void testMirror();
void testCrop();
+ void testCroppedDownsampledBitmap();
CPPUNIT_TEST_SUITE(BitmapTest);
CPPUNIT_TEST(testCreation);
@@ -63,6 +65,7 @@ class BitmapTest : public CppUnit::TestFixture
CPPUNIT_TEST(testDitherSize);
CPPUNIT_TEST(testMirror);
CPPUNIT_TEST(testCrop);
+ CPPUNIT_TEST(testCroppedDownsampledBitmap);
CPPUNIT_TEST_SUITE_END();
};
@@ -687,6 +690,14 @@ void BitmapTest::testMirror()
}
}
+void BitmapTest::testCroppedDownsampledBitmap()
+{
+ Bitmap aBitmap(Size(16, 16), vcl::PixelFormat::N24_BPP);
+ Bitmap aDownsampledBmp(vcl::bitmap::GetDownsampledBitmap(Size(10, 10), Point(20, 20),
+ Size(5, 5), aBitmap, 72, 72));
+ CPPUNIT_ASSERT(aDownsampledBmp.IsEmpty());
+}
+
void BitmapTest::testCrop()
{
Bitmap aBitmap(Bitmap(Size(16, 16), vcl::PixelFormat::N24_BPP));
diff --git a/vcl/qa/cppunit/outdev.cxx b/vcl/qa/cppunit/outdev.cxx
index 0a635a1a139d..5f78c5127807 100644
--- a/vcl/qa/cppunit/outdev.cxx
+++ b/vcl/qa/cppunit/outdev.cxx
@@ -44,7 +44,6 @@ public:
void testDrawScalePartBitmap();
void testDrawTransformedBitmapEx();
void testDrawTransformedBitmapExFlip();
- void testCroppedDownsampledBitmap();
void testRTL();
void testRTLGuard();
void testDefaultFillColor();
@@ -78,7 +77,6 @@ public:
CPPUNIT_TEST(testGetReadableFontColorWindow);
CPPUNIT_TEST(testDrawTransformedBitmapEx);
CPPUNIT_TEST(testDrawTransformedBitmapExFlip);
- CPPUNIT_TEST(testCroppedDownsampledBitmap);
CPPUNIT_TEST(testRTL);
CPPUNIT_TEST(testRTLGuard);
CPPUNIT_TEST(testDefaultFillColor);
@@ -514,75 +512,6 @@ void VclOutdevTest::testDrawTransformedBitmapExFlip()
CPPUNIT_ASSERT_EQUAL_MESSAGE(ss.str(), COL_BLACK, Color(aColor));
}
-namespace
-{
-class DownsampleBitmapTester : public OutputDevice
-{
-public:
- DownsampleBitmapTester()
- : OutputDevice(OUTDEV_VIRDEV)
- , maBitmap(Bitmap(Size(16, 16), vcl::PixelFormat::N24_BPP))
- {
- SetDPIX(96);
- SetDPIY(96);
- }
-
- bool AcquireGraphics() const { return true; }
- void ReleaseGraphics(bool) {}
- bool UsePolyPolygonForComplexGradient() { return false; }
-
- Bitmap testCropFullyOutsideBounds()
- {
- return GetDownsampledBitmap(Size(10, 10), Point(20, 20), Size(5, 5), maBitmap, 72, 72);
- }
-
- Bitmap testCropSameSize()
- {
- return GetDownsampledBitmap(Size(10, 10), Point(0, 0), maBitmap.GetSizePixel(), maBitmap,
- 72, 72);
- }
-
- Bitmap testFullyOvercrop()
- {
- return GetDownsampledBitmap(Size(10, 10), Point(0, 0), Size(100, 100), maBitmap, 72, 72);
- }
-
- Bitmap testPartiallyOvercrop()
- {
- return GetDownsampledBitmap(Size(10, 10), Point(10, 10), Size(100, 100), maBitmap, 72, 72);
- }
-
-private:
- Bitmap maBitmap;
-};
-}
-
-void VclOutdevTest::testCroppedDownsampledBitmap()
-{
- ScopedVclPtrInstance<DownsampleBitmapTester> pTester;
-
- {
- Bitmap aDownsampledBmp(pTester->testCropFullyOutsideBounds());
- CPPUNIT_ASSERT_MESSAGE("Crop was fully outside of bitmap bounds",
- aDownsampledBmp.IsEmpty());
- }
-
- {
- Bitmap aDownsampledBmp(pTester->testCropSameSize());
- CPPUNIT_ASSERT_MESSAGE("Crop same size as bitmap", !aDownsampledBmp.IsEmpty());
- }
-
- {
- Bitmap aDownsampledBmp(pTester->testFullyOvercrop());
- CPPUNIT_ASSERT_MESSAGE("Crop larger than bitmap", !aDownsampledBmp.IsEmpty());
- }
-
- {
- Bitmap aDownsampledBmp(pTester->testPartiallyOvercrop());
- CPPUNIT_ASSERT_MESSAGE("Crop partially overcrops bitmap", !aDownsampledBmp.IsEmpty());
- }
-}
-
void VclOutdevTest::testRTL()
{
ScopedVclPtrInstance<vcl::Window> pWindow(nullptr, WB_APP | WB_STDWORK);
diff --git a/vcl/source/bitmap/BitmapTools.cxx b/vcl/source/bitmap/BitmapTools.cxx
index eddef22cfb53..2a9dc870ddc1 100644
--- a/vcl/source/bitmap/BitmapTools.cxx
+++ b/vcl/source/bitmap/BitmapTools.cxx
@@ -13,6 +13,7 @@
#include <array>
#include <utility>
+#include <tools/helpers.hxx>
#include <vcl/BitmapTools.hxx>
#include <sal/log.hxx>
@@ -1140,6 +1141,73 @@ bool convertBitmap32To24Plus8(BitmapEx const & rInput, BitmapEx & rResult)
return true;
}
+Bitmap GetDownsampledBitmap(Size const& rDstSizeTwip, Point const& rSrcPt, Size const& rSrcSz,
+ Bitmap const& rBmp, tools::Long nMaxBmpDPIX, tools::Long nMaxBmpDPIY)
+{
+ Bitmap aBmp(rBmp);
+
+ if (!aBmp.IsEmpty())
+ {
+ const tools::Rectangle aBmpRect( Point(), aBmp.GetSizePixel() );
+ tools::Rectangle aSrcRect( rSrcPt, rSrcSz );
+
+ // do cropping if necessary
+ if( aSrcRect.Intersection( aBmpRect ) != aBmpRect )
+ {
+ if( !aSrcRect.IsEmpty() )
+ aBmp.Crop( aSrcRect );
+ else
+ aBmp.SetEmpty();
+ }
+
+ if( !aBmp.IsEmpty() )
+ {
+ // do downsampling if necessary
+ // #103209# Normalize size (mirroring has to happen outside of this method)
+ Size aDstSizeTwip(std::abs(rDstSizeTwip.Width()), std::abs(rDstSizeTwip.Height()));
+
+ const Size aBmpSize( aBmp.GetSizePixel() );
+ const double fBmpPixelX = aBmpSize.Width();
+ const double fBmpPixelY = aBmpSize.Height();
+ const double fMaxPixelX
+ = o3tl::convert<double>(aDstSizeTwip.Width(), o3tl::Length::twip, o3tl::Length::in)
+ * nMaxBmpDPIX;
+ const double fMaxPixelY
+ = o3tl::convert<double>(aDstSizeTwip.Height(), o3tl::Length::twip, o3tl::Length::in)
+ * nMaxBmpDPIY;
+
+ // check, if the bitmap DPI exceeds the maximum DPI (allow 4 pixel rounding tolerance)
+ if (((fBmpPixelX > (fMaxPixelX + 4)) ||
+ (fBmpPixelY > (fMaxPixelY + 4))) &&
+ (fBmpPixelY > 0.0) && (fMaxPixelY > 0.0))
+ {
+ // do scaling
+ Size aNewBmpSize;
+ const double fBmpWH = fBmpPixelX / fBmpPixelY;
+ const double fMaxWH = fMaxPixelX / fMaxPixelY;
+
+ if (fBmpWH < fMaxWH)
+ {
+ aNewBmpSize.setWidth(FRound(fMaxPixelY * fBmpWH));
+ aNewBmpSize.setHeight(FRound(fMaxPixelY));
+ }
+ else if (fBmpWH > 0.0)
+ {
+ aNewBmpSize.setWidth(FRound(fMaxPixelX));
+ aNewBmpSize.setHeight(FRound(fMaxPixelX / fBmpWH));
+ }
+
+ if( aNewBmpSize.Width() && aNewBmpSize.Height() )
+ aBmp.Scale(aNewBmpSize);
+ else
+ aBmp.SetEmpty();
+ }
+ }
+ }
+
+ return aBmp;
+}
+
} // end vcl::bitmap
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/outdev/bitmap.cxx b/vcl/source/outdev/bitmap.cxx
index 5466340c2bfe..6f548cbfc7a3 100644
--- a/vcl/source/outdev/bitmap.cxx
+++ b/vcl/source/outdev/bitmap.cxx
@@ -170,74 +170,6 @@ void OutputDevice::DrawBitmap( const Point& rDestPt, const Size& rDestSize,
}
}
-Bitmap OutputDevice::GetDownsampledBitmap( const Size& rDstSizeTwip,
- const Point& rSrcPt, const Size& rSrcSz,
- const Bitmap& rBmp, tools::Long nMaxBmpDPIX, tools::Long nMaxBmpDPIY )
-{
- Bitmap aBmp( rBmp );
-
- if( !aBmp.IsEmpty() )
- {
- const tools::Rectangle aBmpRect( Point(), aBmp.GetSizePixel() );
- tools::Rectangle aSrcRect( rSrcPt, rSrcSz );
-
- // do cropping if necessary
- if( aSrcRect.Intersection( aBmpRect ) != aBmpRect )
- {
- if( !aSrcRect.IsEmpty() )
- aBmp.Crop( aSrcRect );
- else
- aBmp.SetEmpty();
- }
-
- if( !aBmp.IsEmpty() )
- {
- // do downsampling if necessary
- // #103209# Normalize size (mirroring has to happen outside of this method)
- Size aDstSizeTwip(std::abs(rDstSizeTwip.Width()), std::abs(rDstSizeTwip.Height()));
-
- const Size aBmpSize( aBmp.GetSizePixel() );
- const double fBmpPixelX = aBmpSize.Width();
- const double fBmpPixelY = aBmpSize.Height();
- const double fMaxPixelX
- = o3tl::convert<double>(aDstSizeTwip.Width(), o3tl::Length::twip, o3tl::Length::in)
- * nMaxBmpDPIX;
- const double fMaxPixelY
- = o3tl::convert<double>(aDstSizeTwip.Height(), o3tl::Length::twip, o3tl::Length::in)
- * nMaxBmpDPIY;
-
- // check, if the bitmap DPI exceeds the maximum DPI (allow 4 pixel rounding tolerance)
- if( ( ( fBmpPixelX > ( fMaxPixelX + 4 ) ) ||
- ( fBmpPixelY > ( fMaxPixelY + 4 ) ) ) &&
- ( fBmpPixelY > 0.0 ) && ( fMaxPixelY > 0.0 ) )
- {
- // do scaling
- Size aNewBmpSize;
- const double fBmpWH = fBmpPixelX / fBmpPixelY;
- const double fMaxWH = fMaxPixelX / fMaxPixelY;
-
- if( fBmpWH < fMaxWH )
- {
- aNewBmpSize.setWidth( FRound( fMaxPixelY * fBmpWH ) );
- aNewBmpSize.setHeight( FRound( fMaxPixelY ) );
- }
- else if( fBmpWH > 0.0 )
- {
- aNewBmpSize.setWidth( FRound( fMaxPixelX ) );
- aNewBmpSize.setHeight( FRound( fMaxPixelX / fBmpWH) );
- }
-
- if( aNewBmpSize.Width() && aNewBmpSize.Height() )
- aBmp.Scale( aNewBmpSize );
- else
- aBmp.SetEmpty();
- }
- }
- }
-
- return aBmp;
-}
-
Bitmap OutputDevice::GetBitmap( const Point& rSrcPt, const Size& rSize ) const
{
Bitmap aBmp;
diff --git a/vcl/source/outdev/transparent.cxx b/vcl/source/outdev/transparent.cxx
index 8cb2cf51632f..fa17063fa0dd 100644
--- a/vcl/source/outdev/transparent.cxx
+++ b/vcl/source/outdev/transparent.cxx
@@ -24,6 +24,7 @@
#include <tools/helpers.hxx>
#include <officecfg/Office/Common.hxx>
+#include <vcl/BitmapTools.hxx>
#include <vcl/metaact.hxx>
#include <vcl/print.hxx>
#include <vcl/settings.hxx>
@@ -1836,9 +1837,9 @@ bool OutputDevice::RemoveTransparenciesFromMetaFile( const GDIMetaFile& rInMtf,
// scale down bitmap, if requested
if( bDownsampleBitmaps )
- aBandBmp = GetDownsampledBitmap( PixelToLogic(LogicToPixel(aDstSzPix), MapMode(MapUnit::MapTwip)),
+ aBandBmp = vcl::bitmap::GetDownsampledBitmap(PixelToLogic(LogicToPixel(aDstSzPix), MapMode(MapUnit::MapTwip)),
Point(), aBandBmp.GetSizePixel(),
- aBandBmp, nMaxBmpDPIX, nMaxBmpDPIY );
+ aBandBmp, nMaxBmpDPIX, nMaxBmpDPIY);
rOutMtf.AddAction( new MetaCommentAction( "PRNSPOOL_TRANSPARENTBITMAP_BEGIN" ) );
rOutMtf.AddAction( new MetaBmpScaleAction( aDstPtPix, aDstSzPix, aBandBmp ) );
More information about the Libreoffice-commits
mailing list