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

Reply via email to