comphelper/source/misc/lok.cxx | 12 ++++ drawinglayer/source/primitive2d/texthierarchyprimitive2d.cxx | 9 +++ drawinglayer/source/tools/primitive2dxmldump.cxx | 13 ++++ include/comphelper/lok.hxx | 4 + include/drawinglayer/primitive2d/texthierarchyprimitive2d.hxx | 3 + sd/source/ui/tools/SlideshowLayerRenderer.cxx | 29 +++++++++- 6 files changed, 68 insertions(+), 2 deletions(-)
New commits: commit 01742b2369cf4c27269ad390023a25ab38481dea Author: Marco Cecchetti <marco.cecche...@collabora.com> AuthorDate: Tue Dec 3 18:59:50 2024 +0100 Commit: Marco Cecchetti <marco.cecche...@collabora.com> CommitDate: Wed Dec 11 13:51:50 2024 +0100 lok: slideshow: handle text object in edit mode This patch allows to render a text object in edit mode by decomposing a TextHierarchyEditPrimitive2D instance in place of using TextEditDrawing. That avoids to have artifacts displayed while playing the slideshow such as a tiny rectangle around the edited text shape. Moreover it allows to animate a single paragraph even when the related text object is in edit mode. Change-Id: I0c27dc0953dd1b0fb7ae70f41e569587f3a623ac Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177755 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> diff --git a/comphelper/source/misc/lok.cxx b/comphelper/source/misc/lok.cxx index 88c9721a4ce7..8f0f61df3218 100644 --- a/comphelper/source/misc/lok.cxx +++ b/comphelper/source/misc/lok.cxx @@ -35,6 +35,8 @@ static bool g_bViewIdForVisCursorInvalidation(false); static bool g_bLocalRendering(false); +static bool g_bSlideshowRendering(false); + static Compat g_eCompatFlags(Compat::none); static std::function<bool(void*)> g_pAnyInputCallback; @@ -193,6 +195,16 @@ bool isLocalRendering() return g_bLocalRendering; } +void setSlideshowRendering(bool bSlideshowRendering) +{ + g_bSlideshowRendering = bSlideshowRendering; +} + +bool isSlideshowRendering() +{ + return g_bSlideshowRendering; +} + void setCompatFlag(Compat flag) { g_eCompatFlags = static_cast<Compat>(g_eCompatFlags | flag); } bool isCompatFlagSet(Compat flag) { return (g_eCompatFlags & flag) == flag; } diff --git a/drawinglayer/source/primitive2d/texthierarchyprimitive2d.cxx b/drawinglayer/source/primitive2d/texthierarchyprimitive2d.cxx index 93cb4e455d76..ef6364ff447f 100644 --- a/drawinglayer/source/primitive2d/texthierarchyprimitive2d.cxx +++ b/drawinglayer/source/primitive2d/texthierarchyprimitive2d.cxx @@ -19,6 +19,7 @@ #include <drawinglayer/primitive2d/texthierarchyprimitive2d.hxx> #include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx> +#include <comphelper/lok.hxx> using namespace com::sun::star; @@ -148,6 +149,14 @@ namespace drawinglayer::primitive2d return PRIMITIVE2D_ID_TEXTHIERARCHYEDITPRIMITIVE2D; } + void TextHierarchyEditPrimitive2D::get2DDecomposition(Primitive2DDecompositionVisitor& rVisitor, const geometry::ViewInformation2D& /*rViewInformation*/) const + { + // lok case: decompose it when we're rendering a slide show + if (!comphelper::LibreOfficeKit::isSlideshowRendering()) + return; + rVisitor.visit(getContent()); + } + } // end of namespace /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/drawinglayer/source/tools/primitive2dxmldump.cxx b/drawinglayer/source/tools/primitive2dxmldump.cxx index f3b9ef1bc919..54569c4cf7f5 100644 --- a/drawinglayer/source/tools/primitive2dxmldump.cxx +++ b/drawinglayer/source/tools/primitive2dxmldump.cxx @@ -62,6 +62,7 @@ #include <drawinglayer/attribute/fillgradientattribute.hxx> #include <drawinglayer/attribute/sdrfillgraphicattribute.hxx> #include <drawinglayer/attribute/materialattribute3d.hxx> +#include <drawinglayer/primitive2d/texthierarchyprimitive2d.hxx> using namespace drawinglayer::primitive2d; @@ -1099,6 +1100,18 @@ void Primitive2dXmlDump::decomposeAndWrite( break; } + case PRIMITIVE2D_ID_TEXTHIERARCHYEDITPRIMITIVE2D: + { + rWriter.startElement("texthierarchyedit"); + const auto* pTextHierarchyEditPrimitive + = dynamic_cast<const drawinglayer::primitive2d::TextHierarchyEditPrimitive2D*>( + pBasePrimitive); + if (pTextHierarchyEditPrimitive) + decomposeAndWrite(pTextHierarchyEditPrimitive->getContent(), rWriter); + rWriter.endElement(); + break; + } + case PRIMITIVE2D_ID_TEXTHIERARCHYPARAGRAPHPRIMITIVE2D: { // TextHierarchyParagraphPrimitive2D. diff --git a/include/comphelper/lok.hxx b/include/comphelper/lok.hxx index a497912c4a6f..7f1e866cf5a5 100644 --- a/include/comphelper/lok.hxx +++ b/include/comphelper/lok.hxx @@ -66,6 +66,10 @@ COMPHELPER_DLLPUBLIC bool isForkedChild(); COMPHELPER_DLLPUBLIC void setLocalRendering(bool bLocalRendering = true); COMPHELPER_DLLPUBLIC bool isLocalRendering(); +/// Used by SlideshowLayerRenderer for signaling that a slide rendering is occurring. +COMPHELPER_DLLPUBLIC void setSlideshowRendering(bool bSlideshowRendering); +COMPHELPER_DLLPUBLIC bool isSlideshowRendering(); + /// Check whether clients want a part number in an invalidation payload. COMPHELPER_DLLPUBLIC bool isPartInInvalidation(); /// Set whether clients want a part number in an invalidation payload. diff --git a/include/drawinglayer/primitive2d/texthierarchyprimitive2d.hxx b/include/drawinglayer/primitive2d/texthierarchyprimitive2d.hxx index da388d935eac..cad4a8c7e982 100644 --- a/include/drawinglayer/primitive2d/texthierarchyprimitive2d.hxx +++ b/include/drawinglayer/primitive2d/texthierarchyprimitive2d.hxx @@ -183,6 +183,9 @@ namespace drawinglayer::primitive2d /// provide unique ID virtual sal_uInt32 getPrimitive2DID() const override; + + void get2DDecomposition(Primitive2DDecompositionVisitor& rVisitor, + const geometry::ViewInformation2D& rViewInformation) const override; }; } // end of namespace drawinglayer::primitive2d diff --git a/sd/source/ui/tools/SlideshowLayerRenderer.cxx b/sd/source/ui/tools/SlideshowLayerRenderer.cxx index e2b1f4ade226..d17b4beaedf7 100644 --- a/sd/source/ui/tools/SlideshowLayerRenderer.cxx +++ b/sd/source/ui/tools/SlideshowLayerRenderer.cxx @@ -31,6 +31,7 @@ #include <drawdoc.hxx> #include <unokywds.hxx> #include <comphelper/servicehelper.hxx> +#include <comphelper/lok.hxx> #include <com/sun/star/animations/XAnimate.hpp> #include <com/sun/star/animations/XAnimationNode.hpp> @@ -42,7 +43,6 @@ #include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx> #include <drawinglayer/primitive2d/BufferedDecompositionPrimitive2D.hxx> #include <drawinglayer/primitive2d/texthierarchyprimitive2d.hxx> -#include <drawinglayer/primitive2d/texthierarchyprimitive2d.hxx> #include <drawinglayer/tools/primitive2dxmldump.hxx> @@ -238,6 +238,18 @@ findTextBlock(drawinglayer::primitive2d::Primitive2DContainer const& rContainer, if (pTextBlock) return pTextBlock; } + + // for text object in edit mode + auto* pTextEditPrimitive + = dynamic_cast<drawinglayer::primitive2d::TextHierarchyEditPrimitive2D*>( + pBasePrimitive); + if (pTextEditPrimitive) + { + auto* pTextBlock + = findTextBlock(pTextEditPrimitive->getContent(), rViewInformation2D); + if (pTextBlock) + return pTextBlock; + } } } return nullptr; @@ -759,7 +771,20 @@ void SlideshowLayerRenderer::createViewAndDraw( Point aPoint; vcl::Region aRegion(::tools::Rectangle(aPoint, aPageSize)); - aView.CompleteRedraw(rRenderContext.maVirtualDevice, aRegion, pRedirector); + + // Rendering of a text shape in edit mode is performed by decomposing the TextHierarchyEditPrimitive2D instance. + // Usually such kind of primitive doesn't decompose on primitive processing, so we need to signal through a flag + // that a slideshow rendering is going to be performed in order to enable the decomposition. + // Using TextHierarchyEditPrimitive2D decomposition in place of TextEditDrawing for rendering a text object + // in edit mode allows to animate a single paragraph even when the related text object is in edit mode. + comphelper::LibreOfficeKit::setSlideshowRendering(true); + // Redraw slide but skip EndCompleteRedraw() which uses TextEditDrawing for rendering text when a text object is + // in edit mode. TextEditDrawing was causing to have artifacts displayed while playing the slideshow such as + // a tiny rectangle around the edited text shape. + SdrPaintWindow* pPaintWindow = aView.BeginCompleteRedraw(rRenderContext.maVirtualDevice); + OSL_ENSURE(pPaintWindow, "SlideshowLayerRenderer::createViewAndDraw: No OutDev (!)"); + aView.DoCompleteRedraw(*pPaintWindow, aRegion, pRedirector); + comphelper::LibreOfficeKit::setSlideshowRendering(false); } namespace