drawinglayer/source/geometry/viewinformation2d.cxx | 20 + drawinglayer/source/processor2d/baseprocessor2d.cxx | 8 drawinglayer/source/processor2d/cairopixelprocessor2d.cxx | 132 +++++------ drawinglayer/source/processor2d/contourextractor2d.cxx | 4 drawinglayer/source/processor2d/d2dpixelprocessor2d.cxx | 6 drawinglayer/source/processor2d/hittestprocessor2d.cxx | 4 drawinglayer/source/processor2d/linegeometryextractor2d.cxx | 4 drawinglayer/source/processor2d/textaspolygonextractor2d.cxx | 4 drawinglayer/source/processor2d/textextractor2d.cxx | 4 drawinglayer/source/processor2d/vclprocessor2d.cxx | 20 - drawinglayer/source/processor2d/vclprocessor2d.hxx | 5 drawinglayer/source/processor3d/baseprocessor3d.cxx | 11 drawinglayer/source/processor3d/cutfindprocessor3d.cxx | 4 drawinglayer/source/processor3d/defaultprocessor3d.cxx | 4 drawinglayer/source/processor3d/geometry2dextractor.cxx | 4 drawinglayer/source/processor3d/shadow3dextractor.cxx | 4 drawinglayer/source/processor3d/zbufferprocessor3d.cxx | 2 include/drawinglayer/geometry/viewinformation2d.hxx | 5 include/drawinglayer/processor2d/baseprocessor2d.hxx | 13 - include/drawinglayer/processor2d/cairopixelprocessor2d.hxx | 13 - include/drawinglayer/processor3d/baseprocessor3d.hxx | 11 include/svx/sdr/contact/objectcontact.hxx | 2 include/svx/sdr/overlay/overlaymanager.hxx | 7 svx/source/engine3d/helperminimaldepth3d.cxx | 4 svx/source/sdr/contact/objectcontactofobjlistpainter.cxx | 2 svx/source/sdr/contact/objectcontactofpageview.cxx | 11 svx/source/sdr/contact/viewobjectcontactofpageobj.cxx | 2 svx/source/sdr/overlay/overlaymanager.cxx | 73 +++--- 28 files changed, 212 insertions(+), 171 deletions(-)
New commits: commit a841f2fd0d1e76fb51663381215cccadb9753300 Author: Armin Le Grand (collabora) <armin.legr...@collabora.com> AuthorDate: Thu Jul 31 18:29:57 2025 +0200 Commit: Armin Le Grand <armin.le.gr...@me.com> CommitDate: Fri Aug 1 16:13:53 2025 +0200 Added DrawModeFlags to ViewInformation2D This allows setting/using DrawModeFlags system-independent (or: renderer-independent). Changing and applying to a PrmitiveRenderer will apply that (if needed) to the target renderer. Change-Id: Id95d018f95d1b2ff065da5e4d05ba385b22cdbb0 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188704 Reviewed-by: Armin Le Grand <armin.le.gr...@me.com> Tested-by: Jenkins diff --git a/drawinglayer/source/geometry/viewinformation2d.cxx b/drawinglayer/source/geometry/viewinformation2d.cxx index 6550831214db..d3e6bd0371a3 100644 --- a/drawinglayer/source/geometry/viewinformation2d.cxx +++ b/drawinglayer/source/geometry/viewinformation2d.cxx @@ -28,6 +28,7 @@ #include <o3tl/temporary.hxx> #include <officecfg/Office/Common.hxx> #include <unotools/configmgr.hxx> +#include <vcl/rendercontext/DrawModeFlags.hxx> #include <atomic> #include <utility> @@ -84,6 +85,10 @@ protected: // color to use for automatic color Color maAutoColor; + // DrawModeFlags to use, these may ask to modify the + // colors/Bitmap paint according to the flags + DrawModeFlags maDrawModeFlags; + // a hint that the View that is being painted has an active TextEdit. This // is important for handling of TextHierarchyEditPrimitive2D to suppress // the text for objects in TextEdit - the text is visualized by the @@ -113,6 +118,7 @@ public: , mxVisualizedPage() , mfViewTime(0.0) , maAutoColor(COL_AUTO) + , maDrawModeFlags(DrawModeFlags::Default) , mbTextEditActive(false) , mbEditViewActive(false) , mbReducedDisplayQuality(false) @@ -207,6 +213,9 @@ public: Color getAutoColor() const { return maAutoColor; } void setAutoColor(Color aNew) { maAutoColor = aNew; } + DrawModeFlags getDrawModeFlags() const { return maDrawModeFlags; } + void setDrawModeFlags(DrawModeFlags aNew) { maDrawModeFlags = aNew; } + bool getTextEditActive() const { return mbTextEditActive; } void setTextEditActive(bool bNew) { mbTextEditActive = bNew; } @@ -229,6 +238,7 @@ public: && maViewport == rCandidate.maViewport && mxVisualizedPage == rCandidate.mxVisualizedPage && mfViewTime == rCandidate.mfViewTime && maAutoColor == rCandidate.maAutoColor + && maDrawModeFlags == rCandidate.maDrawModeFlags && mbTextEditActive == rCandidate.mbTextEditActive && mbEditViewActive == rCandidate.mbEditViewActive && mbReducedDisplayQuality == rCandidate.mbReducedDisplayQuality @@ -364,6 +374,16 @@ Color ViewInformation2D::getAutoColor() const { return mpViewInformation2D->getA void ViewInformation2D::setAutoColor(Color aNew) { mpViewInformation2D->setAutoColor(aNew); } +DrawModeFlags ViewInformation2D::getDrawModeFlags() const +{ + return mpViewInformation2D->getDrawModeFlags(); +} + +void ViewInformation2D::setDrawModeFlags(DrawModeFlags aNew) +{ + mpViewInformation2D->setDrawModeFlags(aNew); +} + bool ViewInformation2D::getTextEditActive() const { return mpViewInformation2D->getTextEditActive(); diff --git a/drawinglayer/source/processor2d/baseprocessor2d.cxx b/drawinglayer/source/processor2d/baseprocessor2d.cxx index 92b2e3c8d545..5d71ab4fd7f7 100644 --- a/drawinglayer/source/processor2d/baseprocessor2d.cxx +++ b/drawinglayer/source/processor2d/baseprocessor2d.cxx @@ -71,7 +71,13 @@ namespace drawinglayer::processor2d void BaseProcessor2D::setViewInformation2D(const geometry::ViewInformation2D& rNew) { if (rNew != maViewInformation2D) - updateViewInformation(rNew); + { + // set if changed + maViewInformation2D = rNew; + + // allow reaction on change + onViewInformation2DChanged(); + } } } // end of namespace diff --git a/drawinglayer/source/processor2d/cairopixelprocessor2d.cxx b/drawinglayer/source/processor2d/cairopixelprocessor2d.cxx index 7e5d6eb286fa..f0114a6da4fb 100644 --- a/drawinglayer/source/processor2d/cairopixelprocessor2d.cxx +++ b/drawinglayer/source/processor2d/cairopixelprocessor2d.cxx @@ -950,22 +950,15 @@ bool checkCoordinateLimitWorkaroundNeededForUsedCairo() namespace drawinglayer::processor2d { -void CairoPixelProcessor2D::updateViewInformation( - const geometry::ViewInformation2D& rViewInformation2D) +void CairoPixelProcessor2D::onViewInformation2DChanged() { - 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 basegfx::BColorModifierStack& rBColorModifierStack, const DrawModeFlags& rDrawModeFlags, + const basegfx::BColorModifierStack& rBColorModifierStack, const geometry::ViewInformation2D& rViewInformation, cairo_surface_t* pTarget) : BaseProcessor2D(rViewInformation) , mpTargetOutputDevice(nullptr) @@ -977,7 +970,6 @@ CairoPixelProcessor2D::CairoPixelProcessor2D( , mbRenderDecoratedTextDirect( officecfg::Office::Common::Drawinglayer::RenderDecoratedTextDirect::get()) , mnClipRecursionCount(0) - , maDrawModeFlags(rDrawModeFlags) , mbCairoCoordinateLimitWorkaroundActive(false) { // no target, nothing to initialize @@ -1014,7 +1006,6 @@ CairoPixelProcessor2D::CairoPixelProcessor2D(const geometry::ViewInformation2D& , mbRenderDecoratedTextDirect( officecfg::Office::Common::Drawinglayer::RenderDecoratedTextDirect::get()) , mnClipRecursionCount(0) - , maDrawModeFlags(DrawModeFlags::Default) , mbCairoCoordinateLimitWorkaroundActive(false) { if (nWidthPixel <= 0 || nHeightPixel <= 0) @@ -1057,7 +1048,6 @@ CairoPixelProcessor2D::CairoPixelProcessor2D(OutputDevice& rOutputDevice, , mbRenderDecoratedTextDirect( officecfg::Office::Common::Drawinglayer::RenderDecoratedTextDirect::get()) , mnClipRecursionCount(0) - , maDrawModeFlags(rOutputDevice.GetDrawMode()) , mbCairoCoordinateLimitWorkaroundActive(false) { SystemGraphicsData aData(mpTargetOutputDevice->GetSystemGfxData()); @@ -1284,19 +1274,20 @@ void CairoPixelProcessor2D::processBitmapPrimitive2D( { constexpr DrawModeFlags BITMAP(DrawModeFlags::BlackBitmap | DrawModeFlags::WhiteBitmap | DrawModeFlags::GrayBitmap); - const bool bDrawModeFlagsUsed(maDrawModeFlags & BITMAP); + const DrawModeFlags aDrawModeFlags(getViewInformation2D().getDrawModeFlags()); + const bool bDrawModeFlagsUsed(aDrawModeFlags & BITMAP); if (bDrawModeFlagsUsed) { // if DrawModeFlags for Bitmap are used, encapsulate with // corresponding BColorModifier - if (maDrawModeFlags & DrawModeFlags::BlackBitmap) + if (aDrawModeFlags & DrawModeFlags::BlackBitmap) { const basegfx::BColorModifierSharedPtr aBColorModifier( std::make_shared<basegfx::BColorModifier_replace>(basegfx::BColor(0, 0, 0))); maBColorModifierStack.push(aBColorModifier); } - else if (maDrawModeFlags & DrawModeFlags::WhiteBitmap) + else if (aDrawModeFlags & DrawModeFlags::WhiteBitmap) { const basegfx::BColorModifierSharedPtr aBColorModifier( std::make_shared<basegfx::BColorModifier_replace>(basegfx::BColor(1, 1, 1))); @@ -1586,7 +1577,7 @@ void CairoPixelProcessor2D::processPolygonHairlinePrimitive2D( void CairoPixelProcessor2D::processPolyPolygonColorPrimitive2D( const primitive2d::PolyPolygonColorPrimitive2D& rPolyPolygonColorPrimitive2D) { - if (maDrawModeFlags & DrawModeFlags::NoFill) + if (getViewInformation2D().getDrawModeFlags() & DrawModeFlags::NoFill) // NoFill wanted, done return; @@ -1708,8 +1699,7 @@ void CairoPixelProcessor2D::processTransparencePrimitive2D( const double fContainedHeight(aVisibleRange.getHeight()); cairo_surface_t* pMask(cairo_surface_create_similar_image(pTarget, CAIRO_FORMAT_ARGB32, fContainedWidth, fContainedHeight)); - CairoPixelProcessor2D aMaskRenderer(getBColorModifierStack(), maDrawModeFlags, - aViewInformation2D, pMask); + CairoPixelProcessor2D aMaskRenderer(getBColorModifierStack(), aViewInformation2D, pMask); aMaskRenderer.process(rTransCandidate.getTransparence()); // convert mask to something cairo can use @@ -1718,8 +1708,7 @@ void CairoPixelProcessor2D::processTransparencePrimitive2D( // draw content to temporary surface cairo_surface_t* pContent(cairo_surface_create_similar( pTarget, cairo_surface_get_content(pTarget), fContainedWidth, fContainedHeight)); - CairoPixelProcessor2D aContent(getBColorModifierStack(), maDrawModeFlags, aViewInformation2D, - pContent); + CairoPixelProcessor2D aContent(getBColorModifierStack(), aViewInformation2D, pContent); aContent.process(rTransCandidate.getChildren()); // munge the temporary surfaces to our target surface @@ -1777,8 +1766,7 @@ void CairoPixelProcessor2D::processInvertPrimitive2D( const double fContainedHeight(aVisibleRange.getHeight()); cairo_surface_t* pContent(cairo_surface_create_similar_image( pTarget, CAIRO_FORMAT_ARGB32, fContainedWidth, fContainedHeight)); - CairoPixelProcessor2D aContent(getBColorModifierStack(), maDrawModeFlags, aViewInformation2D, - pContent); + CairoPixelProcessor2D aContent(getBColorModifierStack(), aViewInformation2D, pContent); aContent.process(rInvertCandidate.getChildren()); cairo_surface_flush(pContent); @@ -2026,13 +2014,13 @@ void CairoPixelProcessor2D::processTransformPrimitive2D( geometry::ViewInformation2D aViewInformation2D(getViewInformation2D()); aViewInformation2D.setObjectTransformation(getViewInformation2D().getObjectTransformation() * rTransformCandidate.getTransformation()); - updateViewInformation(aViewInformation2D); + setViewInformation2D(aViewInformation2D); // process content process(rTransformCandidate.getChildren()); // restore transformations - updateViewInformation(aLastViewInformation2D); + setViewInformation2D(aLastViewInformation2D); } void CairoPixelProcessor2D::processUnifiedTransparencePrimitive2D( @@ -2092,8 +2080,7 @@ void CairoPixelProcessor2D::processUnifiedTransparencePrimitive2D( const double fContainedHeight(aVisibleRange.getHeight()); cairo_surface_t* pContent(cairo_surface_create_similar( pTarget, cairo_surface_get_content(pTarget), fContainedWidth, fContainedHeight)); - CairoPixelProcessor2D aContent(getBColorModifierStack(), maDrawModeFlags, aViewInformation2D, - pContent); + CairoPixelProcessor2D aContent(getBColorModifierStack(), aViewInformation2D, pContent); aContent.process(rTransCandidate.getChildren()); // paint temporary surface to target with fixed transparence @@ -2130,15 +2117,16 @@ void CairoPixelProcessor2D::processMarkerArrayPrimitive2D( constexpr DrawModeFlags BITMAP(DrawModeFlags::BlackBitmap | DrawModeFlags::WhiteBitmap | DrawModeFlags::GrayBitmap); - if (maDrawModeFlags & BITMAP) + const DrawModeFlags aDrawModeFlags(getViewInformation2D().getDrawModeFlags()); + if (aDrawModeFlags & BITMAP) { - if (maDrawModeFlags & DrawModeFlags::BlackBitmap) + if (aDrawModeFlags & DrawModeFlags::BlackBitmap) { const basegfx::BColorModifierSharedPtr aBColorModifier( std::make_shared<basegfx::BColorModifier_replace>(basegfx::BColor(0, 0, 0))); maBColorModifierStack.push(aBColorModifier); } - else if (maDrawModeFlags & DrawModeFlags::WhiteBitmap) + else if (aDrawModeFlags & DrawModeFlags::WhiteBitmap) { const basegfx::BColorModifierSharedPtr aBColorModifier( std::make_shared<basegfx::BColorModifier_replace>(basegfx::BColor(1, 1, 1))); @@ -2221,7 +2209,7 @@ void CairoPixelProcessor2D::processBackgroundColorPrimitive2D( || rBackgroundColorCandidate.getTransparency() >= 1.0) return; - if (maDrawModeFlags & DrawModeFlags::NoFill) + if (getViewInformation2D().getDrawModeFlags() & DrawModeFlags::NoFill) // NoFill wanted, done return; @@ -2472,7 +2460,7 @@ void CairoPixelProcessor2D::processFilledRectanglePrimitive2D( return; } - if (maDrawModeFlags & DrawModeFlags::NoFill) + if (getViewInformation2D().getDrawModeFlags() & DrawModeFlags::NoFill) // NoFill wanted, done return; @@ -2555,14 +2543,15 @@ void CairoPixelProcessor2D::processFillGraphicPrimitive2D( | DrawModeFlags::GrayBitmap); basegfx::BColor aReplacementColor(0, 0, 0); bool bTemporaryGrayColorModifier(false); - if (maDrawModeFlags & BITMAP) + const DrawModeFlags aDrawModeFlags(getViewInformation2D().getDrawModeFlags()); + if (aDrawModeFlags & BITMAP) { - if (maDrawModeFlags & DrawModeFlags::BlackBitmap) + if (aDrawModeFlags & DrawModeFlags::BlackBitmap) { // aReplacementColor already set aPreparedBitmap.SetEmpty(); } - else if (maDrawModeFlags & DrawModeFlags::WhiteBitmap) + else if (aDrawModeFlags & DrawModeFlags::WhiteBitmap) { aReplacementColor = basegfx::BColor(1, 1, 1); aPreparedBitmap.SetEmpty(); @@ -3413,14 +3402,15 @@ void CairoPixelProcessor2D::processFillGradientPrimitive2D( constexpr DrawModeFlags SIMPLE_GRADIENT(DrawModeFlags::BlackGradient | DrawModeFlags::WhiteGradient | DrawModeFlags::SettingsGradient); - if (maDrawModeFlags & SIMPLE_GRADIENT) + const DrawModeFlags aDrawModeFlags(getViewInformation2D().getDrawModeFlags()); + if (aDrawModeFlags & SIMPLE_GRADIENT) { // use simple, single-color OutputRange draw processFillGradientPrimitive2D_drawOutputRange(rFillGradientPrimitive2D); return; } - const bool bTemporaryGrayColorModifier(maDrawModeFlags & DrawModeFlags::GrayGradient); + const bool bTemporaryGrayColorModifier(aDrawModeFlags & DrawModeFlags::GrayGradient); if (bTemporaryGrayColorModifier) { const basegfx::BColorModifierSharedPtr aBColorModifier( @@ -3504,7 +3494,7 @@ void CairoPixelProcessor2D::processFillGradientPrimitive2D( void CairoPixelProcessor2D::processPolyPolygonRGBAPrimitive2D( const primitive2d::PolyPolygonRGBAPrimitive2D& rPolyPolygonRGBAPrimitive2D) { - if (maDrawModeFlags & DrawModeFlags::NoFill) + if (getViewInformation2D().getDrawModeFlags() & DrawModeFlags::NoFill) // NoFill wanted, done return; @@ -3525,7 +3515,7 @@ void CairoPixelProcessor2D::processPolyPolygonRGBAPrimitive2D( void CairoPixelProcessor2D::processPolyPolygonAlphaGradientPrimitive2D( const primitive2d::PolyPolygonAlphaGradientPrimitive2D& rPolyPolygonAlphaGradientPrimitive2D) { - if (maDrawModeFlags & DrawModeFlags::NoFill) + if (getViewInformation2D().getDrawModeFlags() & DrawModeFlags::NoFill) // NoFill wanted, done return; @@ -3607,17 +3597,18 @@ void CairoPixelProcessor2D::processBitmapAlphaPrimitive2D( { constexpr DrawModeFlags BITMAP(DrawModeFlags::BlackBitmap | DrawModeFlags::WhiteBitmap | DrawModeFlags::GrayBitmap); - const bool bDrawModeFlagsUsed(maDrawModeFlags & BITMAP); + const DrawModeFlags aDrawModeFlags(getViewInformation2D().getDrawModeFlags()); + const bool bDrawModeFlagsUsed(aDrawModeFlags & BITMAP); if (bDrawModeFlagsUsed) { - if (maDrawModeFlags & DrawModeFlags::BlackBitmap) + if (aDrawModeFlags & DrawModeFlags::BlackBitmap) { const basegfx::BColorModifierSharedPtr aBColorModifier( std::make_shared<basegfx::BColorModifier_replace>(basegfx::BColor(0, 0, 0))); maBColorModifierStack.push(aBColorModifier); } - else if (maDrawModeFlags & DrawModeFlags::WhiteBitmap) + else if (aDrawModeFlags & DrawModeFlags::WhiteBitmap) { const basegfx::BColorModifierSharedPtr aBColorModifier( std::make_shared<basegfx::BColorModifier_replace>(basegfx::BColor(1, 1, 1))); @@ -3743,7 +3734,7 @@ void CairoPixelProcessor2D::renderTextDecorationWithOptionalTransformAndColor( { geometry::ViewInformation2D aViewInformation2D(getViewInformation2D()); aViewInformation2D.setObjectTransformation(*pOptionalObjectTransform); - updateViewInformation(aViewInformation2D); + setViewInformation2D(aViewInformation2D); } // render primitives @@ -3751,7 +3742,7 @@ void CairoPixelProcessor2D::renderTextDecorationWithOptionalTransformAndColor( // restore mods if (nullptr != pOptionalObjectTransform) - updateViewInformation(aLastViewInformation2D); + setViewInformation2D(aLastViewInformation2D); if (nullptr != pReplacementColor) maBColorModifierStack.pop(); } @@ -3989,7 +3980,7 @@ bool CairoPixelProcessor2D::handleSvgGradientHelper( constexpr DrawModeFlags SIMPLE_GRADIENT(DrawModeFlags::BlackGradient | DrawModeFlags::WhiteGradient | DrawModeFlags::SettingsGradient); - if (maDrawModeFlags & SIMPLE_GRADIENT) + if (getViewInformation2D().getDrawModeFlags() & SIMPLE_GRADIENT) { aSimpleColor = getGradientColor(aSimpleColor); bDrawSimple = true; @@ -4023,7 +4014,8 @@ void CairoPixelProcessor2D::processSvgLinearGradientPrimitive2D( cairo_save(mpRT); - const bool bTemporaryGrayColorModifier(maDrawModeFlags & DrawModeFlags::GrayGradient); + const bool bTemporaryGrayColorModifier(getViewInformation2D().getDrawModeFlags() + & DrawModeFlags::GrayGradient); if (bTemporaryGrayColorModifier) { const basegfx::BColorModifierSharedPtr aBColorModifier( @@ -4110,7 +4102,7 @@ void CairoPixelProcessor2D::processSvgRadialGradientPrimitive2D( cairo_save(mpRT); bool bTemporaryGrayColorModifier(false); - if (maDrawModeFlags & DrawModeFlags::GrayGradient) + if (getViewInformation2D().getDrawModeFlags() & DrawModeFlags::GrayGradient) { bTemporaryGrayColorModifier = true; const basegfx::BColorModifierSharedPtr aBColorModifier( @@ -4316,23 +4308,25 @@ basegfx::BColor CairoPixelProcessor2D::getLineColor(const basegfx::BColor& rColo { constexpr DrawModeFlags LINE(DrawModeFlags::BlackLine | DrawModeFlags::WhiteLine | DrawModeFlags::GrayLine | DrawModeFlags::SettingsLine); - if (!(maDrawModeFlags & LINE)) + const DrawModeFlags aDrawModeFlags(getViewInformation2D().getDrawModeFlags()); + + if (!(aDrawModeFlags & LINE)) return rColor; - if (maDrawModeFlags & DrawModeFlags::BlackLine) + if (aDrawModeFlags & DrawModeFlags::BlackLine) return basegfx::BColor(0, 0, 0); - if (maDrawModeFlags & DrawModeFlags::WhiteLine) + if (aDrawModeFlags & DrawModeFlags::WhiteLine) return basegfx::BColor(1, 1, 1); - if (maDrawModeFlags & DrawModeFlags::GrayLine) + if (aDrawModeFlags & DrawModeFlags::GrayLine) { const double fLuminance(rColor.luminance()); return basegfx::BColor(fLuminance, fLuminance, fLuminance); } // DrawModeFlags::SettingsLine - if (maDrawModeFlags & DrawModeFlags::SettingsForSelection) + if (aDrawModeFlags & DrawModeFlags::SettingsForSelection) return Application::GetSettings().GetStyleSettings().GetHighlightColor().getBColor(); return Application::GetSettings().GetStyleSettings().GetWindowTextColor().getBColor(); @@ -4342,23 +4336,25 @@ basegfx::BColor CairoPixelProcessor2D::getFillColor(const basegfx::BColor& rColo { constexpr DrawModeFlags FILL(DrawModeFlags::BlackFill | DrawModeFlags::WhiteFill | DrawModeFlags::GrayFill | DrawModeFlags::SettingsFill); - if (!(maDrawModeFlags & FILL)) + const DrawModeFlags aDrawModeFlags(getViewInformation2D().getDrawModeFlags()); + + if (!(aDrawModeFlags & FILL)) return rColor; - if (maDrawModeFlags & DrawModeFlags::BlackFill) + if (aDrawModeFlags & DrawModeFlags::BlackFill) return basegfx::BColor(0, 0, 0); - if (maDrawModeFlags & DrawModeFlags::WhiteFill) + if (aDrawModeFlags & DrawModeFlags::WhiteFill) return basegfx::BColor(1, 1, 1); - if (maDrawModeFlags & DrawModeFlags::GrayFill) + if (aDrawModeFlags & DrawModeFlags::GrayFill) { const double fLuminance(rColor.luminance()); return basegfx::BColor(fLuminance, fLuminance, fLuminance); } // DrawModeFlags::SettingsFill - if (maDrawModeFlags & DrawModeFlags::SettingsForSelection) + if (aDrawModeFlags & DrawModeFlags::SettingsForSelection) return Application::GetSettings().GetStyleSettings().GetHighlightColor().getBColor(); return Application::GetSettings().GetStyleSettings().GetWindowColor().getBColor(); @@ -4368,23 +4364,25 @@ basegfx::BColor CairoPixelProcessor2D::getTextColor(const basegfx::BColor& rColo { constexpr DrawModeFlags TEXT(DrawModeFlags::BlackText | DrawModeFlags::WhiteText | DrawModeFlags::GrayText | DrawModeFlags::SettingsText); - if (!(maDrawModeFlags & TEXT)) + const DrawModeFlags aDrawModeFlags(getViewInformation2D().getDrawModeFlags()); + + if (!(aDrawModeFlags & TEXT)) return rColor; - if (maDrawModeFlags & DrawModeFlags::BlackText) + if (aDrawModeFlags & DrawModeFlags::BlackText) return basegfx::BColor(0, 0, 0); - if (maDrawModeFlags & DrawModeFlags::WhiteText) + if (aDrawModeFlags & DrawModeFlags::WhiteText) return basegfx::BColor(1, 1, 1); - if (maDrawModeFlags & DrawModeFlags::GrayText) + if (aDrawModeFlags & DrawModeFlags::GrayText) { const double fLuminance(rColor.luminance()); return basegfx::BColor(fLuminance, fLuminance, fLuminance); } // DrawModeFlags::SettingsText - if (maDrawModeFlags & DrawModeFlags::SettingsForSelection) + if (aDrawModeFlags & DrawModeFlags::SettingsForSelection) return Application::GetSettings().GetStyleSettings().GetHighlightTextColor().getBColor(); return Application::GetSettings().GetStyleSettings().GetWindowTextColor().getBColor(); @@ -4395,23 +4393,25 @@ basegfx::BColor CairoPixelProcessor2D::getGradientColor(const basegfx::BColor& r constexpr DrawModeFlags GRADIENT(DrawModeFlags::BlackGradient | DrawModeFlags::GrayGradient | DrawModeFlags::WhiteGradient | DrawModeFlags::SettingsGradient); - if (!(maDrawModeFlags & GRADIENT)) + const DrawModeFlags aDrawModeFlags(getViewInformation2D().getDrawModeFlags()); + + if (!(aDrawModeFlags & GRADIENT)) return rColor; - if (maDrawModeFlags & DrawModeFlags::BlackGradient) + if (aDrawModeFlags & DrawModeFlags::BlackGradient) return basegfx::BColor(0, 0, 0); - if (maDrawModeFlags & DrawModeFlags::WhiteGradient) + if (aDrawModeFlags & DrawModeFlags::WhiteGradient) return basegfx::BColor(1, 1, 1); - if (maDrawModeFlags & DrawModeFlags::GrayGradient) + if (aDrawModeFlags & DrawModeFlags::GrayGradient) { const double fLuminance(rColor.luminance()); return basegfx::BColor(fLuminance, fLuminance, fLuminance); } // DrawModeFlags::SettingsGradient - if (maDrawModeFlags & DrawModeFlags::SettingsForSelection) + if (aDrawModeFlags & DrawModeFlags::SettingsForSelection) return Application::GetSettings().GetStyleSettings().GetHighlightColor().getBColor(); return Application::GetSettings().GetStyleSettings().GetWindowColor().getBColor(); diff --git a/drawinglayer/source/processor2d/contourextractor2d.cxx b/drawinglayer/source/processor2d/contourextractor2d.cxx index e0b919464943..94d6b109ecfb 100644 --- a/drawinglayer/source/processor2d/contourextractor2d.cxx +++ b/drawinglayer/source/processor2d/contourextractor2d.cxx @@ -122,13 +122,13 @@ namespace drawinglayer::processor2d // create new local ViewInformation2D geometry::ViewInformation2D aViewInformation2D(getViewInformation2D()); aViewInformation2D.setObjectTransformation(getViewInformation2D().getObjectTransformation() * rTransformCandidate.getTransformation()); - updateViewInformation(aViewInformation2D); + setViewInformation2D(aViewInformation2D); // process content process(rTransformCandidate.getChildren()); // restore transformations - updateViewInformation(aLastViewInformation2D); + setViewInformation2D(aLastViewInformation2D); break; } diff --git a/drawinglayer/source/processor2d/d2dpixelprocessor2d.cxx b/drawinglayer/source/processor2d/d2dpixelprocessor2d.cxx index a192c55db7ae..305d1f987f72 100644 --- a/drawinglayer/source/processor2d/d2dpixelprocessor2d.cxx +++ b/drawinglayer/source/processor2d/d2dpixelprocessor2d.cxx @@ -591,7 +591,7 @@ public: aInvViewTransform.invert(); aViewport.transform(aInvViewTransform); aViewInformation.setViewport(aViewport); - updateViewInformation(aViewInformation); + setViewInformation2D(aViewInformation); } // clear as render preparation @@ -1473,13 +1473,13 @@ void D2DPixelProcessor2D::processTransformPrimitive2D( geometry::ViewInformation2D aViewInformation2D(getViewInformation2D()); aViewInformation2D.setObjectTransformation(getViewInformation2D().getObjectTransformation() * rTransformCandidate.getTransformation()); - updateViewInformation(aViewInformation2D); + setViewInformation2D(aViewInformation2D); // process content process(rTransformCandidate.getChildren()); // restore transformations - updateViewInformation(aLastViewInformation2D); + setViewInformation2D(aLastViewInformation2D); } void D2DPixelProcessor2D::processPolygonStrokePrimitive2D( diff --git a/drawinglayer/source/processor2d/hittestprocessor2d.cxx b/drawinglayer/source/processor2d/hittestprocessor2d.cxx index d9b71b00e825..948db19c93ee 100644 --- a/drawinglayer/source/processor2d/hittestprocessor2d.cxx +++ b/drawinglayer/source/processor2d/hittestprocessor2d.cxx @@ -276,13 +276,13 @@ namespace drawinglayer::processor2d // create new local ViewInformation2D containing transformation geometry::ViewInformation2D aViewInformation2D(getViewInformation2D()); aViewInformation2D.setObjectTransformation(getViewInformation2D().getObjectTransformation() * rTransformCandidate.getTransformation()); - updateViewInformation(aViewInformation2D); + setViewInformation2D(aViewInformation2D); // process child content recursively process(rTransformCandidate.getChildren()); // restore transformations - updateViewInformation(aLastViewInformation2D); + setViewInformation2D(aLastViewInformation2D); break; } diff --git a/drawinglayer/source/processor2d/linegeometryextractor2d.cxx b/drawinglayer/source/processor2d/linegeometryextractor2d.cxx index 1fd97ab110f6..8c07c8a17c0a 100644 --- a/drawinglayer/source/processor2d/linegeometryextractor2d.cxx +++ b/drawinglayer/source/processor2d/linegeometryextractor2d.cxx @@ -83,13 +83,13 @@ namespace drawinglayer::processor2d // create new transformations for CurrentTransformation and for local ViewInformation2D geometry::ViewInformation2D aViewInformation2D(getViewInformation2D()); aViewInformation2D.setObjectTransformation(getViewInformation2D().getObjectTransformation() * rTransformCandidate.getTransformation()); - updateViewInformation(aViewInformation2D); + setViewInformation2D(aViewInformation2D); // process content process(rTransformCandidate.getChildren()); // restore transformations - updateViewInformation(aLastViewInformation2D); + setViewInformation2D(aLastViewInformation2D); break; } diff --git a/drawinglayer/source/processor2d/textaspolygonextractor2d.cxx b/drawinglayer/source/processor2d/textaspolygonextractor2d.cxx index 1a091d027a85..4315f6696f75 100644 --- a/drawinglayer/source/processor2d/textaspolygonextractor2d.cxx +++ b/drawinglayer/source/processor2d/textaspolygonextractor2d.cxx @@ -170,13 +170,13 @@ namespace drawinglayer::processor2d // create new transformations for CurrentTransformation and for local ViewInformation2D geometry::ViewInformation2D aViewInformation2D(getViewInformation2D()); aViewInformation2D.setObjectTransformation(getViewInformation2D().getObjectTransformation() * rTransformCandidate.getTransformation()); - updateViewInformation(aViewInformation2D); + setViewInformation2D(aViewInformation2D); // process content process(rTransformCandidate.getChildren()); // restore transformations - updateViewInformation(aLastViewInformation2D); + setViewInformation2D(aLastViewInformation2D); break; } diff --git a/drawinglayer/source/processor2d/textextractor2d.cxx b/drawinglayer/source/processor2d/textextractor2d.cxx index 105014a750ca..835cb0cc24bc 100644 --- a/drawinglayer/source/processor2d/textextractor2d.cxx +++ b/drawinglayer/source/processor2d/textextractor2d.cxx @@ -47,13 +47,13 @@ void TextExtractor2D::processBasePrimitive2D(const primitive2d::BasePrimitive2D& aViewInformation2D.setObjectTransformation( getViewInformation2D().getObjectTransformation() * rTransformCandidate.getTransformation()); - updateViewInformation(aViewInformation2D); + setViewInformation2D(aViewInformation2D); // process content process(rTransformCandidate.getChildren()); // restore transformations - updateViewInformation(aLastViewInformation2D); + setViewInformation2D(aLastViewInformation2D); break; } diff --git a/drawinglayer/source/processor2d/vclprocessor2d.cxx b/drawinglayer/source/processor2d/vclprocessor2d.cxx index 066472830cad..8f53bf710d77 100644 --- a/drawinglayer/source/processor2d/vclprocessor2d.cxx +++ b/drawinglayer/source/processor2d/vclprocessor2d.cxx @@ -1053,14 +1053,14 @@ void VclProcessor2D::RenderTransformPrimitive2D( geometry::ViewInformation2D aViewInformation2D(getViewInformation2D()); aViewInformation2D.setObjectTransformation(getViewInformation2D().getObjectTransformation() * rTransformCandidate.getTransformation()); - updateViewInformation(aViewInformation2D); + setViewInformation2D(aViewInformation2D); // process content process(rTransformCandidate.getChildren()); // restore transformations maCurrentTransformation = aLastCurrentTransformation; - updateViewInformation(aLastViewInformation2D); + setViewInformation2D(aLastViewInformation2D); } // new XDrawPage for ViewInformation2D @@ -1073,13 +1073,13 @@ void VclProcessor2D::RenderPagePreviewPrimitive2D( // create new local ViewInformation2D geometry::ViewInformation2D aViewInformation2D(getViewInformation2D()); aViewInformation2D.setVisualizedPage(rPagePreviewCandidate.getXDrawPage()); - updateViewInformation(aViewInformation2D); + setViewInformation2D(aViewInformation2D); // process decomposed content process(rPagePreviewCandidate); // restore transformations - updateViewInformation(aLastViewInformation2D); + setViewInformation2D(aLastViewInformation2D); } // marker @@ -1596,14 +1596,8 @@ void VclProcessor2D::adaptTextToFillDrawMode() const mpOutputDevice->SetDrawMode(nAdaptedDrawMode); } -void VclProcessor2D::updateViewInformation(const geometry::ViewInformation2D& rViewInformation2D) +void VclProcessor2D::onViewInformation2DChanged() { - 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() @@ -1611,6 +1605,10 @@ void VclProcessor2D::updateViewInformation(const geometry::ViewInformation2D& rV else mpOutputDevice->SetAntialiasing(mpOutputDevice->GetAntialiasing() & ~AntialiasingFlags::Enable); + + // apply DrawModeFlags to target device + if (getViewInformation2D().getDrawModeFlags() != mpOutputDevice->GetDrawMode()) + mpOutputDevice->SetDrawMode(getViewInformation2D().getDrawModeFlags()); } // process support diff --git a/drawinglayer/source/processor2d/vclprocessor2d.hxx b/drawinglayer/source/processor2d/vclprocessor2d.hxx index a35ead52a4ad..10beddf6bd10 100644 --- a/drawinglayer/source/processor2d/vclprocessor2d.hxx +++ b/drawinglayer/source/processor2d/vclprocessor2d.hxx @@ -109,9 +109,8 @@ protected: void adaptLineToFillDrawMode() const; void adaptTextToFillDrawMode() const; - // allow to react on changes - virtual void - updateViewInformation(const geometry::ViewInformation2D& rViewInformation2D) override; + // allow to react on changes of ViewInformation2D + virtual void onViewInformation2DChanged() override; public: // constructor/destructor diff --git a/drawinglayer/source/processor3d/baseprocessor3d.cxx b/drawinglayer/source/processor3d/baseprocessor3d.cxx index 0969d45dca9b..7fd2a80a9988 100644 --- a/drawinglayer/source/processor3d/baseprocessor3d.cxx +++ b/drawinglayer/source/processor3d/baseprocessor3d.cxx @@ -59,6 +59,17 @@ namespace drawinglayer::processor3d } } + void BaseProcessor3D::setViewInformation3D(const geometry::ViewInformation3D& rNew) + { + if (rNew != maViewInformation3D) + { + // set if changed + maViewInformation3D = rNew; + + // allow reaction on change + onViewInformation3DChanged(); + } + } } // end of namespace /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/drawinglayer/source/processor3d/cutfindprocessor3d.cxx b/drawinglayer/source/processor3d/cutfindprocessor3d.cxx index cb1f737f5964..59228aeca0ed 100644 --- a/drawinglayer/source/processor3d/cutfindprocessor3d.cxx +++ b/drawinglayer/source/processor3d/cutfindprocessor3d.cxx @@ -74,7 +74,7 @@ namespace drawinglayer::processor3d aLastViewInformation3D.getDeviceToView(), aLastViewInformation3D.getViewTime(), aLastViewInformation3D.getExtendedInformationSequence()); - updateViewInformation(aNewViewInformation3D); + setViewInformation3D(aNewViewInformation3D); // #i102956# remember needed back-transform for found cuts (combine from right side) const basegfx::B3DHomMatrix aLastCombinedTransform(maCombinedTransform); @@ -85,7 +85,7 @@ namespace drawinglayer::processor3d // restore transformations and front, back maCombinedTransform = aLastCombinedTransform; - updateViewInformation(aLastViewInformation3D); + setViewInformation3D(aLastViewInformation3D); maFront = aLastFront; maBack = aLastBack; break; diff --git a/drawinglayer/source/processor3d/defaultprocessor3d.cxx b/drawinglayer/source/processor3d/defaultprocessor3d.cxx index 7331ed842165..91f394eb6127 100644 --- a/drawinglayer/source/processor3d/defaultprocessor3d.cxx +++ b/drawinglayer/source/processor3d/defaultprocessor3d.cxx @@ -461,13 +461,13 @@ namespace drawinglayer::processor3d aLastViewInformation3D.getDeviceToView(), aLastViewInformation3D.getViewTime(), aLastViewInformation3D.getExtendedInformationSequence()); - updateViewInformation(aNewViewInformation3D); + setViewInformation3D(aNewViewInformation3D); // let break down recursively process(rTransformCandidate.getChildren()); // restore transformations - updateViewInformation(aLastViewInformation3D); + setViewInformation3D(aLastViewInformation3D); } void DefaultProcessor3D::processBasePrimitive3D(const primitive3d::BasePrimitive3D& rBasePrimitive) diff --git a/drawinglayer/source/processor3d/geometry2dextractor.cxx b/drawinglayer/source/processor3d/geometry2dextractor.cxx index 0d6dd53bb271..42144eae299e 100644 --- a/drawinglayer/source/processor3d/geometry2dextractor.cxx +++ b/drawinglayer/source/processor3d/geometry2dextractor.cxx @@ -54,13 +54,13 @@ namespace drawinglayer::processor3d aLastViewInformation3D.getDeviceToView(), aLastViewInformation3D.getViewTime(), aLastViewInformation3D.getExtendedInformationSequence()); - updateViewInformation(aNewViewInformation3D); + setViewInformation3D(aNewViewInformation3D); // let break down recursively process(rPrimitive.getChildren()); // restore transformations - updateViewInformation(aLastViewInformation3D); + setViewInformation3D(aLastViewInformation3D); break; } case PRIMITIVE3D_ID_MODIFIEDCOLORPRIMITIVE3D : diff --git a/drawinglayer/source/processor3d/shadow3dextractor.cxx b/drawinglayer/source/processor3d/shadow3dextractor.cxx index 543787897bc3..7970b46cfabb 100644 --- a/drawinglayer/source/processor3d/shadow3dextractor.cxx +++ b/drawinglayer/source/processor3d/shadow3dextractor.cxx @@ -108,7 +108,7 @@ namespace drawinglayer::processor3d aLastViewInformation3D.getDeviceToView(), aLastViewInformation3D.getViewTime(), aLastViewInformation3D.getExtendedInformationSequence()); - updateViewInformation(aNewViewInformation3D); + setViewInformation3D(aNewViewInformation3D); if(mbShadowProjectionIsValid) { @@ -121,7 +121,7 @@ namespace drawinglayer::processor3d process(rPrimitive.getChildren()); // restore transformations - updateViewInformation(aLastViewInformation3D); + setViewInformation3D(aLastViewInformation3D); if(mbShadowProjectionIsValid) { diff --git a/drawinglayer/source/processor3d/zbufferprocessor3d.cxx b/drawinglayer/source/processor3d/zbufferprocessor3d.cxx index 82c1129fa585..22674b414cc6 100644 --- a/drawinglayer/source/processor3d/zbufferprocessor3d.cxx +++ b/drawinglayer/source/processor3d/zbufferprocessor3d.cxx @@ -562,7 +562,7 @@ namespace drawinglayer::processor3d aDeviceToView, getViewInformation3D().getViewTime(), getViewInformation3D().getExtendedInformationSequence()); - updateViewInformation(aNewViewInformation3D); + setViewInformation3D(aNewViewInformation3D); // prepare inverse EyeToView transformation. This can be done in constructor // since changes in object transformations when processing TransformPrimitive3Ds diff --git a/include/drawinglayer/geometry/viewinformation2d.hxx b/include/drawinglayer/geometry/viewinformation2d.hxx index c86b7b7a9bf8..f552c35b09e7 100644 --- a/include/drawinglayer/geometry/viewinformation2d.hxx +++ b/include/drawinglayer/geometry/viewinformation2d.hxx @@ -54,6 +54,8 @@ template <class interface_type> class Reference; template <typename> class Sequence; } +enum class DrawModeFlags : sal_uInt32; + namespace drawinglayer::geometry { /** ViewInformation2D class @@ -163,6 +165,9 @@ public: Color getAutoColor() const; void setAutoColor(Color aNew); + DrawModeFlags getDrawModeFlags() const; + void setDrawModeFlags(DrawModeFlags aNew); + /// claim that in the view processed a TextEdit is active bool getTextEditActive() const; void setTextEditActive(bool bNew); diff --git a/include/drawinglayer/processor2d/baseprocessor2d.hxx b/include/drawinglayer/processor2d/baseprocessor2d.hxx index 69624bd9de6f..d0f674383f38 100644 --- a/include/drawinglayer/processor2d/baseprocessor2d.hxx +++ b/include/drawinglayer/processor2d/baseprocessor2d.hxx @@ -44,7 +44,7 @@ namespace drawinglayer::processor2d to construct any processor with a given ViewInformation2D. To be able to handle primitives which need to change the current transformation (as e.g. TransformPrimitive2D) it is allowed for the processor implementation - to change its local value using updateViewInformation. + to change its local value using setViewInformation2D. The basic processing method is process(..) which gets handed over the sequence of primitives to process. For convenience of the C++ implementations, @@ -158,14 +158,11 @@ namespace drawinglayer::processor2d geometry::ViewInformation2D maViewInformation2D; protected: - /* access method to allow the implementations to change the current - ViewInformation2D if needed. This allows isolating these accesses - later if needed + /* callback method to allow the implementations to react on changes + to the current ViewInformation2D if needed (e.g. when your impl/ + derivation needs to react on AA change) */ - virtual void updateViewInformation(const geometry::ViewInformation2D& rViewInformation2D) - { - maViewInformation2D = rViewInformation2D; - } + virtual void onViewInformation2DChanged() {} /* as tooling, the process() implementation takes over API handling and calls this virtual render method when the primitive implementation is BasePrimitive2D-based. diff --git a/include/drawinglayer/processor2d/cairopixelprocessor2d.hxx b/include/drawinglayer/processor2d/cairopixelprocessor2d.hxx index 325cbe8f7fcd..3e5ecff28965 100644 --- a/include/drawinglayer/processor2d/cairopixelprocessor2d.hxx +++ b/include/drawinglayer/processor2d/cairopixelprocessor2d.hxx @@ -14,7 +14,6 @@ #include <tools/long.hxx> #include <sal/config.h> #include <vcl/vclptr.hxx> -#include <vcl/rendercontext/DrawModeFlags.hxx> // cairo-specific #include <cairo.h> @@ -92,10 +91,6 @@ class UNLESS_MERGELIBS(DRAWINGLAYER_DLLPUBLIC) CairoPixelProcessor2D final : pub // see comment there sal_uInt16 mnClipRecursionCount; - // DrawModeFlags from OutputDevice: These do modify how stuff - // needs to be colored/painted, context-dependent - DrawModeFlags maDrawModeFlags; - // calculated result of if we are in outsideCairoCoordinateLimits mode bool mbCairoCoordinateLimitWorkaroundActive; @@ -204,9 +199,8 @@ 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; + // allow to react on changes of ViewInformation2D + virtual void onViewInformation2DChanged() override; // constructor to create a CairoPixelProcessor2D for // the given cairo_surface_t pTarget. pTarget will not @@ -216,9 +210,6 @@ protected: // take over current BColorModifierStack const basegfx::BColorModifierStack& rBColorModifierStack, - // take over current DrawModeFlags - const DrawModeFlags& rDrawModeFlags, - // the ViewInformation const geometry::ViewInformation2D& rViewInformation, diff --git a/include/drawinglayer/processor3d/baseprocessor3d.hxx b/include/drawinglayer/processor3d/baseprocessor3d.hxx index 406dede08fd1..8aba861176cd 100644 --- a/include/drawinglayer/processor3d/baseprocessor3d.hxx +++ b/include/drawinglayer/processor3d/baseprocessor3d.hxx @@ -41,10 +41,10 @@ namespace drawinglayer::processor3d geometry::ViewInformation3D maViewInformation3D; protected: - void updateViewInformation(const geometry::ViewInformation3D& rViewInformation3D) - { - maViewInformation3D = rViewInformation3D; - } + /* callback method to allow the implementations to react on changes + to the current ViewInformation2D if needed + */ + virtual void onViewInformation3DChanged() {} /* as tooling, the process() implementation takes over API handling and calls this virtual render method when the primitive implementation is BasePrimitive3D-based. @@ -59,8 +59,9 @@ namespace drawinglayer::processor3d // the central processing method void process(const primitive3d::Primitive3DContainer& rSource); - // data access + /// data read/write access to ViewInformation2D const geometry::ViewInformation3D& getViewInformation3D() const { return maViewInformation3D; } + void setViewInformation3D(const geometry::ViewInformation3D& rNew); }; } // end of namespace drawinglayer::processor3d diff --git a/include/svx/sdr/contact/objectcontact.hxx b/include/svx/sdr/contact/objectcontact.hxx index eebd209b94aa..221190359fc7 100644 --- a/include/svx/sdr/contact/objectcontact.hxx +++ b/include/svx/sdr/contact/objectcontact.hxx @@ -83,7 +83,7 @@ protected: void setPreviewRenderer(bool bNew) { mbIsPreviewRenderer = bNew; } // interface to allow derivates to set ViewInformation2D - void updateViewInformation2D(const drawinglayer::geometry::ViewInformation2D& rViewInformation2D) { maViewInformation2D = rViewInformation2D; } + void setViewInformation2D2D(const drawinglayer::geometry::ViewInformation2D& rViewInformation2D) { maViewInformation2D = rViewInformation2D; } public: // basic constructor diff --git a/include/svx/sdr/overlay/overlaymanager.hxx b/include/svx/sdr/overlay/overlaymanager.hxx index 3ce37976a99d..7a704c99dfbc 100644 --- a/include/svx/sdr/overlay/overlaymanager.hxx +++ b/include/svx/sdr/overlay/overlaymanager.hxx @@ -62,9 +62,9 @@ namespace sdr::overlay // hold buffered the logic length of discrete vector (1.0, 0.0) and the // view transformation belonging to it. Update happens in getDiscreteOne() - basegfx::B2DHomMatrix maViewTransformation; - drawinglayer::geometry::ViewInformation2D maViewInformation2D; - double mfDiscreteOne; + mutable basegfx::B2DHomMatrix maViewTransformation; + mutable drawinglayer::geometry::ViewInformation2D maViewInformation2D; + mutable double mfDiscreteOne; // internal void ImpDrawMembers(const basegfx::B2DRange& rRange, OutputDevice& rDestinationDevice) const; @@ -77,6 +77,7 @@ namespace sdr::overlay double getDiscreteOne() const; tools::Rectangle RangeToInvalidateRectangle(const basegfx::B2DRange& rRange) const; + bool isOutputToRecordingMetaFile() const; OverlayManager(OutputDevice& rOutputDevice); virtual ~OverlayManager() override; diff --git a/svx/source/engine3d/helperminimaldepth3d.cxx b/svx/source/engine3d/helperminimaldepth3d.cxx index cfcc2c7d1483..9c3be1fd93a8 100644 --- a/svx/source/engine3d/helperminimaldepth3d.cxx +++ b/svx/source/engine3d/helperminimaldepth3d.cxx @@ -75,13 +75,13 @@ namespace drawinglayer::processor3d aLastViewInformation3D.getDeviceToView(), aLastViewInformation3D.getViewTime(), aLastViewInformation3D.getExtendedInformationSequence()); - updateViewInformation(aNewViewInformation3D); + setViewInformation3D(aNewViewInformation3D); // let break down process(rPrimitive.getChildren()); // restore transformations - updateViewInformation(aLastViewInformation3D); + setViewInformation3D(aLastViewInformation3D); break; } case PRIMITIVE3D_ID_POLYGONHAIRLINEPRIMITIVE3D : diff --git a/svx/source/sdr/contact/objectcontactofobjlistpainter.cxx b/svx/source/sdr/contact/objectcontactofobjlistpainter.cxx index 475a3913d3ed..f90ecdb94533 100644 --- a/svx/source/sdr/contact/objectcontactofobjlistpainter.cxx +++ b/svx/source/sdr/contact/objectcontactofobjlistpainter.cxx @@ -101,7 +101,7 @@ void ObjectContactOfObjListPainter::ProcessDisplay(DisplayInfo& rDisplayInfo) aNewViewInformation2D.setViewTransformation(pTargetDevice->GetViewTransformation()); aNewViewInformation2D.setViewport(aViewRange); aNewViewInformation2D.setVisualizedPage(GetXDrawPageForSdrPage(const_cast< SdrPage* >(mpProcessedPage))); - updateViewInformation2D(aNewViewInformation2D); + setViewInformation2D2D(aNewViewInformation2D); // collect primitive data in a sequence; this will already use the updated ViewInformation2D drawinglayer::primitive2d::Primitive2DContainer xPrimitiveSequence; diff --git a/svx/source/sdr/contact/objectcontactofpageview.cxx b/svx/source/sdr/contact/objectcontactofpageview.cxx index 28b40a56d59e..edef3241f38b 100644 --- a/svx/source/sdr/contact/objectcontactofpageview.cxx +++ b/svx/source/sdr/contact/objectcontactofpageview.cxx @@ -224,12 +224,17 @@ namespace sdr::contact if (static_cast<SdrPaintView&>(mrPageWindow.GetPageView().GetView()).IsTextEdit()) aNewViewInformation2D.setTextEditActive(true); - // this is the EditView repaint, provide that information, - // but only if we do not export to metafile if (!isOutputToRecordingMetaFile()) + { + // this is the EditView repaint, provide that information, + // but only if we do not export to metafile aNewViewInformation2D.setEditViewActive(true); - updateViewInformation2D(aNewViewInformation2D); + // also copy the current DrawModeFlags + aNewViewInformation2D.setDrawModeFlags(rTargetOutDev.GetDrawMode()); + } + + setViewInformation2D2D(aNewViewInformation2D); drawinglayer::primitive2d::Primitive2DContainer xPrimitiveSequence; diff --git a/svx/source/sdr/contact/viewobjectcontactofpageobj.cxx b/svx/source/sdr/contact/viewobjectcontactofpageobj.cxx index b7b0e1744259..5a72fd749ae9 100644 --- a/svx/source/sdr/contact/viewobjectcontactofpageobj.cxx +++ b/svx/source/sdr/contact/viewobjectcontactofpageobj.cxx @@ -144,7 +144,7 @@ drawinglayer::primitive2d::Primitive2DContainer PagePrimitiveExtractor::createPr // no time; page previews are not animated aNewViewInformation2D.setViewTime(0.0); - updateViewInformation2D(aNewViewInformation2D); + setViewInformation2D2D(aNewViewInformation2D); // create copy of DisplayInfo to set PagePainting DisplayInfo aDisplayInfo; diff --git a/svx/source/sdr/overlay/overlaymanager.cxx b/svx/source/sdr/overlay/overlaymanager.cxx index 8b6d40006416..266555716e74 100644 --- a/svx/source/sdr/overlay/overlaymanager.cxx +++ b/svx/source/sdr/overlay/overlaymanager.cxx @@ -24,6 +24,7 @@ #include <vcl/canvastools.hxx> #include <vcl/outdev.hxx> #include <vcl/window.hxx> +#include <vcl/gdimtf.hxx> #include <svx/sdr/overlay/overlayobject.hxx> #include <basegfx/matrix/b2dhommatrix.hxx> #include <drawinglayer/processor2d/baseprocessor2d.hxx> @@ -44,14 +45,14 @@ namespace sdr::overlay if(!nSize) return; - // 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 - const DrawModeFlags nOriginalDrawMode(rDestinationDevice.GetDrawMode()); - // prepare ViewInformation2D drawinglayer::geometry::ViewInformation2D aViewInformation2D(getCurrentViewInformation2D()); + // create processor + std::unique_ptr<drawinglayer::processor2d::BaseProcessor2D> pProcessor(drawinglayer::processor2d::createProcessor2DFromOutputDevice( + rDestinationDevice, + aViewInformation2D)); + for(const auto& rpOverlayObject : maOverlayObjects) { OSL_ENSURE(rpOverlayObject, "Corrupted OverlayObject List (!)"); @@ -65,35 +66,23 @@ namespace sdr::overlay { if(rRange.overlaps(rCandidate.getBaseRange())) { - const bool bCurrentAA(aViewInformation2D.getUseAntiAliasing()); - const bool bWantedAA(rCandidate.allowsAntiAliase()); + // update AA flag at local ViewInformation2D + aViewInformation2D.setUseAntiAliasing(rCandidate.allowsAntiAliase()); - if (bCurrentAA != bWantedAA) - { - // set AntiAliasing at Processor2D - aViewInformation2D.setUseAntiAliasing(bWantedAA); - } + // update DrawModeFlags at local ViewInformation2D + aViewInformation2D.setDrawModeFlags(rCandidate.isHighContrastSelection() ? + aViewInformation2D.getDrawModeFlags() | DrawModeFlags::SettingsForSelection : + aViewInformation2D.getDrawModeFlags() & ~DrawModeFlags::SettingsForSelection); - const bool bIsHighContrastSelection(rCandidate.isHighContrastSelection()); - if (bIsHighContrastSelection) + // set if changed - this will update the renderer and/or render + // target, including changed settings, renderer-independent + if (aViewInformation2D != pProcessor->getViewInformation2D()) { - // overrule DrawMode settings - rDestinationDevice.SetDrawMode(nOriginalDrawMode | DrawModeFlags::SettingsForSelection); + pProcessor->setViewInformation2D(aViewInformation2D); } - // create processor - std::unique_ptr<drawinglayer::processor2d::BaseProcessor2D> pProcessor(drawinglayer::processor2d::createProcessor2DFromOutputDevice( - rDestinationDevice, - aViewInformation2D)); - // render primitive pProcessor->process(aSequence); - - if (bIsHighContrastSelection) - { - // restore DrawMode settings - rDestinationDevice.SetDrawMode(nOriginalDrawMode); - } } } } @@ -146,8 +135,16 @@ namespace sdr::overlay return rtl::Reference<OverlayManager>(new OverlayManager(rOutputDevice)); } + bool OverlayManager::isOutputToRecordingMetaFile() const + { + GDIMetaFile* pMetaFile(getOutputDevice().GetConnectMetaFile()); + return (pMetaFile && pMetaFile->IsRecord() && !pMetaFile->IsPause()); + } + drawinglayer::geometry::ViewInformation2D const & OverlayManager::getCurrentViewInformation2D() const { + drawinglayer::geometry::ViewInformation2D aViewInformation(maViewInformation2D); + if(getOutputDevice().GetViewTransformation() != maViewTransformation) { basegfx::B2DRange aViewRange(maViewInformation2D.getViewport()); @@ -165,15 +162,25 @@ namespace sdr::overlay } } - OverlayManager* pThis = const_cast< OverlayManager* >(this); - - pThis->maViewTransformation = getOutputDevice().GetViewTransformation(); - drawinglayer::geometry::ViewInformation2D aViewInformation(maViewInformation2D); + maViewTransformation = getOutputDevice().GetViewTransformation(); aViewInformation.setViewTransformation(maViewTransformation); aViewInformation.setViewport(aViewRange); - pThis->maViewInformation2D = std::move(aViewInformation); + mfDiscreteOne = 0.0; + } - pThis->mfDiscreteOne = 0.0; + if (!isOutputToRecordingMetaFile()) + { + // this is the EditView repaint, provide that information, + // but only if we do not export to metafile + aViewInformation.setEditViewActive(true); + + // also copy the current DrawModeFlags + aViewInformation.setDrawModeFlags(getOutputDevice().GetDrawMode()); + } + + if (aViewInformation != maViewInformation2D) + { + maViewInformation2D = aViewInformation; } return maViewInformation2D;