Move all handling of AA allowing from svt to drawinglayer

Commit 444bf8710d5da7b584fbcb94693e4ed8d2e29297 (Update handling of
AntiAliasing settings and processor2d, 2022-11-08) moved the actual
variable holding the AA state to drawinglayer, which introduced a
duplication of the information.

This moves all the handling from svt to drawinglayer, so that svt
functions only use respective drawinglayer functions. Well, almost:
the IsAAPossibleOnThisSystem function needs vcl, so stays in svt.

Change-Id: I887307fbca1ca0cff1f5f32446e3599817099c3f
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151163
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
diff --git a/drawinglayer/source/geometry/viewinformation2d.cxx b/drawinglayer/source/geometry/viewinformation2d.cxx
index 7e02406..03089e4 100644
--- a/drawinglayer/source/geometry/viewinformation2d.cxx
+++ b/drawinglayer/source/geometry/viewinformation2d.cxx
@@ -25,8 +25,11 @@
#include <com/sun/star/drawing/XDrawPage.hpp>
#include <com/sun/star/geometry/AffineMatrix2D.hpp>
#include <com/sun/star/geometry/RealRectangle2D.hpp>
#include <o3tl/temporary.hxx>
#include <officecfg/Office/Common.hxx>
#include <unotools/configmgr.hxx>

#include <atomic>
#include <utility>

using namespace com::sun::star;
@@ -48,7 +51,6 @@ constexpr OUStringLiteral g_PropertyName_PixelSnapHairline = u"PixelSnapHairline
namespace
{
bool bForwardsAreInitialized(false);
bool bForwardedAntiAliasing(true);
bool bForwardPixelSnapHairline(true);
}

@@ -105,8 +107,8 @@ public:
        , mxVisualizedPage()
        , mfViewTime(0.0)
        , mbReducedDisplayQuality(false)
        , mbUseAntiAliasing(bForwardedAntiAliasing)
        , mbPixelSnapHairline(bForwardedAntiAliasing && bForwardPixelSnapHairline)
        , mbUseAntiAliasing(ViewInformation2D::getGlobalAntiAliasing())
        , mbPixelSnapHairline(mbUseAntiAliasing && bForwardPixelSnapHairline)
    {
    }

@@ -227,13 +229,12 @@ ViewInformation2D::ViewInformation2D()
        bForwardsAreInitialized = true;
        if (!utl::ConfigManager::IsFuzzing())
        {
            bForwardedAntiAliasing = officecfg::Office::Common::Drawinglayer::AntiAliasing::get();
            bForwardPixelSnapHairline
                = officecfg::Office::Common::Drawinglayer::SnapHorVerLinesToDiscrete::get();
        }
    }

    setUseAntiAliasing(bForwardedAntiAliasing);
    setUseAntiAliasing(ViewInformation2D::getGlobalAntiAliasing());
    setPixelSnapHairline(bForwardPixelSnapHairline);
}

@@ -352,11 +353,31 @@ void ViewInformation2D::setPixelSnapHairline(bool bNew)
        mpViewInformation2D->setPixelSnapHairline(bNew);
}

void ViewInformation2D::forwardAntiAliasing(bool bAntiAliasing)
static std::atomic<bool>& globalAntiAliasing()
{
    bForwardedAntiAliasing = bAntiAliasing;
    static std::atomic<bool> g_GlobalAntiAliasing
        = utl::ConfigManager::IsFuzzing()
          || officecfg::Office::Common::Drawinglayer::AntiAliasing::get();
    return g_GlobalAntiAliasing;
}

/**
  * Some code like to turn this stuff on and off during a drawing operation
  * so it can "tunnel" information down through several layers,
  * so we don't want to actually do a config write all the time.
  */
void ViewInformation2D::setGlobalAntiAliasing(bool bAntiAliasing, bool bTemporary)
{
    if (globalAntiAliasing().compare_exchange_strong(o3tl::temporary(!bAntiAliasing), bAntiAliasing)
        && !bTemporary)
    {
        auto batch = comphelper::ConfigurationChanges::create();
        officecfg::Office::Common::Drawinglayer::AntiAliasing::set(bAntiAliasing, batch);
        batch->commit();
    }
}
bool ViewInformation2D::getGlobalAntiAliasing() { return globalAntiAliasing(); }

void ViewInformation2D::forwardPixelSnapHairline(bool bPixelSnapHairline)
{
    bForwardPixelSnapHairline = bPixelSnapHairline;
diff --git a/include/drawinglayer/geometry/viewinformation2d.hxx b/include/drawinglayer/geometry/viewinformation2d.hxx
index e71ab08..8f1bd63 100644
--- a/include/drawinglayer/geometry/viewinformation2d.hxx
+++ b/include/drawinglayer/geometry/viewinformation2d.hxx
@@ -159,7 +159,8 @@ public:
    bool getPixelSnapHairline() const;
    void setPixelSnapHairline(bool bNew);

    static void forwardAntiAliasing(bool bAntiAliasing);
    static void setGlobalAntiAliasing(bool bAntiAliasing, bool bTemporary);
    static bool getGlobalAntiAliasing();
    static void forwardPixelSnapHairline(bool bPixelSnapHairline);
};

diff --git a/svtools/source/config/optionsdrawinglayer.cxx b/svtools/source/config/optionsdrawinglayer.cxx
index 0564adf..a4ec26a 100644
--- a/svtools/source/config/optionsdrawinglayer.cxx
+++ b/svtools/source/config/optionsdrawinglayer.cxx
@@ -119,53 +119,25 @@ sal_uInt32 GetMaximumPaperBottomMargin()
    return officecfg::Office::Common::Drawinglayer::MaximumPaperBottomMargin::get();
}

static std::mutex gaAntiAliasMutex;
static bool gbAntiAliasingInit = false;
static bool gbAntiAliasing = false;
static bool gbAllowAAInit = false;
static bool gbAllowAA = false;

static bool gbAntiAliasingForwardInitial(false);
static bool gbAntiAliasingForwardLast(true);

static bool gbPixelSnapHairlineForwardInitial(false);
static bool gbPixelSnapHairlineForwardLast(true);

bool IsAAPossibleOnThisSystem()
{
    std::scoped_lock aGuard(gaAntiAliasMutex);
    if (!gbAllowAAInit)
    {
        gbAllowAAInit = true;
        gbAllowAA = Application::GetDefaultDevice()->SupportsOperation( OutDevSupportType::TransparentRect );
    }
    static const bool gbAllowAA
        = Application::GetDefaultDevice()->SupportsOperation(OutDevSupportType::TransparentRect);
    return gbAllowAA;
}


bool IsAntiAliasing()
{
    bool bAntiAliasing;
    bool bAntiAliasing = drawinglayer::geometry::ViewInformation2D::getGlobalAntiAliasing();
    if (bAntiAliasing && !IsAAPossibleOnThisSystem())
    {
        std::scoped_lock aGuard(gaAntiAliasMutex);
        if (!gbAntiAliasingInit)
        {
            gbAntiAliasingInit = true;
            gbAntiAliasing = officecfg::Office::Common::Drawinglayer::AntiAliasing::get();
        }
        bAntiAliasing = gbAntiAliasing;
        drawinglayer::geometry::ViewInformation2D::setGlobalAntiAliasing(false, true);
        bAntiAliasing = false;
    }

    bAntiAliasing = bAntiAliasing && IsAAPossibleOnThisSystem();

    //
    if (!gbAntiAliasingForwardInitial || gbAntiAliasingForwardLast != bAntiAliasing)
    {
        gbAntiAliasingForwardInitial = true;
        gbAntiAliasingForwardLast = bAntiAliasing;
        drawinglayer::geometry::ViewInformation2D::forwardAntiAliasing(bAntiAliasing);
    }

    return bAntiAliasing;
}

@@ -176,23 +148,7 @@ bool IsAntiAliasing()
  */
void SetAntiAliasing( bool bOn, bool bTemporary )
{
    std::scoped_lock aGuard(gaAntiAliasMutex);
    if (!bTemporary)
    {
        std::shared_ptr<comphelper::ConfigurationChanges> batch =
                comphelper::ConfigurationChanges::create();
        officecfg::Office::Common::Drawinglayer::AntiAliasing::set(bOn, batch);
        batch->commit();
    }

    if (!gbAntiAliasingForwardInitial || gbAntiAliasingForwardLast != bOn)
    {
        gbAntiAliasingForwardInitial = true;
        gbAntiAliasingForwardLast = bOn;
        drawinglayer::geometry::ViewInformation2D::forwardAntiAliasing(bOn);
    }

    gbAntiAliasing = bOn;
    drawinglayer::geometry::ViewInformation2D::setGlobalAntiAliasing(bOn, bTemporary);
}