[Libreoffice-commits] core.git: 2 commits - config_host.mk.in configure.ac download.lst external/cuckoo external/Module_external.mk Makefile.fetch readlicense_oo/license RepositoryExternal.mk solenv/flatpak-manifest.in svl/Library_svl.mk svl/source vcl/qa vcl/source
Noel Grandin (via logerrit)
logerrit at kemper.freedesktop.org
Thu Sep 9 07:07:09 UTC 2021
Makefile.fetch | 1
RepositoryExternal.mk | 35 ++++++
config_host.mk.in | 2
configure.ac | 25 ++++
download.lst | 2
external/Module_external.mk | 1
external/cuckoo/Makefile | 7 +
external/cuckoo/Module_cuckoo.mk | 16 +++
external/cuckoo/README | 3
external/cuckoo/UnpackedTarball_cuckoo.mk | 18 +++
readlicense_oo/license/license.xml | 6 +
solenv/flatpak-manifest.in | 7 +
svl/Library_svl.mk | 1
svl/source/misc/sharedstringpool.cxx | 154 +++++++++++++++---------------
vcl/qa/cppunit/outdev.cxx | 13 ++
vcl/source/outdev/line.cxx | 1
vcl/source/outdev/outdev.cxx | 17 +++
vcl/source/outdev/outdevstate.cxx | 17 ---
18 files changed, 235 insertions(+), 91 deletions(-)
New commits:
commit 3749d9af3745c0eaff7239e379578e4e2af89e9d
Author: Noel Grandin <noel at peralex.com>
AuthorDate: Mon Sep 6 12:46:51 2021 +0200
Commit: Noel Grandin <noel.grandin at collabora.co.uk>
CommitDate: Thu Sep 9 09:06:45 2021 +0200
tdf#130795 use concurrent hashmap in SharedStringPool
we are loading a spreadsheet in parallel here, but the parallel threads
achievei very little actual concurrency because of heavy contention
in the SharedStringPool mutex.
So switch to a concurrent hash map. I looked at a couple of different
ones (including the Folly one), and this was the one with the simplest
resulting code.
This takes my load time from 12.5s to 8s
Change-Id: I04d6d8e11d613b510eb3bc981f3338819b7ac813
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/121717
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>
diff --git a/Makefile.fetch b/Makefile.fetch
index 3c5b7ed1ee01..85e2136b9d27 100644
--- a/Makefile.fetch
+++ b/Makefile.fetch
@@ -117,6 +117,7 @@ $(WORKDIR)/download: $(BUILDDIR)/config_$(gb_Side).mk $(SRCDIR)/download.lst $(S
$(call fetch_Optional,COINMP,COINMP_TARBALL) \
$(call fetch_Optional,CPPUNIT,CPPUNIT_TARBALL) \
$(call fetch_Optional,CT2N,CT2N_TARBALL) \
+ $(call fetch_Optional,CUCKOO,CUCKOO_TARBALL) \
$(call fetch_Optional,CURL,CURL_TARBALL) \
$(call fetch_Optional,EBOOK,EBOOK_TARBALL) \
$(call fetch_Optional,EPM,EPM_TARBALL) \
diff --git a/RepositoryExternal.mk b/RepositoryExternal.mk
index 15cfbfde3d4a..3f645e08ec2a 100644
--- a/RepositoryExternal.mk
+++ b/RepositoryExternal.mk
@@ -4249,4 +4249,37 @@ endif # ENABLE_ZXING
endif # SYSTEM_ZXING
-# vim: set noet sw=4 ts=4:
+
+
+ifneq ($(SYSTEM_CUCKOO),)
+
+gb_ExternalProject__use_cuckoo_headers :=
+
+define gb_LinkTarget__use_cuckoo_headers
+$(call gb_LinkTarget_set_include,$(1),\
+ -I$(call gb_UnpackedTarball_get_dir,cuckoo) \
+ $$(INCLUDE) \
+)
+
+endef
+
+else # !SYSTEM_CUCKOO
+
+define gb_ExternalProject__use_cuckoo_headers
+$(call gb_ExternalProject_use_unpacked,$(1),cuckoo)
+
+endef
+
+define gb_LinkTarget__use_cuckoo_headers
+$(call gb_LinkTarget_use_unpacked,$(1),cuckoo)
+$(call gb_LinkTarget_set_include,$(1),\
+ -I$(call gb_UnpackedTarball_get_dir,cuckoo) \
+ $$(INCLUDE) \
+)
+
+endef
+
+endif # SYSTEM_CUCKOO
+
+
+# vim: set noet sw=4 ts=4:
\ No newline at end of file
diff --git a/config_host.mk.in b/config_host.mk.in
index abda7d688540..87d5fedf4e64 100644
--- a/config_host.mk.in
+++ b/config_host.mk.in
@@ -92,6 +92,7 @@ export CPPUNIT_CFLAGS=$(gb_SPACE)@CPPUNIT_CFLAGS@
export CPPUNIT_LIBS=$(gb_SPACE)@CPPUNIT_LIBS@
export CPUNAME=@CPUNAME@
export CROSS_COMPILING=@CROSS_COMPILING@
+export CUCKOO_CFLAGS=$(gb_SPACE)@CUCKOO_CFLAGS@
export CURL=@CURL@
export CURL_CFLAGS=$(gb_SPACE)@CURL_CFLAGS@
export CURL_LIBS=$(gb_SPACE)@CURL_LIBS@
@@ -571,6 +572,7 @@ export SYSTEM_BZIP2=@SYSTEM_BZIP2@
export SYSTEM_CAIRO=@SYSTEM_CAIRO@
export SYSTEM_CLUCENE=@SYSTEM_CLUCENE@
export SYSTEM_CPPUNIT=@SYSTEM_CPPUNIT@
+export SYSTEM_CUCKOO=@SYSTEM_CUCKOO@
export SYSTEM_CURL=@SYSTEM_CURL@
export SYSTEM_DICTS=@SYSTEM_DICTS@
export SYSTEM_EXPAT=@SYSTEM_EXPAT@
diff --git a/configure.ac b/configure.ac
index 3779924c6550..5f34231750af 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2334,6 +2334,11 @@ AC_ARG_WITH(system-boost,
[Use boost already on system.]),,
[with_system_boost="$with_system_headers"])
+AC_ARG_WITH(system-cuckoo,
+ AS_HELP_STRING([--with-system-cuckoo],
+ [Use libcuckoo already on system.]),,
+ [with_system_cuckoo="$with_system_headers"])
+
AC_ARG_WITH(system-glm,
AS_HELP_STRING([--with-system-glm],
[Use glm already on system.]),,
@@ -10349,6 +10354,26 @@ dnl Check for system mdds
dnl ===================================================================
libo_CHECK_SYSTEM_MODULE([mdds], [MDDS], [mdds-1.5 >= 1.5.0], ["-I${WORKDIR}/UnpackedTarball/mdds/include"])
+dnl ===================================================================
+dnl Check for system cuckoo
+dnl ===================================================================
+AC_MSG_CHECKING([which cuckoo to use])
+if test "$with_system_cuckoo" = "yes" -o "$with_system_headers" = "yes"; then
+ AC_MSG_RESULT([external])
+ SYSTEM_CUCKOO=TRUE
+ AC_LANG_PUSH([C++])
+ AC_CHECK_HEADER([libcuckoo/cuckoohash_map.hh], [],
+ [AC_MSG_ERROR([libcuckoo/cuckoohash_map.hh not found. install cuckoo])], [])
+ AC_LANG_POP([C++])
+else
+ AC_MSG_RESULT([internal])
+ BUILD_TYPE="$BUILD_TYPE CUCKOO"
+ SYSTEM_CUCKOO=
+ CUCKOO_CFLAGS="${ISYSTEM}${WORKDIR}/UnpackedTarball/cuckoo"
+fi
+AC_SUBST([CUCKOO_CFLAGS])
+AC_SUBST([SYSTEM_CUCKOO])
+
dnl ===================================================================
dnl Check for system glm
dnl ===================================================================
diff --git a/download.lst b/download.lst
index 10db15a39630..9ae9db6625fa 100644
--- a/download.lst
+++ b/download.lst
@@ -269,3 +269,5 @@ export ZXING_SHA256SUM := e595b3fa2ec320beb0b28f6af56b1141853257c2611686685639ce
export ZXING_TARBALL := zxing-cpp-1.1.1.tar.gz
NUMBERTEXT_EXTENSION_SHA256SUM := 1568ed1d2feb8210bb5de61d69574a165cded536cfa17c6953c9064076469de2
OPENSYMBOL_SHA256SUM := f543e6e2d7275557a839a164941c0a86e5f2c3f2a0042bfc434c88c6dde9e140
+export CUCKOO_SHA256SUM := 471dd83a813ed2816c2246c373004470ad0f6612c7ce72038929dc5161cdd58e
+export CUCKOO_TARBALL := libcuckoo-93217f8d391718380c508a722ab9acd5e9081233.tar.gz
diff --git a/external/Module_external.mk b/external/Module_external.mk
index 4566d825301c..3de6f9cdd63f 100644
--- a/external/Module_external.mk
+++ b/external/Module_external.mk
@@ -104,6 +104,7 @@ $(eval $(call gb_Module_add_moduledirs,external,\
$(call gb_Helper_optional,XSLTML,xsltml) \
$(call gb_Helper_optional,ZLIB,zlib) \
$(call gb_Helper_optional,ZMF,libzmf) \
+ $(call gb_Helper_optional,CUCKOO,cuckoo) \
))
# vim: set noet sw=4 ts=4:
diff --git a/external/cuckoo/Makefile b/external/cuckoo/Makefile
new file mode 100644
index 000000000000..e4968cf85fb6
--- /dev/null
+++ b/external/cuckoo/Makefile
@@ -0,0 +1,7 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+
+module_directory:=$(dir $(realpath $(firstword $(MAKEFILE_LIST))))
+
+include $(module_directory)/../../solenv/gbuild/partial_build.mk
+
+# vim: set noet sw=4 ts=4:
diff --git a/external/cuckoo/Module_cuckoo.mk b/external/cuckoo/Module_cuckoo.mk
new file mode 100644
index 000000000000..d2fda7b1e286
--- /dev/null
+++ b/external/cuckoo/Module_cuckoo.mk
@@ -0,0 +1,16 @@
+# -*- 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_Module_Module,cuckoo))
+
+$(eval $(call gb_Module_add_targets,cuckoo,\
+ UnpackedTarball_cuckoo \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/external/cuckoo/README b/external/cuckoo/README
new file mode 100644
index 000000000000..6b8c98342173
--- /dev/null
+++ b/external/cuckoo/README
@@ -0,0 +1,3 @@
+A high-performance, concurrent hash table
+
+[https://github.com/efficient/libcuckoo]
\ No newline at end of file
diff --git a/external/cuckoo/UnpackedTarball_cuckoo.mk b/external/cuckoo/UnpackedTarball_cuckoo.mk
new file mode 100644
index 000000000000..1cfbcc6b882c
--- /dev/null
+++ b/external/cuckoo/UnpackedTarball_cuckoo.mk
@@ -0,0 +1,18 @@
+# -*- 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_UnpackedTarball_UnpackedTarball,cuckoo))
+
+$(eval $(call gb_UnpackedTarball_set_tarball,cuckoo,$(CUCKOO_TARBALL)))
+
+$(eval $(call gb_UnpackedTarball_set_patchlevel,cuckoo,0))
+
+$(eval $(call gb_UnpackedTarball_update_autoconf_configs,cuckoo))
+
+# vim: set noet sw=4 ts=4:
diff --git a/readlicense_oo/license/license.xml b/readlicense_oo/license/license.xml
index 2a27cab23b37..25d37248e738 100644
--- a/readlicense_oo/license/license.xml
+++ b/readlicense_oo/license/license.xml
@@ -676,6 +676,12 @@
<p><a href="#a__LGPL_version_2">Jump to LGPL Version 2</a></p>
<p><a href="#a__MPL_version_1_1">Jump to MPL Version 1.1</a></p>
</div>
+ <div class="LIBCUCKOO" >
+ <h2>libcuckoo</h2>
+ <p>The following software may be included in this product: libcuckoo. Use of any of this software is governed by
+ the terms of the license below:</p>
+ <p><a href="#a__Apache_License_version_2_0">Jump to Apache License Version 2.0</a></p>
+ </div>
<div class="CURL" >
<h2>libcurl</h2>
<p>The following software may be included in this product: libcurl. Use of any of this software is governed by
diff --git a/solenv/flatpak-manifest.in b/solenv/flatpak-manifest.in
index 2312670edf87..70eaa31627d1 100644
--- a/solenv/flatpak-manifest.in
+++ b/solenv/flatpak-manifest.in
@@ -682,6 +682,13 @@
"type": "file",
"dest": "external/tarballs",
"dest-filename": "f543e6e2d7275557a839a164941c0a86e5f2c3f2a0042bfc434c88c6dde9e140-opens___.ttf"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/libcuckoo-93217f8d391718380c508a722ab9acd5e9081233.tar.gz",
+ "sha256": "471dd83a813ed2816c2246c373004470ad0f6612c7ce72038929dc5161cdd58e",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "libcuckoo-93217f8d391718380c508a722ab9acd5e9081233.tar.gz"
}
],
"buildsystem": "simple",
diff --git a/svl/Library_svl.mk b/svl/Library_svl.mk
index 17d64fe971fd..b81660089ea0 100644
--- a/svl/Library_svl.mk
+++ b/svl/Library_svl.mk
@@ -21,6 +21,7 @@ $(eval $(call gb_Library_Library,svl))
$(eval $(call gb_Library_use_externals,svl,\
boost_headers \
+ cuckoo_headers \
$(if $(filter LINUX MACOSX ANDROID iOS %BSD SOLARIS HAIKU,$(OS)), \
curl) \
dtoa \
diff --git a/svl/source/misc/sharedstringpool.cxx b/svl/source/misc/sharedstringpool.cxx
index 2fe8fd8a13ff..bf1f5554b957 100644
--- a/svl/source/misc/sharedstringpool.cxx
+++ b/svl/source/misc/sharedstringpool.cxx
@@ -15,50 +15,57 @@
#include <unordered_map>
#include <unordered_set>
-/** create a key class that caches the hashcode */
-namespace
+#if defined __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunused-parameter"
+#endif
+#if defined _MSC_VER
+#pragma warning(push)
+#pragma warning(disable : 4324) // structure was padded due to alignment specifier
+#endif
+#include <libcuckoo/cuckoohash_map.hh>
+#if defined _MSC_VER
+#pragma warning(pop)
+#endif
+#if defined __clang__
+#pragma clang diagnostic pop
+#endif
+
+namespace svl
{
-struct StringWithHash
+namespace
{
- OUString str;
- sal_Int32 hashCode;
- StringWithHash(OUString s)
- : str(s)
- , hashCode(s.hashCode())
- {
- }
+sal_Int32 getRefCount(const rtl_uString* p) { return (p->refCount & 0x3FFFFFFF); }
+
+// we store the key twice, because the concurrent hashtable we are using does not provide any way to return the key in use
+typedef std::pair<OUString, OUString> Mapped;
- bool operator==(StringWithHash const& rhs) const
+struct HashFunction
+{
+ size_t operator()(rtl_uString* const key) const
{
- if (hashCode != rhs.hashCode)
- return false;
- return str == rhs.str;
+ return rtl_ustr_hashCode_WithLength(key->buffer, key->length);
}
};
-}
-namespace std
-{
-template <> struct hash<StringWithHash>
+struct EqualsFunction
{
- std::size_t operator()(const StringWithHash& k) const { return k.hashCode; }
+ bool operator()(rtl_uString* const lhs, rtl_uString* const rhs) const
+ {
+ return OUString::unacquired(&lhs) == OUString::unacquired(&rhs);
+ }
};
}
-namespace svl
-{
-namespace
-{
-sal_Int32 getRefCount(const rtl_uString* p) { return (p->refCount & 0x3FFFFFFF); }
-}
-
struct SharedStringPool::Impl
{
- mutable std::mutex maMutex;
// We use this map for two purposes - to store lower->upper case mappings
- // and to retrieve a shared uppercase object, so the management logic
- // is quite complex.
- std::unordered_map<StringWithHash, OUString> maStrMap;
+ // and to store an upper->upper mapping.
+ // The second mapping is used so that we can
+ // share the same rtl_uString object between different keys which map to the same uppercase string to save memory.
+ //
+ // Docs for this concurrent hashtable here: http://efficient.github.io/libcuckoo/classlibcuckoo_1_1cuckoohash__map.html
+ libcuckoo::cuckoohash_map<rtl_uString*, Mapped, HashFunction, EqualsFunction> maStrMap;
const CharClass& mrCharClass;
explicit Impl(const CharClass& rCharClass)
@@ -76,43 +83,50 @@ SharedStringPool::~SharedStringPool() {}
SharedString SharedStringPool::intern(const OUString& rStr)
{
- StringWithHash aStrWithHash(rStr);
- std::scoped_lock<std::mutex> aGuard(mpImpl->maMutex);
+ auto& rMap = mpImpl->maStrMap;
- auto[mapIt, bInserted] = mpImpl->maStrMap.emplace(aStrWithHash, rStr);
- if (!bInserted)
+ rtl_uString *pResultLower, *pResultUpper;
+ if (rMap.find_fn(rStr.pData, [&](const Mapped& rMapped) {
+ pResultLower = rMapped.first.pData;
+ pResultUpper = rMapped.second.pData;
+ }))
// there is already a mapping
- return SharedString(mapIt->first.str.pData, mapIt->second.pData);
+ return SharedString(pResultLower, pResultUpper);
// This is a new string insertion. Establish mapping to upper-case variant.
OUString aUpper = mpImpl->mrCharClass.uppercase(rStr);
+
+ // either insert a new upper->upper mapping, or write the existing mapping into aUpper
+ mpImpl->maStrMap.uprase_fn(aUpper.pData,
+ [&](Mapped& mapped) -> bool {
+ aUpper = mapped.second;
+ return false;
+ },
+ aUpper, aUpper);
+
if (aUpper == rStr)
- // no need to do anything more, because we inserted an upper->upper mapping
- return SharedString(mapIt->first.str.pData, mapIt->second.pData);
-
- // We need to insert a lower->upper mapping, so also insert
- // an upper->upper mapping, which we can use both for when an upper string
- // is interned, and to look up a shared upper string.
- StringWithHash aUpperWithHash(aUpper);
- auto mapIt2 = mpImpl->maStrMap.find(aUpperWithHash);
- if (mapIt2 != mpImpl->maStrMap.end())
+ // no need to do anything more, because the key is already uppercase
+ return SharedString(aUpper.pData, aUpper.pData);
+
+ // either insert a new lower->upper mapping, or write the existing mapping into aLower
+ if (mpImpl->maStrMap.uprase_fn(rStr.pData,
+ [&](Mapped& mapped) -> bool {
+ pResultLower = mapped.first.pData;
+ pResultUpper = mapped.second.pData;
+ return false;
+ },
+ rStr, aUpper))
{
- // there is an already existing upper string
- mapIt->second = mapIt2->first.str;
- return SharedString(mapIt->first.str.pData, mapIt->second.pData);
+ pResultLower = rStr.pData;
+ pResultUpper = aUpper.pData;
}
- // There is no already existing upper string.
- // First, update using the iterator, can't do this later because
- // the iterator will be invalid.
- mapIt->second = aUpper;
- mpImpl->maStrMap.emplace_hint(mapIt2, aUpperWithHash, aUpper);
- return SharedString(rStr.pData, aUpper.pData);
+ return SharedString(pResultLower, pResultUpper);
}
void SharedStringPool::purge()
{
- std::scoped_lock<std::mutex> aGuard(mpImpl->maMutex);
+ auto locked_table = mpImpl->maStrMap.lock_table();
// Because we can have an uppercase entry mapped to itself,
// and then a bunch of lowercase entries mapped to that same
@@ -120,12 +134,12 @@ void SharedStringPool::purge()
// time to remove lowercase entries, and then only can we
// check for unused uppercase entries.
- auto it = mpImpl->maStrMap.begin();
- auto itEnd = mpImpl->maStrMap.end();
+ auto it = locked_table.begin();
+ auto itEnd = locked_table.end();
while (it != itEnd)
{
- rtl_uString* p1 = it->first.str.pData;
- rtl_uString* p2 = it->second.pData;
+ rtl_uString* p1 = it->second.first.pData;
+ rtl_uString* p2 = it->second.second.pData;
if (p1 != p2)
{
// normal case - lowercase mapped to uppercase, which
@@ -133,19 +147,19 @@ void SharedStringPool::purge()
// entry as the key in the map
if (getRefCount(p1) == 1)
{
- it = mpImpl->maStrMap.erase(it);
+ it = locked_table.erase(it);
continue;
}
}
++it;
}
- it = mpImpl->maStrMap.begin();
- itEnd = mpImpl->maStrMap.end();
+ it = locked_table.begin();
+ itEnd = locked_table.end();
while (it != itEnd)
{
- rtl_uString* p1 = it->first.str.pData;
- rtl_uString* p2 = it->second.pData;
+ rtl_uString* p1 = it->second.first.pData;
+ rtl_uString* p2 = it->second.second.pData;
if (p1 == p2)
{
// uppercase which is mapped to itself, which means
@@ -153,7 +167,7 @@ void SharedStringPool::purge()
// one ref-counted entry in the value in the map
if (getRefCount(p1) == 2)
{
- it = mpImpl->maStrMap.erase(it);
+ it = locked_table.erase(it);
continue;
}
}
@@ -161,19 +175,15 @@ void SharedStringPool::purge()
}
}
-size_t SharedStringPool::getCount() const
-{
- std::scoped_lock<std::mutex> aGuard(mpImpl->maMutex);
- return mpImpl->maStrMap.size();
-}
+size_t SharedStringPool::getCount() const { return mpImpl->maStrMap.size(); }
size_t SharedStringPool::getCountIgnoreCase() const
{
- std::scoped_lock<std::mutex> aGuard(mpImpl->maMutex);
// this is only called from unit tests, so no need to be efficient
std::unordered_set<OUString> aUpperSet;
- for (auto const& pair : mpImpl->maStrMap)
- aUpperSet.insert(pair.second);
+ auto locked_table = mpImpl->maStrMap.lock_table();
+ for (auto const& pair : locked_table)
+ aUpperSet.insert(pair.second.second);
return aUpperSet.size();
}
}
commit 4bf266233daa7d9ed030a20fa4f487f9f5a82379
Author: Chris Sherlock <chris.sherlock79 at gmail.com>
AuthorDate: Wed Aug 25 18:03:51 2021 +1000
Commit: Mike Kaganski <mike.kaganski at collabora.com>
CommitDate: Thu Sep 9 09:06:35 2021 +0200
vcl: move OutputDevice antialiasing functions to outdev.cxx
Ultimately I hope to reduce outdevstate.cxx to only have push(), pop()
and clearstack(), then rename outdevstate.cxx to stack.cxx. Eventually,
the plan is to separate metafile processing from rendering.
Also include unit test for SetAntialising() and GetAntialiasing().
Change-Id: Ie9eefa2de17ce583ca4acd9d86df004981a0c9b9
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/121020
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski at collabora.com>
diff --git a/vcl/qa/cppunit/outdev.cxx b/vcl/qa/cppunit/outdev.cxx
index c69120155d65..ee1dc6a37b8d 100644
--- a/vcl/qa/cppunit/outdev.cxx
+++ b/vcl/qa/cppunit/outdev.cxx
@@ -58,6 +58,7 @@ public:
void testRefPoint();
void testRasterOp();
void testOutputFlag();
+ void testAntialias();
void testSystemTextColor();
void testShouldDrawWavePixelAsRect();
void testGetWaveLineSize();
@@ -91,6 +92,7 @@ public:
CPPUNIT_TEST(testDefaultRefPoint);
CPPUNIT_TEST(testRefPoint);
CPPUNIT_TEST(testRasterOp);
+ CPPUNIT_TEST(testAntialias);
CPPUNIT_TEST(testOutputFlag);
CPPUNIT_TEST(testSystemTextColor);
CPPUNIT_TEST(testShouldDrawWavePixelAsRect);
@@ -801,6 +803,17 @@ void VclOutdevTest::testOutputFlag()
CPPUNIT_ASSERT(!pVDev->IsDeviceOutputNecessary());
}
+void VclOutdevTest::testAntialias()
+{
+ ScopedVclPtrInstance<VirtualDevice> pVDev;
+
+ CPPUNIT_ASSERT_EQUAL(AntialiasingFlags::NONE, pVDev->GetAntialiasing());
+
+ pVDev->SetAntialiasing(AntialiasingFlags::Enable);
+
+ CPPUNIT_ASSERT_EQUAL(AntialiasingFlags::Enable, pVDev->GetAntialiasing());
+}
+
void VclOutdevTest::testSystemTextColor()
{
{
diff --git a/vcl/source/outdev/line.cxx b/vcl/source/outdev/line.cxx
index 9c1b5749f336..3fb565f5499f 100644
--- a/vcl/source/outdev/line.cxx
+++ b/vcl/source/outdev/line.cxx
@@ -371,5 +371,4 @@ void OutputDevice::drawLine( basegfx::B2DPolyPolygon aLinePolyPolygon, const Lin
mpMetaFile = pOldMetaFile;
}
-
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/outdev/outdev.cxx b/vcl/source/outdev/outdev.cxx
index 1b006ff7f4dd..8d1f9504609f 100644
--- a/vcl/source/outdev/outdev.cxx
+++ b/vcl/source/outdev/outdev.cxx
@@ -339,6 +339,23 @@ void OutputDevice::EnableOutput( bool bEnable )
mpAlphaVDev->EnableOutput( bEnable );
}
+void OutputDevice::SetAntialiasing( AntialiasingFlags nMode )
+{
+ if ( mnAntialiasing != nMode )
+ {
+ mnAntialiasing = nMode;
+ mbInitFont = true;
+
+ if(mpGraphics)
+ {
+ mpGraphics->setAntiAlias(bool(mnAntialiasing & AntialiasingFlags::Enable));
+ }
+ }
+
+ if( mpAlphaVDev )
+ mpAlphaVDev->SetAntialiasing( nMode );
+}
+
sal_uInt16 OutputDevice::GetBitCount() const
{
// we need a graphics instance
diff --git a/vcl/source/outdev/outdevstate.cxx b/vcl/source/outdev/outdevstate.cxx
index 5de6b1c5ec92..8832c09e0f9a 100644
--- a/vcl/source/outdev/outdevstate.cxx
+++ b/vcl/source/outdev/outdevstate.cxx
@@ -198,23 +198,6 @@ void OutputDevice::ClearStack()
Pop();
}
-void OutputDevice::SetAntialiasing( AntialiasingFlags nMode )
-{
- if ( mnAntialiasing != nMode )
- {
- mnAntialiasing = nMode;
- mbInitFont = true;
-
- if(mpGraphics)
- {
- mpGraphics->setAntiAlias(bool(mnAntialiasing & AntialiasingFlags::Enable));
- }
- }
-
- if( mpAlphaVDev )
- mpAlphaVDev->SetAntialiasing( nMode );
-}
-
DrawModeFlags OutputDevice::GetDrawMode() const { return mnDrawMode; }
void OutputDevice::SetDrawMode(DrawModeFlags nDrawMode)
More information about the Libreoffice-commits
mailing list