editeng/source/editeng/StripPortionsHelper.cxx | 54 +++++++++++++++--------- editeng/source/editeng/editview.cxx | 3 - editeng/source/editeng/impedit3.cxx | 24 +++++----- editeng/source/outliner/outlvw.cxx | 3 - include/editeng/StripPortionsHelper.hxx | 25 ++++++++--- include/svx/svdoutl.hxx | 2 sc/source/ui/view/tabview3.cxx | 5 +- svx/source/svdraw/svdedxv.cxx | 7 ++- svx/source/svdraw/svdotextdecomposition.cxx | 5 ++ svx/source/svdraw/svdotextpathdecomposition.cxx | 8 +++ svx/source/svdraw/svdoutl.cxx | 4 + 11 files changed, 97 insertions(+), 43 deletions(-)
New commits: commit d6a3d308598d47d6658c51a95a561cc3c93a3393 Author: Armin Le Grand (collabora) <armin.legr...@collabora.com> AuthorDate: Fri Jul 18 16:49:03 2025 +0200 Commit: Armin Le Grand <armin.le.gr...@me.com> CommitDate: Fri Jul 18 18:43:27 2025 +0200 tdf#167511 correctly apply Color in HighContrast mode to text II For more info please have a look at https://bugs.documentfoundation.org/show_bug.cgi?id=167511 Change-Id: I2c829f7fb42853aa82cff073fa1432ac05d224a7 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188043 Tested-by: Jenkins Reviewed-by: Armin Le Grand <armin.le.gr...@me.com> diff --git a/editeng/source/editeng/StripPortionsHelper.cxx b/editeng/source/editeng/StripPortionsHelper.cxx index cf8e59d6489e..808f848991a4 100644 --- a/editeng/source/editeng/StripPortionsHelper.cxx +++ b/editeng/source/editeng/StripPortionsHelper.cxx @@ -85,7 +85,8 @@ CheckFieldPrimitive(drawinglayer::primitive2d::BasePrimitive2D* pPrimitive, } rtl::Reference<drawinglayer::primitive2d::BasePrimitive2D> -buildTextPortionPrimitive(const DrawPortionInfo& rInfo, const OUString& rText, +buildTextPortionPrimitive(const drawinglayer::geometry::ViewInformation2D& rViewInformation2D, + const DrawPortionInfo& rInfo, const OUString& rText, const drawinglayer::attribute::FontAttribute& rFontAttribute, const std::vector<double>& rDXArray, const basegfx::B2DHomMatrix& rNewTransform) @@ -103,7 +104,9 @@ buildTextPortionPrimitive(const DrawPortionInfo& rInfo, const OUString& rText, } // tdf#167511 get FontColor, evtl. adapted for HighContrast - const Color aFontColor(Application::GetSettings().GetStyleSettings().GetHighContrastMode() + const bool bHighContrast(Application::GetSettings().GetStyleSettings().GetHighContrastMode() + && rViewInformation2D.getEditViewActive()); + const Color aFontColor(bHighContrast ? Application::GetSettings().GetStyleSettings().GetWindowTextColor() : rInfo.mrFont.GetColor()); const basegfx::BColor aBFontColor(aFontColor.getBColor()); @@ -222,6 +225,7 @@ buildTextPortionPrimitive(const DrawPortionInfo& rInfo, const OUString& rText, class DoCapitalsDrawPortionInfo : public SvxDoCapitals { private: + const drawinglayer::geometry::ViewInformation2D& mrViewInformation2D; drawinglayer::primitive2d::Primitive2DContainer& mrTarget; const basegfx::B2DHomMatrix& mrNewTransformA; const basegfx::B2DHomMatrix& mrNewTransformB; @@ -229,11 +233,13 @@ private: SvxFont m_aFont; public: - DoCapitalsDrawPortionInfo(drawinglayer::primitive2d::Primitive2DContainer& rTarget, + DoCapitalsDrawPortionInfo(const drawinglayer::geometry::ViewInformation2D& rViewInformation2D, + drawinglayer::primitive2d::Primitive2DContainer& rTarget, const basegfx::B2DHomMatrix& rNewTransformA, const basegfx::B2DHomMatrix& rNewTransformB, const DrawPortionInfo& rInfo) : SvxDoCapitals(rInfo.maText, rInfo.mnTextStart, rInfo.mnTextLen) + , mrViewInformation2D(rViewInformation2D) , mrTarget(rTarget) , mrNewTransformA(rNewTransformA) , mrNewTransformB(rNewTransformB) @@ -255,6 +261,7 @@ public: }; void CreateTextPortionPrimitivesFromDrawPortionInfo( + const drawinglayer::geometry::ViewInformation2D& rViewInformation2D, drawinglayer::primitive2d::Primitive2DContainer& rTarget, const basegfx::B2DHomMatrix& rNewTransformA, const basegfx::B2DHomMatrix& rNewTransformB, const DrawPortionInfo& rInfo) @@ -340,7 +347,8 @@ void CreateTextPortionPrimitivesFromDrawPortionInfo( OUString caseMappedText = rInfo.mrFont.CalcCaseMap(rInfo.maText); rtl::Reference<drawinglayer::primitive2d::BasePrimitive2D> pNewPrimitive( - buildTextPortionPrimitive(rInfo, caseMappedText, aFontAttribute, aDXArray, aNewTransform)); + buildTextPortionPrimitive(rViewInformation2D, rInfo, caseMappedText, aFontAttribute, + aDXArray, aNewTransform)); bool bSmallCaps = rInfo.mrFont.IsCapital(); if (bSmallCaps && rInfo.mpDXArray.empty()) @@ -351,8 +359,8 @@ void CreateTextPortionPrimitivesFromDrawPortionInfo( if (bSmallCaps) { // rerun with each sub-portion - DoCapitalsDrawPortionInfo aDoDrawPortionInfo(rTarget, rNewTransformA, rNewTransformB, - rInfo); + DoCapitalsDrawPortionInfo aDoDrawPortionInfo(rViewInformation2D, rTarget, rNewTransformA, + rNewTransformB, rInfo); rInfo.mrFont.DoOnCapitals(aDoDrawPortionInfo); // transfer collected primitives from rTarget to a new container @@ -525,8 +533,8 @@ void DoCapitalsDrawPortionInfo::Do(const OUString& rSpanTxt, const sal_Int32 nSp nullptr, /* no field in subportion, handled outside */ false, false, false, m_rInfo.mpLocale, m_rInfo.maOverlineColor, m_rInfo.maTextLineColor); - CreateTextPortionPrimitivesFromDrawPortionInfo(mrTarget, mrNewTransformA, mrNewTransformB, - aInfo); + CreateTextPortionPrimitivesFromDrawPortionInfo(mrViewInformation2D, mrTarget, mrNewTransformA, + mrNewTransformB, aInfo); if (!bUpper) m_aFont.SetPropr(nProp); @@ -599,8 +607,9 @@ void TextHierarchyBreakup::flushLinePrimitivesToParagraphPrimitives(sal_Int32 nP void TextHierarchyBreakup::processDrawPortionInfo(const DrawPortionInfo& rDrawPortionInfo) { - CreateTextPortionPrimitivesFromDrawPortionInfo(maTextPortionPrimitives, maNewTransformA, - maNewTransformB, rDrawPortionInfo); + CreateTextPortionPrimitivesFromDrawPortionInfo(getViewInformation2D(), maTextPortionPrimitives, + maNewTransformA, maNewTransformB, + rDrawPortionInfo); if (rDrawPortionInfo.mbEndOfLine || rDrawPortionInfo.mbEndOfParagraph) { @@ -656,8 +665,10 @@ void TextHierarchyBreakup::directlyAddB2DPrimitive( maTextPortionPrimitives.push_back(rSource); } -TextHierarchyBreakup::TextHierarchyBreakup() - : maTextPortionPrimitives() +TextHierarchyBreakup::TextHierarchyBreakup( + const drawinglayer::geometry::ViewInformation2D& rViewInformation2D) + : StripPortionsHelper(rViewInformation2D) + , maTextPortionPrimitives() , maLinePrimitives() , maParagraphPrimitives() , maNewTransformA() @@ -665,9 +676,11 @@ TextHierarchyBreakup::TextHierarchyBreakup() { } -TextHierarchyBreakup::TextHierarchyBreakup(const basegfx::B2DHomMatrix& rNewTransformA, - const basegfx::B2DHomMatrix& rNewTransformB) - : maTextPortionPrimitives() +TextHierarchyBreakup::TextHierarchyBreakup( + const drawinglayer::geometry::ViewInformation2D& rViewInformation2D, + const basegfx::B2DHomMatrix& rNewTransformA, const basegfx::B2DHomMatrix& rNewTransformB) + : StripPortionsHelper(rViewInformation2D) + , maTextPortionPrimitives() , maLinePrimitives() , maParagraphPrimitives() , maNewTransformA(rNewTransformA) @@ -707,16 +720,17 @@ sal_Int32 TextHierarchyBreakupOutliner::getParagraphCount() const return mrOutliner.GetParagraphCount(); } -TextHierarchyBreakupOutliner::TextHierarchyBreakupOutliner(Outliner& rOutliner) - : TextHierarchyBreakup() +TextHierarchyBreakupOutliner::TextHierarchyBreakupOutliner( + const drawinglayer::geometry::ViewInformation2D& rViewInformation2D, Outliner& rOutliner) + : TextHierarchyBreakup(rViewInformation2D) , mrOutliner(rOutliner) { } TextHierarchyBreakupOutliner::TextHierarchyBreakupOutliner( - Outliner& rOutliner, const basegfx::B2DHomMatrix& rNewTransformA, - const basegfx::B2DHomMatrix& rNewTransformB) - : TextHierarchyBreakup(rNewTransformA, rNewTransformB) + const drawinglayer::geometry::ViewInformation2D& rViewInformation2D, Outliner& rOutliner, + const basegfx::B2DHomMatrix& rNewTransformA, const basegfx::B2DHomMatrix& rNewTransformB) + : TextHierarchyBreakup(rViewInformation2D, rNewTransformA, rNewTransformB) , mrOutliner(rOutliner) { } diff --git a/editeng/source/editeng/editview.cxx b/editeng/source/editeng/editview.cxx index ae94c4c9b3f0..b21cd9a56a66 100644 --- a/editeng/source/editeng/editview.cxx +++ b/editeng/source/editeng/editview.cxx @@ -411,7 +411,8 @@ void EditView::DrawText_ToEditView( const tools::Rectangle& rRect, OutputDevice* { // use TextHierarchyBreakup to get all text embedded to the // TextHierarchy.*Primitive2D groupings for better processing - TextHierarchyBreakup aHelper; + const drawinglayer::geometry::ViewInformation2D aViewInformation2D; + TextHierarchyBreakup aHelper(aViewInformation2D); // hand that Helper over to DrawText_ToEditView at the EditEngine // for usage diff --git a/editeng/source/editeng/impedit3.cxx b/editeng/source/editeng/impedit3.cxx index 7ddae54bd77d..4ef20665453c 100644 --- a/editeng/source/editeng/impedit3.cxx +++ b/editeng/source/editeng/impedit3.cxx @@ -3382,18 +3382,18 @@ void ImpEditEngine::DrawText_ToPosition( OutputDevice& rOutDev, const Point& rSt if (bUsePrimitives) { // extract Primitives. + // create ViewInformation2D based on target OutputDevice + drawinglayer::geometry::ViewInformation2D aViewInformation2D; + aViewInformation2D.setViewTransformation(rOutDev.GetViewTransformation()); + // Do not use Orientation, that will be added below as transformation - TextHierarchyBreakup aHelper; + TextHierarchyBreakup aHelper(aViewInformation2D); PaintOrStrip(rOutDev, aBigRect, aStartPos, 0_deg10, &aHelper); if (aHelper.getTextPortionPrimitives().empty()) // no Primitives, done return; - // create ViewInformation2D based on target OutputDevice - drawinglayer::geometry::ViewInformation2D aViewInformation2D; - aViewInformation2D.setViewTransformation(rOutDev.GetViewTransformation()); - // get content drawinglayer::primitive2d::Primitive2DContainer aContent(aHelper.getTextPortionPrimitives()); @@ -3450,20 +3450,20 @@ void ImpEditEngine::DrawText_ToRectangle( OutputDevice& rOutDev, const tools::Re if (bUsePrimitives) { + // create ViewInformation2D based on target OutputDevice + drawinglayer::geometry::ViewInformation2D aViewInformation2D; + aViewInformation2D.setViewTransformation(rOutDev.GetViewTransformation()); + const basegfx::B2DRange aClipRange(vcl::unotools::b2DRectangleFromRectangle(aOutRect)); + aViewInformation2D.setViewport(aClipRange); + // extract Primitives - TextHierarchyBreakup aHelper; + TextHierarchyBreakup aHelper(aViewInformation2D); PaintOrStrip(rOutDev, aOutRect, aStartPos, 0_deg10, &aHelper); if (aHelper.getTextPortionPrimitives().empty()) // no Primitives, done return; - // create ViewInformation2D based on target OutputDevice - drawinglayer::geometry::ViewInformation2D aViewInformation2D; - aViewInformation2D.setViewTransformation(rOutDev.GetViewTransformation()); - const basegfx::B2DRange aClipRange(vcl::unotools::b2DRectangleFromRectangle(aOutRect)); - aViewInformation2D.setViewport(aClipRange); - // get content and it's range drawinglayer::primitive2d::Primitive2DContainer aContent(aHelper.getTextPortionPrimitives()); const basegfx::B2DRange aContentRange(aContent.getB2DRange(aViewInformation2D)); diff --git a/editeng/source/outliner/outlvw.cxx b/editeng/source/outliner/outlvw.cxx index c7e772be9524..dd6dd6ce3652 100644 --- a/editeng/source/outliner/outlvw.cxx +++ b/editeng/source/outliner/outlvw.cxx @@ -70,7 +70,8 @@ void OutlinerView::DrawText_ToEditView( const tools::Rectangle& rRect, OutputDev // use TextHierarchyBreakupOutliner to get all text embedded to the // TextHierarchy.*Primitive2D groupings for better processing, plus // the correct paragtaph countings - TextHierarchyBreakupOutliner aHelper(rOwner); + const drawinglayer::geometry::ViewInformation2D aViewInformation2D; + TextHierarchyBreakupOutliner aHelper(aViewInformation2D, rOwner); // hand that Helper over to DrawText_ToEditView at the EditEngine // for usage diff --git a/include/editeng/StripPortionsHelper.hxx b/include/editeng/StripPortionsHelper.hxx index dc235471eb37..ab19e78298e9 100644 --- a/include/editeng/StripPortionsHelper.hxx +++ b/include/editeng/StripPortionsHelper.hxx @@ -109,11 +109,23 @@ public: class EDITENG_DLLPUBLIC StripPortionsHelper { + const drawinglayer::geometry::ViewInformation2D& mrViewInformation2D; + public: + StripPortionsHelper(const drawinglayer::geometry::ViewInformation2D& rViewInformation2D) + : mrViewInformation2D(rViewInformation2D) + { + } + virtual void processDrawPortionInfo(const DrawPortionInfo&) = 0; virtual void processDrawBulletInfo(const DrawBulletInfo&) = 0; virtual void directlyAddB2DPrimitive(const drawinglayer::primitive2d::Primitive2DReference&) = 0; + + const drawinglayer::geometry::ViewInformation2D& getViewInformation2D() const + { + return mrViewInformation2D; + } }; class EDITENG_DLLPUBLIC TextHierarchyBreakup : public StripPortionsHelper @@ -136,8 +148,9 @@ public: virtual void directlyAddB2DPrimitive(const drawinglayer::primitive2d::Primitive2DReference&) override; - TextHierarchyBreakup(); - TextHierarchyBreakup(const basegfx::B2DHomMatrix& rNewTransformA, + TextHierarchyBreakup(const drawinglayer::geometry::ViewInformation2D& rViewInformation2D); + TextHierarchyBreakup(const drawinglayer::geometry::ViewInformation2D& rViewInformation2D, + const basegfx::B2DHomMatrix& rNewTransformA, const basegfx::B2DHomMatrix& rNewTransformB); const drawinglayer::primitive2d::Primitive2DContainer& getTextPortionPrimitives(); @@ -152,9 +165,11 @@ protected: virtual sal_Int32 getParagraphCount() const override; public: - TextHierarchyBreakupOutliner(Outliner& rOutliner); - TextHierarchyBreakupOutliner(Outliner& rOutliner, const basegfx::B2DHomMatrix& rNewTransformA, - const basegfx::B2DHomMatrix& rNewTransformB); + TextHierarchyBreakupOutliner( + const drawinglayer::geometry::ViewInformation2D& rViewInformation2D, Outliner& rOutliner); + TextHierarchyBreakupOutliner( + const drawinglayer::geometry::ViewInformation2D& rViewInformation2D, Outliner& rOutliner, + const basegfx::B2DHomMatrix& rNewTransformA, const basegfx::B2DHomMatrix& rNewTransformB); }; #endif // INCLUDED_EDITENG_STRIPPORTIONSHELPER_HXX diff --git a/include/svx/svdoutl.hxx b/include/svx/svdoutl.hxx index 0af4f6804849..b8e45b213b9d 100644 --- a/include/svx/svdoutl.hxx +++ b/include/svx/svdoutl.hxx @@ -63,6 +63,7 @@ public: virtual void processDrawPortionInfo(const DrawPortionInfo& rDrawPortionInfo) override; TextHierarchyBreakupBlockText( + const drawinglayer::geometry::ViewInformation2D& rViewInformation2D, SdrOutliner& rOutliner, const basegfx::B2DHomMatrix& rNewTransformA, const basegfx::B2DHomMatrix& rNewTransformB, @@ -78,6 +79,7 @@ public: virtual void processDrawPortionInfo(const DrawPortionInfo& rDrawPortionInfo) override; TextHierarchyBreakupContourText( + const drawinglayer::geometry::ViewInformation2D& rViewInformation2D, SdrOutliner& rOutliner, const basegfx::B2DHomMatrix& rNewTransformA, const basegfx::B2DHomMatrix& rNewTransformB, diff --git a/sc/source/ui/view/tabview3.cxx b/sc/source/ui/view/tabview3.cxx index 4509f7dc31a8..fb9622a45725 100644 --- a/sc/source/ui/view/tabview3.cxx +++ b/sc/source/ui/view/tabview3.cxx @@ -2308,7 +2308,10 @@ drawinglayer::primitive2d::Primitive2DContainer ScTextEditOverlayObject::createO // use no transformations. The result will be in logic coordinates // based on aEditRectangle and the EditEngine setup, see // ScViewData::SetEditEngine - TextHierarchyBreakup aBreakup; + drawinglayer::geometry::ViewInformation2D aViewInformation2D; + // TextEditOverlay is only possible in EditView, activate it + aViewInformation2D.setEditViewActive(true); + TextHierarchyBreakup aBreakup(aViewInformation2D); pEditView->getEditEngine().StripPortions(aBreakup); aRetval = aBreakup.getTextPortionPrimitives(); diff --git a/svx/source/svdraw/svdedxv.cxx b/svx/source/svdraw/svdedxv.cxx index 77ac5c6a5e2b..951d991e8a35 100644 --- a/svx/source/svdraw/svdedxv.cxx +++ b/svx/source/svdraw/svdedxv.cxx @@ -783,8 +783,11 @@ void TextEditOverlayObject::checkDataChange(const basegfx::B2DRange& rMinTextEdi // of this mechanism, it *may* be possible to buffer layouted // primitives per ParaPortion with/in/dependent on the EditEngine // content if needed. For now, get and compare - TextHierarchyBreakupBlockText aBreakup(*pSdrOutliner, aNewTransformA, aNewTransformB, - aClipRange); + drawinglayer::geometry::ViewInformation2D aViewInformation2D; + // TextEditOverlay is only possible in EditView, activate it + aViewInformation2D.setEditViewActive(true); + TextHierarchyBreakupBlockText aBreakup(aViewInformation2D, *pSdrOutliner, aNewTransformA, + aNewTransformB, aClipRange); pSdrOutliner->StripPortions(aBreakup); aNewTextPrimitives.append(aBreakup.getTextPortionPrimitives()); diff --git a/svx/source/svdraw/svdotextdecomposition.cxx b/svx/source/svdraw/svdotextdecomposition.cxx index 7a6001d628e4..3f7d41a6597d 100644 --- a/svx/source/svdraw/svdotextdecomposition.cxx +++ b/svx/source/svdraw/svdotextdecomposition.cxx @@ -152,6 +152,7 @@ void SdrTextObj::impDecomposeContourTextPrimitive( // ScaledUnitPolyPolygon. Thus aPolyPolygon might be smaller than aScale from aObjectMatrix. We // use this smaller size for the text area, otherwise the text will reach into the stroke. TextHierarchyBreakupContourText aBreakup( + aViewInformation, rOutliner, aNewTransformA, aNewTransformB, @@ -303,6 +304,7 @@ void SdrTextObj::impDecomposeAutoFitTextPrimitive( // now break up text primitives. TextHierarchyBreakupBlockText aBreakup( + aViewInformation, rOutliner, aNewTransformA, aNewTransformB, @@ -620,6 +622,7 @@ void SdrTextObj::impDecomposeBlockTextPrimitive( // now break up text primitives. TextHierarchyBreakupBlockText aBreakup( + aViewInformation, rOutliner, aNewTransformA, aNewTransformB, @@ -704,6 +707,7 @@ void SdrTextObj::impDecomposeStretchTextPrimitive( // now break up text primitives. TextHierarchyBreakupOutliner aBreakup( + aViewInformation, rOutliner, aNewTransformA, aNewTransformB); @@ -1133,6 +1137,7 @@ void SdrTextObj::impDecomposeChainedTextPrimitive( // now break up text primitives. TextHierarchyBreakupBlockText aBreakup( + aViewInformation, rOutliner, aNewTransformA, aNewTransformB, diff --git a/svx/source/svdraw/svdotextpathdecomposition.cxx b/svx/source/svdraw/svdotextpathdecomposition.cxx index ec4017ba4350..20fa93f76490 100644 --- a/svx/source/svdraw/svdotextpathdecomposition.cxx +++ b/svx/source/svdraw/svdotextpathdecomposition.cxx @@ -154,6 +154,12 @@ namespace ::std::vector< impPathTextPortion > maPathTextPortions; public: + TextHierarchyBreakupPathTextPortions(const drawinglayer::geometry::ViewInformation2D& rViewInformation2D) + : StripPortionsHelper(rViewInformation2D) + , maPathTextPortions() + { + } + virtual void processDrawPortionInfo(const DrawPortionInfo& rDrawPortionInfo) override { // extract and add data for TextOnPath further processing @@ -640,7 +646,7 @@ void SdrTextObj::impDecomposePathTextPrimitive( rOutliner.setVisualizedPage(GetSdrPageFromXDrawPage(aViewInformation.getVisualizedPage())); // now break up to text portions - TextHierarchyBreakupPathTextPortions aBreakup; + TextHierarchyBreakupPathTextPortions aBreakup(aViewInformation); rOutliner.StripPortions(aBreakup); const ::std::vector< impPathTextPortion > rPathTextPortions(aBreakup.sortAndGetPathTextPortions()); diff --git a/svx/source/svdraw/svdoutl.cxx b/svx/source/svdraw/svdoutl.cxx index da7bafc506c7..dff076f1da52 100644 --- a/svx/source/svdraw/svdoutl.cxx +++ b/svx/source/svdraw/svdoutl.cxx @@ -166,11 +166,13 @@ void TextHierarchyBreakupBlockText::processDrawPortionInfo(const DrawPortionInfo } TextHierarchyBreakupBlockText::TextHierarchyBreakupBlockText( + const drawinglayer::geometry::ViewInformation2D& rViewInformation2D, SdrOutliner& rOutliner, const basegfx::B2DHomMatrix& rNewTransformA, const basegfx::B2DHomMatrix& rNewTransformB, const basegfx::B2DRange& rClipRange) : TextHierarchyBreakupOutliner( + rViewInformation2D, rOutliner, rNewTransformA, rNewTransformB) @@ -189,11 +191,13 @@ void TextHierarchyBreakupContourText::processDrawPortionInfo(const DrawPortionIn } TextHierarchyBreakupContourText::TextHierarchyBreakupContourText( + const drawinglayer::geometry::ViewInformation2D& rViewInformation2D, SdrOutliner& rOutliner, const basegfx::B2DHomMatrix& rNewTransformA, const basegfx::B2DHomMatrix& rNewTransformB, const basegfx::B2DVector& rScale) : TextHierarchyBreakupOutliner( + rViewInformation2D, rOutliner, rNewTransformA, rNewTransformB)