summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--filter/source/graphicfilter/eps/eps.cxx49
-rw-r--r--include/vcl/graph.hxx3
-rw-r--r--include/vcl/mapmod.hxx3
-rw-r--r--vcl/CppunitTest_vcl_mapmode.mk53
-rw-r--r--vcl/Module_vcl.mk1
-rw-r--r--vcl/qa/cppunit/mapmode.cxx65
-rw-r--r--vcl/source/filter/jpeg/JpegWriter.cxx6
-rw-r--r--vcl/source/filter/jpeg/jpeg.h4
-rw-r--r--vcl/source/filter/jpeg/jpegc.cxx6
-rw-r--r--vcl/source/gdi/graph.cxx26
-rw-r--r--vcl/source/gdi/mapmod.cxx47
11 files changed, 207 insertions, 56 deletions
diff --git a/filter/source/graphicfilter/eps/eps.cxx b/filter/source/graphicfilter/eps/eps.cxx
index 0800b4cf7c07..aaa5fd0e1dfa 100644
--- a/filter/source/graphicfilter/eps/eps.cxx
+++ b/filter/source/graphicfilter/eps/eps.cxx
@@ -215,7 +215,6 @@ private:
inline void ImplWriteTextColor( sal_uLong nMode = PS_RET );
void ImplWriteColor( sal_uLong nMode );
- static double ImplGetScaling( const MapMode& );
void ImplGetMapMode( const MapMode& );
static bool ImplGetBoundingBox( double* nNumb, sal_uInt8* pSource, sal_uLong nSize );
static sal_uInt8* ImplSearchEntry( sal_uInt8* pSource, sal_uInt8 const * pDest, sal_uLong nComp, sal_uLong nSize );
@@ -2197,56 +2196,10 @@ void PSWriter::ImplWriteColor( sal_uLong nMode )
ImplExecMode( nMode );
}
-double PSWriter::ImplGetScaling( const MapMode& rMapMode )
-{
- double nMul;
- switch ( rMapMode.GetMapUnit() )
- {
- case MAP_PIXEL :
- case MAP_SYSFONT :
- case MAP_APPFONT :
-
- case MAP_100TH_MM :
- nMul = 1;
- break;
- case MAP_10TH_MM :
- nMul = 10;
- break;
- case MAP_MM :
- nMul = 100;
- break;
- case MAP_CM :
- nMul = 1000;
- break;
- case MAP_1000TH_INCH :
- nMul = 2.54;
- break;
- case MAP_100TH_INCH :
- nMul = 25.4;
- break;
- case MAP_10TH_INCH :
- nMul = 254;
- break;
- case MAP_INCH :
- nMul = 2540;
- break;
- case MAP_TWIP :
- nMul = 1.76388889;
- break;
- case MAP_POINT :
- nMul = 35.27777778;
- break;
- default:
- nMul = 1.0;
- break;
- }
- return nMul;
-}
-
void PSWriter::ImplGetMapMode( const MapMode& rMapMode )
{
ImplWriteLine( "tm setmatrix" );
- double fMul = ImplGetScaling( rMapMode );
+ double fMul = rMapMode.GetUnitMultiplier();
double fScaleX = (double)rMapMode.GetScaleX() * fMul;
double fScaleY = (double)rMapMode.GetScaleY() * fMul;
ImplTranslate( rMapMode.GetOrigin().X() * fScaleX, rMapMode.GetOrigin().Y() * fScaleY );
diff --git a/include/vcl/graph.hxx b/include/vcl/graph.hxx
index 4ca949130e42..7514f8767016 100644
--- a/include/vcl/graph.hxx
+++ b/include/vcl/graph.hxx
@@ -31,6 +31,7 @@
#include <vcl/gfxlink.hxx>
#include <com/sun/star/uno/Reference.hxx>
#include <vcl/svgdata.hxx>
+#include <basegfx/vector/b2dsize.hxx>
enum GraphicType
@@ -163,6 +164,8 @@ public:
MapMode GetPrefMapMode() const;
void SetPrefMapMode( const MapMode& rPrefMapMode );
+ basegfx::B2DSize GetPPI() const;
+
Size GetSizePixel( const OutputDevice* pRefDevice = nullptr ) const;
sal_uLong GetSizeBytes() const;
diff --git a/include/vcl/mapmod.hxx b/include/vcl/mapmod.hxx
index 508bdd82c8e5..77aa83d53b65 100644
--- a/include/vcl/mapmod.hxx
+++ b/include/vcl/mapmod.hxx
@@ -61,6 +61,9 @@ public:
void SetScaleY( const Fraction& rScaleY );
const Fraction& GetScaleY() const;
+ /// Gets the multiplier, which is relative to 1/100 mm units
+ double GetUnitMultiplier() const;
+
MapMode& operator=( const MapMode& rMapMode );
bool operator==( const MapMode& rMapMode ) const;
bool operator!=( const MapMode& rMapMode ) const
diff --git a/vcl/CppunitTest_vcl_mapmode.mk b/vcl/CppunitTest_vcl_mapmode.mk
new file mode 100644
index 000000000000..daee48078e31
--- /dev/null
+++ b/vcl/CppunitTest_vcl_mapmode.mk
@@ -0,0 +1,53 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+$(eval $(call gb_CppunitTest_CppunitTest,vcl_mapmode))
+
+$(eval $(call gb_CppunitTest_set_include,vcl_mapmode,\
+ $$(INCLUDE) \
+ -I$(SRCDIR)/vcl/inc \
+))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,vcl_mapmode, \
+ vcl/qa/cppunit/mapmode \
+))
+
+$(eval $(call gb_CppunitTest_use_externals,vcl_mapmode,boost_headers))
+
+$(eval $(call gb_CppunitTest_use_libraries,vcl_mapmode, \
+ comphelper \
+ cppu \
+ cppuhelper \
+ sal \
+ svt \
+ test \
+ tl \
+ tk \
+ unotest \
+ vcl \
+ $(gb_UWINAPI) \
+))
+
+$(eval $(call gb_CppunitTest_use_api,vcl_mapmode,\
+ udkapi \
+ offapi \
+))
+
+$(eval $(call gb_CppunitTest_use_ure,vcl_mapmode))
+$(eval $(call gb_CppunitTest_use_vcl,vcl_mapmode))
+
+$(eval $(call gb_CppunitTest_use_components,vcl_mapmode,\
+ configmgr/source/configmgr \
+ i18npool/util/i18npool \
+ ucb/source/core/ucb1 \
+))
+
+$(eval $(call gb_CppunitTest_use_configuration,vcl_mapmode))
+
+# vim: set noet sw=4 ts=4:
diff --git a/vcl/Module_vcl.mk b/vcl/Module_vcl.mk
index 299ffb11f4ac..65fa586e4ee5 100644
--- a/vcl/Module_vcl.mk
+++ b/vcl/Module_vcl.mk
@@ -101,6 +101,7 @@ $(eval $(call gb_Module_add_check_targets,vcl,\
CppunitTest_vcl_fontmetric \
CppunitTest_vcl_complextext \
CppunitTest_vcl_filters_test \
+ CppunitTest_vcl_mapmode \
CppunitTest_vcl_outdev \
CppunitTest_vcl_app_test \
CppunitTest_vcl_wmf_test \
diff --git a/vcl/qa/cppunit/mapmode.cxx b/vcl/qa/cppunit/mapmode.cxx
new file mode 100644
index 000000000000..87c20a3bd666
--- /dev/null
+++ b/vcl/qa/cppunit/mapmode.cxx
@@ -0,0 +1,65 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <test/bootstrapfixture.hxx>
+#include <cppunit/TestAssert.h>
+#include <cppunit/TestFixture.h>
+
+#include <osl/file.hxx>
+#include <osl/process.h>
+
+#include <vcl/mapmod.hxx>
+
+class VclMapModeTest : public test::BootstrapFixture
+{
+public:
+ VclMapModeTest() : BootstrapFixture(true, false) {}
+
+ void testMultiplier();
+
+ CPPUNIT_TEST_SUITE(VclMapModeTest);
+ CPPUNIT_TEST(testMultiplier);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+void VclMapModeTest::testMultiplier()
+{
+ MapMode aMapMode;
+ CPPUNIT_ASSERT_MESSAGE( "Default map mode is MAP_PIXEL, multiplier should be 1", aMapMode.GetUnitMultiplier() == 1 );
+ aMapMode.SetMapUnit( MAP_SYSFONT );
+ CPPUNIT_ASSERT_MESSAGE( "Map mode is MAP_SYSFONT, multiplier should be 1", aMapMode.GetUnitMultiplier() == 1 );
+ aMapMode.SetMapUnit( MAP_APPFONT );
+ CPPUNIT_ASSERT_MESSAGE( "Map mode is MAP_APPFONT, multiplier should be 1", aMapMode.GetUnitMultiplier() == 1 );
+ aMapMode.SetMapUnit( MAP_100TH_MM );
+ CPPUNIT_ASSERT_MESSAGE( "Map mode is MAP_100TH_MM, multiplier should be 1", aMapMode.GetUnitMultiplier() == 1 );
+ aMapMode.SetMapUnit( MAP_10TH_MM );
+ CPPUNIT_ASSERT_MESSAGE( "Map mode is MAP_10TH_MM, multiplier should be 10", aMapMode.GetUnitMultiplier() == 10 );
+ aMapMode.SetMapUnit( MAP_MM );
+ CPPUNIT_ASSERT_MESSAGE( "Map mode is MAP_MM, multiplier should be 100", aMapMode.GetUnitMultiplier() == 100 );
+ aMapMode.SetMapUnit( MAP_CM );
+ CPPUNIT_ASSERT_MESSAGE( "Map mode is MAP_CM, multiplier should be 1000", aMapMode.GetUnitMultiplier() == 1000 );
+ aMapMode.SetMapUnit( MAP_1000TH_INCH );
+ CPPUNIT_ASSERT_MESSAGE( "Map mode is MAP_1000TH_INCH, multiplier should be 2.54", aMapMode.GetUnitMultiplier() == 2.54 );
+ aMapMode.SetMapUnit( MAP_100TH_INCH );
+ CPPUNIT_ASSERT_MESSAGE( "Map mode is MAP_100TH_INCH, multiplier should be 2.54", aMapMode.GetUnitMultiplier() == 25.4 );
+ aMapMode.SetMapUnit( MAP_10TH_INCH );
+ CPPUNIT_ASSERT_MESSAGE( "Map mode is MAP_10TH_INCH, multiplier should be 254", aMapMode.GetUnitMultiplier() == 254 );
+ aMapMode.SetMapUnit( MAP_INCH );
+ CPPUNIT_ASSERT_MESSAGE( "Map mode is MAP_INCH, multiplier should be 2540", aMapMode.GetUnitMultiplier() == 2540 );
+ aMapMode.SetMapUnit( MAP_TWIP );
+ CPPUNIT_ASSERT_MESSAGE( "Map mode is MAP_TWIP, multiplier should be 1.76388889", aMapMode.GetUnitMultiplier() == 1.76388889 );
+ aMapMode.SetMapUnit( MAP_POINT );
+ CPPUNIT_ASSERT_MESSAGE( "Map mode is MAP_POINT, multiplier should be 35.27777778", aMapMode.GetUnitMultiplier() == 35.27777778 );
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(VclMapModeTest);
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/filter/jpeg/JpegWriter.cxx b/vcl/source/filter/jpeg/JpegWriter.cxx
index 94632167e003..35c04797c07f 100644
--- a/vcl/source/filter/jpeg/JpegWriter.cxx
+++ b/vcl/source/filter/jpeg/JpegWriter.cxx
@@ -227,7 +227,11 @@ bool JPEGWriter::Write( const Graphic& rGraphic )
if( !mbNative )
mpBuffer = new sal_uInt8[ AlignedWidth4Bytes( mbGreys ? mpReadAccess->Width() * 8L : mpReadAccess->Width() * 24L ) ];
- bRet = WriteJPEG( this, &mrStream, mpReadAccess->Width(), mpReadAccess->Height(), mbGreys, mnQuality, maChromaSubsampling, mxStatusIndicator );
+ SAL_INFO("vcl", "\nJPEG Export - DPI X: " << rGraphic.GetPPI().getX() << "\nJPEG Export - DPI Y: " << rGraphic.GetPPI().getY());
+
+ bRet = WriteJPEG( this, &mrStream, mpReadAccess->Width(),
+ mpReadAccess->Height(), rGraphic.GetPPI(), mbGreys,
+ mnQuality, maChromaSubsampling, mxStatusIndicator );
delete[] mpBuffer;
mpBuffer = nullptr;
diff --git a/vcl/source/filter/jpeg/jpeg.h b/vcl/source/filter/jpeg/jpeg.h
index 1f8c21f62aac..63c4b2ac3d28 100644
--- a/vcl/source/filter/jpeg/jpeg.h
+++ b/vcl/source/filter/jpeg/jpeg.h
@@ -24,6 +24,7 @@
#include <com/sun/star/uno/Reference.hxx>
#include <sal/types.h>
+#include <basegfx/vector/b2dsize.hxx>
#include <jpeglib.h>
@@ -38,7 +39,8 @@ void jpeg_svstream_src (j_decompress_ptr cinfo, void* infile);
void jpeg_svstream_dest (j_compress_ptr cinfo, void* outfile);
-bool WriteJPEG( JPEGWriter* pJPEGWriter, void* pOutputStream, long nWidth, long nHeight, bool bGreyScale,
+bool WriteJPEG( JPEGWriter* pJPEGWriter, void* pOutputStream,
+ long nWidth, long nHeight, basegfx::B2DSize aPPI, bool bGreyScale,
long nQualityPercent, long aChromaSubsampling,
css::uno::Reference<css::task::XStatusIndicator> const & status);
diff --git a/vcl/source/filter/jpeg/jpegc.cxx b/vcl/source/filter/jpeg/jpegc.cxx
index d42ae785b623..ef3c91c736bf 100644
--- a/vcl/source/filter/jpeg/jpegc.cxx
+++ b/vcl/source/filter/jpeg/jpegc.cxx
@@ -231,7 +231,7 @@ void ReadJPEG( JPEGReader* pJPEGReader, void* pInputStream, long* pLines,
}
bool WriteJPEG( JPEGWriter* pJPEGWriter, void* pOutputStream,
- long nWidth, long nHeight, bool bGreys,
+ long nWidth, long nHeight, basegfx::B2DSize aPPI, bool bGreys,
long nQualityPercent, long aChromaSubsampling,
css::uno::Reference<css::task::XStatusIndicator> const & status )
{
@@ -270,8 +270,8 @@ bool WriteJPEG( JPEGWriter* pJPEGWriter, void* pOutputStream,
jpeg_set_quality( &cinfo, (int) nQualityPercent, FALSE );
cinfo.density_unit = 1;
- cinfo.X_density = 96;
- cinfo.Y_density = 96;
+ cinfo.X_density = aPPI.getX();
+ cinfo.Y_density = aPPI.getY();
if ( ( nWidth > 128 ) || ( nHeight > 128 ) )
jpeg_simple_progression( &cinfo );
diff --git a/vcl/source/gdi/graph.cxx b/vcl/source/gdi/graph.cxx
index 6acf9b19abe3..2c14d8f3bc9a 100644
--- a/vcl/source/gdi/graph.cxx
+++ b/vcl/source/gdi/graph.cxx
@@ -37,8 +37,8 @@ static void ImplDrawDefault( OutputDevice* pOutDev, const OUString* pText,
vcl::Font* pFont, const Bitmap* pBitmap, const BitmapEx* pBitmapEx,
const Point& rDestPt, const Size& rDestSize )
{
- sal_uInt16 nPixel = (sal_uInt16) pOutDev->PixelToLogic( Size( 1, 1 ) ).Width();
- sal_uInt16 nPixelWidth = nPixel;
+ sal_uInt16 nPixel = (sal_uInt16) pOutDev->PixelToLogic( Size( 1, 1 ) ).Width();
+ sal_uInt16 nPixelWidth = nPixel;
Point aPoint( rDestPt.X() + nPixelWidth, rDestPt.Y() + nPixelWidth );
Size aSize( rDestSize.Width() - ( nPixelWidth << 1 ), rDestSize.Height() - ( nPixelWidth << 1 ) );
bool bFilled = ( pBitmap != nullptr || pBitmapEx != nullptr || pFont != nullptr );
@@ -407,6 +407,28 @@ void Graphic::SetPrefMapMode( const MapMode& rPrefMapMode )
mpImpGraphic->ImplSetPrefMapMode( rPrefMapMode );
}
+basegfx::B2DSize Graphic::GetPPI() const
+{
+ MapMode aMapMode = GetPrefMapMode();
+
+ double fWidthInches = ( GetPrefSize().Width() * aMapMode.GetUnitMultiplier() ) / 2540;
+ double fHeightInches = ( GetPrefSize().Height() * aMapMode.GetUnitMultiplier() ) / 2540;
+ double fPpiX = 0;
+ double fPpiY = 0;
+
+ if ( fWidthInches > 0 || fHeightInches > 0 ) // we don't want a divide by 0 situation
+ {
+ fPpiX = GetSizePixel().Width() / fWidthInches;
+ fPpiY = GetSizePixel().Height() / fHeightInches;
+ }
+ else
+ {
+ SAL_WARN("vcl", "PPI X is " << fPpiX << " and PPI Y is " << fPpiY << ": thus we are making this 0 DPI. This is unlikely.");
+ }
+
+ return basegfx::B2DSize( fPpiX, fPpiY );
+}
+
Size Graphic::GetSizePixel( const OutputDevice* pRefDevice ) const
{
Size aRet;
diff --git a/vcl/source/gdi/mapmod.cxx b/vcl/source/gdi/mapmod.cxx
index c95351829bdf..0c4bc512fd62 100644
--- a/vcl/source/gdi/mapmod.cxx
+++ b/vcl/source/gdi/mapmod.cxx
@@ -25,7 +25,6 @@
#include <tools/vcompat.hxx>
#include <tools/debug.hxx>
-
struct MapMode::ImplMapMode
{
sal_uLong mnRefCount;
@@ -208,6 +207,52 @@ void MapMode::SetScaleY( const Fraction& rScaleY )
mpImplMapMode->maScaleY.ReduceInaccurate(32);
}
+double MapMode::GetUnitMultiplier() const
+{
+ double nMul;
+ switch ( GetMapUnit() )
+ {
+ case MAP_PIXEL :
+ case MAP_SYSFONT :
+ case MAP_APPFONT :
+
+ case MAP_100TH_MM :
+ nMul = 1;
+ break;
+ case MAP_10TH_MM :
+ nMul = 10;
+ break;
+ case MAP_MM :
+ nMul = 100;
+ break;
+ case MAP_CM :
+ nMul = 1000;
+ break;
+ case MAP_1000TH_INCH :
+ nMul = 2.54;
+ break;
+ case MAP_100TH_INCH :
+ nMul = 25.4;
+ break;
+ case MAP_10TH_INCH :
+ nMul = 254;
+ break;
+ case MAP_INCH :
+ nMul = 2540;
+ break;
+ case MAP_TWIP :
+ nMul = 1.76388889;
+ break;
+ case MAP_POINT :
+ nMul = 35.27777778;
+ break;
+ default:
+ nMul = 1.0;
+ break;
+ }
+ return nMul;
+}
+
MapMode& MapMode::operator=( const MapMode& rMapMode )
{
DBG_ASSERT( rMapMode.mpImplMapMode->mnRefCount < 0xFFFFFFFE, "MapMode: RefCount overflow" );