drawinglayer/source/geometry/viewinformation2d.cxx           |   20 +
 drawinglayer/source/processor2d/baseprocessor2d.cxx          |    8 
 drawinglayer/source/processor2d/cairopixelprocessor2d.cxx    |  132 +++++------
 drawinglayer/source/processor2d/contourextractor2d.cxx       |    4 
 drawinglayer/source/processor2d/d2dpixelprocessor2d.cxx      |    6 
 drawinglayer/source/processor2d/hittestprocessor2d.cxx       |    4 
 drawinglayer/source/processor2d/linegeometryextractor2d.cxx  |    4 
 drawinglayer/source/processor2d/textaspolygonextractor2d.cxx |    4 
 drawinglayer/source/processor2d/textextractor2d.cxx          |    4 
 drawinglayer/source/processor2d/vclprocessor2d.cxx           |   20 -
 drawinglayer/source/processor2d/vclprocessor2d.hxx           |    5 
 drawinglayer/source/processor3d/baseprocessor3d.cxx          |   11 
 drawinglayer/source/processor3d/cutfindprocessor3d.cxx       |    4 
 drawinglayer/source/processor3d/defaultprocessor3d.cxx       |    4 
 drawinglayer/source/processor3d/geometry2dextractor.cxx      |    4 
 drawinglayer/source/processor3d/shadow3dextractor.cxx        |    4 
 drawinglayer/source/processor3d/zbufferprocessor3d.cxx       |    2 
 include/drawinglayer/geometry/viewinformation2d.hxx          |    5 
 include/drawinglayer/processor2d/baseprocessor2d.hxx         |   13 -
 include/drawinglayer/processor2d/cairopixelprocessor2d.hxx   |   13 -
 include/drawinglayer/processor3d/baseprocessor3d.hxx         |   11 
 include/svx/sdr/contact/objectcontact.hxx                    |    2 
 include/svx/sdr/overlay/overlaymanager.hxx                   |    7 
 svx/source/engine3d/helperminimaldepth3d.cxx                 |    4 
 svx/source/sdr/contact/objectcontactofobjlistpainter.cxx     |    2 
 svx/source/sdr/contact/objectcontactofpageview.cxx           |   11 
 svx/source/sdr/contact/viewobjectcontactofpageobj.cxx        |    2 
 svx/source/sdr/overlay/overlaymanager.cxx                    |   73 +++---
 28 files changed, 212 insertions(+), 171 deletions(-)

New commits:
commit a841f2fd0d1e76fb51663381215cccadb9753300
Author:     Armin Le Grand (collabora) <armin.legr...@collabora.com>
AuthorDate: Thu Jul 31 18:29:57 2025 +0200
Commit:     Armin Le Grand <armin.le.gr...@me.com>
CommitDate: Fri Aug 1 16:13:53 2025 +0200

    Added DrawModeFlags to ViewInformation2D
    
    This allows setting/using DrawModeFlags system-independent
    (or: renderer-independent). Changing and applying to a
    PrmitiveRenderer will apply that (if needed) to the target
    renderer.
    
    Change-Id: Id95d018f95d1b2ff065da5e4d05ba385b22cdbb0
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188704
    Reviewed-by: Armin Le Grand <armin.le.gr...@me.com>
    Tested-by: Jenkins

diff --git a/drawinglayer/source/geometry/viewinformation2d.cxx 
b/drawinglayer/source/geometry/viewinformation2d.cxx
index 6550831214db..d3e6bd0371a3 100644
--- a/drawinglayer/source/geometry/viewinformation2d.cxx
+++ b/drawinglayer/source/geometry/viewinformation2d.cxx
@@ -28,6 +28,7 @@
 #include <o3tl/temporary.hxx>
 #include <officecfg/Office/Common.hxx>
 #include <unotools/configmgr.hxx>
+#include <vcl/rendercontext/DrawModeFlags.hxx>
 
 #include <atomic>
 #include <utility>
@@ -84,6 +85,10 @@ protected:
     // color to use for automatic color
     Color maAutoColor;
 
+    // DrawModeFlags to use, these may ask to modify the
+    // colors/Bitmap paint according to the flags
+    DrawModeFlags maDrawModeFlags;
+
     // a hint that the View that is being painted has an active TextEdit. This
     // is important for handling of TextHierarchyEditPrimitive2D to suppress
     // the text for objects in TextEdit - the text is visualized by the
@@ -113,6 +118,7 @@ public:
         , mxVisualizedPage()
         , mfViewTime(0.0)
         , maAutoColor(COL_AUTO)
+        , maDrawModeFlags(DrawModeFlags::Default)
         , mbTextEditActive(false)
         , mbEditViewActive(false)
         , mbReducedDisplayQuality(false)
@@ -207,6 +213,9 @@ public:
     Color getAutoColor() const { return maAutoColor; }
     void setAutoColor(Color aNew) { maAutoColor = aNew; }
 
+    DrawModeFlags getDrawModeFlags() const { return maDrawModeFlags; }
+    void setDrawModeFlags(DrawModeFlags aNew) { maDrawModeFlags = aNew; }
+
     bool getTextEditActive() const { return mbTextEditActive; }
     void setTextEditActive(bool bNew) { mbTextEditActive = bNew; }
 
@@ -229,6 +238,7 @@ public:
                 && maViewport == rCandidate.maViewport
                 && mxVisualizedPage == rCandidate.mxVisualizedPage
                 && mfViewTime == rCandidate.mfViewTime && maAutoColor == 
rCandidate.maAutoColor
+                && maDrawModeFlags == rCandidate.maDrawModeFlags
                 && mbTextEditActive == rCandidate.mbTextEditActive
                 && mbEditViewActive == rCandidate.mbEditViewActive
                 && mbReducedDisplayQuality == 
rCandidate.mbReducedDisplayQuality
@@ -364,6 +374,16 @@ Color ViewInformation2D::getAutoColor() const { return 
mpViewInformation2D->getA
 
 void ViewInformation2D::setAutoColor(Color aNew) { 
mpViewInformation2D->setAutoColor(aNew); }
 
+DrawModeFlags ViewInformation2D::getDrawModeFlags() const
+{
+    return mpViewInformation2D->getDrawModeFlags();
+}
+
+void ViewInformation2D::setDrawModeFlags(DrawModeFlags aNew)
+{
+    mpViewInformation2D->setDrawModeFlags(aNew);
+}
+
 bool ViewInformation2D::getTextEditActive() const
 {
     return mpViewInformation2D->getTextEditActive();
diff --git a/drawinglayer/source/processor2d/baseprocessor2d.cxx 
b/drawinglayer/source/processor2d/baseprocessor2d.cxx
index 92b2e3c8d545..5d71ab4fd7f7 100644
--- a/drawinglayer/source/processor2d/baseprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/baseprocessor2d.cxx
@@ -71,7 +71,13 @@ namespace drawinglayer::processor2d
         void BaseProcessor2D::setViewInformation2D(const 
geometry::ViewInformation2D& rNew)
         {
             if (rNew != maViewInformation2D)
-                updateViewInformation(rNew);
+            {
+                // set if changed
+                maViewInformation2D = rNew;
+
+                // allow reaction on change
+                onViewInformation2DChanged();
+            }
         }
 } // end of namespace
 
diff --git a/drawinglayer/source/processor2d/cairopixelprocessor2d.cxx 
b/drawinglayer/source/processor2d/cairopixelprocessor2d.cxx
index 7e5d6eb286fa..f0114a6da4fb 100644
--- a/drawinglayer/source/processor2d/cairopixelprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/cairopixelprocessor2d.cxx
@@ -950,22 +950,15 @@ bool checkCoordinateLimitWorkaroundNeededForUsedCairo()
 
 namespace drawinglayer::processor2d
 {
-void CairoPixelProcessor2D::updateViewInformation(
-    const geometry::ViewInformation2D& rViewInformation2D)
+void CairoPixelProcessor2D::onViewInformation2DChanged()
 {
-    if (rViewInformation2D == getViewInformation2D())
-        return;
-
-    // call parent to actually set
-    BaseProcessor2D::updateViewInformation(rViewInformation2D);
-
     // apply AntiAlias information to target device
     cairo_set_antialias(mpRT, getViewInformation2D().getUseAntiAliasing() ? 
CAIRO_ANTIALIAS_DEFAULT
                                                                           : 
CAIRO_ANTIALIAS_NONE);
 }
 
 CairoPixelProcessor2D::CairoPixelProcessor2D(
-    const basegfx::BColorModifierStack& rBColorModifierStack, const 
DrawModeFlags& rDrawModeFlags,
+    const basegfx::BColorModifierStack& rBColorModifierStack,
     const geometry::ViewInformation2D& rViewInformation, cairo_surface_t* 
pTarget)
     : BaseProcessor2D(rViewInformation)
     , mpTargetOutputDevice(nullptr)
@@ -977,7 +970,6 @@ CairoPixelProcessor2D::CairoPixelProcessor2D(
     , mbRenderDecoratedTextDirect(
           
officecfg::Office::Common::Drawinglayer::RenderDecoratedTextDirect::get())
     , mnClipRecursionCount(0)
-    , maDrawModeFlags(rDrawModeFlags)
     , mbCairoCoordinateLimitWorkaroundActive(false)
 {
     // no target, nothing to initialize
@@ -1014,7 +1006,6 @@ CairoPixelProcessor2D::CairoPixelProcessor2D(const 
geometry::ViewInformation2D&
     , mbRenderDecoratedTextDirect(
           
officecfg::Office::Common::Drawinglayer::RenderDecoratedTextDirect::get())
     , mnClipRecursionCount(0)
-    , maDrawModeFlags(DrawModeFlags::Default)
     , mbCairoCoordinateLimitWorkaroundActive(false)
 {
     if (nWidthPixel <= 0 || nHeightPixel <= 0)
@@ -1057,7 +1048,6 @@ 
CairoPixelProcessor2D::CairoPixelProcessor2D(OutputDevice& rOutputDevice,
     , mbRenderDecoratedTextDirect(
           
officecfg::Office::Common::Drawinglayer::RenderDecoratedTextDirect::get())
     , mnClipRecursionCount(0)
-    , maDrawModeFlags(rOutputDevice.GetDrawMode())
     , mbCairoCoordinateLimitWorkaroundActive(false)
 {
     SystemGraphicsData aData(mpTargetOutputDevice->GetSystemGfxData());
@@ -1284,19 +1274,20 @@ void CairoPixelProcessor2D::processBitmapPrimitive2D(
 {
     constexpr DrawModeFlags BITMAP(DrawModeFlags::BlackBitmap | 
DrawModeFlags::WhiteBitmap
                                    | DrawModeFlags::GrayBitmap);
-    const bool bDrawModeFlagsUsed(maDrawModeFlags & BITMAP);
+    const DrawModeFlags 
aDrawModeFlags(getViewInformation2D().getDrawModeFlags());
+    const bool bDrawModeFlagsUsed(aDrawModeFlags & BITMAP);
 
     if (bDrawModeFlagsUsed)
     {
         // if DrawModeFlags for Bitmap are used, encapsulate with
         // corresponding BColorModifier
-        if (maDrawModeFlags & DrawModeFlags::BlackBitmap)
+        if (aDrawModeFlags & DrawModeFlags::BlackBitmap)
         {
             const basegfx::BColorModifierSharedPtr aBColorModifier(
                 
std::make_shared<basegfx::BColorModifier_replace>(basegfx::BColor(0, 0, 0)));
             maBColorModifierStack.push(aBColorModifier);
         }
-        else if (maDrawModeFlags & DrawModeFlags::WhiteBitmap)
+        else if (aDrawModeFlags & DrawModeFlags::WhiteBitmap)
         {
             const basegfx::BColorModifierSharedPtr aBColorModifier(
                 
std::make_shared<basegfx::BColorModifier_replace>(basegfx::BColor(1, 1, 1)));
@@ -1586,7 +1577,7 @@ void 
CairoPixelProcessor2D::processPolygonHairlinePrimitive2D(
 void CairoPixelProcessor2D::processPolyPolygonColorPrimitive2D(
     const primitive2d::PolyPolygonColorPrimitive2D& 
rPolyPolygonColorPrimitive2D)
 {
-    if (maDrawModeFlags & DrawModeFlags::NoFill)
+    if (getViewInformation2D().getDrawModeFlags() & DrawModeFlags::NoFill)
         // NoFill wanted, done
         return;
 
@@ -1708,8 +1699,7 @@ void 
CairoPixelProcessor2D::processTransparencePrimitive2D(
     const double fContainedHeight(aVisibleRange.getHeight());
     cairo_surface_t* pMask(cairo_surface_create_similar_image(pTarget, 
CAIRO_FORMAT_ARGB32,
                                                               fContainedWidth, 
fContainedHeight));
-    CairoPixelProcessor2D aMaskRenderer(getBColorModifierStack(), 
maDrawModeFlags,
-                                        aViewInformation2D, pMask);
+    CairoPixelProcessor2D aMaskRenderer(getBColorModifierStack(), 
aViewInformation2D, pMask);
     aMaskRenderer.process(rTransCandidate.getTransparence());
 
     // convert mask to something cairo can use
@@ -1718,8 +1708,7 @@ void 
CairoPixelProcessor2D::processTransparencePrimitive2D(
     // draw content to temporary surface
     cairo_surface_t* pContent(cairo_surface_create_similar(
         pTarget, cairo_surface_get_content(pTarget), fContainedWidth, 
fContainedHeight));
-    CairoPixelProcessor2D aContent(getBColorModifierStack(), maDrawModeFlags, 
aViewInformation2D,
-                                   pContent);
+    CairoPixelProcessor2D aContent(getBColorModifierStack(), 
aViewInformation2D, pContent);
     aContent.process(rTransCandidate.getChildren());
 
     // munge the temporary surfaces to our target surface
@@ -1777,8 +1766,7 @@ void CairoPixelProcessor2D::processInvertPrimitive2D(
     const double fContainedHeight(aVisibleRange.getHeight());
     cairo_surface_t* pContent(cairo_surface_create_similar_image(
         pTarget, CAIRO_FORMAT_ARGB32, fContainedWidth, fContainedHeight));
-    CairoPixelProcessor2D aContent(getBColorModifierStack(), maDrawModeFlags, 
aViewInformation2D,
-                                   pContent);
+    CairoPixelProcessor2D aContent(getBColorModifierStack(), 
aViewInformation2D, pContent);
     aContent.process(rInvertCandidate.getChildren());
     cairo_surface_flush(pContent);
 
@@ -2026,13 +2014,13 @@ void CairoPixelProcessor2D::processTransformPrimitive2D(
     geometry::ViewInformation2D aViewInformation2D(getViewInformation2D());
     
aViewInformation2D.setObjectTransformation(getViewInformation2D().getObjectTransformation()
                                                * 
rTransformCandidate.getTransformation());
-    updateViewInformation(aViewInformation2D);
+    setViewInformation2D(aViewInformation2D);
 
     // process content
     process(rTransformCandidate.getChildren());
 
     // restore transformations
-    updateViewInformation(aLastViewInformation2D);
+    setViewInformation2D(aLastViewInformation2D);
 }
 
 void CairoPixelProcessor2D::processUnifiedTransparencePrimitive2D(
@@ -2092,8 +2080,7 @@ void 
CairoPixelProcessor2D::processUnifiedTransparencePrimitive2D(
     const double fContainedHeight(aVisibleRange.getHeight());
     cairo_surface_t* pContent(cairo_surface_create_similar(
         pTarget, cairo_surface_get_content(pTarget), fContainedWidth, 
fContainedHeight));
-    CairoPixelProcessor2D aContent(getBColorModifierStack(), maDrawModeFlags, 
aViewInformation2D,
-                                   pContent);
+    CairoPixelProcessor2D aContent(getBColorModifierStack(), 
aViewInformation2D, pContent);
     aContent.process(rTransCandidate.getChildren());
 
     // paint temporary surface to target with fixed transparence
@@ -2130,15 +2117,16 @@ void 
CairoPixelProcessor2D::processMarkerArrayPrimitive2D(
 
     constexpr DrawModeFlags BITMAP(DrawModeFlags::BlackBitmap | 
DrawModeFlags::WhiteBitmap
                                    | DrawModeFlags::GrayBitmap);
-    if (maDrawModeFlags & BITMAP)
+    const DrawModeFlags 
aDrawModeFlags(getViewInformation2D().getDrawModeFlags());
+    if (aDrawModeFlags & BITMAP)
     {
-        if (maDrawModeFlags & DrawModeFlags::BlackBitmap)
+        if (aDrawModeFlags & DrawModeFlags::BlackBitmap)
         {
             const basegfx::BColorModifierSharedPtr aBColorModifier(
                 
std::make_shared<basegfx::BColorModifier_replace>(basegfx::BColor(0, 0, 0)));
             maBColorModifierStack.push(aBColorModifier);
         }
-        else if (maDrawModeFlags & DrawModeFlags::WhiteBitmap)
+        else if (aDrawModeFlags & DrawModeFlags::WhiteBitmap)
         {
             const basegfx::BColorModifierSharedPtr aBColorModifier(
                 
std::make_shared<basegfx::BColorModifier_replace>(basegfx::BColor(1, 1, 1)));
@@ -2221,7 +2209,7 @@ void 
CairoPixelProcessor2D::processBackgroundColorPrimitive2D(
         || rBackgroundColorCandidate.getTransparency() >= 1.0)
         return;
 
-    if (maDrawModeFlags & DrawModeFlags::NoFill)
+    if (getViewInformation2D().getDrawModeFlags() & DrawModeFlags::NoFill)
         // NoFill wanted, done
         return;
 
@@ -2472,7 +2460,7 @@ void 
CairoPixelProcessor2D::processFilledRectanglePrimitive2D(
         return;
     }
 
-    if (maDrawModeFlags & DrawModeFlags::NoFill)
+    if (getViewInformation2D().getDrawModeFlags() & DrawModeFlags::NoFill)
         // NoFill wanted, done
         return;
 
@@ -2555,14 +2543,15 @@ void 
CairoPixelProcessor2D::processFillGraphicPrimitive2D(
                                    | DrawModeFlags::GrayBitmap);
     basegfx::BColor aReplacementColor(0, 0, 0);
     bool bTemporaryGrayColorModifier(false);
-    if (maDrawModeFlags & BITMAP)
+    const DrawModeFlags 
aDrawModeFlags(getViewInformation2D().getDrawModeFlags());
+    if (aDrawModeFlags & BITMAP)
     {
-        if (maDrawModeFlags & DrawModeFlags::BlackBitmap)
+        if (aDrawModeFlags & DrawModeFlags::BlackBitmap)
         {
             // aReplacementColor already set
             aPreparedBitmap.SetEmpty();
         }
-        else if (maDrawModeFlags & DrawModeFlags::WhiteBitmap)
+        else if (aDrawModeFlags & DrawModeFlags::WhiteBitmap)
         {
             aReplacementColor = basegfx::BColor(1, 1, 1);
             aPreparedBitmap.SetEmpty();
@@ -3413,14 +3402,15 @@ void 
CairoPixelProcessor2D::processFillGradientPrimitive2D(
     constexpr DrawModeFlags SIMPLE_GRADIENT(DrawModeFlags::BlackGradient
                                             | DrawModeFlags::WhiteGradient
                                             | DrawModeFlags::SettingsGradient);
-    if (maDrawModeFlags & SIMPLE_GRADIENT)
+    const DrawModeFlags 
aDrawModeFlags(getViewInformation2D().getDrawModeFlags());
+    if (aDrawModeFlags & SIMPLE_GRADIENT)
     {
         // use simple, single-color OutputRange draw
         
processFillGradientPrimitive2D_drawOutputRange(rFillGradientPrimitive2D);
         return;
     }
 
-    const bool bTemporaryGrayColorModifier(maDrawModeFlags & 
DrawModeFlags::GrayGradient);
+    const bool bTemporaryGrayColorModifier(aDrawModeFlags & 
DrawModeFlags::GrayGradient);
     if (bTemporaryGrayColorModifier)
     {
         const basegfx::BColorModifierSharedPtr aBColorModifier(
@@ -3504,7 +3494,7 @@ void 
CairoPixelProcessor2D::processFillGradientPrimitive2D(
 void CairoPixelProcessor2D::processPolyPolygonRGBAPrimitive2D(
     const primitive2d::PolyPolygonRGBAPrimitive2D& rPolyPolygonRGBAPrimitive2D)
 {
-    if (maDrawModeFlags & DrawModeFlags::NoFill)
+    if (getViewInformation2D().getDrawModeFlags() & DrawModeFlags::NoFill)
         // NoFill wanted, done
         return;
 
@@ -3525,7 +3515,7 @@ void 
CairoPixelProcessor2D::processPolyPolygonRGBAPrimitive2D(
 void CairoPixelProcessor2D::processPolyPolygonAlphaGradientPrimitive2D(
     const primitive2d::PolyPolygonAlphaGradientPrimitive2D& 
rPolyPolygonAlphaGradientPrimitive2D)
 {
-    if (maDrawModeFlags & DrawModeFlags::NoFill)
+    if (getViewInformation2D().getDrawModeFlags() & DrawModeFlags::NoFill)
         // NoFill wanted, done
         return;
 
@@ -3607,17 +3597,18 @@ void 
CairoPixelProcessor2D::processBitmapAlphaPrimitive2D(
 {
     constexpr DrawModeFlags BITMAP(DrawModeFlags::BlackBitmap | 
DrawModeFlags::WhiteBitmap
                                    | DrawModeFlags::GrayBitmap);
-    const bool bDrawModeFlagsUsed(maDrawModeFlags & BITMAP);
+    const DrawModeFlags 
aDrawModeFlags(getViewInformation2D().getDrawModeFlags());
+    const bool bDrawModeFlagsUsed(aDrawModeFlags & BITMAP);
 
     if (bDrawModeFlagsUsed)
     {
-        if (maDrawModeFlags & DrawModeFlags::BlackBitmap)
+        if (aDrawModeFlags & DrawModeFlags::BlackBitmap)
         {
             const basegfx::BColorModifierSharedPtr aBColorModifier(
                 
std::make_shared<basegfx::BColorModifier_replace>(basegfx::BColor(0, 0, 0)));
             maBColorModifierStack.push(aBColorModifier);
         }
-        else if (maDrawModeFlags & DrawModeFlags::WhiteBitmap)
+        else if (aDrawModeFlags & DrawModeFlags::WhiteBitmap)
         {
             const basegfx::BColorModifierSharedPtr aBColorModifier(
                 
std::make_shared<basegfx::BColorModifier_replace>(basegfx::BColor(1, 1, 1)));
@@ -3743,7 +3734,7 @@ void 
CairoPixelProcessor2D::renderTextDecorationWithOptionalTransformAndColor(
     {
         geometry::ViewInformation2D aViewInformation2D(getViewInformation2D());
         aViewInformation2D.setObjectTransformation(*pOptionalObjectTransform);
-        updateViewInformation(aViewInformation2D);
+        setViewInformation2D(aViewInformation2D);
     }
 
     // render primitives
@@ -3751,7 +3742,7 @@ void 
CairoPixelProcessor2D::renderTextDecorationWithOptionalTransformAndColor(
 
     // restore mods
     if (nullptr != pOptionalObjectTransform)
-        updateViewInformation(aLastViewInformation2D);
+        setViewInformation2D(aLastViewInformation2D);
     if (nullptr != pReplacementColor)
         maBColorModifierStack.pop();
 }
@@ -3989,7 +3980,7 @@ bool CairoPixelProcessor2D::handleSvgGradientHelper(
     constexpr DrawModeFlags SIMPLE_GRADIENT(DrawModeFlags::BlackGradient
                                             | DrawModeFlags::WhiteGradient
                                             | DrawModeFlags::SettingsGradient);
-    if (maDrawModeFlags & SIMPLE_GRADIENT)
+    if (getViewInformation2D().getDrawModeFlags() & SIMPLE_GRADIENT)
     {
         aSimpleColor = getGradientColor(aSimpleColor);
         bDrawSimple = true;
@@ -4023,7 +4014,8 @@ void 
CairoPixelProcessor2D::processSvgLinearGradientPrimitive2D(
 
     cairo_save(mpRT);
 
-    const bool bTemporaryGrayColorModifier(maDrawModeFlags & 
DrawModeFlags::GrayGradient);
+    const bool 
bTemporaryGrayColorModifier(getViewInformation2D().getDrawModeFlags()
+                                           & DrawModeFlags::GrayGradient);
     if (bTemporaryGrayColorModifier)
     {
         const basegfx::BColorModifierSharedPtr aBColorModifier(
@@ -4110,7 +4102,7 @@ void 
CairoPixelProcessor2D::processSvgRadialGradientPrimitive2D(
     cairo_save(mpRT);
 
     bool bTemporaryGrayColorModifier(false);
-    if (maDrawModeFlags & DrawModeFlags::GrayGradient)
+    if (getViewInformation2D().getDrawModeFlags() & 
DrawModeFlags::GrayGradient)
     {
         bTemporaryGrayColorModifier = true;
         const basegfx::BColorModifierSharedPtr aBColorModifier(
@@ -4316,23 +4308,25 @@ basegfx::BColor 
CairoPixelProcessor2D::getLineColor(const basegfx::BColor& rColo
 {
     constexpr DrawModeFlags LINE(DrawModeFlags::BlackLine | 
DrawModeFlags::WhiteLine
                                  | DrawModeFlags::GrayLine | 
DrawModeFlags::SettingsLine);
-    if (!(maDrawModeFlags & LINE))
+    const DrawModeFlags 
aDrawModeFlags(getViewInformation2D().getDrawModeFlags());
+
+    if (!(aDrawModeFlags & LINE))
         return rColor;
 
-    if (maDrawModeFlags & DrawModeFlags::BlackLine)
+    if (aDrawModeFlags & DrawModeFlags::BlackLine)
         return basegfx::BColor(0, 0, 0);
 
-    if (maDrawModeFlags & DrawModeFlags::WhiteLine)
+    if (aDrawModeFlags & DrawModeFlags::WhiteLine)
         return basegfx::BColor(1, 1, 1);
 
-    if (maDrawModeFlags & DrawModeFlags::GrayLine)
+    if (aDrawModeFlags & DrawModeFlags::GrayLine)
     {
         const double fLuminance(rColor.luminance());
         return basegfx::BColor(fLuminance, fLuminance, fLuminance);
     }
 
     // DrawModeFlags::SettingsLine
-    if (maDrawModeFlags & DrawModeFlags::SettingsForSelection)
+    if (aDrawModeFlags & DrawModeFlags::SettingsForSelection)
         return 
Application::GetSettings().GetStyleSettings().GetHighlightColor().getBColor();
 
     return 
Application::GetSettings().GetStyleSettings().GetWindowTextColor().getBColor();
@@ -4342,23 +4336,25 @@ basegfx::BColor 
CairoPixelProcessor2D::getFillColor(const basegfx::BColor& rColo
 {
     constexpr DrawModeFlags FILL(DrawModeFlags::BlackFill | 
DrawModeFlags::WhiteFill
                                  | DrawModeFlags::GrayFill | 
DrawModeFlags::SettingsFill);
-    if (!(maDrawModeFlags & FILL))
+    const DrawModeFlags 
aDrawModeFlags(getViewInformation2D().getDrawModeFlags());
+
+    if (!(aDrawModeFlags & FILL))
         return rColor;
 
-    if (maDrawModeFlags & DrawModeFlags::BlackFill)
+    if (aDrawModeFlags & DrawModeFlags::BlackFill)
         return basegfx::BColor(0, 0, 0);
 
-    if (maDrawModeFlags & DrawModeFlags::WhiteFill)
+    if (aDrawModeFlags & DrawModeFlags::WhiteFill)
         return basegfx::BColor(1, 1, 1);
 
-    if (maDrawModeFlags & DrawModeFlags::GrayFill)
+    if (aDrawModeFlags & DrawModeFlags::GrayFill)
     {
         const double fLuminance(rColor.luminance());
         return basegfx::BColor(fLuminance, fLuminance, fLuminance);
     }
 
     // DrawModeFlags::SettingsFill
-    if (maDrawModeFlags & DrawModeFlags::SettingsForSelection)
+    if (aDrawModeFlags & DrawModeFlags::SettingsForSelection)
         return 
Application::GetSettings().GetStyleSettings().GetHighlightColor().getBColor();
 
     return 
Application::GetSettings().GetStyleSettings().GetWindowColor().getBColor();
@@ -4368,23 +4364,25 @@ basegfx::BColor 
CairoPixelProcessor2D::getTextColor(const basegfx::BColor& rColo
 {
     constexpr DrawModeFlags TEXT(DrawModeFlags::BlackText | 
DrawModeFlags::WhiteText
                                  | DrawModeFlags::GrayText | 
DrawModeFlags::SettingsText);
-    if (!(maDrawModeFlags & TEXT))
+    const DrawModeFlags 
aDrawModeFlags(getViewInformation2D().getDrawModeFlags());
+
+    if (!(aDrawModeFlags & TEXT))
         return rColor;
 
-    if (maDrawModeFlags & DrawModeFlags::BlackText)
+    if (aDrawModeFlags & DrawModeFlags::BlackText)
         return basegfx::BColor(0, 0, 0);
 
-    if (maDrawModeFlags & DrawModeFlags::WhiteText)
+    if (aDrawModeFlags & DrawModeFlags::WhiteText)
         return basegfx::BColor(1, 1, 1);
 
-    if (maDrawModeFlags & DrawModeFlags::GrayText)
+    if (aDrawModeFlags & DrawModeFlags::GrayText)
     {
         const double fLuminance(rColor.luminance());
         return basegfx::BColor(fLuminance, fLuminance, fLuminance);
     }
 
     // DrawModeFlags::SettingsText
-    if (maDrawModeFlags & DrawModeFlags::SettingsForSelection)
+    if (aDrawModeFlags & DrawModeFlags::SettingsForSelection)
         return 
Application::GetSettings().GetStyleSettings().GetHighlightTextColor().getBColor();
 
     return 
Application::GetSettings().GetStyleSettings().GetWindowTextColor().getBColor();
@@ -4395,23 +4393,25 @@ basegfx::BColor 
CairoPixelProcessor2D::getGradientColor(const basegfx::BColor& r
     constexpr DrawModeFlags GRADIENT(DrawModeFlags::BlackGradient | 
DrawModeFlags::GrayGradient
                                      | DrawModeFlags::WhiteGradient
                                      | DrawModeFlags::SettingsGradient);
-    if (!(maDrawModeFlags & GRADIENT))
+    const DrawModeFlags 
aDrawModeFlags(getViewInformation2D().getDrawModeFlags());
+
+    if (!(aDrawModeFlags & GRADIENT))
         return rColor;
 
-    if (maDrawModeFlags & DrawModeFlags::BlackGradient)
+    if (aDrawModeFlags & DrawModeFlags::BlackGradient)
         return basegfx::BColor(0, 0, 0);
 
-    if (maDrawModeFlags & DrawModeFlags::WhiteGradient)
+    if (aDrawModeFlags & DrawModeFlags::WhiteGradient)
         return basegfx::BColor(1, 1, 1);
 
-    if (maDrawModeFlags & DrawModeFlags::GrayGradient)
+    if (aDrawModeFlags & DrawModeFlags::GrayGradient)
     {
         const double fLuminance(rColor.luminance());
         return basegfx::BColor(fLuminance, fLuminance, fLuminance);
     }
 
     // DrawModeFlags::SettingsGradient
-    if (maDrawModeFlags & DrawModeFlags::SettingsForSelection)
+    if (aDrawModeFlags & DrawModeFlags::SettingsForSelection)
         return 
Application::GetSettings().GetStyleSettings().GetHighlightColor().getBColor();
 
     return 
Application::GetSettings().GetStyleSettings().GetWindowColor().getBColor();
diff --git a/drawinglayer/source/processor2d/contourextractor2d.cxx 
b/drawinglayer/source/processor2d/contourextractor2d.cxx
index e0b919464943..94d6b109ecfb 100644
--- a/drawinglayer/source/processor2d/contourextractor2d.cxx
+++ b/drawinglayer/source/processor2d/contourextractor2d.cxx
@@ -122,13 +122,13 @@ namespace drawinglayer::processor2d
                     // create new local ViewInformation2D
                     geometry::ViewInformation2D 
aViewInformation2D(getViewInformation2D());
                     
aViewInformation2D.setObjectTransformation(getViewInformation2D().getObjectTransformation()
 * rTransformCandidate.getTransformation());
-                    updateViewInformation(aViewInformation2D);
+                    setViewInformation2D(aViewInformation2D);
 
                     // process content
                     process(rTransformCandidate.getChildren());
 
                     // restore transformations
-                    updateViewInformation(aLastViewInformation2D);
+                    setViewInformation2D(aLastViewInformation2D);
 
                     break;
                 }
diff --git a/drawinglayer/source/processor2d/d2dpixelprocessor2d.cxx 
b/drawinglayer/source/processor2d/d2dpixelprocessor2d.cxx
index a192c55db7ae..305d1f987f72 100644
--- a/drawinglayer/source/processor2d/d2dpixelprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/d2dpixelprocessor2d.cxx
@@ -591,7 +591,7 @@ public:
                 aInvViewTransform.invert();
                 aViewport.transform(aInvViewTransform);
                 aViewInformation.setViewport(aViewport);
-                updateViewInformation(aViewInformation);
+                setViewInformation2D(aViewInformation);
             }
 
             // clear as render preparation
@@ -1473,13 +1473,13 @@ void D2DPixelProcessor2D::processTransformPrimitive2D(
     geometry::ViewInformation2D aViewInformation2D(getViewInformation2D());
     
aViewInformation2D.setObjectTransformation(getViewInformation2D().getObjectTransformation()
                                                * 
rTransformCandidate.getTransformation());
-    updateViewInformation(aViewInformation2D);
+    setViewInformation2D(aViewInformation2D);
 
     // process content
     process(rTransformCandidate.getChildren());
 
     // restore transformations
-    updateViewInformation(aLastViewInformation2D);
+    setViewInformation2D(aLastViewInformation2D);
 }
 
 void D2DPixelProcessor2D::processPolygonStrokePrimitive2D(
diff --git a/drawinglayer/source/processor2d/hittestprocessor2d.cxx 
b/drawinglayer/source/processor2d/hittestprocessor2d.cxx
index d9b71b00e825..948db19c93ee 100644
--- a/drawinglayer/source/processor2d/hittestprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/hittestprocessor2d.cxx
@@ -276,13 +276,13 @@ namespace drawinglayer::processor2d
                     // create new local ViewInformation2D containing 
transformation
                     geometry::ViewInformation2D 
aViewInformation2D(getViewInformation2D());
                     
aViewInformation2D.setObjectTransformation(getViewInformation2D().getObjectTransformation()
 * rTransformCandidate.getTransformation());
-                    updateViewInformation(aViewInformation2D);
+                    setViewInformation2D(aViewInformation2D);
 
                     // process child content recursively
                     process(rTransformCandidate.getChildren());
 
                     // restore transformations
-                    updateViewInformation(aLastViewInformation2D);
+                    setViewInformation2D(aLastViewInformation2D);
 
                     break;
                 }
diff --git a/drawinglayer/source/processor2d/linegeometryextractor2d.cxx 
b/drawinglayer/source/processor2d/linegeometryextractor2d.cxx
index 1fd97ab110f6..8c07c8a17c0a 100644
--- a/drawinglayer/source/processor2d/linegeometryextractor2d.cxx
+++ b/drawinglayer/source/processor2d/linegeometryextractor2d.cxx
@@ -83,13 +83,13 @@ namespace drawinglayer::processor2d
                     // create new transformations for CurrentTransformation 
and for local ViewInformation2D
                     geometry::ViewInformation2D 
aViewInformation2D(getViewInformation2D());
                     
aViewInformation2D.setObjectTransformation(getViewInformation2D().getObjectTransformation()
 * rTransformCandidate.getTransformation());
-                    updateViewInformation(aViewInformation2D);
+                    setViewInformation2D(aViewInformation2D);
 
                     // process content
                     process(rTransformCandidate.getChildren());
 
                     // restore transformations
-                    updateViewInformation(aLastViewInformation2D);
+                    setViewInformation2D(aLastViewInformation2D);
 
                     break;
                 }
diff --git a/drawinglayer/source/processor2d/textaspolygonextractor2d.cxx 
b/drawinglayer/source/processor2d/textaspolygonextractor2d.cxx
index 1a091d027a85..4315f6696f75 100644
--- a/drawinglayer/source/processor2d/textaspolygonextractor2d.cxx
+++ b/drawinglayer/source/processor2d/textaspolygonextractor2d.cxx
@@ -170,13 +170,13 @@ namespace drawinglayer::processor2d
                     // create new transformations for CurrentTransformation 
and for local ViewInformation2D
                     geometry::ViewInformation2D 
aViewInformation2D(getViewInformation2D());
                     
aViewInformation2D.setObjectTransformation(getViewInformation2D().getObjectTransformation()
 * rTransformCandidate.getTransformation());
-                    updateViewInformation(aViewInformation2D);
+                    setViewInformation2D(aViewInformation2D);
 
                     // process content
                     process(rTransformCandidate.getChildren());
 
                     // restore transformations
-                    updateViewInformation(aLastViewInformation2D);
+                    setViewInformation2D(aLastViewInformation2D);
 
                     break;
                 }
diff --git a/drawinglayer/source/processor2d/textextractor2d.cxx 
b/drawinglayer/source/processor2d/textextractor2d.cxx
index 105014a750ca..835cb0cc24bc 100644
--- a/drawinglayer/source/processor2d/textextractor2d.cxx
+++ b/drawinglayer/source/processor2d/textextractor2d.cxx
@@ -47,13 +47,13 @@ void TextExtractor2D::processBasePrimitive2D(const 
primitive2d::BasePrimitive2D&
             aViewInformation2D.setObjectTransformation(
                 getViewInformation2D().getObjectTransformation()
                 * rTransformCandidate.getTransformation());
-            updateViewInformation(aViewInformation2D);
+            setViewInformation2D(aViewInformation2D);
 
             // process content
             process(rTransformCandidate.getChildren());
 
             // restore transformations
-            updateViewInformation(aLastViewInformation2D);
+            setViewInformation2D(aLastViewInformation2D);
 
             break;
         }
diff --git a/drawinglayer/source/processor2d/vclprocessor2d.cxx 
b/drawinglayer/source/processor2d/vclprocessor2d.cxx
index 066472830cad..8f53bf710d77 100644
--- a/drawinglayer/source/processor2d/vclprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/vclprocessor2d.cxx
@@ -1053,14 +1053,14 @@ void VclProcessor2D::RenderTransformPrimitive2D(
     geometry::ViewInformation2D aViewInformation2D(getViewInformation2D());
     
aViewInformation2D.setObjectTransformation(getViewInformation2D().getObjectTransformation()
                                                * 
rTransformCandidate.getTransformation());
-    updateViewInformation(aViewInformation2D);
+    setViewInformation2D(aViewInformation2D);
 
     // process content
     process(rTransformCandidate.getChildren());
 
     // restore transformations
     maCurrentTransformation = aLastCurrentTransformation;
-    updateViewInformation(aLastViewInformation2D);
+    setViewInformation2D(aLastViewInformation2D);
 }
 
 // new XDrawPage for ViewInformation2D
@@ -1073,13 +1073,13 @@ void VclProcessor2D::RenderPagePreviewPrimitive2D(
     // create new local ViewInformation2D
     geometry::ViewInformation2D aViewInformation2D(getViewInformation2D());
     aViewInformation2D.setVisualizedPage(rPagePreviewCandidate.getXDrawPage());
-    updateViewInformation(aViewInformation2D);
+    setViewInformation2D(aViewInformation2D);
 
     // process decomposed content
     process(rPagePreviewCandidate);
 
     // restore transformations
-    updateViewInformation(aLastViewInformation2D);
+    setViewInformation2D(aLastViewInformation2D);
 }
 
 // marker
@@ -1596,14 +1596,8 @@ void VclProcessor2D::adaptTextToFillDrawMode() const
     mpOutputDevice->SetDrawMode(nAdaptedDrawMode);
 }
 
-void VclProcessor2D::updateViewInformation(const geometry::ViewInformation2D& 
rViewInformation2D)
+void VclProcessor2D::onViewInformation2DChanged()
 {
-    if (rViewInformation2D == getViewInformation2D())
-        return;
-
-    // call parent to actually set
-    BaseProcessor2D::updateViewInformation(rViewInformation2D);
-
     // apply AntiAlias information to target device
     if (getViewInformation2D().getUseAntiAliasing())
         mpOutputDevice->SetAntialiasing(mpOutputDevice->GetAntialiasing()
@@ -1611,6 +1605,10 @@ void VclProcessor2D::updateViewInformation(const 
geometry::ViewInformation2D& rV
     else
         mpOutputDevice->SetAntialiasing(mpOutputDevice->GetAntialiasing()
                                         & ~AntialiasingFlags::Enable);
+
+    // apply DrawModeFlags to target device
+    if (getViewInformation2D().getDrawModeFlags() != 
mpOutputDevice->GetDrawMode())
+        mpOutputDevice->SetDrawMode(getViewInformation2D().getDrawModeFlags());
 }
 
 // process support
diff --git a/drawinglayer/source/processor2d/vclprocessor2d.hxx 
b/drawinglayer/source/processor2d/vclprocessor2d.hxx
index a35ead52a4ad..10beddf6bd10 100644
--- a/drawinglayer/source/processor2d/vclprocessor2d.hxx
+++ b/drawinglayer/source/processor2d/vclprocessor2d.hxx
@@ -109,9 +109,8 @@ protected:
     void adaptLineToFillDrawMode() const;
     void adaptTextToFillDrawMode() const;
 
-    // allow to react on changes
-    virtual void
-    updateViewInformation(const geometry::ViewInformation2D& 
rViewInformation2D) override;
+    // allow to react on changes of ViewInformation2D
+    virtual void onViewInformation2DChanged() override;
 
 public:
     // constructor/destructor
diff --git a/drawinglayer/source/processor3d/baseprocessor3d.cxx 
b/drawinglayer/source/processor3d/baseprocessor3d.cxx
index 0969d45dca9b..7fd2a80a9988 100644
--- a/drawinglayer/source/processor3d/baseprocessor3d.cxx
+++ b/drawinglayer/source/processor3d/baseprocessor3d.cxx
@@ -59,6 +59,17 @@ namespace drawinglayer::processor3d
             }
         }
 
+        void BaseProcessor3D::setViewInformation3D(const 
geometry::ViewInformation3D& rNew)
+        {
+            if (rNew != maViewInformation3D)
+            {
+                // set if changed
+                maViewInformation3D = rNew;
+
+                // allow reaction on change
+                onViewInformation3DChanged();
+            }
+        }
 } // end of namespace
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/drawinglayer/source/processor3d/cutfindprocessor3d.cxx 
b/drawinglayer/source/processor3d/cutfindprocessor3d.cxx
index cb1f737f5964..59228aeca0ed 100644
--- a/drawinglayer/source/processor3d/cutfindprocessor3d.cxx
+++ b/drawinglayer/source/processor3d/cutfindprocessor3d.cxx
@@ -74,7 +74,7 @@ namespace drawinglayer::processor3d
                         aLastViewInformation3D.getDeviceToView(),
                         aLastViewInformation3D.getViewTime(),
                         
aLastViewInformation3D.getExtendedInformationSequence());
-                    updateViewInformation(aNewViewInformation3D);
+                    setViewInformation3D(aNewViewInformation3D);
 
                     // #i102956# remember needed back-transform for found cuts 
(combine from right side)
                     const basegfx::B3DHomMatrix 
aLastCombinedTransform(maCombinedTransform);
@@ -85,7 +85,7 @@ namespace drawinglayer::processor3d
 
                     // restore transformations and front, back
                     maCombinedTransform = aLastCombinedTransform;
-                    updateViewInformation(aLastViewInformation3D);
+                    setViewInformation3D(aLastViewInformation3D);
                     maFront = aLastFront;
                     maBack = aLastBack;
                     break;
diff --git a/drawinglayer/source/processor3d/defaultprocessor3d.cxx 
b/drawinglayer/source/processor3d/defaultprocessor3d.cxx
index 7331ed842165..91f394eb6127 100644
--- a/drawinglayer/source/processor3d/defaultprocessor3d.cxx
+++ b/drawinglayer/source/processor3d/defaultprocessor3d.cxx
@@ -461,13 +461,13 @@ namespace drawinglayer::processor3d
                 aLastViewInformation3D.getDeviceToView(),
                 aLastViewInformation3D.getViewTime(),
                 aLastViewInformation3D.getExtendedInformationSequence());
-            updateViewInformation(aNewViewInformation3D);
+            setViewInformation3D(aNewViewInformation3D);
 
             // let break down recursively
             process(rTransformCandidate.getChildren());
 
             // restore transformations
-            updateViewInformation(aLastViewInformation3D);
+            setViewInformation3D(aLastViewInformation3D);
         }
 
         void DefaultProcessor3D::processBasePrimitive3D(const 
primitive3d::BasePrimitive3D& rBasePrimitive)
diff --git a/drawinglayer/source/processor3d/geometry2dextractor.cxx 
b/drawinglayer/source/processor3d/geometry2dextractor.cxx
index 0d6dd53bb271..42144eae299e 100644
--- a/drawinglayer/source/processor3d/geometry2dextractor.cxx
+++ b/drawinglayer/source/processor3d/geometry2dextractor.cxx
@@ -54,13 +54,13 @@ namespace drawinglayer::processor3d
                         aLastViewInformation3D.getDeviceToView(),
                         aLastViewInformation3D.getViewTime(),
                         
aLastViewInformation3D.getExtendedInformationSequence());
-                    updateViewInformation(aNewViewInformation3D);
+                    setViewInformation3D(aNewViewInformation3D);
 
                     // let break down recursively
                     process(rPrimitive.getChildren());
 
                     // restore transformations
-                    updateViewInformation(aLastViewInformation3D);
+                    setViewInformation3D(aLastViewInformation3D);
                     break;
                 }
                 case PRIMITIVE3D_ID_MODIFIEDCOLORPRIMITIVE3D :
diff --git a/drawinglayer/source/processor3d/shadow3dextractor.cxx 
b/drawinglayer/source/processor3d/shadow3dextractor.cxx
index 543787897bc3..7970b46cfabb 100644
--- a/drawinglayer/source/processor3d/shadow3dextractor.cxx
+++ b/drawinglayer/source/processor3d/shadow3dextractor.cxx
@@ -108,7 +108,7 @@ namespace drawinglayer::processor3d
                         aLastViewInformation3D.getDeviceToView(),
                         aLastViewInformation3D.getViewTime(),
                         
aLastViewInformation3D.getExtendedInformationSequence());
-                    updateViewInformation(aNewViewInformation3D);
+                    setViewInformation3D(aNewViewInformation3D);
 
                     if(mbShadowProjectionIsValid)
                     {
@@ -121,7 +121,7 @@ namespace drawinglayer::processor3d
                     process(rPrimitive.getChildren());
 
                     // restore transformations
-                    updateViewInformation(aLastViewInformation3D);
+                    setViewInformation3D(aLastViewInformation3D);
 
                     if(mbShadowProjectionIsValid)
                     {
diff --git a/drawinglayer/source/processor3d/zbufferprocessor3d.cxx 
b/drawinglayer/source/processor3d/zbufferprocessor3d.cxx
index 82c1129fa585..22674b414cc6 100644
--- a/drawinglayer/source/processor3d/zbufferprocessor3d.cxx
+++ b/drawinglayer/source/processor3d/zbufferprocessor3d.cxx
@@ -562,7 +562,7 @@ namespace drawinglayer::processor3d
                 aDeviceToView,
                 getViewInformation3D().getViewTime(),
                 getViewInformation3D().getExtendedInformationSequence());
-            updateViewInformation(aNewViewInformation3D);
+            setViewInformation3D(aNewViewInformation3D);
 
             // prepare inverse EyeToView transformation. This can be done in 
constructor
             // since changes in object transformations when processing 
TransformPrimitive3Ds
diff --git a/include/drawinglayer/geometry/viewinformation2d.hxx 
b/include/drawinglayer/geometry/viewinformation2d.hxx
index c86b7b7a9bf8..f552c35b09e7 100644
--- a/include/drawinglayer/geometry/viewinformation2d.hxx
+++ b/include/drawinglayer/geometry/viewinformation2d.hxx
@@ -54,6 +54,8 @@ template <class interface_type> class Reference;
 template <typename> class Sequence;
 }
 
+enum class DrawModeFlags : sal_uInt32;
+
 namespace drawinglayer::geometry
 {
 /** ViewInformation2D class
@@ -163,6 +165,9 @@ public:
     Color getAutoColor() const;
     void setAutoColor(Color aNew);
 
+    DrawModeFlags getDrawModeFlags() const;
+    void setDrawModeFlags(DrawModeFlags aNew);
+
     /// claim that in the view processed a TextEdit is active
     bool getTextEditActive() const;
     void setTextEditActive(bool bNew);
diff --git a/include/drawinglayer/processor2d/baseprocessor2d.hxx 
b/include/drawinglayer/processor2d/baseprocessor2d.hxx
index 69624bd9de6f..d0f674383f38 100644
--- a/include/drawinglayer/processor2d/baseprocessor2d.hxx
+++ b/include/drawinglayer/processor2d/baseprocessor2d.hxx
@@ -44,7 +44,7 @@ namespace drawinglayer::processor2d
             to construct any processor with a given ViewInformation2D. To be 
able
             to handle primitives which need to change the current 
transformation
             (as e.g. TransformPrimitive2D) it is allowed for the processor 
implementation
-            to change its local value using updateViewInformation.
+            to change its local value using setViewInformation2D.
 
             The basic processing method is process(..) which gets handed over 
the
             sequence of primitives to process. For convenience of the C++ 
implementations,
@@ -158,14 +158,11 @@ namespace drawinglayer::processor2d
             geometry::ViewInformation2D                     
maViewInformation2D;
 
         protected:
-            /*  access method to allow the implementations to change the 
current
-                ViewInformation2D if needed. This allows isolating these 
accesses
-                later if needed
+            /*  callback method to allow the implementations to react on 
changes
+                to the current ViewInformation2D if needed (e.g. when your 
impl/
+                derivation needs to react on AA change)
              */
-            virtual void updateViewInformation(const 
geometry::ViewInformation2D& rViewInformation2D)
-            {
-                maViewInformation2D = rViewInformation2D;
-            }
+            virtual void onViewInformation2DChanged() {}
 
             /*  as tooling, the process() implementation takes over API 
handling and calls this
                 virtual render method when the primitive implementation is 
BasePrimitive2D-based.
diff --git a/include/drawinglayer/processor2d/cairopixelprocessor2d.hxx 
b/include/drawinglayer/processor2d/cairopixelprocessor2d.hxx
index 325cbe8f7fcd..3e5ecff28965 100644
--- a/include/drawinglayer/processor2d/cairopixelprocessor2d.hxx
+++ b/include/drawinglayer/processor2d/cairopixelprocessor2d.hxx
@@ -14,7 +14,6 @@
 #include <tools/long.hxx>
 #include <sal/config.h>
 #include <vcl/vclptr.hxx>
-#include <vcl/rendercontext/DrawModeFlags.hxx>
 
 // cairo-specific
 #include <cairo.h>
@@ -92,10 +91,6 @@ class UNLESS_MERGELIBS(DRAWINGLAYER_DLLPUBLIC) 
CairoPixelProcessor2D final : pub
     // see comment there
     sal_uInt16 mnClipRecursionCount;
 
-    // DrawModeFlags from OutputDevice: These do modify how stuff
-    // needs to be colored/painted, context-dependent
-    DrawModeFlags maDrawModeFlags;
-
     // calculated result of if we are in outsideCairoCoordinateLimits mode
     bool mbCairoCoordinateLimitWorkaroundActive;
 
@@ -204,9 +199,8 @@ protected:
     bool hasError() const { return cairo_status(mpRT) != CAIRO_STATUS_SUCCESS; 
}
     bool hasRenderTarget() const { return nullptr != mpRT; }
 
-    // allow to react on changes
-    virtual void
-    updateViewInformation(const geometry::ViewInformation2D& 
rViewInformation2D) override;
+    // allow to react on changes of ViewInformation2D
+    virtual void onViewInformation2DChanged() override;
 
     // constructor to create a CairoPixelProcessor2D for
     // the given cairo_surface_t pTarget. pTarget will not
@@ -216,9 +210,6 @@ protected:
         // take over current BColorModifierStack
         const basegfx::BColorModifierStack& rBColorModifierStack,
 
-        // take over current DrawModeFlags
-        const DrawModeFlags& rDrawModeFlags,
-
         // the ViewInformation
         const geometry::ViewInformation2D& rViewInformation,
 
diff --git a/include/drawinglayer/processor3d/baseprocessor3d.hxx 
b/include/drawinglayer/processor3d/baseprocessor3d.hxx
index 406dede08fd1..8aba861176cd 100644
--- a/include/drawinglayer/processor3d/baseprocessor3d.hxx
+++ b/include/drawinglayer/processor3d/baseprocessor3d.hxx
@@ -41,10 +41,10 @@ namespace drawinglayer::processor3d
             geometry::ViewInformation3D                     
maViewInformation3D;
 
         protected:
-            void updateViewInformation(const geometry::ViewInformation3D& 
rViewInformation3D)
-            {
-                maViewInformation3D = rViewInformation3D;
-            }
+            /*  callback method to allow the implementations to react on 
changes
+                to the current ViewInformation2D if needed
+             */
+            virtual void onViewInformation3DChanged() {}
 
             /*  as tooling, the process() implementation takes over API 
handling and calls this
                 virtual render method when the primitive implementation is 
BasePrimitive3D-based.
@@ -59,8 +59,9 @@ namespace drawinglayer::processor3d
             // the central processing method
             void process(const primitive3d::Primitive3DContainer& rSource);
 
-            // data access
+            /// data read/write access to ViewInformation2D
             const geometry::ViewInformation3D& getViewInformation3D() const { 
return maViewInformation3D; }
+            void setViewInformation3D(const geometry::ViewInformation3D& rNew);
         };
 
 } // end of namespace drawinglayer::processor3d
diff --git a/include/svx/sdr/contact/objectcontact.hxx 
b/include/svx/sdr/contact/objectcontact.hxx
index eebd209b94aa..221190359fc7 100644
--- a/include/svx/sdr/contact/objectcontact.hxx
+++ b/include/svx/sdr/contact/objectcontact.hxx
@@ -83,7 +83,7 @@ protected:
     void setPreviewRenderer(bool bNew) { mbIsPreviewRenderer = bNew; }
 
     // interface to allow derivates to set ViewInformation2D
-    void updateViewInformation2D(const 
drawinglayer::geometry::ViewInformation2D& rViewInformation2D) { 
maViewInformation2D = rViewInformation2D; }
+    void setViewInformation2D2D(const 
drawinglayer::geometry::ViewInformation2D& rViewInformation2D) { 
maViewInformation2D = rViewInformation2D; }
 
 public:
     // basic constructor
diff --git a/include/svx/sdr/overlay/overlaymanager.hxx 
b/include/svx/sdr/overlay/overlaymanager.hxx
index 3ce37976a99d..7a704c99dfbc 100644
--- a/include/svx/sdr/overlay/overlaymanager.hxx
+++ b/include/svx/sdr/overlay/overlaymanager.hxx
@@ -62,9 +62,9 @@ namespace sdr::overlay
 
             // hold buffered the logic length of discrete vector (1.0, 0.0) 
and the
             // view transformation belonging to it. Update happens in 
getDiscreteOne()
-            basegfx::B2DHomMatrix                       maViewTransformation;
-            drawinglayer::geometry::ViewInformation2D   maViewInformation2D;
-            double                                      mfDiscreteOne;
+            mutable basegfx::B2DHomMatrix                       
maViewTransformation;
+            mutable drawinglayer::geometry::ViewInformation2D   
maViewInformation2D;
+            mutable double                                      mfDiscreteOne;
 
             // internal
             void ImpDrawMembers(const basegfx::B2DRange& rRange, OutputDevice& 
rDestinationDevice) const;
@@ -77,6 +77,7 @@ namespace sdr::overlay
             double getDiscreteOne() const;
 
             tools::Rectangle RangeToInvalidateRectangle(const 
basegfx::B2DRange& rRange) const;
+            bool isOutputToRecordingMetaFile() const;
 
             OverlayManager(OutputDevice& rOutputDevice);
             virtual ~OverlayManager() override;
diff --git a/svx/source/engine3d/helperminimaldepth3d.cxx 
b/svx/source/engine3d/helperminimaldepth3d.cxx
index cfcc2c7d1483..9c3be1fd93a8 100644
--- a/svx/source/engine3d/helperminimaldepth3d.cxx
+++ b/svx/source/engine3d/helperminimaldepth3d.cxx
@@ -75,13 +75,13 @@ namespace drawinglayer::processor3d
                         aLastViewInformation3D.getDeviceToView(),
                         aLastViewInformation3D.getViewTime(),
                         
aLastViewInformation3D.getExtendedInformationSequence());
-                    updateViewInformation(aNewViewInformation3D);
+                    setViewInformation3D(aNewViewInformation3D);
 
                     // let break down
                     process(rPrimitive.getChildren());
 
                     // restore transformations
-                    updateViewInformation(aLastViewInformation3D);
+                    setViewInformation3D(aLastViewInformation3D);
                     break;
                 }
                 case PRIMITIVE3D_ID_POLYGONHAIRLINEPRIMITIVE3D :
diff --git a/svx/source/sdr/contact/objectcontactofobjlistpainter.cxx 
b/svx/source/sdr/contact/objectcontactofobjlistpainter.cxx
index 475a3913d3ed..f90ecdb94533 100644
--- a/svx/source/sdr/contact/objectcontactofobjlistpainter.cxx
+++ b/svx/source/sdr/contact/objectcontactofobjlistpainter.cxx
@@ -101,7 +101,7 @@ void 
ObjectContactOfObjListPainter::ProcessDisplay(DisplayInfo& rDisplayInfo)
     
aNewViewInformation2D.setViewTransformation(pTargetDevice->GetViewTransformation());
     aNewViewInformation2D.setViewport(aViewRange);
     aNewViewInformation2D.setVisualizedPage(GetXDrawPageForSdrPage(const_cast< 
SdrPage* >(mpProcessedPage)));
-    updateViewInformation2D(aNewViewInformation2D);
+    setViewInformation2D2D(aNewViewInformation2D);
 
     // collect primitive data in a sequence; this will already use the updated 
ViewInformation2D
     drawinglayer::primitive2d::Primitive2DContainer xPrimitiveSequence;
diff --git a/svx/source/sdr/contact/objectcontactofpageview.cxx 
b/svx/source/sdr/contact/objectcontactofpageview.cxx
index 28b40a56d59e..edef3241f38b 100644
--- a/svx/source/sdr/contact/objectcontactofpageview.cxx
+++ b/svx/source/sdr/contact/objectcontactofpageview.cxx
@@ -224,12 +224,17 @@ namespace sdr::contact
             if 
(static_cast<SdrPaintView&>(mrPageWindow.GetPageView().GetView()).IsTextEdit())
                 aNewViewInformation2D.setTextEditActive(true);
 
-            // this is the EditView repaint, provide that information,
-            // but only if we do not export to metafile
             if (!isOutputToRecordingMetaFile())
+            {
+                // this is the EditView repaint, provide that information,
+                // but only if we do not export to metafile
                 aNewViewInformation2D.setEditViewActive(true);
 
-            updateViewInformation2D(aNewViewInformation2D);
+                // also copy the current DrawModeFlags
+                
aNewViewInformation2D.setDrawModeFlags(rTargetOutDev.GetDrawMode());
+            }
+
+            setViewInformation2D2D(aNewViewInformation2D);
 
             drawinglayer::primitive2d::Primitive2DContainer xPrimitiveSequence;
 
diff --git a/svx/source/sdr/contact/viewobjectcontactofpageobj.cxx 
b/svx/source/sdr/contact/viewobjectcontactofpageobj.cxx
index b7b0e1744259..5a72fd749ae9 100644
--- a/svx/source/sdr/contact/viewobjectcontactofpageobj.cxx
+++ b/svx/source/sdr/contact/viewobjectcontactofpageobj.cxx
@@ -144,7 +144,7 @@ drawinglayer::primitive2d::Primitive2DContainer 
PagePrimitiveExtractor::createPr
         // no time; page previews are not animated
         aNewViewInformation2D.setViewTime(0.0);
 
-        updateViewInformation2D(aNewViewInformation2D);
+        setViewInformation2D2D(aNewViewInformation2D);
 
         // create copy of DisplayInfo to set PagePainting
         DisplayInfo aDisplayInfo;
diff --git a/svx/source/sdr/overlay/overlaymanager.cxx 
b/svx/source/sdr/overlay/overlaymanager.cxx
index 8b6d40006416..266555716e74 100644
--- a/svx/source/sdr/overlay/overlaymanager.cxx
+++ b/svx/source/sdr/overlay/overlaymanager.cxx
@@ -24,6 +24,7 @@
 #include <vcl/canvastools.hxx>
 #include <vcl/outdev.hxx>
 #include <vcl/window.hxx>
+#include <vcl/gdimtf.hxx>
 #include <svx/sdr/overlay/overlayobject.hxx>
 #include <basegfx/matrix/b2dhommatrix.hxx>
 #include <drawinglayer/processor2d/baseprocessor2d.hxx>
@@ -44,14 +45,14 @@ namespace sdr::overlay
             if(!nSize)
                 return;
 
-            // tdf#150622 for High Contrast we typically force colors to a 
single pair Fore/Back,
-            // but it seems reasonable to allow overlays to use the selection 
color
-            // taken from the system High Contrast settings
-            const DrawModeFlags 
nOriginalDrawMode(rDestinationDevice.GetDrawMode());
-
             // prepare ViewInformation2D
             drawinglayer::geometry::ViewInformation2D 
aViewInformation2D(getCurrentViewInformation2D());
 
+            // create processor
+            std::unique_ptr<drawinglayer::processor2d::BaseProcessor2D> 
pProcessor(drawinglayer::processor2d::createProcessor2DFromOutputDevice(
+                rDestinationDevice,
+                aViewInformation2D));
+
             for(const auto& rpOverlayObject : maOverlayObjects)
             {
                 OSL_ENSURE(rpOverlayObject, "Corrupted OverlayObject List 
(!)");
@@ -65,35 +66,23 @@ namespace sdr::overlay
                     {
                         if(rRange.overlaps(rCandidate.getBaseRange()))
                         {
-                            const bool 
bCurrentAA(aViewInformation2D.getUseAntiAliasing());
-                            const bool 
bWantedAA(rCandidate.allowsAntiAliase());
+                            // update AA flag at local ViewInformation2D
+                            
aViewInformation2D.setUseAntiAliasing(rCandidate.allowsAntiAliase());
 
-                            if (bCurrentAA != bWantedAA)
-                            {
-                                // set AntiAliasing at Processor2D
-                                
aViewInformation2D.setUseAntiAliasing(bWantedAA);
-                            }
+                            // update DrawModeFlags at local ViewInformation2D
+                            
aViewInformation2D.setDrawModeFlags(rCandidate.isHighContrastSelection() ?
+                                aViewInformation2D.getDrawModeFlags() | 
DrawModeFlags::SettingsForSelection :
+                                aViewInformation2D.getDrawModeFlags() & 
~DrawModeFlags::SettingsForSelection);
 
-                            const bool 
bIsHighContrastSelection(rCandidate.isHighContrastSelection());
-                            if (bIsHighContrastSelection)
+                            // set if changed - this will update the renderer 
and/or render
+                            // target, including changed settings, 
renderer-independent
+                            if (aViewInformation2D != 
pProcessor->getViewInformation2D())
                             {
-                                // overrule DrawMode settings
-                                
rDestinationDevice.SetDrawMode(nOriginalDrawMode | 
DrawModeFlags::SettingsForSelection);
+                                
pProcessor->setViewInformation2D(aViewInformation2D);
                             }
 
-                            // create processor
-                            
std::unique_ptr<drawinglayer::processor2d::BaseProcessor2D> 
pProcessor(drawinglayer::processor2d::createProcessor2DFromOutputDevice(
-                                rDestinationDevice,
-                                aViewInformation2D));
-
                             // render primitive
                             pProcessor->process(aSequence);
-
-                            if (bIsHighContrastSelection)
-                            {
-                                // restore DrawMode settings
-                                
rDestinationDevice.SetDrawMode(nOriginalDrawMode);
-                            }
                         }
                     }
                 }
@@ -146,8 +135,16 @@ namespace sdr::overlay
             return rtl::Reference<OverlayManager>(new 
OverlayManager(rOutputDevice));
         }
 
+        bool OverlayManager::isOutputToRecordingMetaFile() const
+        {
+            GDIMetaFile* pMetaFile(getOutputDevice().GetConnectMetaFile());
+            return (pMetaFile && pMetaFile->IsRecord() && 
!pMetaFile->IsPause());
+        }
+
         drawinglayer::geometry::ViewInformation2D const & 
OverlayManager::getCurrentViewInformation2D() const
         {
+            drawinglayer::geometry::ViewInformation2D 
aViewInformation(maViewInformation2D);
+
             if(getOutputDevice().GetViewTransformation() != 
maViewTransformation)
             {
                 basegfx::B2DRange 
aViewRange(maViewInformation2D.getViewport());
@@ -165,15 +162,25 @@ namespace sdr::overlay
                     }
                 }
 
-                OverlayManager* pThis = const_cast< OverlayManager* >(this);
-
-                pThis->maViewTransformation = 
getOutputDevice().GetViewTransformation();
-                drawinglayer::geometry::ViewInformation2D 
aViewInformation(maViewInformation2D);
+                maViewTransformation = 
getOutputDevice().GetViewTransformation();
                 aViewInformation.setViewTransformation(maViewTransformation);
                 aViewInformation.setViewport(aViewRange);
-                pThis->maViewInformation2D = std::move(aViewInformation);
+                mfDiscreteOne = 0.0;
+            }
 
-                pThis->mfDiscreteOne = 0.0;
+            if (!isOutputToRecordingMetaFile())
+            {
+                // this is the EditView repaint, provide that information,
+                // but only if we do not export to metafile
+                aViewInformation.setEditViewActive(true);
+
+                // also copy the current DrawModeFlags
+                
aViewInformation.setDrawModeFlags(getOutputDevice().GetDrawMode());
+            }
+
+            if (aViewInformation != maViewInformation2D)
+            {
+                maViewInformation2D = aViewInformation;
             }
 
             return maViewInformation2D;

Reply via email to