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()