drawinglayer/source/processor2d/baseprocessor2d.cxx        |    5 ++
 drawinglayer/source/processor2d/cairopixelprocessor2d.cxx  |   14 +++++++
 drawinglayer/source/processor2d/vclprocessor2d.cxx         |   25 +++++++++++--
 drawinglayer/source/processor2d/vclprocessor2d.hxx         |    8 ++++
 include/drawinglayer/processor2d/baseprocessor2d.hxx       |    5 +-
 include/drawinglayer/processor2d/cairopixelprocessor2d.hxx |    4 ++
 svx/source/sdr/overlay/overlaymanager.cxx                  |   20 ++++------
 7 files changed, 66 insertions(+), 15 deletions(-)

New commits:
commit a7c39fb097435f5219ee8dc6ec3fec62b14ebd5b
Author:     Armin Le Grand (collabora) <armin.legr...@collabora.com>
AuthorDate: Wed Jul 23 11:50:31 2025 +0200
Commit:     Armin Le Grand <armin.le.gr...@me.com>
CommitDate: Wed Jul 23 15:06:36 2025 +0200

    Allow changing ViewInformation2D in BaseProcessor2D
    
    In OverlayManager rendering AA state is set at the target
    OutputDevice, this obviously only works if the target
    renderer *is* an OutputDevice, thus not with e.g. CairoSDPR.
    
    Thus I added changing ViewInformation2D in BaseProcessor2D
    directly. This simplifies if changes to a primitive renderer
    have to be made while it's lifetime.
    
    All other aspects of ViewInformation2D can of course also
    be changed. There were occasions in the past where working
    around this was needed, this is then obsolete.
    
    Since e.g. setting AA at the target renderer which
    may not always be an OutputDevice makes this also target
    device independent - the primitive renderer is the instance
    that knows how to apply this correctly.
    
    Change-Id: I1836d08d0844dfed81bb84e8fccbe3fabe2831c3
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188220
    Tested-by: Jenkins
    Reviewed-by: Armin Le Grand <armin.le.gr...@me.com>

diff --git a/drawinglayer/source/processor2d/baseprocessor2d.cxx 
b/drawinglayer/source/processor2d/baseprocessor2d.cxx
index 8209ca00f0fb..92b2e3c8d545 100644
--- a/drawinglayer/source/processor2d/baseprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/baseprocessor2d.cxx
@@ -68,6 +68,11 @@ namespace drawinglayer::processor2d
             }
         }
 
+        void BaseProcessor2D::setViewInformation2D(const 
geometry::ViewInformation2D& rNew)
+        {
+            if (rNew != maViewInformation2D)
+                updateViewInformation(rNew);
+        }
 } // end of namespace
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/drawinglayer/source/processor2d/cairopixelprocessor2d.cxx 
b/drawinglayer/source/processor2d/cairopixelprocessor2d.cxx
index 167caaad50f4..944eb6000af6 100644
--- a/drawinglayer/source/processor2d/cairopixelprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/cairopixelprocessor2d.cxx
@@ -950,6 +950,20 @@ bool checkCoordinateLimitWorkaroundNeededForUsedCairo()
 
 namespace drawinglayer::processor2d
 {
+void CairoPixelProcessor2D::updateViewInformation(
+    const geometry::ViewInformation2D& rViewInformation2D)
+{
+    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 
geometry::ViewInformation2D& rViewInformation,
                                              cairo_surface_t* pTarget)
     : BaseProcessor2D(rViewInformation)
diff --git a/drawinglayer/source/processor2d/vclprocessor2d.cxx 
b/drawinglayer/source/processor2d/vclprocessor2d.cxx
index 575431513e8e..7d6c053ef8cd 100644
--- a/drawinglayer/source/processor2d/vclprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/vclprocessor2d.cxx
@@ -1596,21 +1596,42 @@ void VclProcessor2D::adaptTextToFillDrawMode() const
     mpOutputDevice->SetDrawMode(nAdaptedDrawMode);
 }
 
-// process support
+void VclProcessor2D::updateViewInformation(const geometry::ViewInformation2D& 
rViewInformation2D)
+{
+    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()
+                                        | AntialiasingFlags::Enable);
+    else
+        mpOutputDevice->SetAntialiasing(mpOutputDevice->GetAntialiasing()
+                                        & ~AntialiasingFlags::Enable);
+}
+
+// process support
 VclProcessor2D::VclProcessor2D(const geometry::ViewInformation2D& 
rViewInformation,
                                OutputDevice& rOutDev)
     : BaseProcessor2D(rViewInformation)
     , mpOutputDevice(&rOutDev)
     , maBColorModifierStack()
     , mnPolygonStrokePrimitive2D(0)
+    , mnOriginalAA(rOutDev.GetAntialiasing())
 {
     // set digit language, derived from SvtCTLOptions to have the correct
     // number display for arabic/hindi numerals
     rOutDev.SetDigitLanguage(drawinglayer::detail::getDigitLanguage());
+
+    // NOTE: to save/restore oringinal AntiAliasing mode we need
+    // to use mnOriginalAA here - OutputDevice::Push/Pop does not
+    // offer that
 }
 
-VclProcessor2D::~VclProcessor2D() {}
+VclProcessor2D::~VclProcessor2D() { 
mpOutputDevice->SetAntialiasing(mnOriginalAA); }
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/drawinglayer/source/processor2d/vclprocessor2d.hxx 
b/drawinglayer/source/processor2d/vclprocessor2d.hxx
index d2c7381f262c..a35ead52a4ad 100644
--- a/drawinglayer/source/processor2d/vclprocessor2d.hxx
+++ b/drawinglayer/source/processor2d/vclprocessor2d.hxx
@@ -22,6 +22,7 @@
 #include <drawinglayer/processor2d/baseprocessor2d.hxx>
 #include <basegfx/matrix/b2dhommatrix.hxx>
 #include <basegfx/color/bcolormodifier.hxx>
+#include <vcl/rendercontext/AntialiasingFlags.hxx>
 #include <vcl/vclptr.hxx>
 
 class OutputDevice;
@@ -72,6 +73,9 @@ protected:
     // PolygonStrokePrimitive2D's decompositions (normally only one)
     sal_uInt32 mnPolygonStrokePrimitive2D;
 
+    // AntialiasingFlags, saved at construction time
+    const AntialiasingFlags mnOriginalAA;
+
     // common VCL rendering support
     void RenderTextSimpleOrDecoratedPortionPrimitive2D(
         const primitive2d::TextSimplePortionPrimitive2D& rTextCandidate);
@@ -105,6 +109,10 @@ protected:
     void adaptLineToFillDrawMode() const;
     void adaptTextToFillDrawMode() const;
 
+    // allow to react on changes
+    virtual void
+    updateViewInformation(const geometry::ViewInformation2D& 
rViewInformation2D) override;
+
 public:
     // constructor/destructor
     VclProcessor2D(const geometry::ViewInformation2D& rViewInformation, 
OutputDevice& rOutDev);
diff --git a/include/drawinglayer/processor2d/baseprocessor2d.hxx 
b/include/drawinglayer/processor2d/baseprocessor2d.hxx
index 9d1bb6b8a7a5..69624bd9de6f 100644
--- a/include/drawinglayer/processor2d/baseprocessor2d.hxx
+++ b/include/drawinglayer/processor2d/baseprocessor2d.hxx
@@ -162,7 +162,7 @@ namespace drawinglayer::processor2d
                 ViewInformation2D if needed. This allows isolating these 
accesses
                 later if needed
              */
-            void updateViewInformation(const geometry::ViewInformation2D& 
rViewInformation2D)
+            virtual void updateViewInformation(const 
geometry::ViewInformation2D& rViewInformation2D)
             {
                 maViewInformation2D = rViewInformation2D;
             }
@@ -188,8 +188,9 @@ namespace drawinglayer::processor2d
             /// the central processing method
             void process(const primitive2d::Primitive2DContainer& rSource);
 
-            /// data read access
+            /// data read/write access to ViewInformation2D
             const geometry::ViewInformation2D& getViewInformation2D() const { 
return maViewInformation2D; }
+            void setViewInformation2D(const geometry::ViewInformation2D& rNew);
         };
 
 } // end of namespace drawinglayer::processor2d
diff --git a/include/drawinglayer/processor2d/cairopixelprocessor2d.hxx 
b/include/drawinglayer/processor2d/cairopixelprocessor2d.hxx
index eb7515c0b77c..e97b1042a8d0 100644
--- a/include/drawinglayer/processor2d/cairopixelprocessor2d.hxx
+++ b/include/drawinglayer/processor2d/cairopixelprocessor2d.hxx
@@ -194,6 +194,10 @@ 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;
+
     // constructor to create a CairoPixelProcessor2D for
     // the given cairo_surface_t pTarget. pTarget will not
     // be owned and not destroyed, but be used as render
diff --git a/svx/source/sdr/overlay/overlaymanager.cxx 
b/svx/source/sdr/overlay/overlaymanager.cxx
index b31197ab59ac..de70e8e138eb 100644
--- a/svx/source/sdr/overlay/overlaymanager.cxx
+++ b/svx/source/sdr/overlay/overlaymanager.cxx
@@ -44,8 +44,6 @@ namespace sdr::overlay
             if(!nSize)
                 return;
 
-            const AntialiasingFlags 
nOriginalAA(rDestinationDevice.GetAntialiasing());
-            const bool 
bIsAntiAliasing(getCurrentViewInformation2D().getUseAntiAliasing());
             // 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
@@ -69,13 +67,15 @@ namespace sdr::overlay
                     {
                         if(rRange.overlaps(rCandidate.getBaseRange()))
                         {
-                            if(bIsAntiAliasing && 
rCandidate.allowsAntiAliase())
-                            {
-                                rDestinationDevice.SetAntialiasing(nOriginalAA 
| AntialiasingFlags::Enable);
-                            }
-                            else
+                            const bool 
bCurrentAA(pProcessor->getViewInformation2D().getUseAntiAliasing());
+                            const bool 
bWantedAA(rCandidate.allowsAntiAliase());
+
+                            if (bCurrentAA != bWantedAA)
                             {
-                                rDestinationDevice.SetAntialiasing(nOriginalAA 
& ~AntialiasingFlags::Enable);
+                                // set AntiAliasing at Processor2D
+                                drawinglayer::geometry::ViewInformation2D 
aViewInformation2D(pProcessor->getViewInformation2D());
+                                
aViewInformation2D.setUseAntiAliasing(bWantedAA);
+                                
pProcessor->setViewInformation2D(aViewInformation2D);
                             }
 
                             const bool bIsHighContrastSelection = 
rCandidate.isHighContrastSelection();
@@ -97,10 +97,8 @@ namespace sdr::overlay
                 }
             }
 
+            // destroy Processor2D and restore AA settings
             pProcessor.reset();
-
-            // restore AA settings
-            rDestinationDevice.SetAntialiasing(nOriginalAA);
         }
 
         void OverlayManager::ImpStripeDefinitionChanged()

Reply via email to