[Libreoffice-commits] core.git: Branch 'feature/drawinglayercore' - 93 commits - basic/source bin/benchmark-document-loading bridges/source chart2/Library_chartcontroller.mk chart2/qa chart2/source comphelper/source configure.ac cui/source download.lst drawinglayer/CppunitTest_drawinglayer_border.mk drawinglayer/inc drawinglayer/Library_drawinglayercore.mk drawinglayer/Library_drawinglayer.mk drawinglayer/Module_drawinglayer.mk drawinglayer/source emfio/CppunitTest_emfio_emf.mk emfio/Library_emfio.mk external/libmwaw external/libwps filter/Configuration_filter.mk filter/Library_pdffilter.mk filter/Library_svgfilter.mk filter/source forms/source helpcontent2 hwpfilter/source include/basegfx include/drawinglayer include/o3tl include/vcl io/source o3tl/qa odk/build-examples_common.mk odk/examples offapi/com officecfg/registry oox/qa package/qa package/source qadevOOo/tests reportdesign/source Repository.mk sal/osl sc/CppunitTest_sc_parallelism.mk sc/CppunitTest_sc_ucalc.mk sc/inc sc/Library_sc.mk sc /qa sc/res sc/source sc/util sd/CppunitTest_sd_uimpress.mk sd/Library_sd.mk sd/source sfx2/Library_sfx.mk solenv/flatpak-manifest.in svgio/CppunitTest_svgio.mk svgio/Library_svgio.mk svl/source svx/CppunitTest_svx_unit.mk svx/Library_svxcore.mk svx/Library_svx.mk svx/source svx/uiconfig sw/CppunitTest_sw_uwriter.mk sw/inc sw/Library_sw.mk sw/Library_swui.mk sw/qa sw/sdi sw/source sw/uiconfig test/source toolkit/qa ucb/source vcl/inc vcl/Library_vcl.mk vcl/qt5 vcl/quartz vcl/source vcl/StaticLibrary_fuzzerstubs.mk vcl/unx vcl/workben wizards/source writerperfect/qa writerperfect/source

Tomaž Vajngerl (via logerrit) logerrit at kemper.freedesktop.org
Mon Sep 28 08:33:05 UTC 2020


Rebased ref, commits from common ancestor:
commit 05cfcdf20df0bbcd82a3a0f65b8f833766c1c2db
Author:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Fri Jul 17 15:09:49 2020 +0200
Commit:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
CommitDate: Mon Sep 28 10:32:10 2020 +0200

    Revert "hack for gradients split into adjacent polygons (tdf#133016)"
    
    This reverts commit 777ac5456a1f24fea29931ede983b5b8ad9a063d.

diff --git a/drawinglayer/source/primitive2d/svggradientprimitive2d.cxx b/drawinglayer/source/primitive2d/svggradientprimitive2d.cxx
index 7c9eb8441306..9b9d258046cc 100644
--- a/drawinglayer/source/primitive2d/svggradientprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/svggradientprimitive2d.cxx
@@ -30,7 +30,7 @@
 #include <drawinglayer/geometry/viewinformation2d.hxx>
 #include <sal/log.hxx>
 #include <cmath>
-#include <vcl/skia/SkiaHelper.hxx>
+
 
 using namespace com::sun::star;
 
@@ -868,12 +868,6 @@ namespace drawinglayer::primitive2d
             // use color distance and discrete lengths to calculate step count
             const sal_uInt32 nSteps(calculateStepsForSvgGradient(getColorA(), getColorB(), fDelta, fDiscreteUnit));
 
-            // HACK: Splitting a gradient into adjacent polygons with gradually changing color is silly.
-            // If antialiasing is used to draw them, the AA-ed adjacent edges won't line up perfectly
-            // because of the AA (see SkiaSalGraphicsImpl::mergePolyPolygonToPrevious()).
-            // Make the polygons a bit wider, so they the partial overlap "fixes" this.
-            const double fixup = SkiaHelper::isVCLSkiaEnabled() ? fDiscreteUnit / 2 : 0;
-
             // tdf#117949 Use a small amount of discrete overlap at the edges. Usually this
             // should be exactly 0.0 and 1.0, but there were cases when this gets clipped
             // against the mask polygon which got numerically problematic.
@@ -887,7 +881,7 @@ namespace drawinglayer::primitive2d
                     basegfx::B2DRange(
                         getOffsetA() - fDiscreteUnit,
                         -0.0001, // TTTT -> should be 0.0, see comment above
-                        getOffsetA() + (fDelta / nSteps) + fDiscreteUnit + fixup,
+                        getOffsetA() + (fDelta / nSteps) + fDiscreteUnit,
                         1.0001))); // TTTT -> should be 1.0, see comment above
 
             // prepare loop (inside to outside, [0.0 .. 1.0[)
commit 935b8524354cf462583d28b83674e0e1f71d4297
Author:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Mon Jun 15 19:39:35 2020 +0200
Commit:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
CommitDate: Mon Sep 28 10:32:10 2020 +0200

    vcl: add a Bitmap interface to basegfx, BitmapEx implementing it
    
    Change-Id: I758f421d545191883e615f5016e9fc643459556e

diff --git a/include/basegfx/bitmap/Bitmap.hxx b/include/basegfx/bitmap/Bitmap.hxx
new file mode 100644
index 000000000000..b91b702aa212
--- /dev/null
+++ b/include/basegfx/bitmap/Bitmap.hxx
@@ -0,0 +1,23 @@
+/* -*- 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/.
+ *
+ */
+
+#pragma once
+
+#include <basegfx/basegfxdllapi.h>
+
+namespace basegfx
+{
+class BASEGFX_DLLPUBLIC IBitmap
+{
+};
+
+} // end of namespace basegfx
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/vcl/bitmapex.hxx b/include/vcl/bitmapex.hxx
index 4dac473bb2f5..774afe981d07 100644
--- a/include/vcl/bitmapex.hxx
+++ b/include/vcl/bitmapex.hxx
@@ -25,6 +25,8 @@
 #include <vcl/Scanline.hxx>
 #include <tools/color.hxx>
 
+#include <basegfx/bitmap/Bitmap.hxx>
+
 #include <sal/types.h>
 
 namespace com::sun::star::rendering {
@@ -40,7 +42,7 @@ enum class TransparentType
     Bitmap
 };
 
-class SAL_WARN_UNUSED VCL_DLLPUBLIC BitmapEx
+class SAL_WARN_UNUSED VCL_DLLPUBLIC BitmapEx : basegfx::IBitmap
 {
 public:
 
commit 274cb56a34737c33c43364998e3aabbe2f4d64ed
Author:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Wed May 27 12:49:05 2020 +0200
Commit:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
CommitDate: Mon Sep 28 10:32:09 2020 +0200

    add o3tl version of hash_combine to not depend on boost for this
    
    Change-Id: I081f8d116ef811baa8aa5de35a6cb51fa4de7d56

diff --git a/include/o3tl/hash_combine.hxx b/include/o3tl/hash_combine.hxx
new file mode 100644
index 000000000000..17419b3e2c0f
--- /dev/null
+++ b/include/o3tl/hash_combine.hxx
@@ -0,0 +1,29 @@
+/* -*- 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/.
+ */
+
+#pragma once
+
+namespace o3tl
+{
+template <typename T, typename N, std::enable_if_t<(sizeof(N) == 4), bool> = false>
+inline void hash_combine(N& nSeed, T const& nValue)
+{
+    static_assert(sizeof(nSeed) == 4);
+    nSeed ^= std::hash<T>{}(nValue) + 0x9E3779B9u + (nSeed << 6) + (nSeed >> 2);
+}
+
+template <typename T, typename N, std::enable_if_t<(sizeof(N) == 8), bool> = false>
+inline void hash_combine(N& nSeed, T const& nValue)
+{
+    static_assert(sizeof(nSeed) == 8);
+    nSeed ^= std::hash<T>{}(nValue) + 0x9E3779B97F4A7C15llu + (nSeed << 12) + (nSeed >> 4);
+}
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/o3tl/qa/test-lru_map.cxx b/o3tl/qa/test-lru_map.cxx
index a03a6bf37200..3ab285c4329a 100644
--- a/o3tl/qa/test-lru_map.cxx
+++ b/o3tl/qa/test-lru_map.cxx
@@ -15,7 +15,7 @@
 
 #include <o3tl/lru_map.hxx>
 
-#include <boost/functional/hash.hpp>
+#include <o3tl/hash_combine.hxx>
 
 using namespace ::o3tl;
 
@@ -206,8 +206,8 @@ struct TestClassKeyHashFunction
     std::size_t operator()(TestClassKey const& aKey) const
     {
         std::size_t seed = 0;
-        boost::hash_combine(seed, aKey.mA);
-        boost::hash_combine(seed, aKey.mB);
+        o3tl::hash_combine(seed, aKey.mA);
+        o3tl::hash_combine(seed, aKey.mB);
         return seed;
     }
 };
commit 65722bf5fa38541b827ae7f8719d88003a9b4491
Author:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Tue May 26 15:57:38 2020 +0200
Commit:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
CommitDate: Mon Sep 28 10:32:09 2020 +0200

    GraphicAttributes: put const. and op. '=' into the header file
    
    Change-Id: I1bc38f89457c3593673b445e7571a4fd82d5960b

diff --git a/include/vcl/GraphicAttributes.hxx b/include/vcl/GraphicAttributes.hxx
index 28b23d324a1d..47aad3b723af 100644
--- a/include/vcl/GraphicAttributes.hxx
+++ b/include/vcl/GraphicAttributes.hxx
@@ -51,9 +51,37 @@ private:
     GraphicDrawMode meDrawMode;
 
 public:
-    GraphicAttr();
+    GraphicAttr()
+        : mfGamma(1.0)
+        , mnMirrFlags(basegfx::MirrorDirectionFlags::NONE)
+        , mnLeftCrop(0)
+        , mnTopCrop(0)
+        , mnRightCrop(0)
+        , mnBottomCrop(0)
+        , mnRotate10(0)
+        , mnContPercent(0)
+        , mnLumPercent(0)
+        , mnRPercent(0)
+        , mnGPercent(0)
+        , mnBPercent(0)
+        , mbInvert(false)
+        , mcTransparency(0)
+        , meDrawMode(GraphicDrawMode::Standard)
+    {
+    }
+
+    bool operator==(const GraphicAttr& rAttr) const
+    {
+        return mfGamma == rAttr.mfGamma && mnMirrFlags == rAttr.mnMirrFlags
+               && mnLeftCrop == rAttr.mnLeftCrop && mnTopCrop == rAttr.mnTopCrop
+               && mnRightCrop == rAttr.mnRightCrop && mnBottomCrop == rAttr.mnBottomCrop
+               && mnRotate10 == rAttr.mnRotate10 && mnContPercent == rAttr.mnContPercent
+               && mnLumPercent == rAttr.mnLumPercent && mnRPercent == rAttr.mnRPercent
+               && mnGPercent == rAttr.mnGPercent && mnBPercent == rAttr.mnBPercent
+               && mbInvert == rAttr.mbInvert && mcTransparency == rAttr.mcTransparency
+               && meDrawMode == rAttr.meDrawMode;
+    }
 
-    bool operator==(const GraphicAttr& rAttr) const;
     bool operator!=(const GraphicAttr& rAttr) const { return !(*this == rAttr); }
 
     void SetDrawMode(GraphicDrawMode eDrawMode) { meDrawMode = eDrawMode; }
diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk
index 5d3a1b593850..4b29c2d59a9e 100644
--- a/vcl/Library_vcl.mk
+++ b/vcl/Library_vcl.mk
@@ -328,7 +328,6 @@ $(eval $(call gb_Library_add_exception_objects,vcl,\
     vcl/source/graphic/GraphicObject \
     vcl/source/graphic/GraphicObject2 \
     vcl/source/graphic/GraphicReader \
-    vcl/source/graphic/grfattr \
     vcl/source/graphic/Manager \
     vcl/source/graphic/UnoGraphic \
     vcl/source/graphic/UnoGraphicMapper \
diff --git a/vcl/source/graphic/grfattr.cxx b/vcl/source/graphic/grfattr.cxx
deleted file mode 100644
index 36e8605b77de..000000000000
--- a/vcl/source/graphic/grfattr.cxx
+++ /dev/null
@@ -1,60 +0,0 @@
-/* -*- 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/.
- *
- * This file incorporates work covered by the following license notice:
- *
- *   Licensed to the Apache Software Foundation (ASF) under one or more
- *   contributor license agreements. See the NOTICE file distributed
- *   with this work for additional information regarding copyright
- *   ownership. The ASF licenses this file to you under the Apache
- *   License, Version 2.0 (the "License"); you may not use this file
- *   except in compliance with the License. You may obtain a copy of
- *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#include <vcl/GraphicAttributes.hxx>
-
-GraphicAttr::GraphicAttr() :
-    mfGamma         ( 1.0 ),
-    mnMirrFlags     ( basegfx::MirrorDirectionFlags::NONE ),
-    mnLeftCrop      ( 0 ),
-    mnTopCrop       ( 0 ),
-    mnRightCrop     ( 0 ),
-    mnBottomCrop    ( 0 ),
-    mnRotate10      ( 0 ),
-    mnContPercent   ( 0 ),
-    mnLumPercent    ( 0 ),
-    mnRPercent      ( 0 ),
-    mnGPercent      ( 0 ),
-    mnBPercent      ( 0 ),
-    mbInvert        ( false ),
-    mcTransparency  ( 0 ),
-    meDrawMode      ( GraphicDrawMode::Standard )
-{
-}
-
-bool GraphicAttr::operator==( const GraphicAttr& rAttr ) const
-{
-    return( ( mfGamma == rAttr.mfGamma ) &&
-            ( mnMirrFlags == rAttr.mnMirrFlags ) &&
-            ( mnLeftCrop == rAttr.mnLeftCrop ) &&
-            ( mnTopCrop == rAttr.mnTopCrop ) &&
-            ( mnRightCrop == rAttr.mnRightCrop ) &&
-            ( mnBottomCrop == rAttr.mnBottomCrop ) &&
-            ( mnRotate10 == rAttr.mnRotate10 ) &&
-            ( mnContPercent == rAttr.mnContPercent ) &&
-            ( mnLumPercent == rAttr.mnLumPercent ) &&
-            ( mnRPercent == rAttr.mnRPercent ) &&
-            ( mnGPercent == rAttr.mnGPercent ) &&
-            ( mnBPercent == rAttr.mnBPercent ) &&
-            ( mbInvert == rAttr.mbInvert ) &&
-            ( mcTransparency == rAttr.mcTransparency ) &&
-            ( meDrawMode == rAttr.meDrawMode ) );
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit d33cd6fa90bc8077bf8980886af8a54d83b87483
Author:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Tue May 26 13:39:45 2020 +0200
Commit:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
CommitDate: Mon Sep 28 10:32:09 2020 +0200

    basegfx::MirrorDirectionFlags as replacement for BmpMirrorFlags
    
    BmpMirrorFlags in Bitmap is an attribute for bitmap manipulation
    (mirroring). This change creates a copy of the flags in basegfx
    as MirrorDirectionFlags, which will be used in the fututre as a
    general repalcement for the BmpMirrorFlags, that will be changed
    step by step.
    
    For now we only use the flags in GraphicAttr to make it independent
    form vcl, and cast to/from BmpMirrorFLags and MirrorDirectionFlags
    where needed.
    
    Change-Id: I01a69a4d241caa22cff61bdbf87944af57684749

diff --git a/drawinglayer/source/primitive2d/graphicprimitive2d.cxx b/drawinglayer/source/primitive2d/graphicprimitive2d.cxx
index f86b1585b13f..2f571ed66aa3 100644
--- a/drawinglayer/source/primitive2d/graphicprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/graphicprimitive2d.cxx
@@ -49,8 +49,10 @@ void GraphicPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer,
     if (getGraphicAttr().IsMirrored())
     {
         // content needs mirroring
-        const bool bHMirr(getGraphicAttr().GetMirrorFlags() & BmpMirrorFlags::Horizontal);
-        const bool bVMirr(getGraphicAttr().GetMirrorFlags() & BmpMirrorFlags::Vertical);
+        const bool bHMirr(getGraphicAttr().GetMirrorFlags()
+                          & basegfx::MirrorDirectionFlags::Horizontal);
+        const bool bVMirr(getGraphicAttr().GetMirrorFlags()
+                          & basegfx::MirrorDirectionFlags::Vertical);
 
         // mirror by applying negative scale to the unit primitive and
         // applying the object transformation on it.
@@ -69,7 +71,7 @@ void GraphicPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer,
 
     aSuppressGraphicAttr.SetCrop(0, 0, 0, 0);
     aSuppressGraphicAttr.SetRotation(0);
-    aSuppressGraphicAttr.SetMirrorFlags(BmpMirrorFlags::NONE);
+    aSuppressGraphicAttr.SetMirrorFlags(basegfx::MirrorDirectionFlags::NONE);
     aSuppressGraphicAttr.SetTransparency(0);
 
     const GraphicObject& rGraphicObject = getGraphicObject();
diff --git a/filter/source/msfilter/escherex.cxx b/filter/source/msfilter/escherex.cxx
index 24dcabe0277e..5d4d527340a1 100644
--- a/filter/source/msfilter/escherex.cxx
+++ b/filter/source/msfilter/escherex.cxx
@@ -1673,7 +1673,7 @@ bool EscherPropertyContainer::CreateGraphicProperties(const uno::Reference<beans
 
                 if(bMirrored)
                 {
-                    pGraphicAttr->SetMirrorFlags(BmpMirrorFlags::Horizontal);
+                    pGraphicAttr->SetMirrorFlags(basegfx::MirrorDirectionFlags::Horizontal);
                 }
 
                 if(nTransparency)
diff --git a/include/basegfx/bitmap/BitmapAttributes.hxx b/include/basegfx/bitmap/BitmapAttributes.hxx
new file mode 100644
index 000000000000..d918d55faa99
--- /dev/null
+++ b/include/basegfx/bitmap/BitmapAttributes.hxx
@@ -0,0 +1,36 @@
+/* -*- 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/.
+ *
+ */
+
+#pragma once
+
+#include <basegfx/basegfxdllapi.h>
+#include <o3tl/typed_flags_set.hxx>
+
+namespace basegfx
+{
+enum class MirrorDirectionFlags
+{
+    NONE = 0x00,
+    Horizontal = 0x01,
+    Vertical = 0x02,
+};
+
+} // end of namespace basegfx
+
+namespace o3tl
+{
+template <>
+struct typed_flags<basegfx::MirrorDirectionFlags>
+    : is_typed_flags<basegfx::MirrorDirectionFlags, 0x03>
+{
+};
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/vcl/GraphicAttributes.hxx b/include/vcl/GraphicAttributes.hxx
index 08b716b3db08..28b23d324a1d 100644
--- a/include/vcl/GraphicAttributes.hxx
+++ b/include/vcl/GraphicAttributes.hxx
@@ -21,6 +21,7 @@
 
 #include <vcl/dllapi.h>
 #include <vcl/bitmap.hxx>
+#include <basegfx/bitmap/BitmapAttributes.hxx>
 
 enum class GraphicDrawMode
 {
@@ -34,7 +35,7 @@ class VCL_DLLPUBLIC GraphicAttr
 {
 private:
     double mfGamma;
-    BmpMirrorFlags mnMirrFlags;
+    basegfx::MirrorDirectionFlags mnMirrFlags;
     long mnLeftCrop;
     long mnTopCrop;
     long mnRightCrop;
@@ -58,8 +59,8 @@ public:
     void SetDrawMode(GraphicDrawMode eDrawMode) { meDrawMode = eDrawMode; }
     GraphicDrawMode GetDrawMode() const { return meDrawMode; }
 
-    void SetMirrorFlags(BmpMirrorFlags nMirrFlags) { mnMirrFlags = nMirrFlags; }
-    BmpMirrorFlags GetMirrorFlags() const { return mnMirrFlags; }
+    void SetMirrorFlags(basegfx::MirrorDirectionFlags nMirrFlags) { mnMirrFlags = nMirrFlags; }
+    basegfx::MirrorDirectionFlags GetMirrorFlags() const { return mnMirrFlags; }
 
     void SetCrop(long nLeft_100TH_MM, long nTop_100TH_MM, long nRight_100TH_MM,
                  long nBottom_100TH_MM)
@@ -102,7 +103,7 @@ public:
     sal_uInt8 GetTransparency() const { return mcTransparency; }
 
     bool IsSpecialDrawMode() const { return (meDrawMode != GraphicDrawMode::Standard); }
-    bool IsMirrored() const { return mnMirrFlags != BmpMirrorFlags::NONE; }
+    bool IsMirrored() const { return mnMirrFlags != basegfx::MirrorDirectionFlags::NONE; }
     bool IsCropped() const
     {
         return (mnLeftCrop != 0 || mnTopCrop != 0 || mnRightCrop != 0 || mnBottomCrop != 0);
diff --git a/svx/source/sdr/contact/viewcontactofgraphic.cxx b/svx/source/sdr/contact/viewcontactofgraphic.cxx
index 8fceef864ae2..db24da9a5552 100644
--- a/svx/source/sdr/contact/viewcontactofgraphic.cxx
+++ b/svx/source/sdr/contact/viewcontactofgraphic.cxx
@@ -336,7 +336,9 @@ namespace sdr::contact
 
             if(bHMirr || bVMirr)
             {
-                aLocalGrafInfo.SetMirrorFlags((bHMirr ? BmpMirrorFlags::Horizontal : BmpMirrorFlags::NONE)|(bVMirr ? BmpMirrorFlags::Vertical : BmpMirrorFlags::NONE));
+                basegfx::MirrorDirectionFlags eVertical = bVMirr ? basegfx::MirrorDirectionFlags::Vertical : basegfx::MirrorDirectionFlags::NONE;
+                basegfx::MirrorDirectionFlags eHorizontal = bHMirr ? basegfx::MirrorDirectionFlags::Horizontal : basegfx::MirrorDirectionFlags::NONE;
+                aLocalGrafInfo.SetMirrorFlags(eVertical | eHorizontal);
             }
 
             // fill object matrix
diff --git a/svx/source/svdraw/svdograf.cxx b/svx/source/svdraw/svdograf.cxx
index 2f2c4886f86d..ed1433256d8e 100644
--- a/svx/source/svdraw/svdograf.cxx
+++ b/svx/source/svdraw/svdograf.cxx
@@ -378,7 +378,10 @@ GraphicAttr SdrGrafObj::GetGraphicAttr( SdrGrafObjTransformsAttrs nTransformFlag
             bool bHMirr = nMirrorCase == 2 || nMirrorCase == 4;
             bool bVMirr = nMirrorCase == 3 || nMirrorCase == 4;
 
-            aActAttr.SetMirrorFlags( ( bHMirr ? BmpMirrorFlags::Horizontal : BmpMirrorFlags::NONE ) | ( bVMirr ? BmpMirrorFlags::Vertical : BmpMirrorFlags::NONE ) );
+            basegfx::MirrorDirectionFlags eVertical = bVMirr ? basegfx::MirrorDirectionFlags::Vertical : basegfx::MirrorDirectionFlags::NONE;
+            basegfx::MirrorDirectionFlags eHorizontal = bHMirr ? basegfx::MirrorDirectionFlags::Horizontal : basegfx::MirrorDirectionFlags::NONE;
+
+            aActAttr.SetMirrorFlags(eVertical | eHorizontal);
         }
 
         if( bRotate )
diff --git a/sw/source/core/graphic/ndgrf.cxx b/sw/source/core/graphic/ndgrf.cxx
index 55ced4c704bc..43a4e3878108 100644
--- a/sw/source/core/graphic/ndgrf.cxx
+++ b/sw/source/core/graphic/ndgrf.cxx
@@ -728,22 +728,22 @@ GraphicAttr& SwGrfNode::GetGraphicAttr( GraphicAttr& rGA,
     rGA.SetDrawMode( rSet.GetDrawModeGrf().GetValue() );
 
     const SwMirrorGrf & rMirror = rSet.GetMirrorGrf();
-    BmpMirrorFlags nMirror = BmpMirrorFlags::NONE;
+    basegfx::MirrorDirectionFlags nMirror = basegfx::MirrorDirectionFlags::NONE;
     if( rMirror.IsGrfToggle() && pFrame && !pFrame->FindPageFrame()->OnRightPage() )
     {
         switch( rMirror.GetValue() )
         {
         case MirrorGraph::Dont:
-            nMirror = BmpMirrorFlags::Horizontal;
+            nMirror = basegfx::MirrorDirectionFlags::Horizontal;
             break;
         case MirrorGraph::Vertical:
-            nMirror = BmpMirrorFlags::NONE;
+            nMirror = basegfx::MirrorDirectionFlags::NONE;
             break;
         case MirrorGraph::Horizontal:
-            nMirror = BmpMirrorFlags::Horizontal|BmpMirrorFlags::Vertical;
+            nMirror = basegfx::MirrorDirectionFlags::Horizontal | basegfx::MirrorDirectionFlags::Vertical;
             break;
         default:
-            nMirror = BmpMirrorFlags::Vertical;
+            nMirror = basegfx::MirrorDirectionFlags::Vertical;
             break;
         }
     }
@@ -751,13 +751,13 @@ GraphicAttr& SwGrfNode::GetGraphicAttr( GraphicAttr& rGA,
         switch( rMirror.GetValue() )
         {
         case MirrorGraph::Both:
-            nMirror = BmpMirrorFlags::Horizontal|BmpMirrorFlags::Vertical;
+            nMirror = basegfx::MirrorDirectionFlags::Horizontal | basegfx::MirrorDirectionFlags::Vertical;
             break;
         case MirrorGraph::Vertical:
-            nMirror = BmpMirrorFlags::Horizontal;
+            nMirror = basegfx::MirrorDirectionFlags::Horizontal;
             break;
         case MirrorGraph::Horizontal:
-            nMirror = BmpMirrorFlags::Vertical;
+            nMirror = basegfx::MirrorDirectionFlags::Vertical;
             break;
         default: break;
         }
diff --git a/vcl/source/graphic/GraphicObject.cxx b/vcl/source/graphic/GraphicObject.cxx
index 0447bddfd637..137666937eb6 100644
--- a/vcl/source/graphic/GraphicObject.cxx
+++ b/vcl/source/graphic/GraphicObject.cxx
@@ -168,7 +168,7 @@ void lclImplAdjust( BitmapEx& rBmpEx, const GraphicAttr& rAttr, GraphicAdjustmen
 
     if( ( nAdjustmentFlags & GraphicAdjustmentFlags::MIRROR ) && aAttr.IsMirrored() )
     {
-        rBmpEx.Mirror( aAttr.GetMirrorFlags() );
+        rBmpEx.Mirror(BmpMirrorFlags(aAttr.GetMirrorFlags()) );
     }
 
     if( ( nAdjustmentFlags & GraphicAdjustmentFlags::ROTATE ) && aAttr.IsRotated() )
@@ -219,7 +219,7 @@ void lclImplAdjust( GDIMetaFile& rMtf, const GraphicAttr& rAttr, GraphicAdjustme
 
     if( ( nAdjustmentFlags & GraphicAdjustmentFlags::MIRROR ) && aAttr.IsMirrored() )
     {
-        rMtf.Mirror( aAttr.GetMirrorFlags() );
+        rMtf.Mirror(BmpMirrorFlags(aAttr.GetMirrorFlags()));
     }
 
     if( ( nAdjustmentFlags & GraphicAdjustmentFlags::ROTATE ) && aAttr.IsRotated() )
@@ -270,7 +270,7 @@ void lclImplAdjust( Animation& rAnimation, const GraphicAttr& rAttr, GraphicAdju
 
     if( ( nAdjustmentFlags & GraphicAdjustmentFlags::MIRROR ) && aAttr.IsMirrored() )
     {
-        rAnimation.Mirror( aAttr.GetMirrorFlags() );
+        rAnimation.Mirror(BmpMirrorFlags(aAttr.GetMirrorFlags()));
     }
 
     if( ( nAdjustmentFlags & GraphicAdjustmentFlags::ROTATE ) && aAttr.IsRotated() )
@@ -383,7 +383,7 @@ bool GraphicObject::ImplGetCropParams( OutputDevice const * pOut, Point& rPt, Si
         if( !aSize100.IsEmpty() && nTotalWidth > 0 && nTotalHeight > 0 )
         {
             double fScale = static_cast<double>(aSize100.Width()) / nTotalWidth;
-            const long nNewLeft = -FRound( ( ( pAttr->GetMirrorFlags() & BmpMirrorFlags::Horizontal ) ? pAttr->GetRightCrop() : pAttr->GetLeftCrop() ) * fScale );
+            const long nNewLeft = -FRound( ( ( BmpMirrorFlags(pAttr->GetMirrorFlags()) & BmpMirrorFlags::Horizontal ) ? pAttr->GetRightCrop() : pAttr->GetLeftCrop() ) * fScale );
             const long nNewRight = nNewLeft + FRound( aSize100.Width() * fScale ) - 1;
 
             fScale = static_cast<double>(rSz.Width()) / aSize100.Width();
@@ -391,7 +391,7 @@ bool GraphicObject::ImplGetCropParams( OutputDevice const * pOut, Point& rPt, Si
             rSz.setWidth( FRound( ( nNewRight - nNewLeft + 1 ) * fScale ) );
 
             fScale = static_cast<double>(aSize100.Height()) / nTotalHeight;
-            const long nNewTop = -FRound( ( ( pAttr->GetMirrorFlags() & BmpMirrorFlags::Vertical ) ? pAttr->GetBottomCrop() : pAttr->GetTopCrop() ) * fScale );
+            const long nNewTop = -FRound( ( ( BmpMirrorFlags(pAttr->GetMirrorFlags()) & BmpMirrorFlags::Vertical ) ? pAttr->GetBottomCrop() : pAttr->GetTopCrop() ) * fScale );
             const long nNewBottom = nNewTop + FRound( aSize100.Height() * fScale ) - 1;
 
             fScale = static_cast<double>(rSz.Height()) / aSize100.Height();
@@ -476,7 +476,8 @@ bool GraphicObject::Draw( OutputDevice* pOut, const Point& rPt, const Size& rSz,
     {
         aPt.AdjustX(aSz.Width() + 1 );
         aSz.setWidth( -aSz.Width() );
-        aAttr.SetMirrorFlags( aAttr.GetMirrorFlags() ^ BmpMirrorFlags::Horizontal );
+        BmpMirrorFlags eFlags = BmpMirrorFlags(aAttr.GetMirrorFlags()) ^ BmpMirrorFlags::Horizontal;
+        aAttr.SetMirrorFlags(basegfx::MirrorDirectionFlags(eFlags));
     }
 
     // mirrored vertically
@@ -484,7 +485,8 @@ bool GraphicObject::Draw( OutputDevice* pOut, const Point& rPt, const Size& rSz,
     {
         aPt.AdjustY(aSz.Height() + 1 );
         aSz.setHeight( -aSz.Height() );
-        aAttr.SetMirrorFlags( aAttr.GetMirrorFlags() ^ BmpMirrorFlags::Vertical );
+        BmpMirrorFlags eFlags = BmpMirrorFlags(aAttr.GetMirrorFlags()) ^ BmpMirrorFlags::Vertical;
+        aAttr.SetMirrorFlags(basegfx::MirrorDirectionFlags(eFlags));
     }
 
     if( bCropped )
diff --git a/vcl/source/graphic/grfattr.cxx b/vcl/source/graphic/grfattr.cxx
index 35acaf50b841..36e8605b77de 100644
--- a/vcl/source/graphic/grfattr.cxx
+++ b/vcl/source/graphic/grfattr.cxx
@@ -21,7 +21,7 @@
 
 GraphicAttr::GraphicAttr() :
     mfGamma         ( 1.0 ),
-    mnMirrFlags     ( BmpMirrorFlags::NONE ),
+    mnMirrFlags     ( basegfx::MirrorDirectionFlags::NONE ),
     mnLeftCrop      ( 0 ),
     mnTopCrop       ( 0 ),
     mnRightCrop     ( 0 ),
commit 4a119301c5245e5d0096803f827937a3a1a42d1d
Author:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Fri May 8 22:28:35 2020 +0200
Commit:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
CommitDate: Mon Sep 28 10:32:08 2020 +0200

    Move some basic primitives to drawinglayer CORE
    
    Mostly which are easy to move and used in VclProcessor2D
    
    Change-Id: Ie1559e13a2a7cdb5225421def2f9145026ff9121

diff --git a/drawinglayer/Library_drawinglayer.mk b/drawinglayer/Library_drawinglayer.mk
index 4896c0ad0759..451a9b1e55d3 100644
--- a/drawinglayer/Library_drawinglayer.mk
+++ b/drawinglayer/Library_drawinglayer.mk
@@ -50,11 +50,6 @@ $(eval $(call gb_Library_use_libraries,drawinglayer,\
 $(eval $(call gb_Library_add_exception_objects,drawinglayer,\
     drawinglayer/source/animation/animationtiming \
     drawinglayer/source/attribute/fillgraphicattribute \
-    drawinglayer/source/attribute/fillgradientattribute \
-    drawinglayer/source/attribute/fillhatchattribute \
-    drawinglayer/source/attribute/fontattribute \
-    drawinglayer/source/attribute/lineattribute \
-    drawinglayer/source/attribute/linestartendattribute \
     drawinglayer/source/attribute/materialattribute3d \
     drawinglayer/source/attribute/sdrallattribute3d \
     drawinglayer/source/attribute/sdrfillattribute \
@@ -67,11 +62,9 @@ $(eval $(call gb_Library_add_exception_objects,drawinglayer,\
     drawinglayer/source/attribute/sdrobjectattribute3d \
     drawinglayer/source/attribute/sdrsceneattribute3d \
     drawinglayer/source/attribute/sdrshadowattribute \
-    drawinglayer/source/attribute/strokeattribute \
     drawinglayer/source/geometry/viewinformation3d \
     drawinglayer/source/primitive2d/animatedprimitive2d \
     drawinglayer/source/primitive2d/backgroundcolorprimitive2d \
-    drawinglayer/source/primitive2d/bitmapprimitive2d \
     drawinglayer/source/primitive2d/borderlineprimitive2d \
     drawinglayer/source/primitive2d/controlprimitive2d \
     drawinglayer/source/primitive2d/cropprimitive2d \
@@ -80,54 +73,32 @@ $(eval $(call gb_Library_add_exception_objects,drawinglayer,\
     drawinglayer/source/primitive2d/embedded3dprimitive2d \
     drawinglayer/source/primitive2d/epsprimitive2d \
     drawinglayer/source/primitive2d/fillgraphicprimitive2d \
-    drawinglayer/source/primitive2d/fillgradientprimitive2d \
-    drawinglayer/source/primitive2d/fillhatchprimitive2d \
     drawinglayer/source/primitive2d/glowprimitive2d \
     drawinglayer/source/primitive2d/graphicprimitivehelper2d \
     drawinglayer/source/primitive2d/graphicprimitive2d \
     drawinglayer/source/primitive2d/gridprimitive2d \
-    drawinglayer/source/primitive2d/groupprimitive2d \
     drawinglayer/source/primitive2d/helplineprimitive2d \
     drawinglayer/source/primitive2d/hiddengeometryprimitive2d \
     drawinglayer/source/primitive2d/invertprimitive2d \
     drawinglayer/source/primitive2d/markerarrayprimitive2d \
-    drawinglayer/source/primitive2d/maskprimitive2d \
     drawinglayer/source/primitive2d/mediaprimitive2d \
     drawinglayer/source/primitive2d/metafileprimitive2d \
-    drawinglayer/source/primitive2d/modifiedcolorprimitive2d \
-    drawinglayer/source/primitive2d/objectinfoprimitive2d \
     drawinglayer/source/primitive2d/pagehierarchyprimitive2d \
-    drawinglayer/source/primitive2d/pagepreviewprimitive2d \
     drawinglayer/source/primitive2d/patternfillprimitive2d \
-    drawinglayer/source/primitive2d/pointarrayprimitive2d \
-    drawinglayer/source/primitive2d/polygonprimitive2d \
-    drawinglayer/source/primitive2d/PolyPolygonHairlinePrimitive2D \
-    drawinglayer/source/primitive2d/PolyPolygonMarkerPrimitive2D \
-    drawinglayer/source/primitive2d/PolyPolygonStrokePrimitive2D \
-    drawinglayer/source/primitive2d/PolyPolygonColorPrimitive2D \
-    drawinglayer/source/primitive2d/PolyPolygonGradientPrimitive2D \
-    drawinglayer/source/primitive2d/PolyPolygonHatchPrimitive2D \
     drawinglayer/source/primitive2d/PolyPolygonGraphicPrimitive2D \
-    drawinglayer/source/primitive2d/PolyPolygonSelectionPrimitive2D \
-    drawinglayer/source/primitive2d/primitivetools2d \
     drawinglayer/source/primitive2d/sceneprimitive2d \
     drawinglayer/source/primitive2d/sdrdecompositiontools2d \
     drawinglayer/source/primitive2d/shadowprimitive2d \
     drawinglayer/source/primitive2d/softedgeprimitive2d \
     drawinglayer/source/primitive2d/structuretagprimitive2d \
-    drawinglayer/source/primitive2d/svggradientprimitive2d \
     drawinglayer/source/primitive2d/textbreakuphelper \
     drawinglayer/source/primitive2d/textdecoratedprimitive2d \
     drawinglayer/source/primitive2d/texteffectprimitive2d \
-    drawinglayer/source/primitive2d/textenumsprimitive2d \
     drawinglayer/source/primitive2d/texthierarchyprimitive2d \
     drawinglayer/source/primitive2d/textlayoutdevice \
     drawinglayer/source/primitive2d/textlineprimitive2d \
     drawinglayer/source/primitive2d/textprimitive2d \
     drawinglayer/source/primitive2d/textstrikeoutprimitive2d \
-    drawinglayer/source/primitive2d/transformprimitive2d \
-    drawinglayer/source/primitive2d/transparenceprimitive2d \
-    drawinglayer/source/primitive2d/unifiedtransparenceprimitive2d \
     drawinglayer/source/primitive2d/wallpaperprimitive2d \
     drawinglayer/source/primitive2d/wrongspellprimitive2d \
     drawinglayer/source/primitive3d/baseprimitive3d \
@@ -185,7 +156,6 @@ $(eval $(call gb_Library_add_exception_objects,drawinglayer,\
     drawinglayer/source/tools/wmfemfhelper \
     drawinglayer/source/tools/primitive2dxmldump \
     drawinglayer/source/drawinglayeruno/xprimitive2drenderer \
-    drawinglayer/source/texture/texture \
     drawinglayer/source/dumper/XShapeDumper \
     drawinglayer/source/dumper/EnhancedShapeDumper \
 ))
diff --git a/drawinglayer/Library_drawinglayercore.mk b/drawinglayer/Library_drawinglayercore.mk
index f1643d27014d..972ac32f5388 100644
--- a/drawinglayer/Library_drawinglayercore.mk
+++ b/drawinglayer/Library_drawinglayercore.mk
@@ -40,10 +40,47 @@ $(eval $(call gb_Library_use_libraries,drawinglayercore,\
 ))
 
 $(eval $(call gb_Library_add_exception_objects,drawinglayercore,\
+    drawinglayer/source/attribute/lineattribute \
+    drawinglayer/source/attribute/strokeattribute \
+    drawinglayer/source/attribute/linestartendattribute \
+    drawinglayer/source/attribute/fillgradientattribute \
+    drawinglayer/source/attribute/fillhatchattribute \
+    drawinglayer/source/attribute/fontattribute \
+    drawinglayer/source/geometry/viewinformation2d \
+    drawinglayer/source/texture/texture \
     drawinglayer/source/primitive2d/baseprimitive2d \
     drawinglayer/source/primitive2d/Primitive2DContainer \
     drawinglayer/source/primitive2d/Tools \
-    drawinglayer/source/geometry/viewinformation2d \
+    drawinglayer/source/primitive2d/polygonprimitive2d \
+    drawinglayer/source/primitive2d/PolyPolygonColorPrimitive2D \
+    drawinglayer/source/primitive2d/PolyPolygonHairlinePrimitive2D \
+    drawinglayer/source/primitive2d/PolyPolygonMarkerPrimitive2D \
+    drawinglayer/source/primitive2d/PolyPolygonStrokePrimitive2D \
+    drawinglayer/source/primitive2d/PolyPolygonGradientPrimitive2D \
+    drawinglayer/source/primitive2d/PolyPolygonHatchPrimitive2D \
+    drawinglayer/source/primitive2d/PolyPolygonSelectionPrimitive2D \
+    drawinglayer/source/primitive2d/fillgradientprimitive2d \
+    drawinglayer/source/primitive2d/maskprimitive2d \
+    drawinglayer/source/primitive2d/groupprimitive2d \
+    drawinglayer/source/primitive2d/fillhatchprimitive2d \
+    drawinglayer/source/primitive2d/primitivetools2d \
+    drawinglayer/source/primitive2d/pointarrayprimitive2d \
+    drawinglayer/source/primitive2d/modifiedcolorprimitive2d \
+    drawinglayer/source/primitive2d/bitmapprimitive2d \
+    drawinglayer/source/primitive2d/unifiedtransparenceprimitive2d \
+    drawinglayer/source/primitive2d/transparenceprimitive2d \
+    drawinglayer/source/primitive2d/pagepreviewprimitive2d \
+    drawinglayer/source/primitive2d/transformprimitive2d \
+    drawinglayer/source/primitive2d/svggradientprimitive2d \
+    drawinglayer/source/primitive2d/objectinfoprimitive2d \
+    drawinglayer/source/primitive2d/textenumsprimitive2d \
 ))
 
+#    drawinglayer/source/primitive2d/epsprimitive2d \
+#    drawinglayer/source/primitive2d/markerarrayprimitive2d \
+#    drawinglayer/source/primitive2d/fillgraphicprimitive2d \
+#    drawinglayer/source/primitive2d/textdecoratedprimitive2d \
+#    drawinglayer/source/primitive2d/textprimitive2d \
+
+
 # vim: set noet sw=4 ts=4:
diff --git a/filter/Library_pdffilter.mk b/filter/Library_pdffilter.mk
index a7cb47a65231..349883578482 100644
--- a/filter/Library_pdffilter.mk
+++ b/filter/Library_pdffilter.mk
@@ -49,6 +49,7 @@ $(eval $(call gb_Library_use_libraries,pdffilter,\
 	cppuhelper \
 	cppu \
 	sal \
+	drawinglayercore \
 	drawinglayer \
 ))
 
commit 2dec23126e3a23caf6a853bc07b69d61e8b09277
Author:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Thu Aug 13 10:16:35 2020 +0200
Commit:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
CommitDate: Mon Sep 28 10:32:08 2020 +0200

    drawinglayer: externalize PolygonWavePrimitive2D class
    
    Change-Id: I20a702c838ec68686b9c7e407be31ae9158cbef6

diff --git a/include/drawinglayer/primitive2d/polygonprimitive2d.hxx b/include/drawinglayer/primitive2d/polygonprimitive2d.hxx
index ac56461e35b0..57a37b60814f 100644
--- a/include/drawinglayer/primitive2d/polygonprimitive2d.hxx
+++ b/include/drawinglayer/primitive2d/polygonprimitive2d.hxx
@@ -39,7 +39,7 @@ namespace drawinglayer::primitive2d
     This is one of the non-decomposable primitives, so a renderer
     should process it.
  */
-class DRAWINGLAYER_DLLPUBLIC PolygonHairlinePrimitive2D final : public BasePrimitive2D
+class DRAWINGLAYERCORE_DLLPUBLIC PolygonHairlinePrimitive2D final : public BasePrimitive2D
 {
 private:
     /// the hairline geometry
@@ -76,7 +76,7 @@ public:
     It will be decomposed to the needed PolygonHairlinePrimitive2D if
     not handled directly by a renderer.
  */
-class DRAWINGLAYER_DLLPUBLIC PolygonMarkerPrimitive2D final
+class DRAWINGLAYERCORE_DLLPUBLIC PolygonMarkerPrimitive2D final
     : public BufferedDecompositionPrimitive2D
 {
 private:
@@ -131,7 +131,7 @@ public:
     and stroke attributes. It will be decomposed dependent on the definition
     to the needed primitives, e.g. filled PolyPolygons for fat lines.
  */
-class DRAWINGLAYER_DLLPUBLIC PolygonStrokePrimitive2D : public BufferedDecompositionPrimitive2D
+class DRAWINGLAYERCORE_DLLPUBLIC PolygonStrokePrimitive2D : public BufferedDecompositionPrimitive2D
 {
 private:
     /// the line geometry
@@ -180,7 +180,7 @@ public:
     This primitive defines a waveline based on a PolygonStrokePrimitive2D
     where the wave is defined by wave width and wave length.
  */
-class PolygonWavePrimitive2D final : public PolygonStrokePrimitive2D
+class DRAWINGLAYERCORE_DLLPUBLIC PolygonWavePrimitive2D final : public PolygonStrokePrimitive2D
 {
 private:
     /// wave definition
@@ -225,7 +225,8 @@ public:
     possibly extended by start and end definitions, which are
     normally used for arrows.
  */
-class DRAWINGLAYER_DLLPUBLIC PolygonStrokeArrowPrimitive2D final : public PolygonStrokePrimitive2D
+class DRAWINGLAYERCORE_DLLPUBLIC PolygonStrokeArrowPrimitive2D final
+    : public PolygonStrokePrimitive2D
 {
 private:
     /// geometric definitions for line start and end
commit a4b8b4bcc2eabcb901f42b6ac8290f98304fbbb6
Author:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Fri May 8 20:50:29 2020 +0200
Commit:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
CommitDate: Mon Sep 28 10:32:07 2020 +0200

    drawinglayer: externalize PointArrayPrimitive2D class
    
    Change-Id: I8ee993947bf2f4437cf3a429c43a81132fac0947

diff --git a/include/drawinglayer/primitive2d/pointarrayprimitive2d.hxx b/include/drawinglayer/primitive2d/pointarrayprimitive2d.hxx
index 7e516555162a..ba4be8c5dcc4 100644
--- a/include/drawinglayer/primitive2d/pointarrayprimitive2d.hxx
+++ b/include/drawinglayer/primitive2d/pointarrayprimitive2d.hxx
@@ -37,7 +37,7 @@ namespace drawinglayer::primitive2d
             should process it (Currently it is only used for grid visualisation,
             but this may change).
          */
-        class PointArrayPrimitive2D final : public BasePrimitive2D
+        class DRAWINGLAYER_DLLPUBLIC PointArrayPrimitive2D final : public BasePrimitive2D
         {
         private:
             /// the array of positions
commit d6637cf11a705cc90213778d105add606ce162db
Author:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Fri May 8 20:43:38 2020 +0200
Commit:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
CommitDate: Mon Sep 28 10:32:07 2020 +0200

    drawinglayer: externalize classes in texture.hxx
    
    Change-Id: I1e49a6c896733ebebf16db23f3c2f8b06161d659

diff --git a/drawinglayer/inc/texture/texture.hxx b/drawinglayer/inc/texture/texture.hxx
index 24e23a4b241c..b34bde38d1bc 100644
--- a/drawinglayer/inc/texture/texture.hxx
+++ b/drawinglayer/inc/texture/texture.hxx
@@ -30,7 +30,7 @@
 
 namespace drawinglayer::texture
 {
-        class GeoTexSvx
+        class DRAWINGLAYER_DLLPUBLIC GeoTexSvx
         {
         public:
             GeoTexSvx();
@@ -53,7 +53,7 @@ namespace drawinglayer::texture
             basegfx::BColor         maBColor;
         };
 
-        class GeoTexSvxGradient : public GeoTexSvx
+        class DRAWINGLAYER_DLLPUBLIC GeoTexSvxGradient : public GeoTexSvx
         {
         protected:
             basegfx::ODFGradientInfo            maGradientInfo;
@@ -79,7 +79,7 @@ namespace drawinglayer::texture
                 basegfx::BColor& rOuterColor) = 0;
         };
 
-        class GeoTexSvxGradientLinear final : public GeoTexSvxGradient
+        class DRAWINGLAYER_DLLPUBLIC GeoTexSvxGradientLinear final : public GeoTexSvxGradient
         {
             double                  mfUnitMinX;
             double                  mfUnitWidth;
@@ -102,7 +102,7 @@ namespace drawinglayer::texture
             virtual void modifyBColor(const basegfx::B2DPoint& rUV, basegfx::BColor& rBColor, double& rfOpacity) const override;
         };
 
-        class GeoTexSvxGradientAxial final : public GeoTexSvxGradient
+        class DRAWINGLAYER_DLLPUBLIC GeoTexSvxGradientAxial final : public GeoTexSvxGradient
         {
             double                  mfUnitMinX;
             double                  mfUnitWidth;
@@ -124,7 +124,7 @@ namespace drawinglayer::texture
             virtual void modifyBColor(const basegfx::B2DPoint& rUV, basegfx::BColor& rBColor, double& rfOpacity) const override;
         };
 
-        class GeoTexSvxGradientRadial final : public GeoTexSvxGradient
+        class DRAWINGLAYER_DLLPUBLIC GeoTexSvxGradientRadial final : public GeoTexSvxGradient
         {
         public:
             GeoTexSvxGradientRadial(
@@ -143,7 +143,7 @@ namespace drawinglayer::texture
             virtual void modifyBColor(const basegfx::B2DPoint& rUV, basegfx::BColor& rBColor, double& rfOpacity) const override;
         };
 
-        class GeoTexSvxGradientElliptical final : public GeoTexSvxGradient
+        class DRAWINGLAYER_DLLPUBLIC GeoTexSvxGradientElliptical final : public GeoTexSvxGradient
         {
         public:
             GeoTexSvxGradientElliptical(
@@ -163,7 +163,7 @@ namespace drawinglayer::texture
             virtual void modifyBColor(const basegfx::B2DPoint& rUV, basegfx::BColor& rBColor, double& rfOpacity) const override;
         };
 
-        class GeoTexSvxGradientSquare final : public GeoTexSvxGradient
+        class DRAWINGLAYER_DLLPUBLIC GeoTexSvxGradientSquare final : public GeoTexSvxGradient
         {
         public:
             GeoTexSvxGradientSquare(
@@ -183,7 +183,7 @@ namespace drawinglayer::texture
             virtual void modifyBColor(const basegfx::B2DPoint& rUV, basegfx::BColor& rBColor, double& rfOpacity) const override;
         };
 
-        class GeoTexSvxGradientRect final : public GeoTexSvxGradient
+        class DRAWINGLAYER_DLLPUBLIC GeoTexSvxGradientRect final : public GeoTexSvxGradient
         {
         public:
             GeoTexSvxGradientRect(
@@ -203,7 +203,7 @@ namespace drawinglayer::texture
             virtual void modifyBColor(const basegfx::B2DPoint& rUV, basegfx::BColor& rBColor, double& rfOpacity) const override;
         };
 
-        class GeoTexSvxHatch final : public GeoTexSvx
+        class DRAWINGLAYER_DLLPUBLIC GeoTexSvxHatch final : public GeoTexSvx
         {
             basegfx::B2DRange                   maOutputRange;
             basegfx::B2DHomMatrix               maTextureTransform;
@@ -239,7 +239,7 @@ namespace drawinglayer::texture
         // given percentage value (offsetX has to be 0.0 <= offsetX <= 1.0).
         // Accordingly to offsetY. If both are given, offsetX is preferred
         // and offsetY is ignored.
-        class GeoTexSvxTiled final : public GeoTexSvx
+        class DRAWINGLAYER_DLLPUBLIC GeoTexSvxTiled final : public GeoTexSvx
         {
             basegfx::B2DRange               maRange;
             double                          mfOffsetX;
commit e7f2df5d0c36e54b79e1720db777e551d8cba05b
Author:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Fri May 8 20:40:59 2020 +0200
Commit:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
CommitDate: Mon Sep 28 10:32:07 2020 +0200

    drawinglayer: externalize FillHatchPrimitive2D class
    
    Change-Id: I9ad1f179a43bb6c501cb699c0f26523f47307829

diff --git a/include/drawinglayer/primitive2d/fillhatchprimitive2d.hxx b/include/drawinglayer/primitive2d/fillhatchprimitive2d.hxx
index 03bc12139fcb..07399ce0e759 100644
--- a/include/drawinglayer/primitive2d/fillhatchprimitive2d.hxx
+++ b/include/drawinglayer/primitive2d/fillhatchprimitive2d.hxx
@@ -24,9 +24,6 @@
 #include <drawinglayer/attribute/fillhatchattribute.hxx>
 #include <basegfx/color/bcolor.hxx>
 
-
-// FillHatchPrimitive2D class
-
 namespace drawinglayer::primitive2d
 {
         /** FillHatchPrimitive2D class
@@ -43,7 +40,7 @@ namespace drawinglayer::primitive2d
 
             The decomposition will deliver the hatch lines.
          */
-        class FillHatchPrimitive2D final : public DiscreteMetricDependentPrimitive2D
+        class DRAWINGLAYER_DLLPUBLIC FillHatchPrimitive2D final : public DiscreteMetricDependentPrimitive2D
         {
         private:
             /// the geometrically visible area
commit bdceae8b2cbf250541ba273863eae0272dab951d
Author:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Wed Apr 1 13:00:25 2020 +0200
Commit:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
CommitDate: Mon Sep 28 10:32:06 2020 +0200

    Add OutputDevice::drawPrimitive2D to OutputDevice
    
    Change-Id: Ifc22eca62df72bddd247ba097054f34756520614

diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx
index 14b03507dfe3..5f8a607198cb 100644
--- a/include/vcl/outdev.hxx
+++ b/include/vcl/outdev.hxx
@@ -49,6 +49,8 @@
 #include <com/sun/star/drawing/LineCap.hpp>
 #include <com/sun/star/uno/Reference.h>
 
+#include <drawinglayer/primitive2d/Primitive2DContainer.hxx>
+
 #include <memory>
 #include <vector>
 
@@ -1961,6 +1963,9 @@ public:
     ///@}
 
 
+    bool drawPrimitive2D(drawinglayer::primitive2d::Primitive2DContainer & rPrimitive2D);
+
+
     /** @name Native Widget Rendering functions
 
         These all just call through to the private mpGraphics functions of the same name.
diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk
index ee68260fbd50..5d3a1b593850 100644
--- a/vcl/Library_vcl.mk
+++ b/vcl/Library_vcl.mk
@@ -80,6 +80,7 @@ $(eval $(call gb_Library_use_libraries,vcl,\
     basegfx \
     comphelper \
     cppuhelper \
+    drawinglayercore \
     i18nlangtag \
     i18nutil \
     $(if $(filter OPENCL,$(BUILD_TYPE)),opencl) \
diff --git a/vcl/source/outdev/outdev.cxx b/vcl/source/outdev/outdev.cxx
index 020a57a6a40c..e0ce70a90911 100644
--- a/vcl/source/outdev/outdev.cxx
+++ b/vcl/source/outdev/outdev.cxx
@@ -704,4 +704,9 @@ bool OutputDevice::DrawEPS( const Point& rPoint, const Size& rSize,
     return bDrawn;
 }
 
+bool OutputDevice::drawPrimitive2D(drawinglayer::primitive2d::Primitive2DContainer & rPrimitive2D)
+{
+    return false;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 50d0a3bd921abccf39c2fe510d21e7d2fd7ae3f0
Author:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Sat Mar 7 14:33:43 2020 +0100
Commit:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
CommitDate: Mon Sep 28 10:32:06 2020 +0200

    Separate core drawinglayer func. into drawinglayercore library
    
    This separates the drawinglayer core functionallity into a
    separate library, to keep a strict separation what is backend
    dependent and what is not. More strict separation can be done
    at a later date.
    
    This will make it possible to push part of drawinglayer
    (part of processor2d) directly into VCL.
    
    Change-Id: Ibc26580067e50bf20d7cdd37fa0e44eb10200878

diff --git a/Repository.mk b/Repository.mk
index d0aca4e0e982..fa3e845b3236 100644
--- a/Repository.mk
+++ b/Repository.mk
@@ -351,6 +351,7 @@ $(eval $(call gb_Helper_register_libraries_for_install,OOOLIBS,ooo, \
 	$(call gb_Helper_optional,SCRIPTING,dlgprov) \
 	$(if $(filter WNT,$(OS)),directx9canvas) \
 	$(if $(ENABLE_OPENGL_CANVAS),oglcanvas) \
+	drawinglayercore \
 	drawinglayer \
 	editeng \
 	$(if $(filter WNT,$(OS)),emser) \
diff --git a/drawinglayer/CppunitTest_drawinglayer_border.mk b/drawinglayer/CppunitTest_drawinglayer_border.mk
index fa2f715590cd..e00006c18dba 100644
--- a/drawinglayer/CppunitTest_drawinglayer_border.mk
+++ b/drawinglayer/CppunitTest_drawinglayer_border.mk
@@ -21,6 +21,7 @@ $(eval $(call gb_CppunitTest_use_libraries,drawinglayer_border, \
 	sal \
 	salhelper \
 	drawinglayer \
+	drawinglayercore \
 	vcl \
 	test \
 	tl \
diff --git a/drawinglayer/Library_drawinglayer.mk b/drawinglayer/Library_drawinglayer.mk
index 43a42b83b42c..4896c0ad0759 100644
--- a/drawinglayer/Library_drawinglayer.mk
+++ b/drawinglayer/Library_drawinglayer.mk
@@ -30,6 +30,7 @@ $(eval $(call gb_Library_use_externals,drawinglayer,\
 ))
 
 $(eval $(call gb_Library_use_libraries,drawinglayer,\
+    drawinglayercore \
     basegfx \
     canvastools \
     comphelper \
@@ -67,11 +68,9 @@ $(eval $(call gb_Library_add_exception_objects,drawinglayer,\
     drawinglayer/source/attribute/sdrsceneattribute3d \
     drawinglayer/source/attribute/sdrshadowattribute \
     drawinglayer/source/attribute/strokeattribute \
-    drawinglayer/source/geometry/viewinformation2d \
     drawinglayer/source/geometry/viewinformation3d \
     drawinglayer/source/primitive2d/animatedprimitive2d \
     drawinglayer/source/primitive2d/backgroundcolorprimitive2d \
-    drawinglayer/source/primitive2d/baseprimitive2d \
     drawinglayer/source/primitive2d/bitmapprimitive2d \
     drawinglayer/source/primitive2d/borderlineprimitive2d \
     drawinglayer/source/primitive2d/controlprimitive2d \
@@ -111,7 +110,6 @@ $(eval $(call gb_Library_add_exception_objects,drawinglayer,\
     drawinglayer/source/primitive2d/PolyPolygonGraphicPrimitive2D \
     drawinglayer/source/primitive2d/PolyPolygonSelectionPrimitive2D \
     drawinglayer/source/primitive2d/primitivetools2d \
-    drawinglayer/source/primitive2d/Primitive2DContainer \
     drawinglayer/source/primitive2d/sceneprimitive2d \
     drawinglayer/source/primitive2d/sdrdecompositiontools2d \
     drawinglayer/source/primitive2d/shadowprimitive2d \
@@ -127,7 +125,6 @@ $(eval $(call gb_Library_add_exception_objects,drawinglayer,\
     drawinglayer/source/primitive2d/textlineprimitive2d \
     drawinglayer/source/primitive2d/textprimitive2d \
     drawinglayer/source/primitive2d/textstrikeoutprimitive2d \
-    drawinglayer/source/primitive2d/Tools \
     drawinglayer/source/primitive2d/transformprimitive2d \
     drawinglayer/source/primitive2d/transparenceprimitive2d \
     drawinglayer/source/primitive2d/unifiedtransparenceprimitive2d \
diff --git a/drawinglayer/Library_drawinglayercore.mk b/drawinglayer/Library_drawinglayercore.mk
new file mode 100644
index 000000000000..f1643d27014d
--- /dev/null
+++ b/drawinglayer/Library_drawinglayercore.mk
@@ -0,0 +1,49 @@
+# -*- 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_Library_Library,drawinglayercore))
+
+$(eval $(call gb_Library_set_include,drawinglayercore,\
+    $$(INCLUDE) \
+    -I$(SRCDIR)/drawinglayer/inc \
+))
+
+$(eval $(call gb_Library_add_defs,drawinglayercore,\
+    -DDRAWINGLAYERCORE_DLLIMPLEMENTATION \
+))
+
+$(eval $(call gb_Library_set_precompiled_header,drawinglayercore,drawinglayer/inc/pch/precompiled_drawinglayercore))
+
+$(eval $(call gb_Library_use_sdk_api,drawinglayercore))
+
+$(eval $(call gb_Library_use_externals,drawinglayercore,\
+    boost_headers \
+    libxml2 \
+))
+
+$(eval $(call gb_Library_use_libraries,drawinglayercore,\
+    basegfx \
+    comphelper \
+    cppu \
+    cppuhelper \
+    i18nlangtag \
+    sal \
+    salhelper \
+    svl \
+    tl \
+))
+
+$(eval $(call gb_Library_add_exception_objects,drawinglayercore,\
+    drawinglayer/source/primitive2d/baseprimitive2d \
+    drawinglayer/source/primitive2d/Primitive2DContainer \
+    drawinglayer/source/primitive2d/Tools \
+    drawinglayer/source/geometry/viewinformation2d \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/drawinglayer/Module_drawinglayer.mk b/drawinglayer/Module_drawinglayer.mk
index 6d329e95c60a..687cd9c2671f 100644
--- a/drawinglayer/Module_drawinglayer.mk
+++ b/drawinglayer/Module_drawinglayer.mk
@@ -10,6 +10,7 @@
 $(eval $(call gb_Module_Module,drawinglayer))
 
 $(eval $(call gb_Module_add_targets,drawinglayer,\
+    Library_drawinglayercore \
     Library_drawinglayer \
 ))
 
diff --git a/drawinglayer/inc/pch/precompiled_drawinglayer.hxx b/drawinglayer/inc/pch/precompiled_drawinglayer.hxx
index f4a45f1757f2..47fb368aa3d8 100644
--- a/drawinglayer/inc/pch/precompiled_drawinglayer.hxx
+++ b/drawinglayer/inc/pch/precompiled_drawinglayer.hxx
@@ -91,7 +91,6 @@
 #include <basegfx/range/basicrange.hxx>
 #include <basegfx/tuple/b2dtuple.hxx>
 #include <basegfx/tuple/b3dtuple.hxx>
-#include <basegfx/utils/canvastools.hxx>
 #include <basegfx/vector/b2dvector.hxx>
 #include <basegfx/vector/b2enums.hxx>
 #include <basegfx/vector/b2ivector.hxx>
@@ -103,7 +102,7 @@
 #include <com/sun/star/drawing/TextureMode.hpp>
 #include <com/sun/star/drawing/TextureProjectionMode.hpp>
 #include <com/sun/star/graphic/XPrimitive3D.hpp>
-#include <com/sun/star/util/XAccounting.hpp>
+#include <com/sun/star/uno/Reference.hxx>
 #include <comphelper/comphelperdllapi.h>
 #include <comphelper/processfactory.hxx>
 #include <comphelper/sequence.hxx>
@@ -137,7 +136,6 @@
 #include <drawinglayer/drawinglayerdllapi.h>
 #include <drawinglayer/geometry/viewinformation2d.hxx>
 #include <drawinglayer/geometry/viewinformation3d.hxx>
-#include <drawinglayer/primitive2d/CommonTypes.hxx>
 #include <drawinglayer/primitive2d/PolyPolygonColorPrimitive2D.hxx>
 #include <drawinglayer/primitive2d/PolyPolygonGradientPrimitive2D.hxx>
 #include <drawinglayer/primitive2d/PolyPolygonGraphicPrimitive2D.hxx>
@@ -145,9 +143,6 @@
 #include <drawinglayer/primitive2d/PolyPolygonHatchPrimitive2D.hxx>
 #include <drawinglayer/primitive2d/PolyPolygonMarkerPrimitive2D.hxx>
 #include <drawinglayer/primitive2d/PolyPolygonStrokePrimitive2D.hxx>
-#include <drawinglayer/primitive2d/Primitive2DContainer.hxx>
-#include <drawinglayer/primitive2d/Primitive2DVisitor.hxx>
-#include <drawinglayer/primitive2d/Tools.hxx>
 #include <drawinglayer/primitive2d/baseprimitive2d.hxx>
 #include <drawinglayer/primitive2d/bitmapprimitive2d.hxx>
 #include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx>
diff --git a/drawinglayer/inc/pch/precompiled_drawinglayercore.cxx b/drawinglayer/inc/pch/precompiled_drawinglayercore.cxx
new file mode 100644
index 000000000000..4a8c23ea8e65
--- /dev/null
+++ b/drawinglayer/inc/pch/precompiled_drawinglayercore.cxx
@@ -0,0 +1,12 @@
+/* -*- 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 "precompiled_drawinglayercore.hxx"
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/drawinglayer/inc/pch/precompiled_drawinglayercore.hxx b/drawinglayer/inc/pch/precompiled_drawinglayercore.hxx
new file mode 100644
index 000000000000..4cc5ca4612c9
--- /dev/null
+++ b/drawinglayer/inc/pch/precompiled_drawinglayercore.hxx
@@ -0,0 +1,46 @@
+/* -*- 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/.
+ */
+
+/*
+ This file has been autogenerated by update_pch.sh. It is possible to edit it
+ manually (such as when an include file has been moved/renamed/removed). All such
+ manual changes will be rewritten by the next run of update_pch.sh (which presumably
+ also fixes all possible problems, so it's usually better to use it).
+
+ Generated on 2020-03-07 12:37:18 using:
+ ./bin/update_pch drawinglayer drawinglayercore --cutoff=4 --exclude:system --exclude:module --exclude:local
+
+ If after updating build fails, use the following command to locate conflicting headers:
+ ./bin/update_pch_bisect ./drawinglayer/inc/pch/precompiled_drawinglayercore.hxx "make drawinglayer.build" --find-conflicts
+*/
+
+#if PCH_LEVEL >= 1
+#include <ostream>
+#include <vector>
+#endif // PCH_LEVEL >= 1
+#if PCH_LEVEL >= 2
+#include <osl/diagnose.h>
+#include <osl/interlck.h>
+#include <sal/config.h>
+#include <sal/types.h>
+#endif // PCH_LEVEL >= 2
+#if PCH_LEVEL >= 3
+#include <basegfx/basegfxdllapi.h>
+#include <basegfx/point/b2dpoint.hxx>
+#include <basegfx/range/b2drange.hxx>
+#include <basegfx/range/basicrange.hxx>
+#include <basegfx/tuple/b2dtuple.hxx>
+#include <basegfx/utils/canvastools.hxx>
+#include <basegfx/vector/b2dvector.hxx>
+#endif // PCH_LEVEL >= 3
+#if PCH_LEVEL >= 4
+#include <drawinglayer/geometry/viewinformation2d.hxx>
+#endif // PCH_LEVEL >= 4
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/emfio/CppunitTest_emfio_emf.mk b/emfio/CppunitTest_emfio_emf.mk
index 5b32187b7ea8..e8e90d7dddd4 100644
--- a/emfio/CppunitTest_emfio_emf.mk
+++ b/emfio/CppunitTest_emfio_emf.mk
@@ -23,6 +23,7 @@ $(eval $(call gb_CppunitTest_use_sdk_api,emfio_emf))
 $(eval $(call gb_CppunitTest_use_libraries,emfio_emf,\
     basegfx \
     drawinglayer \
+    drawinglayercore \
     cppu \
     cppuhelper \
     comphelper \
diff --git a/emfio/Library_emfio.mk b/emfio/Library_emfio.mk
index 281f077130f1..f923f2078e35 100644
--- a/emfio/Library_emfio.mk
+++ b/emfio/Library_emfio.mk
@@ -41,6 +41,7 @@ $(eval $(call gb_Library_use_sdk_api,emfio))
 
 $(eval $(call gb_Library_use_libraries,emfio,\
     basegfx \
+    drawinglayercore \
     drawinglayer \
     cppu \
     cppuhelper \
diff --git a/filter/Library_svgfilter.mk b/filter/Library_svgfilter.mk
index 21318aa1fd03..1f0caf11758c 100644
--- a/filter/Library_svgfilter.mk
+++ b/filter/Library_svgfilter.mk
@@ -56,6 +56,7 @@ $(eval $(call gb_Library_use_libraries,svgfilter,\
 	sax \
 	salhelper \
 	comphelper \
+	drawinglayercore \
 	drawinglayer \
 	basegfx \
 	cppuhelper \
diff --git a/include/drawinglayer/drawinglayerdllapi.h b/include/drawinglayer/drawinglayerdllapi.h
index 0b3983504919..36a0d8abfea2 100644
--- a/include/drawinglayer/drawinglayerdllapi.h
+++ b/include/drawinglayer/drawinglayerdllapi.h
@@ -19,6 +19,12 @@
 #endif
 #define DRAWINGLAYER_DLLPRIVATE SAL_DLLPRIVATE
 
+#if defined(DRAWINGLAYERCORE_DLLIMPLEMENTATION)
+#define DRAWINGLAYERCORE_DLLPUBLIC SAL_DLLPUBLIC_EXPORT
+#else
+#define DRAWINGLAYERCORE_DLLPUBLIC SAL_DLLPUBLIC_IMPORT
+#endif
+
 #endif
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/drawinglayer/geometry/viewinformation2d.hxx b/include/drawinglayer/geometry/viewinformation2d.hxx
index 95be29a72bda..06b17248d213 100644
--- a/include/drawinglayer/geometry/viewinformation2d.hxx
+++ b/include/drawinglayer/geometry/viewinformation2d.hxx
@@ -63,7 +63,7 @@ namespace drawinglayer::geometry
     It is an implementation to support the sequence of PropertyValues used in a
     css::graphic::XPrimitive2D for C++ implementations working with those
 */
-class DRAWINGLAYER_DLLPUBLIC ViewInformation2D
+class DRAWINGLAYERCORE_DLLPUBLIC ViewInformation2D
 {
 public:
     typedef o3tl::cow_wrapper<ImpViewInformation2D, o3tl::ThreadSafeRefCountingPolicy> ImplType;
diff --git a/include/drawinglayer/primitive2d/Primitive2DContainer.hxx b/include/drawinglayer/primitive2d/Primitive2DContainer.hxx
index cca3a0a91485..c096e9a8cc2f 100644
--- a/include/drawinglayer/primitive2d/Primitive2DContainer.hxx
+++ b/include/drawinglayer/primitive2d/Primitive2DContainer.hxx
@@ -34,7 +34,7 @@ class ViewInformation2D;
 
 namespace drawinglayer::primitive2d
 {
-class SAL_WARN_UNUSED DRAWINGLAYER_DLLPUBLIC Primitive2DContainer
+class SAL_WARN_UNUSED DRAWINGLAYERCORE_DLLPUBLIC Primitive2DContainer
     : public std::deque<Primitive2DReference>,
       public Primitive2DDecompositionVisitor
 {
diff --git a/include/drawinglayer/primitive2d/Primitive2DVisitor.hxx b/include/drawinglayer/primitive2d/Primitive2DVisitor.hxx
index dfe04b32a320..e174d1e0878d 100644
--- a/include/drawinglayer/primitive2d/Primitive2DVisitor.hxx
+++ b/include/drawinglayer/primitive2d/Primitive2DVisitor.hxx
@@ -27,7 +27,7 @@ namespace drawinglayer::primitive2d
 class Primitive2DContainer;
 
 // Visitor class for walking a tree of Primitive2DReference
-class DRAWINGLAYER_DLLPUBLIC Primitive2DDecompositionVisitor
+class DRAWINGLAYERCORE_DLLPUBLIC Primitive2DDecompositionVisitor
 {
 public:
     virtual void append(const Primitive2DReference&) = 0;
diff --git a/include/drawinglayer/primitive2d/Tools.hxx b/include/drawinglayer/primitive2d/Tools.hxx
index fbb6f5717c01..1c30565c8c1b 100644
--- a/include/drawinglayer/primitive2d/Tools.hxx
+++ b/include/drawinglayer/primitive2d/Tools.hxx
@@ -31,16 +31,16 @@ class ViewInformation2D;
 namespace drawinglayer::primitive2d
 {
 /// get B2DRange from a given Primitive2DReference
-basegfx::B2DRange DRAWINGLAYER_DLLPUBLIC getB2DRangeFromPrimitive2DReference(
+basegfx::B2DRange DRAWINGLAYERCORE_DLLPUBLIC getB2DRangeFromPrimitive2DReference(
     const Primitive2DReference& rCandidate, const geometry::ViewInformation2D& aViewInformation);
 
 /** compare two Primitive2DReferences for equality, including trying to get implementations (BasePrimitive2D)
     and using compare operator
  */
-bool DRAWINGLAYER_DLLPUBLIC arePrimitive2DReferencesEqual(const Primitive2DReference& rA,
-                                                          const Primitive2DReference& rB);
+bool DRAWINGLAYERCORE_DLLPUBLIC arePrimitive2DReferencesEqual(const Primitive2DReference& rA,
+                                                              const Primitive2DReference& rB);
 
-OUString DRAWINGLAYER_DLLPUBLIC idToString(sal_uInt32 nId);
+OUString DRAWINGLAYERCORE_DLLPUBLIC idToString(sal_uInt32 nId);
 
 } // end of namespace drawinglayer::primitive2d
 
diff --git a/include/drawinglayer/primitive2d/baseprimitive2d.hxx b/include/drawinglayer/primitive2d/baseprimitive2d.hxx
index 45d0e3519c40..5478309846cd 100644
--- a/include/drawinglayer/primitive2d/baseprimitive2d.hxx
+++ b/include/drawinglayer/primitive2d/baseprimitive2d.hxx
@@ -119,8 +119,8 @@ typedef cppu::WeakComponentImplHelper<css::graphic::XPrimitive2D, css::util::XAc
     for view-independent primitives which are defined by not using ViewInformation2D
     in their get2DDecomposition/getB2DRange implementations.
 */
-class DRAWINGLAYER_DLLPUBLIC BasePrimitive2D : protected cppu::BaseMutex,
-                                               public BasePrimitive2DImplBase
+class DRAWINGLAYERCORE_DLLPUBLIC BasePrimitive2D : protected cppu::BaseMutex,
+                                                   public BasePrimitive2DImplBase
 {
     BasePrimitive2D(const BasePrimitive2D&) = delete;
     BasePrimitive2D& operator=(const BasePrimitive2D&) = delete;
@@ -198,7 +198,7 @@ public:
         to identify if a new decomposition is needed at the next call
     (f) return maBuffered2DDecomposition
  */
-class DRAWINGLAYER_DLLPUBLIC BufferedDecompositionPrimitive2D : public BasePrimitive2D
+class DRAWINGLAYERCORE_DLLPUBLIC BufferedDecompositionPrimitive2D : public BasePrimitive2D
 {
 private:
     /// a sequence used for buffering the last create2DDecomposition() result
diff --git a/sc/CppunitTest_sc_parallelism.mk b/sc/CppunitTest_sc_parallelism.mk
index eb7aaa446954..ff2cd6e25953 100644
--- a/sc/CppunitTest_sc_parallelism.mk
+++ b/sc/CppunitTest_sc_parallelism.mk
@@ -40,6 +40,7 @@ $(eval $(call gb_CppunitTest_use_libraries,sc_parallelism, \
     cppuhelper \
     dbtools \
     drawinglayer \
+    drawinglayercore \
     editeng \
     for \
     forui \
diff --git a/sc/CppunitTest_sc_ucalc.mk b/sc/CppunitTest_sc_ucalc.mk
index 8943de7ab4c3..60fb6676dab9 100644
--- a/sc/CppunitTest_sc_ucalc.mk
+++ b/sc/CppunitTest_sc_ucalc.mk
@@ -49,6 +49,7 @@ $(eval $(call gb_CppunitTest_use_libraries,sc_ucalc, \
     cppuhelper \
     dbtools \
     drawinglayer \
+    drawinglayercore \
     editeng \
     for \
     forui \
diff --git a/sc/Library_sc.mk b/sc/Library_sc.mk
index 1b3cead83beb..04589a676eaa 100644
--- a/sc/Library_sc.mk
+++ b/sc/Library_sc.mk
@@ -70,6 +70,7 @@ $(eval $(call gb_Library_use_libraries,sc,\
     cppu \
     cppuhelper \
     dbtools \
+    drawinglayercore \
     drawinglayer \
     editeng \
     for \
diff --git a/sd/CppunitTest_sd_uimpress.mk b/sd/CppunitTest_sd_uimpress.mk
index 93426dfc3a55..63f143978231 100644
--- a/sd/CppunitTest_sd_uimpress.mk
+++ b/sd/CppunitTest_sd_uimpress.mk
@@ -27,6 +27,7 @@ $(eval $(call gb_CppunitTest_use_libraries,sd_uimpress,\
     cppu \
     cppuhelper \
     drawinglayer \
+    drawinglayercore \
     editeng \
     i18nlangtag \
     i18nutil \
diff --git a/sd/Library_sd.mk b/sd/Library_sd.mk
index 9d399e8e3f5a..ed9decbc75cc 100644
--- a/sd/Library_sd.mk
+++ b/sd/Library_sd.mk
@@ -74,6 +74,7 @@ $(eval $(call gb_Library_use_libraries,sd,\
 	cppcanvas \
 	cppu \
 	cppuhelper \
+	drawinglayercore \
 	drawinglayer \
 	editeng \
 	i18nlangtag \
diff --git a/sfx2/Library_sfx.mk b/sfx2/Library_sfx.mk
index cb0b099eb37d..95d1eb704273 100644
--- a/sfx2/Library_sfx.mk
+++ b/sfx2/Library_sfx.mk
@@ -49,6 +49,7 @@ $(eval $(call gb_Library_use_libraries,sfx,\
     comphelper \
     cppu \
     cppuhelper \
+    drawinglayercore \
     drawinglayer \
     fwk \
     i18nlangtag \
diff --git a/svgio/CppunitTest_svgio.mk b/svgio/CppunitTest_svgio.mk
index d690f2383116..e6708c916f34 100644
--- a/svgio/CppunitTest_svgio.mk
+++ b/svgio/CppunitTest_svgio.mk
@@ -30,6 +30,7 @@ $(eval $(call gb_CppunitTest_use_library_objects,svgio,\
 $(eval $(call gb_CppunitTest_use_libraries,svgio,\
     basegfx \
     drawinglayer \
+    drawinglayercore \
     cppu \
     cppuhelper \
     comphelper \
diff --git a/svgio/Library_svgio.mk b/svgio/Library_svgio.mk
index 83a8546bdc1a..d75508e0537e 100644
--- a/svgio/Library_svgio.mk
+++ b/svgio/Library_svgio.mk
@@ -33,6 +33,7 @@ $(eval $(call gb_Library_use_sdk_api,svgio))
 
 $(eval $(call gb_Library_use_libraries,svgio,\
     basegfx \
+    drawinglayercore \
     drawinglayer \
     comphelper \
     cppu \
diff --git a/svx/CppunitTest_svx_unit.mk b/svx/CppunitTest_svx_unit.mk
index ac9f3e4531ad..4a51867ec189 100644
--- a/svx/CppunitTest_svx_unit.mk
+++ b/svx/CppunitTest_svx_unit.mk
@@ -36,6 +36,7 @@ $(eval $(call gb_CppunitTest_add_exception_objects,svx_unit, \
 $(eval $(call gb_CppunitTest_use_libraries,svx_unit, \
 	basegfx \
 	drawinglayer \
+	drawinglayercore \
 	sal \
 	sfx \
 	svxcore \
diff --git a/svx/Library_svx.mk b/svx/Library_svx.mk
index 424361233542..77d4541f892e 100644
--- a/svx/Library_svx.mk
+++ b/svx/Library_svx.mk
@@ -50,6 +50,7 @@ $(eval $(call gb_Library_use_libraries,svx,\
 		crashreport) \
     $(call gb_Helper_optional,DBCONNECTIVITY, \
         dbtools) \
+    drawinglayercore \
     drawinglayer \
     editeng \
     fwk \
diff --git a/svx/Library_svxcore.mk b/svx/Library_svxcore.mk
index 3d4590d216a1..b31ce6ff5287 100644
--- a/svx/Library_svxcore.mk
+++ b/svx/Library_svxcore.mk
@@ -57,6 +57,7 @@ $(eval $(call gb_Library_use_libraries,svxcore,\
     cppu \
     $(call gb_Helper_optional,DBCONNECTIVITY, \
         dbtools) \
+    drawinglayercore \
     drawinglayer \
     editeng \
     fwk \
diff --git a/sw/CppunitTest_sw_uwriter.mk b/sw/CppunitTest_sw_uwriter.mk
index 6b9ffa4ba683..a881587735e4 100644
--- a/sw/CppunitTest_sw_uwriter.mk
+++ b/sw/CppunitTest_sw_uwriter.mk
@@ -33,6 +33,7 @@ $(eval $(call gb_CppunitTest_use_libraries,sw_uwriter, \
     $(call gb_Helper_optional,DBCONNECTIVITY, \
         dbtools) \
     drawinglayer \
+    drawinglayercore \
     editeng \
     i18nlangtag \
     i18nutil \
diff --git a/sw/Library_sw.mk b/sw/Library_sw.mk
index 2de7d6b0e4dc..9a9e50bd0d87 100644
--- a/sw/Library_sw.mk
+++ b/sw/Library_sw.mk
@@ -58,6 +58,7 @@ $(eval $(call gb_Library_use_libraries,sw,\
     cppuhelper \
     $(call gb_Helper_optional,DBCONNECTIVITY, \
         dbtools) \
+    drawinglayercore \
     drawinglayer \
     editeng \
     i18nlangtag \
diff --git a/sw/Library_swui.mk b/sw/Library_swui.mk
index 99f1dd20ae3d..4c09d1cc4bda 100644
--- a/sw/Library_swui.mk
+++ b/sw/Library_swui.mk
@@ -75,6 +75,7 @@ $(eval $(call gb_Library_use_libraries,swui,\
     ucbhelper \
     utl \
     vcl \
+    drawinglayercore \
     drawinglayer \
 ))
 
commit e70069fb72d52c20b28166708a217bf674dcb61b
Author:     Seth Chaiklin <sdc.blanco at youmail.dk>
AuthorDate: Sat Sep 26 17:24:03 2020 +0200
Commit:     Heiko Tietze <heiko.tietze at documentfoundation.org>
CommitDate: Mon Sep 28 10:23:30 2020 +0200

    tdf#129471  change defaults on Find toolbar
    
    Conclusion from discussion in bug report:
     - Hide (but keep) "Navigate by" and controls by default on Find toolbar
    
    Change-Id: I09866887eaf1c92fa013945f71d1e197e80ff756
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/103429
    Tested-by: Jenkins
    Reviewed-by: Heiko Tietze <heiko.tietze at documentfoundation.org>

diff --git a/sw/uiconfig/swriter/toolbar/findbar.xml b/sw/uiconfig/swriter/toolbar/findbar.xml
index 15a29ac85162..e77af94f2954 100644
--- a/sw/uiconfig/swriter/toolbar/findbar.xml
+++ b/sw/uiconfig/swriter/toolbar/findbar.xml
@@ -27,9 +27,9 @@
   <toolbar:toolbarseparator/>
   <toolbar:toolbaritem xlink:href=".uno:SearchDialog"/>
   <toolbar:toolbarseparator/>
-  <toolbar:toolbaritem xlink:href=".uno:NavElement"/>
-  <toolbar:toolbaritem xlink:href=".uno:ScrollToPrevious"/>
-  <toolbar:toolbaritem xlink:href=".uno:ScrollToNext"/>
+  <toolbar:toolbaritem xlink:href=".uno:NavElement" toolbar:visible="false"/>
+  <toolbar:toolbaritem xlink:href=".uno:ScrollToPrevious" toolbar:visible="false"/>
+  <toolbar:toolbaritem xlink:href=".uno:ScrollToNext" toolbar:visible="false"/>
   <toolbar:toolbarseparator/>
   <toolbar:toolbaritem xlink:href=".uno:SearchLabel"/>
 </toolbar:toolbar>
commit 41fa7244746819411f209110f13af43941f17ce8
Author:     Kelemen Gábor <kelemeng at ubuntu.com>
AuthorDate: Tue Nov 12 15:03:04 2019 +0100
Commit:     László Németh <nemeth at numbertext.org>
CommitDate: Mon Sep 28 09:18:06 2020 +0200

    tdf#108059 Introduce compatibility key for pie chart orientation
    
    There is no similar setting in MSO, it just always uses clockwise.
    
    LO on the other hand confuses users by using counterclockwise
    which turns to clockwise upon save to OOXML and reload.
    
    Eliminate this behavior by introducing a compatibility key
    for OOXML-heavy environments that:
    - sets the orientation to clockwise when pie chart type is selected
    - hides the checkbox that would have no effect after a save to OOXML
    
    Default value is false to keep current behavior
    
    Change-Id: I9e12ecad8e9978f960c921a521461aee023a5063
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/82524
    Tested-by: Jenkins
    Tested-by: László Németh <nemeth at numbertext.org>
    Reviewed-by: Balazs Varga <balazs.varga991 at gmail.com>
    Reviewed-by: László Németh <nemeth at numbertext.org>

diff --git a/chart2/Library_chartcontroller.mk b/chart2/Library_chartcontroller.mk
index 48115dd2a33b..05f031415213 100644
--- a/chart2/Library_chartcontroller.mk
+++ b/chart2/Library_chartcontroller.mk
@@ -22,6 +22,10 @@ $(eval $(call gb_Library_use_external,chartcontroller,boost_headers))
 
 $(eval $(call gb_Library_use_sdk_api,chartcontroller))
 
+$(eval $(call gb_Library_use_custom_headers,chartcontroller,\
+        officecfg/registry \
+))
+
 $(eval $(call gb_Library_use_libraries,chartcontroller,\
     basegfx \
     chartcore \
diff --git a/chart2/source/controller/dialogs/tp_PolarOptions.cxx b/chart2/source/controller/dialogs/tp_PolarOptions.cxx
index 804c4221247a..e858813bb39f 100644
--- a/chart2/source/controller/dialogs/tp_PolarOptions.cxx
+++ b/chart2/source/controller/dialogs/tp_PolarOptions.cxx
@@ -22,6 +22,7 @@
 
 #include <svl/eitem.hxx>
 #include <svl/intitem.hxx>
+#include <officecfg/Office/Compatibility.hxx>
 
 namespace chart
 {
@@ -80,7 +81,8 @@ void PolarOptionsTabPage::Reset(const SfxItemSet* rInAttrs)
     {
         m_xFL_StartingAngle->hide();
     }
-    if (rInAttrs->GetItemState(SCHATTR_CLOCKWISE, true, &pPoolItem) == SfxItemState::SET)
+    // tdf#108059 Hide clockwise orientation checkbox in OOXML-heavy environments it would be useless anyways
+    if (!officecfg::Office::Compatibility::View::ClockwisePieChartDirection::get() && rInAttrs->GetItemState(SCHATTR_CLOCKWISE, true, &pPoolItem) == SfxItemState::SET)
     {
         bool bCheck = static_cast< const SfxBoolItem * >( pPoolItem )->GetValue();
         m_xCB_Clockwise->set_active(bCheck);
diff --git a/chart2/source/model/template/PieChartTypeTemplate.cxx b/chart2/source/model/template/PieChartTypeTemplate.cxx
index ec08764a7509..7f58b6e856e6 100644
--- a/chart2/source/model/template/PieChartTypeTemplate.cxx
+++ b/chart2/source/model/template/PieChartTypeTemplate.cxx
@@ -34,6 +34,7 @@
 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
 #include <officecfg/Office/Compatibility.hxx>
 #include <tools/diagnose_ex.h>
+#include <officecfg/Office/Compatibility.hxx>
 
 #include <rtl/math.hxx>
 
@@ -237,7 +238,15 @@ void PieChartTypeTemplate::adaptScales(
             {
                 chart2::ScaleData aScaleData( xAxis->getScaleData() );
                 AxisHelper::removeExplicitScaling( aScaleData );
-                aScaleData.Orientation = chart2::AxisOrientation_MATHEMATICAL;
+                // tdf#108059 Create new pie/donut charts with clockwise orientation
+                if (!officecfg::Office::Compatibility::View::ClockwisePieChartDirection::get())
+                {
+                    aScaleData.Orientation = chart2::AxisOrientation_MATHEMATICAL;
+                }
+                else
+                {
+                    aScaleData.Orientation = chart2::AxisOrientation_REVERSE;
+                }
                 xAxis->setScaleData( aScaleData );
             }
 
diff --git a/officecfg/registry/schema/org/openoffice/Office/Compatibility.xcs b/officecfg/registry/schema/org/openoffice/Office/Compatibility.xcs
index 5b89f9498005..87d139fb9116 100644
--- a/officecfg/registry/schema/org/openoffice/Office/Compatibility.xcs
+++ b/officecfg/registry/schema/org/openoffice/Office/Compatibility.xcs
@@ -193,6 +193,14 @@
         </info>
         <value>true</value>
       </prop>
+      <prop oor:name="ClockwisePieChartDirection" oor:type="xs:boolean" oor:nillable="false">
+        <info>
+        <!-- See tdf#108059 for rationale -->
+            <desc>Specifies whether the default orientation of pie charts should be clockwise. In OOXML-heavy environments it might be confusing to see charts being mirrored after save, avoid that by setting this key to true.</desc>
+            <label>Pie chart default orientation. Set to true for more OOXML-ish UX.</label>
+        </info>
+        <value>false</value>
+      </prop>
     </group>
   </component>
 </oor:component-schema>
diff --git a/sw/qa/extras/uiwriter/uiwriter2.cxx b/sw/qa/extras/uiwriter/uiwriter2.cxx
index 8fb14a87c945..a6efc4a5ee60 100644
--- a/sw/qa/extras/uiwriter/uiwriter2.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter2.cxx
@@ -2977,9 +2977,20 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf123218)
         }
         ~ReverseXAxisOrientationDoughnutChart() = delete;
     };
+
+    struct ClockwisePieChartDirection
+        : public comphelper::ConfigurationProperty<ClockwisePieChartDirection, bool>
+    {
+        static OUString path()
+        {
+            return "/org.openoffice.Office.Compatibility/View/ClockwisePieChartDirection";
+        }
+        ~ClockwisePieChartDirection() = delete;
+    };
     auto batch = comphelper::ConfigurationChanges::create();
 
     ReverseXAxisOrientationDoughnutChart::set(false, batch);
+    ClockwisePieChartDirection::set(true, batch);
     batch->commit();
 
     createDoc();
@@ -3028,5 +3039,11 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf123218)
     CPPUNIT_ASSERT(xAxis.is());
     chart2::ScaleData aScaleData = xAxis->getScaleData();
     CPPUNIT_ASSERT_EQUAL(chart2::AxisOrientation_MATHEMATICAL, aScaleData.Orientation);
+
+    // tdf#108059 test primary Y axis Orientation value
+    uno::Reference<chart2::XAxis> xYAxis = xCoord->getAxisByDimension(1, 0);
+    CPPUNIT_ASSERT(xYAxis.is());
+    aScaleData = xYAxis->getScaleData();
+    CPPUNIT_ASSERT_EQUAL(chart2::AxisOrientation_REVERSE, aScaleData.Orientation);
 }
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 050e95e50d44a5cbb74bb5de481cb30551f83136
Author:     David Tardon <dtardon at redhat.com>
AuthorDate: Sun Sep 27 19:07:48 2020 +0200
Commit:     David Tardon <dtardon at redhat.com>
CommitDate: Mon Sep 28 08:58:06 2020 +0200

    upload libmwaw 0.3.17
    
    Change-Id: I24c6c5a5d93a76a9fcc2213cd48beb8e5a5ca479
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/103519
    Tested-by: Jenkins
    Reviewed-by: David Tardon <dtardon at redhat.com>

diff --git a/configure.ac b/configure.ac
index 0db50672d5fa..7aeb5ef1588e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -8846,7 +8846,7 @@ libo_CHECK_SYSTEM_MODULE([libcdr],[CDR],[libcdr-0.1])
 libo_CHECK_SYSTEM_MODULE([libmspub],[MSPUB],[libmspub-0.1])
 
 libo_CHECK_SYSTEM_MODULE([libmwaw],[MWAW],[libmwaw-0.3 >= 0.3.1])
-libo_PKG_VERSION([MWAW], [libmwaw-0.3], [0.3.16])
+libo_PKG_VERSION([MWAW], [libmwaw-0.3], [0.3.17])
 
 libo_CHECK_SYSTEM_MODULE([libetonyek],[ETONYEK],[libetonyek-0.1])
 libo_PKG_VERSION([ETONYEK], [libetonyek-0.1], [0.1.8])
diff --git a/download.lst b/download.lst
index 560e004ed80c..a4782bb2b9ef 100644
--- a/download.lst
+++ b/download.lst
@@ -186,8 +186,8 @@ export MDNSRESPONDER_SHA256SUM := e777b4d7dbf5eb1552cb80090ad1ede319067ab6e45e39
 export MDNSRESPONDER_TARBALL := mDNSResponder-878.200.35.tar.gz
 export MSPUB_SHA256SUM := ef36c1a1aabb2ba3b0bedaaafe717bf4480be2ba8de6f3894be5fd3702b013ba
 export MSPUB_TARBALL := libmspub-0.1.4.tar.xz
-export MWAW_SHA256SUM := 0c639edba5297bde5575193bf5b5f2f469956beaff5c0206d91ce9df6bde1868
-export MWAW_VERSION_MICRO := 16
+export MWAW_SHA256SUM := 8e1537eb1de1b4714f4bf0a20478f342c5d71a65bf99307a694b1e9e30bb911c
+export MWAW_VERSION_MICRO := 17
 export MWAW_TARBALL := libmwaw-0.3.$(MWAW_VERSION_MICRO).tar.xz
 export MYTHES_SHA256SUM := 1e81f395d8c851c3e4e75b568e20fa2fa549354e75ab397f9de4b0e0790a305f
 export MYTHES_TARBALL := a8c2c5b8f09e7ede322d5c602ff6a4b6-mythes-1.2.4.tar.gz
diff --git a/external/libmwaw/Library_mwaw.mk b/external/libmwaw/Library_mwaw.mk
index 880a70861e24..bb1a880fd9ce 100644
--- a/external/libmwaw/Library_mwaw.mk
+++ b/external/libmwaw/Library_mwaw.mk
@@ -41,6 +41,9 @@ $(eval $(call gb_Library_add_generated_exception_objects,mwaw,\
 	UnpackedTarball/libmwaw/src/lib/BeagleWksSSParser \
 	UnpackedTarball/libmwaw/src/lib/BeagleWksStructManager \
 	UnpackedTarball/libmwaw/src/lib/BeagleWksText \
+	UnpackedTarball/libmwaw/src/lib/CanvasGraph \
+	UnpackedTarball/libmwaw/src/lib/CanvasParser \
+	UnpackedTarball/libmwaw/src/lib/CanvasStyleManager \
 	UnpackedTarball/libmwaw/src/lib/ClarisDrawGraph \
 	UnpackedTarball/libmwaw/src/lib/ClarisDrawParser \
 	UnpackedTarball/libmwaw/src/lib/ClarisDrawStyleManager \
@@ -63,6 +66,7 @@ $(eval $(call gb_Library_add_generated_exception_objects,mwaw,\
 	UnpackedTarball/libmwaw/src/lib/CricketDrawParser \
 	UnpackedTarball/libmwaw/src/lib/DocMkrParser \
 	UnpackedTarball/libmwaw/src/lib/DocMkrText \
+	UnpackedTarball/libmwaw/src/lib/DrawTableParser \
 	UnpackedTarball/libmwaw/src/lib/EDocParser \
 	UnpackedTarball/libmwaw/src/lib/FreeHandParser \
 	UnpackedTarball/libmwaw/src/lib/FullWrtGraph \
@@ -83,6 +87,8 @@ $(eval $(call gb_Library_add_generated_exception_objects,mwaw,\
 	UnpackedTarball/libmwaw/src/lib/HanMacWrdKGraph \
 	UnpackedTarball/libmwaw/src/lib/HanMacWrdKParser \
 	UnpackedTarball/libmwaw/src/lib/HanMacWrdKText \
+	UnpackedTarball/libmwaw/src/lib/JazzSSParser \
+	UnpackedTarball/libmwaw/src/lib/JazzWriterParser \
 	UnpackedTarball/libmwaw/src/lib/LightWayTxtGraph \
 	UnpackedTarball/libmwaw/src/lib/LightWayTxtParser \
 	UnpackedTarball/libmwaw/src/lib/LightWayTxtText \
diff --git a/solenv/flatpak-manifest.in b/solenv/flatpak-manifest.in
index df77597b7158..9ac394f22049 100644
--- a/solenv/flatpak-manifest.in
+++ b/solenv/flatpak-manifest.in
@@ -273,10 +273,10 @@
                     "dest-filename": "external/tarballs/libmspub-0.1.4.tar.xz"
                 },
                 {
-                    "url": "https://dev-www.libreoffice.org/src/libmwaw-0.3.16.tar.xz",
-                    "sha256": "0c639edba5297bde5575193bf5b5f2f469956beaff5c0206d91ce9df6bde1868",
+                    "url": "https://dev-www.libreoffice.org/src/libmwaw-0.3.17.tar.xz",
+                    "sha256": "8e1537eb1de1b4714f4bf0a20478f342c5d71a65bf99307a694b1e9e30bb911c",
                     "type": "file",
-                    "dest-filename": "external/tarballs/libmwaw-0.3.16.tar.xz"
+                    "dest-filename": "external/tarballs/libmwaw-0.3.17.tar.xz"
                 },
                 {
                     "url": "https://dev-www.libreoffice.org/src/libodfgen-0.1.6.tar.bz2",
diff --git a/writerperfect/qa/unit/WpftCalcFilterTest.cxx b/writerperfect/qa/unit/WpftCalcFilterTest.cxx
index d31075733e80..e566b4fec981 100644
--- a/writerperfect/qa/unit/WpftCalcFilterTest.cxx
+++ b/writerperfect/qa/unit/WpftCalcFilterTest.cxx
@@ -34,6 +34,7 @@ void WpftCalcFilterTest::test()
         { "Numbers_2.numbers", REQUIRE_ETONYEK_VERSION(0, 1, 2) },
     };
     const writerperfect::test::WpftOptionalMap_t aMWAWOptional{
+        { "JazzLotus.hqx", REQUIRE_MWAW_VERSION(0, 3, 17) },
         { "Multiplan_1.hqx", REQUIRE_MWAW_VERSION(0, 3, 14) },
     };
     const writerperfect::test::WpftOptionalMap_t aWpsOptional{
diff --git a/writerperfect/qa/unit/WpftDrawFilterTest.cxx b/writerperfect/qa/unit/WpftDrawFilterTest.cxx
index ddb5be888094..f616caa71a0a 100644
--- a/writerperfect/qa/unit/WpftDrawFilterTest.cxx
+++ b/writerperfect/qa/unit/WpftDrawFilterTest.cxx
@@ -31,11 +31,13 @@ WpftDrawFilterTest::WpftDrawFilterTest()
 void WpftDrawFilterTest::test()
 {
     const writerperfect::test::WpftOptionalMap_t aMWAWOptional{
+        { "Canvas_2.hqx", REQUIRE_MWAW_VERSION(0, 3, 17) },
         { "ClarisDraw.hqx", REQUIRE_MWAW_VERSION(0, 3, 5) },
         { "CorelPainter_3_win.rif", REQUIRE_MWAW_VERSION(0, 3, 15) },
         { "CorelPainter_10", REQUIRE_MWAW_VERSION(0, 3, 15) },
         { "CricketDraw_1.0.hqx", REQUIRE_MWAW_VERSION(0, 3, 8) },
         { "CricketDraw_1.1.hqx", REQUIRE_MWAW_VERSION(0, 3, 8) },
+        { "DrawingTable_1.hqx", REQUIRE_MWAW_VERSION(0, 3, 17) },
         { "FreeHand_1.0.hqx", REQUIRE_MWAW_VERSION(0, 3, 8) },
         { "FreeHand_2.0.hqx", REQUIRE_MWAW_VERSION(0, 3, 8) },
         { "MacDraft_1.0.hqx", REQUIRE_MWAW_VERSION(0, 3, 5) },
diff --git a/writerperfect/qa/unit/WpftWriterFilterTest.cxx b/writerperfect/qa/unit/WpftWriterFilterTest.cxx
index 6f88c694682b..5ae36a64fe8d 100644
--- a/writerperfect/qa/unit/WpftWriterFilterTest.cxx
+++ b/writerperfect/qa/unit/WpftWriterFilterTest.cxx
@@ -38,6 +38,7 @@ void WpftWriterFilterTest::test()
         { "Pages_5.pages", REQUIRE_ETONYEK_VERSION(0, 1, 8) },
     };
     const writerperfect::test::WpftOptionalMap_t aMWAWOptional{
+        { "JazzLotus.hqx", REQUIRE_MWAW_VERSION(0, 3, 17) },
         { "MaxWrite_1.hqx", REQUIRE_MWAW_VERSION(0, 3, 8) },
         { "MouseWrite_1.hqx", REQUIRE_MWAW_VERSION(0, 3, 8) },
         { "RagTime_2.1.hqx", REQUIRE_MWAW_VERSION(0, 3, 2) },
diff --git a/writerperfect/qa/unit/data/calc/libmwaw/pass/JazzLotus.hqx b/writerperfect/qa/unit/data/calc/libmwaw/pass/JazzLotus.hqx
new file mode 100644
index 000000000000..7c527f2c193d
--- /dev/null
+++ b/writerperfect/qa/unit/data/calc/libmwaw/pass/JazzLotus.hqx
@@ -0,0 +1,39 @@
+(This file must be converted with BinHex 4.0)
+:"A0SC at 9d!%TA5e0+39TD!*!%"fd!!!&%EiF!!!!#!!X!%3!FBf9XE&3!N"!%!!!
+!"!!%!"%!((0NBR0NFf4LFf4LFf9QCJ#3"JF!!!!(!!3!%3!H5c&6!"3!!!S!0!!
+d!%8!43!(!!(rr`!"rrm!!!$j!"%!(NXb8`!!i`"Y!23!!!!5!!)!"`!#rrm!![r
+r!!!"!J!4!"j,-e-!N!i(rj!%!!,rr`#3"4%!(&056NF!%J!#&!!!#J!d!2`!"`!
+!rrm!!2rr!!!!%3!F58-a!!!!!4J!!!!5!!)8!!!*rj!%!!,rr`!!!"%!(%P$-J#
+3"")!!K3!!!S!0!!*rj!%!!,rr`!!!"%!(&456NF!"J!*!!!"#3!+!!!!#3!#rrm
+!![rr!!!!%3!F3NP1!)!"Irprr`!!!")!!J!)!!6rr`!%rrm!!!!4!"a at 38`!!!)
+8!!!+!&`!9`"Y!!MrN!3!"2rr!!!!"J!'9N%!"J!5!"8"*[m!!3$rrh&3!!B!%J!
+'!")!"J!5!!!!#JJ!"`!!!"B*!*$j32rr!"B!#J%!N!B5!!B!!J!&rrm!%`!%!!,
+rr`!0!!KrJ!#3"3)!$3!)Ii!!!3!!!!-!%!!HIi!!!`#3$3`&!!%&!!)4"3!$%J-
+!$3!)Ii!!!!!"!!3!%!!LIi!!!3!"[rq!!*!)%!'rrlrr!!!"J!#rr`!!%J-!%!!
+RIi!!!`!"2rbCN!HD!"8&!!%&!!-6"3!%&!8!!J8!!a%%&!-!$`!-Ii!!!3!#"@&
+LBf4P!!i!%(q!!!)!!N!!Nc13"M)!%!!BIi!!!`!#`!+!!*!)"J8!#!33!`!3!#T
+rJ!!#!!1rrqc-N!E1!"J"J!#rr`!!!Erq[rd!!"3"[rqrr3!!%J-!%!!BIi!!!`!
+$3!'J!*!)"J8!"33I!`!3!"TrJ!!"!!3!N!X)!B$rJ!!!!!-!%!!HIi!!!`!%2rc
+VK4ki8HZ&(J!-!$rmki8HZ&(VK4i$!"!!'Rq!!!-!"8!!J!#3#!J&!!)&!!03!`!
+3!"TrJ!!"!!G!"B!!N!J)"3!#"3!'&3-!%!!DIi!!!J!(!*!,#!8!!38!!aB$!"!
+!'Rq!!!-!"crrJ!#3#!J&!!%&!!)A!`!3!"TrJ!!%!!Frri!!N!J)"3!""3!#'J-
+!%!!DIi!!"3!(!*!,#!8!!38!!KX$!"!!'Rq!!!%!#!#3#`J&!!%&!!)C!`!3!"T
+rJ!!#!!Jrri!!N!J)"3!""3!#'!-!%!!AIi!!!!!+!*!,"38!!4i$!"!!'Rq!!!%
+!#J#3#`J&!!!&!!%F!`!3!"TrJ!!#!!Srri!!N!J)"3!!"3!"(3-!%!!6Ii%!!!!
+,!Q&L!!J'!@%'!@)J!`!3!#"rJ!!"!!Y!!-QCN!F!$J+!!EriJ!+rq!!!J!%$!"!
+!*(q!!!!!$-!!J!#3#")&!!0#"3!#"3!$FK)&!!0$%J-!%!!KIi!!!!!0`!'*@Zr
+5P(9)l!!29J8!!`8!!Q!5"3!$4")$!"!!-Rq!!!%!$F!#dkJYbRp8+G8!)!8!!dm
+&!!0f%J8!!h85"3!$4K)&!!0d%J8!"%854a)$!"!!1(q!!!%!$Rrr3)-!N!FQ"3!
+$5!8!!NN5"3!$5K)&!!00%J8!!Ni5"3!"6")&!!)&!!0,%J-!%!!@Ii!!!!!22rq
+!!*!)"&98%J-!%!!EIi!!!3!23!#!!*!)#98&!!)&!!0F!`!3!$"rJ!!#!!qrri!
+!N!JH"3!$2`8!!e-5"3!$8K)&!!0P%J8!!h%5"3!$CK)$!!d!#(q!!!!!%3!"!!d
+!#!+!!!%!%3!"!!d!#!q!!!)!%3!"!!d!#"+!!!-!%3!"!!d!##+!!!3!%3!"!!d
+!#$+!!!8!%3!"!!d!#%+!!!B!%3!"!!d!#(#!!!!!%J!"!!d!#(+!!!%!%J!"!!d
+!#(@!!!)!%J!"!!d!#(q#!!-!%J!"!!d!#(q%!!3!%J!"!!d!#2q!!!8!%J!"!!d
+!#(q!!!B!%J!"!!%!!$VQ!!!"!!!!!4)!!!!5!!!!-J%Z!!!!'!$,!&`!k`"m!!!
+"!!!"!!!"%J%!!)B",J!!"A0SC at 9d!J!!!%TA5e0+39TD!*!+$RB!N!4+9dY65N&
+D at J#3'0YlTfX!!!FC!!!"4!##!5i!!!!B!&F!'3"h!$N!!!%!!!%!!!%5!3!!J`%
+Z!!!!'!"A!'B!G`#'!!!"!!!"!!!"%J%!!)3",J!!!"J!N3!C!,%!13!!!3!!!3!
+!!4)"!!#&!5i!!!!B!*%!CJ#a!)B!!!%!!!%!!!%5!3!!KJ%Z!!!!'!!H!!`!S!#
+J!*!&$Je+39TD)$!a,M!`-#`a!!!"!!!!!4)!!!!5!!!!-J!#&5!"HJ!!!"`!-J!
+!8e45)!!!!!S"!2rr!*!&!VMkV2!!:
diff --git a/writerperfect/qa/unit/data/draw/libmwaw/pass/Canvas_2.hqx b/writerperfect/qa/unit/data/draw/libmwaw/pass/Canvas_2.hqx
new file mode 100644
index 000000000000..9a534cd21c8b
--- /dev/null
+++ b/writerperfect/qa/unit/data/draw/libmwaw/pass/Canvas_2.hqx
@@ -0,0 +1,407 @@
+(This file must be converted with BinHex 4.0)
+:"@CTE'8a!'4bGc*%383b!3!!!%p"!!!"VKBU!!!ChJ!!4E`!!!'N!!!!#J!!!()
+!!!!k!!!!-J!!!#)!!!!@!!!!3J!!!"S!!!##!!!!2!"N!!%!!%@m!%X!!%!#PJ#
+3$J%"!!%!N!3J!%!!B!#!!-!"3!'!!F!#3!+!!*!62J!!!!%!!3!3!!!!!3!$2rb
+!!*!)"`!$!!F!#`!1!!$rq!!!!(J!N!i@&3#3"Xc-rj!%!!!!![rr!%N!!2rr!!!
+!&!!%!!3!6!"-!!%!#!"+!%S!)J!#!!%!(3!#rrm!'J!Q!!i!!2rr#!!!!2rr!!)
+!"!!!!!S!N!6m'2`B!*$r!*$r!*$$!3#3")!!!!#!!!!!J!!!!)!!N!B"!!!!!`#
+3'9SC6!!L!!%!N!i)6'&jCA)J)c%!!LJY!%0[F(NJE`!$!!!!$!#3"[rq!*!r#2r
+1!"MrjJ#3#4S!S!"[!1-#e!%h!`!"5!!"!"!!!!!$!!%!!!",!!!!!3!!!!%!!!%
+L!%IbcJ"(llS!4qq+!3!!4r,1!*!(!3!"!"3!$!!$!!)!!!"D!!%!!!!#!!!!!`!
+-!*!&!J!8!!`!!`!#!!!!@J!"!!!!!J!!!!-!$!#3"3-!&!!-!!-!!J!!!&S!!3!
+!!!)!!!!$!!`!N!3"!!"D!!`!!`!#!!!!@J!"!!!!!J!!!!-!$!#3"!%"!"3!$!!
+$!!)!!!"D!!%!!!!#!!!!!`!-!*!%!3)!&!!-!!-!!J!!!&S!!3!!!!)!!!!$!!`
+!N!N"!"!!!!!$!!%!!!")!!!!!3!!!!%!!!%L!%IbcJ"(llS!4qq+!3!!4r,1!!)
+!#J#3"@3!!!!"!!!!!3!!!!%!!!0`G#lbcJ"(liS!-HN8rrm!4r,1!!-!#J#3"3)
+!!!!F@,%!!3!!!!%!!!0ME5lbcJ"(liS!-HN8rrm!4r,1!!3!$!#3"3)!!!!-!!!
+!!3!!!!%!!!4`D at 0KcJ"(liS!-HN8rrm!4r,1!!%!#J!!!!-!!3!!!%J!!!!"!!!
+!!3!!!fPZ,[,1!%I[LJ!ak46rr`"(mXi!!J!+!*!&C!!!!!%!!!"N!!!!!3!!!R"
+d-I,1!%I[LJ!aCK$rr`"(mXi$-5mi3)"L!!!!*Z4!J'5D!!)3q!%L!%IbcJ"(llS
+!4qq+!3!!4r,1!*!Ae!!!!)S!!!"!!!!!6!#32eS!N2m!!!%!!!!"!!%!#J!!!!S
+!!#F3!!%!!J!"!!!!!3#3"@3!!!"N!!!!C!!!!!%!!!!"!!!!!J!!!!%!!!!"!!!
+!!3!!!$)!#J!"!*!&!`!8!!%!!3!"!!%!N"m"!!%!!e%)!$J!%J!"!!!#r3!"!3(
+m!!&&a2i!#LB!!!8e!!%!!J!Kq3!"raAm!!CFc-`!!Irrj!!(53%*!,J"l'2p!!)
+)!3(p!!&&X[i!!!Vm!!!"r`!i!3!#q3!"raAl!!(-c2hrj3!)U&"J'UK3B"CMr3!
+##!%"q!!!#[`!"!%!!3!"q3!"r`,l!2[rp`!rlJ!15J!i!&B!aJ-#!`!!#!%8r!!
+!#[i!!Li!![i!"!%!$!!"q3!"r`,l!2[rj!!1EJ!i!(!!D`-%!J!!#!%83[`!!$M
+q!!!Zr!!%!3!-!!,j!!(r![X!qrrN!!HM!$B!X`"S![d!!3%"q`!!C[i!#Q3!'J!
+"!!%!$3!#q3!"r`,p!$)"!!$lrq3!"pS!1J$U!'`#r3!"!3(l!!$+rJ!+C!!D!!%
+!!3!0!!,j!!(r![X!qrrR!$lq!!lm!$N")!#""33#!!!)!46f!!JC!"N!!3!0!!,
+j!!(r![X!qrrP!!m"A3![!AF!LJB%!J!!#!%8mJ!!!6cq!!!#q3!"r`,l!2[rj3!
+)!6J!3J&)!(3#r3!"!3(m!!%",[i!#Q3!'J!"!!%!$3!#q3!"r`,l!2[rq3!cl!!
+1cJ$I!3X"K`3%!J!!#!%8mJ!!!Ii!!!(j!!(r![X!qrrP!!J"PJ"$!DB!G3,p!!!
+"5!!"r!!"!C,q!!CN!"S!!3!"rJ!!!rN!!Im#q`$lrq3!$NS!1!"`!-CM"!-!!!J
+"!Id!!3(frJ!!$[`!"!%!$3!"q3!"r`,r!$,p!2[rj!!15J!f!8J!aQ-%!`!!#!%
+"r3!"!J6q!!!8r!!!!Ii!!!(j!!(r![X!qrrT!&Am!!G*!3N!Z!(X"2d!!3N"r!!
+&!q`!!!d#r!!!!Ii!!!6q!!!5rJ!#%`%#q`$lr`%"$[)!"6H!!!"aJ2`!$`%B!2`
+"93%B"KXE!!!)!46h!!(rT[m!@!%!!Ii!!!Aj!!(r![X!!Fc-rIrp!!D!!)!!J!#
+!m!!9!6!"4!&L!FS*"!4-6!J"S`!"!!!4([i!!&Mm!!!"rJ!!"[S!!K%"![eQ"c-
+cQCNc-rrrr3!""Q42"3!N"Q3!*2%!$`%`!83"BJ(+1!3%6%`)!46p!!%4G[i!!+l
+m!!!"rJ!!#2N!!Im3q`!"c-cprrd!"`CN!#3'C!!Nm!!(5J%+!,F"k`,q!%i#!!%
+"r!!,!N!!!!'X!"S!!3!"rJ!!"2N!#`%#!%S!!!%+!!$rrq)!"dN"#3#i!H`*r3!
+"#3(m!!%3l[i!!M!!'[i!!!(q!!!%q3!"!3*"$3"+!!!"#J!!rrm!!!%1j`!2!8B
+!S!&e!1!*"!)!!!J"([d!!3)BrJ!!+2`!!!(q!!!(q3!"r`,l!!(-c2hrk`"EqJ!
+($`!X!$d!A`Ap!!)*!46p!!X5*!!!!A!!%!!3!!(q!!!)q3!"r`IpCJFc-mc-!!$
+-c2d!"rQ0"S,jM3D#m!!('!%3!%3"3!6p!!)*!46p!!86P!!!"#$r!&3$!!$rr[i
+!!!Rj!![r![rr!!!c-fCQ-c2l!!IjGIrpqAArrI!!"aS!S!"[!1-#r3!"!3(m!!%
+e6[i!"YB!'J!"!!(q!!!4q3!"raAl!!(-c2hrr3"#k!!163#3!!$q!9J%!!!"!3N
+"&2d!"5+5!!!4q[`!!!(q!!!-q3!"!3,l!2[rr3!'J!#!!)!!J1m!#"3"H3!r!D8
+%!&6q!!)*!46p!!8AY!!!#4,p!!(rrIi!!!Vj!!%"![X!!Fc-rIrp!!IrqJC$rrS
+'3r!!"iF!3J#H!'S%r3!##3%8r3!&)-B!!!(-r3!"rrlq!!!,q3"1!3%#q`!"c-c
+prrd!"rQV!"MjU`!Bm!!0Q`$r!*`"!!-"!8a-#!6m!!%dM2i!!Li!!ri!!!(q!!!
+0q3!"!3,l!2[rr3!'J!#!!)!!J2J!5rJ!$CX!r`#F!3!$!3&-6!J%r!!"0,Vq!!)
+Z!!2q!!!"rJ!!$[N!!3%#q`$lrrd!"S!!J!#!!)$[!!l#!Cm!l`(B"!%"6%`)!3(
+h!%Rm!!!"rJ!!$rN!!3%#q`$lrrd!"S!!J!#!!)$`!!J")`'r!6-"m3,p!!!"q`!
+"01Mq!!*Q!"Vq!!!"rJ!!%2N!!3%#q`$lrrm!1HB!$KB"EJ!B!H!$"!4-6!J"&2d
+!!6BNrJ!#,J!#rJ!!!Ii!!",j!!(r![X!qrrP!!F"JJ&E!B`"ZPB(!`%"!!!)!46
+p!!%fh2i!"Li!!J!"!!(q!!!@q3!"r`,l!2[rr3!'3!#!!)!!J1m!$K3"D3!l!J)
+$"!4-6!J"&2d!!6C5rJ!',J!#!!%!!Ii!!"2l!%d$!!$r![X!qrrp!!E!!-!!`!"
+!l`!1C`("!*d#,!-%"%a-#!%8r3!"0Ulq!!!ZrJ!#!`!"rJ!!&IN!!Im#q`$lrrd
+!"S!!3!#!!-$k!%rf!!ij!DS!5J)X!`3%6%`)!46p!!%fJ2i!"#i!!J!(r!!!&2N
+!!Im#q`$lrrX!!-$q!!"!m!!9!Md!0`*k!(`*"!4-6!J"&!!"!!!i([m!BJ%!-2`
+!"!%!,3!GrJ!!2ri!!Lcr&IX!!Fc-rIm,!!d!!+'HSrdGPi8Nr!!'(Mhm!#'+1rd
+!$`'9!@)"R`("!`%"!!!)!46p!!%h#[i!!#lq!!)"!!(q!!!Aq3!"r`,l!2[r62d
+!"S!!J!#!!)$`!!m"T3&U!Dm"b3-"!3!!#!%8r3!"0cMq!!!ZrJ!#!3!"rJ!!'2N
+!!Im#q`$lrrd!"S!!J!#!!)$`!!8"V3&a!FGC#3(4!`%"!!!)!46p!!%hC[i!!#l
+q!!)"!!(q!!!Cq3!"r`,l!2[rr3!'3!#!!-!!J2!!$`&b!Fm"M!)[!`%"!!!)!46
+p!!%hP2i!!#lq!!)"!!(q!!!Dr3"1r3!"r`,l!2[rr3!'3!#!!-!!J2!!$`'%!GJ
+"RJ)i!`%"!!!)!46p!!%h`[i!!#lq!!)"!!(q!!!Eq3!"r`,l!2[rr3!'3!#!!-!
+!J2`!8I8!$`'I!H-"U3*#!`%"!!!)!46p!!%hm2i!!#lq!!)"!!(q!!!Fq3!"r`,
+l!2[rr3!'J!#!!)!!J2!!$`)Y!*`#A3$,!`3%6%`)!46p!!%iQ',q!!)Z!!,q!!3
+"!#d!([i!!%(p!!(r![X!qrm,!!d!!!hcdh'd&4&'r!!''&-4!"FHk[d!$`)p!$F
+#HJ"m1!3%6%`)!46p!!%i6[i!!%Vm!!!"rJ!!([N!!Im9q`!"c-crre%"rrrp!!H
+KRU2p(CH&*2%!%!)Y!$F#l!%BB`3%6%`)!3%JrJ!"1 at Eq!!!Br!!!!Ii!!"hj!!(
+r&IX!!Fc-rIrp!!F0mk2p9YldI[%!!`*X!(jY#`+5!,F*"!4-6!J"&2d!!6SQrJ!
+!-2`!"!%!,3!HrJ!!3[d!!3%#q`!"c-cpr`X!$3!!C'rr3'A6[1cm!!B6!,)!(&l
+ at r3!2!PS!aJ+#!2m+"!4-6!J"&2d!!6T at rJ!+Q!!C!"N!!3!Y!"lr!'d"!%2p!!%
+"![X!!Fc-rIm,!!d!!!1TT)LA64Q-r!!'&&`5!"`kJ[d!&3+T!)N#`!#c#33%6%`
+)!43!!3!!1alq!!T`!,3!!3!"!#d!([i!!%6q!!*&!3,l!!(-c2hr#`!0!!#0cT)
+ZMHai#rm!E2i!"J`Nl!!@SYEp!"8#c3"+!Z`!UJN%"%a-#!%8!!%!!$M'rJ!!D2`
+!"!%!,3!HrJ!!4[i!!M,r&IX!!Fc-rIm,!!d!!(FEX#K at hXI+r!!'%!PP!#jih[d
+!$`,0!%S#l!#U1!3%6%`)!46p!&J"2DEq!!$1r!!!!Ii!!#2j!!(r&IX!!Fc-rIr
+p!!Gh'l!S9Yl(b[%!$`+5!0!#a3%B#33%6%`)!46p!!%j,[i!!$Mm!!3"!#d!([i
+!!%Mp!!(r&IX!!Fc-AIhr#`!0!!"2fKREJ6rdI[`!"KTL3!!PaYIp!!J#$3%X!N-
+"N36p!!%*!I`!"6mD!!!#p2`!!!(q!!!HrJ!!22i!!Md"![X!!Fc-rIm"!"Eb!!!
+ErJ!"-S$m!!%#IPm'!9N#MJ('"2d!!3N"r!!"3UMq!!$Jr!!!!Ii!!"rq!!!krJ!
+#13%#q`!"c-cprri!!!2d!!!)rJ!!+IX!#!+V!9d#Z`'l![d!!3%"r!!"3lMq!!C
+X!"S!!3!"rJ!!)%Rj!![r&3+V!!!"A3!!rrrM!!J#U!&D!Vi"d3Rp!!%*!I`!!83
+NrJ!!-2`!!!(q!!!Jq3!"!3,l!!(-c2hrrJ!)!GpFPrSPa-F!@[`!!!Vq!!!aq`!
+)!UX"A3+m!Fd%r3!"#3(m!!&%92i!!1lm!!!"rJ!!)2i!!$Eq!!)h!3,l!!(-c2h
+rrJ!!!I3!"!L!!!![q`!)!R`"8`+3!!(,#Id!!3N"rJ"J!`!!3iMq!!!`r!!!!Ii
+!!"rj!!%"![X!!Fc-rIrq!!J$!!#JD3!!B(,m!!!+rJ!!+rX!#!*q!9N#MJ'V![d
+!!3%"r!!"3Mlq!!CU!"S!!3!"rJ!!(rN!"rm9!Ri!!!&C*J-!!2rrf`!!C2d!!3%
+"m`!#!3!"rJ!!)IN!!Im9q`!"c-cprq8!9`J#)!%X!M!"N3,p!!%"!I`!!6kXrJ!
+'EJ!D!!%!!Ii!!"lj!![r&3)J!!!",!!!rrrq!!!@j`!)!J`"+`*$!C%*r3!"#3(
+m!!&#$[i!!M!!'[i!!!(r!%S"!"lj!!X""!)J!!!",!!!rrrq!!S@!!"Fp@$US`Z
+I&[`!!LD9S2%!!'6p!!))!3(f!!!lrJ!!!Ii!!!,j!!(r&IX!!Fc-rIrh!%M[!"8
+#+`""!Qd!LJN%"%a-#!%8!!%!!$PqrJ!!-2`!!!(q!!!GqJ!%32m9!L[q!!4"!!$
+rrq-!$`)V!%%#E3#+1!3%6%`)!44-r3!"1Dlq!!"+r!!!!Ii!!"lj!!(r&IX!!Fc
+-rIrP!!m#1!#R!Pd!h`-%"%a-#!%8r3!"1IMq!!)Z!!,q!!!"rJ!!([N!!rm#!MM
+r!$-&!+F!!2rri`!(!R!!K!+,!,Mq"!4-6!J"&2)!!!(q!!!Hq3!$ra8#F2i!")3
+!!2rrj3"3%3!!!Q`!c!+1!3-&"!4-6!J"&2B!""N!'3!"rJ!!([N!!rm9!Qcq!!6
+-!!$rrq-!$`+X!)%#Z`#X"`3%6%`)!46p!!%kl[i!"M!!Y2qQ!!&+rJ!!([N!!rm
+9!Ucq!!5"!!$rrq-!$`+T!)N#`!#c1!3%6%`)!46p!!%lM[i!!0lm!!!"rJ!!([N
+!!Im9q`!"c-cprrd!!ih1NLj,!ihXH![a!"8#ZJ!k!ZN!P3N%"%a-#!%8!!%!!$a
+XrJ!!D2`!!!(q!!!HqJ!%4rm9!VVq!!3k!!$rrq-!$3+k!$S#k3#91!3%6%`)5`%
+"&2d!!6c8rJ!!d[`!!!(q!!!Mq3!"raAl!!(-c2hrj3!2!U8!b!,A!4!*"!4-6!J
+"&2d!!6jdrJ!!12`!!!(q!!!Hq3!$ra8#T6Vq!!6)!!$rrq-!#!,8!6F#j!'b![d
+!!3%"r!!"48,q!!C`!"S!!3!"rJ!!)IN!!Im9q`!"c-cprqN!9I`!!J%!!I-!%`K
+-BAPPFL!M-`!#+#d!3fp`H5"[rJ!%&J!"!!(c!"-)6'&jCA)J)c3!!LJY!%0[F(N
+JEri!""B!!3!"m`!0#%aKH at 9b)#-e!!)S,3"J"80[F(NJEri!""B!!3!"m`!6#%a
+KH at 9b)#-f!!)S,3"$Eh"j)'rq!!`@!!%!!3!!&'`!@KLXq`!6#%aKH at 9b)#-h!!)
+S,3"$Eh"j)'rq!!3@!!%!!I-!"`K-BAPPFL!M&`Xi!!)S,3"$Eh"j)'rq!!3@!!%
+!!Im!C"%!!!9&"H8'+3G,!&B!1!"+!-Ei!!J"!"3!$!!$!!,q!!*D!!(q!!!#rJ!
+#!`!-r!!'EJ!i!(!!DrJ!#!%!&!!-!!-!![i!!PS!!Ii!!!,q!!)$!!cm!!!$rJ!
+!$2X!!Irqr3"MrJ!!#2S!!"cq!!!)rJ!F%Q&LBf4PCQF0!!%!!3"F[`3!A,jJ!&S
+BV!"F[[6m!!S*rrm!!3!3!!`!!ri!!!ck!!J3!!`!%!!-!!2q!!!-q`!"rrlk!!!
+)qJ!!(2i!!!Mq!!!5D"YKBQ0NC at CR$3!"!!%!A,m%!&bqB!"D'+`!A,ldr!!+#Ir
+r!!%!%!!-!!2q!!!-qJ!)%!!-!"!!$!!$rJ!!$2X!!IrqqJ!!#2S!!"cq!!!)rJ!
+8%Q&LBf4PCQF0!!%!!3"F[`3!A,jJCJF!@KLX!&bqp2`!#JRrr`!"!"!!$!!$rJ!
+!$2S!#"!!$!!3!!`!!ri!!!cl!!(rr[S!!!Mk!!!FrJ!!#2i!("*KBQ0NC at CR$3!
+"!!%!A,m%!&bqB!"D'+`!A,ldr!!'#Irr!!%!%'i$!!`!!ri!!!ck!")3!!`!%!!
+-!!)!!`!%!5S!A!!`rJ!+"3!-!!8!"J!(!!Rq!!!BrJ!!&2S!!J3"D[i!"+!!!!&
+'rJ!%Z`!!!@lq!!6J!!!"GIi!!,Mq!!!$rJ!!$2X!!IrqrJ!!!Ii!!&6r!(N"!&V
+q!!"-rJ!!)2i!D-C9EL"`CA4TG#"dCAKdC5""FQPKE%*[EfYYB at i0-6"`G$-`F(4
+LEfaNDA4KE'PM$A9ZC(*XD at jP$@j[FQeKE!eMC at jdCA)0Eh9dE'PZC3ecD'&NEhF
+!$3!,!&br"!"F[Q!!@KLX!&bqp2m!F2i!"!8!!3!)rJ!b$`!#!"3!!`!F!!3!)!!
+&!#3!"J!S!!F!,`!)!$J!"!"'!!N!6J!+!&Arr`!#!"!!$!!$rJ!!$2S!"J%!%!!
+-!!2q!!i-rrm!!$-c!!%!$J!,"p(q!!!-qJ!'!3!0!!S!$[i!!!aFqJ!'!J!,!!J
+!$[i!!!Vk!!B"!#%!'!!1rJ!!([S!#J%!)3!B!!i"!!!HqJ!+!3!K!"J!$J)!!"l
+k!!S"!!X!#!!1"J!!#[S!#J%!$3!*!!i)!!!+qJ!%!3!1!!NV"3!1%!!!#[S!(K!
+!$!!K!"J!#`!)!!X!#!!,!!J!$3!*!!i!#3!1!!Qe!$I5!!%#%2i!#B)3"!!!3!!
+3"!,b!!%#%2i!$)!3"!!!3!!S!!,q!!2e!!`#%X"iFFBi$Ka%iF!SB348FN%!!I8
+!&3)6)%5)JK!%)N4#)#KNLN%mH6Yh20cj!"8#%L"%L))3"#)S3L"%4!Tq3S8KQ84
+Nq3!9!K)J42L#%!3q%%2JI%4k38+&34%F42N!$!)5)%5!JK!%)#K#!%4'#%5+38+
+&S4&N42N!&3)5)%5)JK!%)N4#))*%QN&#K4%44%6j!"8"iL"iF')-!aa%-F##4'V
+q2(ZlZrlZpJ!!313!!%$i!!+*!$M)!!$JrJ!$!i!!F2`!!-$k!!-$m!"qrJ!#"!I
+JrJ!*(i!$m!!'!!!(`2S!#3ii!-1!!!!-"q$r!'d,!"q!!r!i"!!!!m$Jq`!*'!`
+$JF!!!!`$i2i!#Jq!!I"i"!!!!i(Jq`!*1!i$!-!!!!`$i2i!#Jq!!I"i$!!!!i(
+Jq`!*1!i(!1!!!!`$i2i!#Jq!!I"`(!!!!i(!q`!,1!i(!1!!!$`$li!2DJVJ$i$
+pm!!i!!!$J2S!&cJF$J"`im$r`rrJ2rJ2JIr`-2q$j`1!`2S!&MJ1!(IXF"`$rq"
+rr!q$rr(`1!FI!iI!q`!A!q!1!((`1"`$mI$mIJq(ir$`1"`2"`2!qJ!+2!i!F1!
+i(!2Kq2KY#ci2Mm(`i(JF$JF$J2S!&Ji1!($J("`$i2R`(`q2JI$JF$J1"`1!qJ!
+@"`i!F1!F(!2JqI!I$iq"m1"`1!i(!i$k!"B($J"`i"`F!q$jm"m2Mi(`i("`$JF
+$J2i!$KK`!M!($J"`i"`F!q$jm(B,(`q2JI$JF(!H$`1!rJ!C#)J#F!F'!'$J("`
+$i2R`(`q2JI(!i(!F$JIp!"N)LXG`"`F!i1!F(!2Kq2Jq$ir"mF$JF"`1"rd!'3L
+,)R!'!`$!i$JF!r(`r(i2Kq2a`1"`2!i(r3!1#)SL-!i$JF$`1"`$rq"r@`[m$i2
+rmFMK-(a1*b$q!"S)LL)F'!($!2K`(L2ri$ri(m(rqG$L1*k14d$q!"SFFm1(i!"
+q!1I!$m2IJ!rJ(m$pq1"m$`m(Ji$p!!!#q`!!i1X!!!,l!!$Jq`!6kJ!!i13!!1$
+N!!$Jj3!"!I$l!!IV!!%(r+%!!SN!!SN!$mF!!(cP!!%"MZ8!!J-(!"6Q!!%("q8
+!!3i(j3!!$Z3!!"cr!",Q!!!Fj!!!(13!!"cN!!)F!J!4jJ!"$J6P!!%('18!!32
+JiJ!#L3!#L3!6b!!#!`C!jJ!"!3,R!!3$,jpkrL8!(1N!"3%NSL45*1N!"3)T)L5
+NH1N!"3***N5N31N!"!2TQdEQ$!!ib`!!!rhr!2c'!"IM!!!Jj!!!)1J!"#acPXm
+Jk!!$0)SE84`!)1J!"#5+%NmJk!!%*)S585$S!!3NFK*I)13!"BX!!33!&H8!!!6
+Q!!31BXjMJ1J!!a+64*,M!'6X!!B&!%N!!!%*rJ!%53!!!Hcq!!5i!!!"l2i!",J
+!!!%*rJ!%53!!!3Rq!!!+r!!b#J&J"Q3"9!!N!@!'C!&8!#3"23CN!83!*!%`"Q3
+"9`!N!6S'C!&X!#3"@JCN!AS!*!&LHAF'C!'R!#3"@`CN!FS!*!&%"Q3"[!!N!6!
+'C!'N!#3!VJ%Z!8B"AJ($!9i"8J&G!9)"@`&4!9J"6`&6!8d"6!&+!8B"4`&!!8B
+"1`&(!6F"5!%d!8X"-J&2!6%"8`%a!9F"-3&E!6-"A`%e!@-"13&R!6d"D`&#!@j
+i at J&)!A%"6J&d!9-"H3&A!Am"@J''!9`"MJ&G!CF"AJ'J!9i"U!&G!Dm"A!'f!9X
+"[!&B!F!"93($!9)"``&0!F%"5!'p!8-"Z3%p!E)"0J'V!5i"SJ!%!%%!pi$p!!)
+*KM(q!")#!!"hq'!!!"!"*!-*J!!!&!BqH3QpmL!!!S!-%l1FrJ"SJX'BMRB!!"#
+f8k+Fr%!!!#k`EmI[!!!#@#3kBT`!!!E"i,Tm3b!!'6EmbBr"J!"&@rici9S!!#C
+crf(&CJ!!"+2reaCR)!#MVrrNbXV!!+X[rqL+)J!!0-Irm"L%`!!(#rri!HZ!!#Y
+crrpc"IqNB!"(6rlr"23!!,Ylr[m%r8!!bQ2qr`6m!!!H)Ilr"2i!!,ThrIm$J!"
+0jrhr!m!!hA$pr`6!!%pSIrlr!q!!U[Epr`2J!+S9rIm%i!"Q6Vrqr`2J!'bbrIm
+%i!"H4)rqr`6J!(iJ"rlr"H!!Cj'Mrf8kE!rJ!!lQ#rj3Rq!!-PJ0ri%2i!!++5h
+ri$rJ!#JB#(rq(q!!L@"X2rrri!"!0!!2rrrJ!!`2!!rrrq$q!!3%)rrri2d!%`(
+rrq!!!)!!!2rri!!#!)!!2rrJq!!!`2B!!-$k!$Mm!!$!pJ!!`2F!!$$f!!!`q!!
+#-!$!q!!#-!$!q3!%$!!!!`2k!!3-!!!$!rJ!!32!p`!"!m$k!&X&!!2!!!``qJ!
+%!m!!$$$j!!%``2F!!6$!q`!'-!!`!!!-$2`!"M!!-!!!$!cl!!3m!!!`$2S!"$`
+!!$!-r!!)`!`!$!$`!`!$rJ!)`!`!$!$`!`!$rJ!!!rm!E2i!![!!$2i!!!2m!!,
+`!!cq!!F2!!$!m!!!`rd!"`m!!-$`!!$$rJ!!$2l!"-`!`$$!rJ!!$2l!"-`!`$$
+!r3!'!`!m$!!`-2`!"J-!2!`!-$$l!!Bc!c-`-!!`r!!'-`-c-$!!-2d!!J-`!%i
+"$!2k!!3$-!!-!rS!"M!$2!`!!-$m!!B`!c`-!!$!qJ!#$--$q!!#$--$qJ!$$-2
+!`2N!!`c$`-$k!!-2!-$!q3!$$`$!`2N!!`-!-!0 at q3!$!`!`!rB!!X2-`2J!!X2
+-`2X!!J--22X!"3-!!!--22X!!!2q!!-$$!!-r!!'!`!!!``!$2`!!`-!!-$q!!!
+`r3!$`!!!`2i!!$$p!!A!!-!!!!0F!3$!rJ!)-!!!`!!!!`$!rJ!%-!!!`!cm!!%
+2`2i-!F!-r!!"$m$q$2N!!m--!$$j!!2$$!!`qJ!%!`-!--$k!!3$!`!``2`!"J-
+!2!`c!!2m!!B$!$`--`!$r3"GrJ!$!c-c-2N!!`-c-c$m!!F`!`!!``!!`2d!"c!
+$!!$$!!$!q!!#$!m-q!!#$!m-r!!'!`!---$!-2`!"J-!$$$!`$$p!!B-$!!!-`-
+-r!!,$!`!!$-$$!!!`!!!0`!$rJ!)c-!!-!$!!!!$rJ!$c-!!-2X!!X!$!rl!q`!
+#`!-$rX$h!!$!pJ!!`2S!!!2f!!!$i!!TrJ!!$2B!!!cj!!$!pJ!!`2-!!-$f!!$
+!p`!"!i$a!!%$J2%!!31!q3!Lp`!!12!!!$M`!!!im3!!F2!!!($`!!"`q!!!A2X
+!!1$q!$Ml!!%)q2X!!1$i!!%2rrX!!1$h!!!-qJ!#!F!FmJ!#!F!FmJ!#!F!Fq`!
+""R6l!!!Fq!!"#PAp!$m#!!!Fp`!!!IX!!"ch!!")qJ!"$JIa!!%1"rS!!3h`qJ!
+"$JIj!!!"q`!%!i!!!i$m!!%2rrX!"!1!!!1!r!"0q3!%!i!!!i$h!!3$J$J!$[J
+!!!,q!!3$J$J!$[N!!3rrrJ!%!i!i!!li!!!#rJ!"(($q!!!(p3!"(($q!!!(q3!
+!!Ii!!4a`rJ!""`"#q`!"$GMm!!3((!!((23!"!FF!!FFqJ!!%2`!"!FF!!FFqJ!
+!![i!!Z!!"rB!!,Aq!!,J!!Ih!!%")ri!!Z!!"r%!43-1!!1!q!!!A2d!!`i!!i$
+c!!-1!!1!q!!!#[X!!q!!!1$l!!%0p2X!!q!!!1$k!!!#q`!$i!!!i2X!"J*k!!!
+r!($f!"Vp!!)r!($b!!)r!($[!!!rm!!!2r!!!$rC!$6l!!!2l3!!F2i!!$Md!!"
+`rJ!!123!!($q!!!ipJ!'r`!"`!1!123!"!(!!i!ip!!#!F!$-3'!12-!!MJF$[B
+!!!rq!!)i(!lb!!)i(!lf!!B2r`!!2`!1mJ!#2`!1mJ!#2`!1pJ!rrJ!'$Mm!!$m
+$J2B!"Jir!!!r!i$f!!B12`!!2`1!pJ!%F!$MMJId!!4`!111"r3!"(!!iii(p3!
+$ii(((2X!A!-!!!2`r3!$ii(((2N!!32`r3!$ii(((2N!!32`r!!(IMJ!!$J!F!I
+m!!!rr3!(IMJ!!$J!F!Im!!!rr3!(IMJ!!$J!F!Im!!!rr!!$"`1"ar`!!MJ!$[X
+!!3F$A`'"ar`!!MJ!$[X!!`F$JFIm!!)i!!lm!!!1r!!&!F!!!$Mmq`!!$[`!"3(
+!!!!ir2X!!!lm!!8"`!!!12cl!!31!1!"`2d!"3i!ii!i(2i!"!i!i!(!r3!&$J$
+MJ$JFB[i!"!i!i!(!r3!&$J$MJ$JFq`!"!F$p!!0q!"q1q3!"!F$p!!0q!"q1q3!
+"!F$p!!0q!"q1r!!"!F$p!!K`!!2`2`!2`1$q!!%"`2d!#(!!!r!r!!r!i2i!!3(
+!r3!#F!!$9!A`2`!2`1$m!!!Fq!!$F$m!F2d!!"ci!!0`2`"`r3!!(2J!!h!r!($
+l!!!(r3!'FF$rrm!$J2X!!!Ip!!Ca`2rr`!1!q`!!"rd!"R(!rrr!!i$m!%hm!!B
+IrMmF!!ImpJ!'(rir(!!(r2B!"Krq2a`!"rci!!"`r3!%iirr(i$j!!"`r3!%iir
+r(i$j!!"`r3!%iirr(i$i!!Fi!!!(i!!!i%Eh!!Fi!!!(i!!!i2F!"cJ!!!IJ!!$
+JpJ!&(!ri!!rip3!&(!ri!!rip3!)(!ri!!ri!!rrqJ!)F!$mIJ!!!F!Fq!!#F!$
+m1`9q!!!"`"ci!!K`!2aq!!!"`"cc!!AMm$m!!2re!!,Mm$rb!!,Mm$rd!!-2`!!
+1m`!'$m!!$J!!$r`!3IX!!`r!!!ld!!3$J!$MM[3!"!1!!111p!!%!i!!iilj!!%

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list