Resolves: tdf#152845 AutoText preview not readable in high contrast mode

if its a high contrast mode with white text on black background.  Reuse
isOutputToWindow to distinguish between the case we are outputting to
screen but not using a vcl::Window (and want to use the appropiate color
for autocolor) vs the cases we are printing or exporting to pdf and not
using a vcl::Window where the color should be black.

Change-Id: Ib688892a6315fe88ba585613539088611d3995ad
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145234
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/basctl/source/basicide/basdoc.cxx b/basctl/source/basicide/basdoc.cxx
index 83a3f17..ffd22b9 100644
--- a/basctl/source/basicide/basdoc.cxx
+++ b/basctl/source/basicide/basdoc.cxx
@@ -82,7 +82,7 @@ void DocShell::FillClass( SvGlobalName*, SotClipboardFormatId*, OUString*, sal_I
    DBG_ASSERT( !bTemplate, "No template for Basic" );
}

void DocShell::Draw( OutputDevice *, const JobSetup &, sal_uInt16 )
void DocShell::Draw( OutputDevice *, const JobSetup &, sal_uInt16, bool )
{}

} // namespace basctl
diff --git a/basctl/source/basicide/basdoc.hxx b/basctl/source/basicide/basdoc.hxx
index d5b3aab..bb847a0 100644
--- a/basctl/source/basicide/basdoc.hxx
+++ b/basctl/source/basicide/basdoc.hxx
@@ -34,7 +34,7 @@ class DocShell: public SfxObjectShell

protected:
    virtual void    Draw( OutputDevice *, const JobSetup & rSetup,
                          sal_uInt16 nAspect ) override;
                          sal_uInt16 nAspect, bool bOutputForScreen ) override;
    virtual void    FillClass( SvGlobalName * pClassName,
                               SotClipboardFormatId * pFormat,
                               OUString * pFullTypeName,
diff --git a/include/sfx2/objsh.hxx b/include/sfx2/objsh.hxx
index b64fa61..e3a5b4a 100644
--- a/include/sfx2/objsh.hxx
+++ b/include/sfx2/objsh.hxx
@@ -650,9 +650,10 @@ public:
    void            DoDraw( OutputDevice *, const Point & rObjPos,
                            const Size & rSize,
                            const JobSetup & rSetup,
                            sal_uInt16 nAspect = ASPECT_CONTENT );
                            sal_uInt16 nAspect = ASPECT_CONTENT,
                            bool bOutputForScreen = false );
    virtual void    Draw( OutputDevice *, const JobSetup & rSetup,
                          sal_uInt16 nAspect ) = 0;
                          sal_uInt16 nAspect, bool bOutputForScreen ) = 0;


    virtual void    FillClass( SvGlobalName * pClassName,
@@ -717,7 +718,8 @@ public:
                                            const Fraction & rScaleX,
                                            const Fraction & rScaleY,
                                            const JobSetup & rSetup,
                                            sal_uInt16 nAspect );
                                            sal_uInt16 nAspect,
                                            bool bOutputForScreen );

    // Shell Interface
    SAL_DLLPRIVATE void ExecFile_Impl(SfxRequest &);
diff --git a/sc/source/ui/docshell/docsh4.cxx b/sc/source/ui/docshell/docsh4.cxx
index a57a40e..3ef4dba 100644
--- a/sc/source/ui/docshell/docsh4.cxx
+++ b/sc/source/ui/docshell/docsh4.cxx
@@ -2174,7 +2174,7 @@ void ScDocShell::GetState( SfxItemSet &rSet )
    }
}

void ScDocShell::Draw( OutputDevice* pDev, const JobSetup & /* rSetup */, sal_uInt16 nAspect )
void ScDocShell::Draw( OutputDevice* pDev, const JobSetup & /* rSetup */, sal_uInt16 nAspect, bool /*bOutputToWindow*/ )
{

    SCTAB nVisTab = m_pDocument->GetVisibleTab();
diff --git a/sc/source/ui/inc/docsh.hxx b/sc/source/ui/inc/docsh.hxx
index edf0cbc..6df3ebc 100644
--- a/sc/source/ui/inc/docsh.hxx
+++ b/sc/source/ui/inc/docsh.hxx
@@ -198,7 +198,7 @@ public:
    virtual bool    DoSaveCompleted( SfxMedium * pNewStor=nullptr, bool bRegisterRecent=true ) override;     // SfxObjectShell
    virtual bool    QuerySlotExecutable( sal_uInt16 nSlotId ) override;

    virtual void    Draw( OutputDevice *, const JobSetup & rSetup, sal_uInt16 nAspect ) override;
    virtual void    Draw(OutputDevice *, const JobSetup & rSetup, sal_uInt16 nAspect, bool bOutputForScreen) override;

    virtual void    SetVisArea( const tools::Rectangle & rVisArea ) override;

diff --git a/sd/source/ui/docshell/docshel2.cxx b/sd/source/ui/docshell/docshel2.cxx
index 160c64a..caf0fc8 100644
--- a/sd/source/ui/docshell/docshel2.cxx
+++ b/sd/source/ui/docshell/docshel2.cxx
@@ -44,7 +44,7 @@ namespace sd {
/**
 * Drawing of DocShell (with the helper class SdDrawViewShell)
 */
void DrawDocShell::Draw(OutputDevice* pOut, const JobSetup&, sal_uInt16 nAspect)
void DrawDocShell::Draw(OutputDevice* pOut, const JobSetup&, sal_uInt16 nAspect, bool /*bOutputForScreen*/)
{
    if (nAspect == ASPECT_THUMBNAIL)
    {
diff --git a/sd/source/ui/inc/DrawDocShell.hxx b/sd/source/ui/inc/DrawDocShell.hxx
index 86917fc..e9dfe42 100644
--- a/sd/source/ui/inc/DrawDocShell.hxx
+++ b/sd/source/ui/inc/DrawDocShell.hxx
@@ -90,7 +90,7 @@ public:
    virtual bool            SaveAs( SfxMedium &rMedium  ) override;

    virtual ::tools::Rectangle       GetVisArea(sal_uInt16 nAspect) const override;
    virtual void            Draw(OutputDevice*, const JobSetup& rSetup, sal_uInt16 nAspect) override;
    virtual void            Draw(OutputDevice*, const JobSetup& rSetup, sal_uInt16 nAspect, bool bOutputForScreen) override;
    virtual SfxUndoManager* GetUndoManager() override;
    virtual Printer*        GetDocumentPrinter() override;
    virtual void            OnDocumentPrinterChanged(Printer* pNewPrinter) override;
diff --git a/sfx2/source/doc/objembed.cxx b/sfx2/source/doc/objembed.cxx
index 91e886c..f2e91ce 100644
--- a/sfx2/source/doc/objembed.cxx
+++ b/sfx2/source/doc/objembed.cxx
@@ -122,12 +122,12 @@ void SfxObjectShell::FillTransferableObjectDescriptor( TransferableObjectDescrip
    rDesc.maDisplayName.clear();
}


void SfxObjectShell::DoDraw( OutputDevice* pDev,
                            const Point & rObjPos,
                            const Size & rSize,
                            const JobSetup & rSetup,
                            sal_uInt16 nAspect )
                            sal_uInt16 nAspect,
                            bool bOutputForScreen )
{
    if (!rSize.Width() || !rSize.Height())
        return;
@@ -141,17 +141,17 @@ void SfxObjectShell::DoDraw( OutputDevice* pDev,
        Fraction aXF( rSize.Width(), aSize.Width() );
        Fraction aYF( rSize.Height(), aSize.Height() );

        DoDraw_Impl( pDev, rObjPos, aXF, aYF, rSetup, nAspect );
        DoDraw_Impl(pDev, rObjPos, aXF, aYF, rSetup, nAspect, bOutputForScreen);
    }
}


void SfxObjectShell::DoDraw_Impl( OutputDevice* pDev,
                               const Point & rViewPos,
                               const Fraction & rScaleX,
                               const Fraction & rScaleY,
                               const JobSetup & rSetup,
                               sal_uInt16 nAspect )
                               sal_uInt16 nAspect,
                               bool bOutputForScreen )
{
    tools::Rectangle aVisArea  = GetVisArea( nAspect );
    // MapUnit of the target
@@ -194,7 +194,7 @@ void SfxObjectShell::DoDraw_Impl( OutputDevice* pDev,
    if( pMtf )
        pMtf->Record( pDev );

    Draw( pDev, rSetup, nAspect );
    Draw( pDev, rSetup, nAspect, bOutputForScreen );

    // Restore Device settings
    pDev->Pop();
diff --git a/starmath/inc/document.hxx b/starmath/inc/document.hxx
index 214d9a9..bf9477b 100644
--- a/starmath/inc/document.hxx
+++ b/starmath/inc/document.hxx
@@ -103,7 +103,8 @@ class SM_DLLPUBLIC SmDocShell final : public SfxObjectShell, public SfxListener

    virtual void        Draw(OutputDevice *pDevice,
                             const JobSetup & rSetup,
                             sal_uInt16 nAspect) override;
                             sal_uInt16 nAspect,
                             bool bOutputForScreen) override;

    virtual void        FillClass(SvGlobalName* pClassName,
                                  SotClipboardFormatId*  pFormat,
diff --git a/starmath/source/document.cxx b/starmath/source/document.cxx
index 73b53f6..10143da 100644
--- a/starmath/source/document.cxx
+++ b/starmath/source/document.cxx
@@ -1139,7 +1139,8 @@ void SmDocShell::SaveSymbols()

void SmDocShell::Draw(OutputDevice *pDevice,
                      const JobSetup &,
                      sal_uInt16 /*nAspect*/)
                      sal_uInt16 /*nAspect*/,
                      bool /*bOutputForScreen*/)
{
    pDevice->IntersectClipRegion(GetVisArea());
    Point atmppoint;
diff --git a/sw/inc/docsh.hxx b/sw/inc/docsh.hxx
index 74fa222..890c2c4 100644
--- a/sw/inc/docsh.hxx
+++ b/sw/inc/docsh.hxx
@@ -120,7 +120,7 @@ class SW_DLLPUBLIC SwDocShell
    SAL_DLLPRIVATE virtual std::shared_ptr<SfxDocumentInfoDialog> CreateDocumentInfoDialog(weld::Window* pParent,
                                                                                           const SfxItemSet &rSet) override;
    /// OLE-stuff
    SAL_DLLPRIVATE virtual void          Draw( OutputDevice*, const JobSetup&, sal_uInt16 nAspect) override;
    SAL_DLLPRIVATE virtual void Draw(OutputDevice*, const JobSetup&, sal_uInt16 nAspect, bool bOutputToWindow) override;

    /// Methods for StyleSheets

diff --git a/sw/inc/viewsh.hxx b/sw/inc/viewsh.hxx
index 1114478..3c8bc31 100644
--- a/sw/inc/viewsh.hxx
+++ b/sw/inc/viewsh.hxx
@@ -367,7 +367,8 @@ public:

    // Printing for OLE 2.0.
    static void PrtOle2( SwDoc *pDoc, const SwViewOption *pOpt, const SwPrintData& rOptions,
                         vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect );
                         vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect,
                         bool bOutputForScreen );

    // Fill temporary doc with selected text for Print or PDF export.
    void FillPrtDoc( SwDoc& rPrtDoc, const SfxPrinter* pPrt );
diff --git a/sw/source/core/doc/notxtfrm.cxx b/sw/source/core/doc/notxtfrm.cxx
index 6cb7155..640d8dc 100644
--- a/sw/source/core/doc/notxtfrm.cxx
+++ b/sw/source/core/doc/notxtfrm.cxx
@@ -1264,7 +1264,7 @@ void SwNoTextFrame::ImplPaintPictureGraphic( vcl::RenderContext* pOut,
            ? pImp->GetPageView()
            : nullptr);
        // tdf#130951 caution - target may be Window, use the correct OutputDevice
        OutputDevice* pTarget(pShell->isOutputToWindow()
        OutputDevice* pTarget((pShell->isOutputToWindow() && pShell->GetWin())
            ? pShell->GetWin()->GetOutDev()
            : pShell->GetOut());
        SdrPageWindow* pPageWindow(nullptr != pPageView && nullptr != pTarget
diff --git a/sw/source/core/txtnode/fntcache.cxx b/sw/source/core/txtnode/fntcache.cxx
index 20ed476..0387246 100644
--- a/sw/source/core/txtnode/fntcache.cxx
+++ b/sw/source/core/txtnode/fntcache.cxx
@@ -2134,7 +2134,10 @@ bool SwDrawTextInfo::ApplyAutoColor( vcl::Font* pFont )
    bool bChgFntColor = false;
    bool bChgLineColor = false;

    if (GetShell() && !GetShell()->GetWin() && GetShell()->GetViewOptions()->IsBlackFont())
    const SwViewShell *pVSh = GetShell();
    const bool bOutputToWindow(pVSh && (pVSh->GetWin() || pVSh->isOutputToWindow()));

    if (pVSh && !bOutputToWindow && pVSh->GetViewOptions()->IsBlackFont())
    {
        if ( COL_BLACK != rFnt.GetColor() )
            bChgFntColor = true;
@@ -2150,8 +2153,8 @@ bool SwDrawTextInfo::ApplyAutoColor( vcl::Font* pFont )
        // LineColor has to be changed if:
        // 1. IsAlwaysAutoColor is set

        bChgLineColor = GetShell() && GetShell()->GetWin() &&
                GetShell()->GetAccessibilityOptions()->IsAlwaysAutoColor();
        bChgLineColor = pVSh && bOutputToWindow &&
                pVSh->GetAccessibilityOptions()->IsAlwaysAutoColor();

        bChgFntColor = COL_AUTO == rFnt.GetColor() || bChgLineColor;

@@ -2200,10 +2203,10 @@ bool SwDrawTextInfo::ApplyAutoColor( vcl::Font* pFont )
            if ( ! pCol )
                pCol = aGlobalRetoucheColor;

            if( GetShell() && GetShell()->GetWin() )
            if (pVSh && bOutputToWindow)
            {
                // here we determine the preferred window text color for painting
                const SwViewOption* pViewOption = GetShell()->GetViewOptions();
                const SwViewOption* pViewOption = pVSh->GetViewOptions();
                if(pViewOption->IsPagePreview() &&
                        !officecfg::Office::Common::Accessibility::IsForPagePreviews::get())
                    nNewColor = COL_BLACK;
diff --git a/sw/source/core/view/viewimp.cxx b/sw/source/core/view/viewimp.cxx
index 272cd96..0ca4026 100644
--- a/sw/source/core/view/viewimp.cxx
+++ b/sw/source/core/view/viewimp.cxx
@@ -291,7 +291,7 @@ Color SwViewShellImp::GetRetoucheColor() const
{
    Color aRet( COL_TRANSPARENT );
    const SwViewShell &rSh = *GetShell();
    if ( rSh.GetWin() )
    if (rSh.GetWin() || rSh.isOutputToWindow())
    {
        if ( rSh.GetViewOptions()->getBrowseMode() &&
             COL_TRANSPARENT != rSh.GetViewOptions()->GetRetoucheColor() )
diff --git a/sw/source/core/view/vprint.cxx b/sw/source/core/view/vprint.cxx
index c792773..0ad22cc 100644
--- a/sw/source/core/view/vprint.cxx
+++ b/sw/source/core/view/vprint.cxx
@@ -574,7 +574,8 @@ bool SwViewShell::PrintOrPDFExport(
}

void SwViewShell::PrtOle2( SwDoc *pDoc, const SwViewOption *pOpt, const SwPrintData& rOptions,
                           vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect )
                           vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect,
                           bool bOutputForScreen )
{
    // For printing a shell is needed. Either the Doc already has one, then we
    // create a new view, or it has none, then we create the first view.
@@ -584,6 +585,8 @@ void SwViewShell::PrtOle2( SwDoc *pDoc, const SwViewOption *pOpt, const SwPrintD
    else
        pSh.reset(new SwViewShell( *pDoc, nullptr, pOpt, &rRenderContext));

    pSh->setOutputToWindow(bOutputForScreen);

    {
        CurrShell aCurr( pSh.get() );
        pSh->PrepareForPrint( rOptions );
diff --git a/sw/source/uibase/app/docsh.cxx b/sw/source/uibase/app/docsh.cxx
index b9a8430..72dd331 100644
--- a/sw/source/uibase/app/docsh.cxx
+++ b/sw/source/uibase/app/docsh.cxx
@@ -847,7 +847,7 @@ bool SwDocShell::SaveCompleted( const uno::Reference < embed::XStorage >& xStor 

// Draw()-Override for OLE2 (Sfx)
void SwDocShell::Draw( OutputDevice* pDev, const JobSetup& rSetup,
                               sal_uInt16 nAspect )
                               sal_uInt16 nAspect, bool bOutputForScreen )
{
    //fix #25341# Draw should not affect the Modified
    bool bResetModified = IsEnableSetModified();
@@ -876,7 +876,7 @@ void SwDocShell::Draw( OutputDevice* pDev, const JobSetup& rSetup,
    pDev->SetBackground();
    const bool bWeb = dynamic_cast< const SwWebDocShell *>( this ) !=  nullptr;
    SwPrintData aOpts;
    SwViewShell::PrtOle2(m_xDoc.get(), SW_MOD()->GetUsrPref(bWeb), aOpts, *pDev, aRect);
    SwViewShell::PrtOle2(m_xDoc.get(), SW_MOD()->GetUsrPref(bWeb), aOpts, *pDev, aRect, bOutputForScreen);
    pDev->Pop();

    if( pOrig )
diff --git a/sw/source/uibase/utlui/unotools.cxx b/sw/source/uibase/utlui/unotools.cxx
index fba4437..74f47fc 100644
--- a/sw/source/uibase/utlui/unotools.cxx
+++ b/sw/source/uibase/utlui/unotools.cxx
@@ -53,6 +53,7 @@
#include <comphelper/string.hxx>
#include <docsh.hxx>
#include <editsh.hxx>
#include <wrtsh.hxx>
#include <swmodule.hxx>
#include <TextCursorHelper.hxx>
#include <doc.hxx>
@@ -169,7 +170,7 @@ void SwOneExampleFrame::Paint(vcl::RenderContext& rRenderContext, const tools::R
        tools::Rectangle aRect(Point(), m_xVirDev->PixelToLogic(aSize));
        pShell->SetVisArea(tools::Rectangle(Point(), Size(aRect.GetWidth() * fZoom,
                                                          aRect.GetHeight() * fZoom)));
        pShell->DoDraw(m_xVirDev.get(), aRect.TopLeft(), aRect.GetSize(), JobSetup(), ASPECT_CONTENT);
        pShell->DoDraw(m_xVirDev.get(), aRect.TopLeft(), aRect.GetSize(), JobSetup(), ASPECT_CONTENT, true);
        m_xVirDev->Pop();
    }