[Libreoffice-commits] core.git: Branch 'feature/RotateFlyFrame3' - sw/source

Armin Le Grand Armin.Le.Grand at cib.de
Tue Nov 7 17:22:23 UTC 2017


 sw/source/core/doc/notxtfrm.cxx    |  113 ++++++++++++++++++++++++-------------
 sw/source/core/draw/dflyobj.cxx    |   30 +++------
 sw/source/core/inc/flyfrms.hxx     |   12 ++-
 sw/source/core/inc/frame.hxx       |    5 -
 sw/source/core/inc/frmtool.hxx     |    5 -
 sw/source/core/inc/notxtfrm.hxx    |   12 ++-
 sw/source/core/layout/flylay.cxx   |   59 +++++++++----------
 sw/source/core/layout/paintfrm.cxx |   12 +++
 sw/source/core/layout/wsfrm.cxx    |    7 --
 9 files changed, 146 insertions(+), 109 deletions(-)

New commits:
commit 3e7e2cd25ee620461ac9f15c50945f3ebc4b8cbe
Author: Armin Le Grand <Armin.Le.Grand at cib.de>
Date:   Tue Nov 7 18:18:44 2017 +0100

    RotateFlyFrame: Late-Updating of Areas
    
    When Layouting the update of the Areas is needed,
    but during layout needs to be stable on the unrotated
    values. Hard to find the right spot to do this, decided
    to use the inner/outer frame, layout both, and trigger
    the updates when the inner frame is layouted to non-
    rotated Areas for inner and outer frame. Still not sure
    oif this will be correct, but is close to working well.
    Some repaints/updates missing
    
    Change-Id: I3d7dcbf624f3f32392e5e98420cb348d11d7d322

diff --git a/sw/source/core/doc/notxtfrm.cxx b/sw/source/core/doc/notxtfrm.cxx
index 4a040cedfb9d..1accccb8e492 100644
--- a/sw/source/core/doc/notxtfrm.cxx
+++ b/sw/source/core/doc/notxtfrm.cxx
@@ -470,8 +470,15 @@ const Size& SwNoTextFrame::GetSize() const
     return pFly->getFramePrintArea().SSize();
 }
 
-void SwNoTextFrame::MakeAll(vcl::RenderContext* /*pRenderContext*/)
+void SwNoTextFrame::MakeAll(vcl::RenderContext* pRenderContext)
 {
+    if(GetUpper() && !GetUpper()->isFrameAreaDefinitionValid())
+    {
+        // outer frame *needs* to be layouted first, force this by calling
+        // ::Calc directly
+        GetUpper()->Calc(pRenderContext);
+    }
+
     SwContentNotify aNotify( this );
     SwBorderAttrAccess aAccess( SwFrame::GetCache(), this );
     const SwBorderAttrs &rAttrs = *aAccess.Get();
@@ -495,9 +502,9 @@ void SwNoTextFrame::MakeAll(vcl::RenderContext* /*pRenderContext*/)
         }
     }
 
-    // RotateFlyFrame3 - outer frame
+    // RotateFlyFrame3 - inner frame
     // After the unrotated layout is finished, apply possible set rotation to it
-    const double fRotation(getRotation());
+    const double fRotation(getFrameRotation());
 
     if(basegfx::fTools::equalZero(fRotation))
     {
@@ -507,25 +514,49 @@ void SwNoTextFrame::MakeAll(vcl::RenderContext* /*pRenderContext*/)
     }
     else
     {
-        // save Transformations to local maFrameAreaTransformation
-        // and maFramePrintAreaTransformation.
-        const Point aCenter(getFrameArea().Center());
-        const basegfx::B2DPoint aB2DCenter(aCenter.X(), aCenter.Y());
-
-        createFrameAreaTransformations(
-            maFrameAreaTransformation,
-            maFramePrintAreaTransformation,
-            fRotation,
-            aB2DCenter);
-
-        // create BoundRects of FrameAreas and re-set the FrameArea definitions
-        // to represent the rotated geometry in the layout object
-        setFrameAreaDefinitionsToBoundRangesOfTransformations(
-            maFrameAreaTransformation,
-            maFramePrintAreaTransformation);
+        const bool bMeValid(isFrameAreaDefinitionValid());
+        const bool bUpperValid(!GetUpper() || GetUpper()->isFrameAreaDefinitionValid());
+
+        if(bMeValid && bUpperValid)
+        {
+            // get center from outer frame (layout frame) to be on the safe side
+            const Point aCenter(GetUpper() ? GetUpper()->getFrameArea().Center() : getFrameArea().Center());
+            const basegfx::B2DPoint aB2DCenter(aCenter.X(), aCenter.Y());
+
+            updateTransformationsAndAreas(
+                fRotation,
+                aB2DCenter);
+
+            if(GetUpper())
+            {
+                SwFlyFreeFrame *pFly = dynamic_cast< SwFlyFreeFrame* >(GetUpper());
+
+                if(pFly)
+                {
+                    pFly->updateTransformationsAndAreas(
+                        fRotation,
+                        aB2DCenter);
+                }
+            }
+        }
     }
 }
 
+void SwNoTextFrame::updateTransformationsAndAreas(
+    double fRotation,
+    const basegfx::B2DPoint& rCenter)
+{
+    createFrameAreaTransformations(
+        maFrameAreaTransformation,
+        maFramePrintAreaTransformation,
+        fRotation,
+        rCenter);
+
+    setFrameAreaDefinitionsToBoundRangesOfTransformations(
+        maFrameAreaTransformation,
+        maFramePrintAreaTransformation);
+}
+
 // RotateFlyFrame3 - Support for Transformations - outer frame
 basegfx::B2DHomMatrix SwNoTextFrame::getFrameAreaTransformation() const
 {
@@ -551,9 +582,9 @@ basegfx::B2DHomMatrix SwNoTextFrame::getFramePrintAreaTransformation() const
     return SwContentFrame::getFramePrintAreaTransformation();
 }
 
-// RotateFlyFrame3 - outer frame
+// RotateFlyFrame3 - inner frame
 // Check if we contain a SwGrfNode and get possible rotation from it
-double SwNoTextFrame::getRotation() const
+double SwNoTextFrame::getFrameRotation() const
 {
     const SwNoTextNode* pSwNoTextNode(nullptr != GetNode() ? GetNode()->GetNoTextNode() : nullptr);
 
@@ -571,8 +602,8 @@ double SwNoTextFrame::getRotation() const
         }
     }
 
-    // call parent
-    return SwContentFrame::getRotation();
+    // no rotation
+    return 0.0;
 }
 
 /** Calculate the Bitmap's site, if needed */
@@ -735,12 +766,12 @@ void SwNoTextFrame::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
                             // and LayoutFrame (outer, GetUpper). It is possible to only invalidate
                             // the outer frame, but that leads to an in-between state that gets
                             // potentially painted
-                            InvalidateAll_();
-
                             if(GetUpper())
                             {
                                 GetUpper()->InvalidateAll_();
                             }
+
+                            InvalidateAll_();
                         }
                     }
                     break;
@@ -878,20 +909,12 @@ void paintGraphicUsingPrimitivesHelper(
     vcl::RenderContext & rOutputDevice,
     GraphicObject const& rGrfObj,
     GraphicAttr const& rGraphicAttr,
-    SwRect const& rAlignedGrfArea)
+    const basegfx::B2DHomMatrix& rGraphicTransform)
 {
     // RotGrfFlyFrame: unify using GraphicPrimitive2D
     // -> the primitive handles all crop and mirror stuff
     // -> the primitive renderer will create the needed pdf export data
     // -> if bitmap content, it will be cached system-dependent
-    const basegfx::B2DRange aTargetRange(
-        rAlignedGrfArea.Left(), rAlignedGrfArea.Top(),
-        rAlignedGrfArea.Right(), rAlignedGrfArea.Bottom());
-    const double fRotate(static_cast< double >(-rGraphicAttr.GetRotation()) * (M_PI/1800.0));
-    const basegfx::B2DHomMatrix aTargetTransform(
-        basegfx::utils::createRotateAroundCenterKeepAspectRatioStayInsideRange(
-            aTargetRange,
-            fRotate));
     drawinglayer::primitive2d::Primitive2DContainer aContent(1);
     bool bDone(false);
 
@@ -924,7 +947,7 @@ void paintGraphicUsingPrimitivesHelper(
                 if(aTempGraphic.IsLink() && GfxLinkType::NativeJpg == aTempGraphic.GetLink().GetType())
                 {
                     aContent[0] = new drawinglayer::primitive2d::GraphicPrimitive2D(
-                        aTargetTransform,
+                        rGraphicTransform,
                         aTempGraphic,
                         rGraphicAttr);
                     bDone = true;
@@ -936,11 +959,14 @@ void paintGraphicUsingPrimitivesHelper(
     if(!bDone)
     {
         aContent[0] = new drawinglayer::primitive2d::GraphicPrimitive2D(
-            aTargetTransform,
+            rGraphicTransform,
             rGrfObj,
             rGraphicAttr);
     }
 
+    basegfx::B2DRange aTargetRange(0.0, 0.0, 1.0, 1.0);
+    aTargetRange.transform(rGraphicTransform);
+
     paintUsingPrimitivesHelper(
         rOutputDevice,
         aContent,
@@ -1074,8 +1100,13 @@ void SwNoTextFrame::PaintPicture( vcl::RenderContext* pOut, const SwRect &rGrfAr
                 }
                 else
                 {
-                    paintGraphicUsingPrimitivesHelper(*pOut,
-                            rGrfObj, aGrfAttr, aAlignedGrfArea);
+                    const basegfx::B2DHomMatrix aGraphicTransform(getFrameAreaTransformation());
+
+                    paintGraphicUsingPrimitivesHelper(
+                        *pOut,
+                        rGrfObj,
+                        aGrfAttr,
+                        aGraphicTransform);
                 }
             }
             else
@@ -1154,12 +1185,16 @@ void SwNoTextFrame::PaintPicture( vcl::RenderContext* pOut, const SwRect &rGrfAr
             {
                 GraphicObject aTempGraphicObject(*pGraphic);
                 GraphicAttr aGrfAttr;
+                const basegfx::B2DHomMatrix aGraphicTransform(
+                    basegfx::utils::createScaleTranslateB2DHomMatrix(
+                        aAlignedGrfArea.Width(), aAlignedGrfArea.Height(),
+                        aAlignedGrfArea.Left(), aAlignedGrfArea.Top()));
 
                 paintGraphicUsingPrimitivesHelper(
                     *pOut,
                     aTempGraphicObject,
                     aGrfAttr,
-                    aAlignedGrfArea);
+                    aGraphicTransform);
 
                 // shade the representation if the object is activated outplace
                 uno::Reference < embed::XEmbeddedObject > xObj = pOLENd->GetOLEObj().GetOleRef();
diff --git a/sw/source/core/draw/dflyobj.cxx b/sw/source/core/draw/dflyobj.cxx
index 82b3c6f701cd..cc12dd1baad9 100644
--- a/sw/source/core/draw/dflyobj.cxx
+++ b/sw/source/core/draw/dflyobj.cxx
@@ -1013,17 +1013,10 @@ SdrObject* SwVirtFlyDrawObj::getFullDragClone() const
     // call parent
     SdrObject* pRetval = SdrVirtObj::getFullDragClone();
 
-    if(pRetval && ContainsSwGrfNode())
+    if(pRetval && GetFlyFrame() && ContainsSwGrfNode())
     {
-        // RotGrfFlyFrame: Add transformation to placeholder object
-        Size aSize;
-        const sal_uInt16 nRotation(SwVirtFlyDrawObj::getPossibleRotationFromFraphicFrame(aSize));
-        const double fRotate(static_cast< double >(-nRotation) * (M_PI/1800.0));
-        const basegfx::B2DRange aTargetRange(getInnerBound());
-        const basegfx::B2DHomMatrix aTargetTransform(
-            basegfx::utils::createRotateAroundCenterKeepAspectRatioStayInsideRange(
-                aTargetRange,
-                fRotate));
+        // RotGrfFlyFrame3: get inner bounds/transformation
+        const basegfx::B2DHomMatrix aTargetTransform(GetFlyFrame()->getFramePrintAreaTransformation());
 
         pRetval->TRSetBaseGeometry(aTargetTransform, basegfx::B2DPolyPolygon());
     }
@@ -1043,15 +1036,16 @@ void SwVirtFlyDrawObj::addCropHandles(SdrHdlList& rTarget) const
 
         if(!aTargetRange.isEmpty())
         {
-            Size aSize;
-            const sal_uInt16 nRotation(SwVirtFlyDrawObj::getPossibleRotationFromFraphicFrame(aSize));
-            const double fRotate(static_cast< double >(-nRotation) * (M_PI/1800.0));
-            const basegfx::B2DHomMatrix aTargetTransform(
-                basegfx::utils::createRotateAroundCenterKeepAspectRatioStayInsideRange(
-                    aTargetRange,
-                    fRotate));
+            // RotGrfFlyFrame3: get inner bounds/transformation
+            const basegfx::B2DHomMatrix aTargetTransform(GetFlyFrame()->getFramePrintAreaTransformation());
+
+            // break up matrix
+            basegfx::B2DTuple aScale;
+            basegfx::B2DTuple aTranslate;
+            double fRotate(0.0);
+            double fShearX(0.0);
+            aTargetTransform.decompose(aScale, aTranslate, fRotate, fShearX);
             basegfx::B2DPoint aPos;
-            const double fShearX(0.0);
 
             aPos = aTargetTransform * basegfx::B2DPoint(0.0, 0.0);
             rTarget.AddHdl(new SdrCropHdl(Point(basegfx::fround(aPos.getX()), basegfx::fround(aPos.getY())), SdrHdlKind::UpperLeft, fShearX, fRotate));
diff --git a/sw/source/core/inc/flyfrms.hxx b/sw/source/core/inc/flyfrms.hxx
index 3b6ce2292bce..e202c9733d88 100644
--- a/sw/source/core/inc/flyfrms.hxx
+++ b/sw/source/core/inc/flyfrms.hxx
@@ -30,6 +30,7 @@ class SwFlyAtContentFrame;
 // bound in Content.
 class SwFlyFreeFrame : public SwFlyFrame
 {
+private:
     // #i34753# - flag for at-page anchored Writer fly frames
     // to prevent a positioning - call of method <MakeObjPos()> -, if Writer
     // fly frame is already clipped during its format by the object formatter.
@@ -123,12 +124,17 @@ public:
     */
     virtual bool IsFormatPossible() const override;
 
-    // RotateFlyFrame3 - Support for outer Frame of a SwGrfNode
-    virtual double getRotation() const override;
-
     // RotateFlyFrame3 - Support for Transformations for outer Frame of a SwGrfNode
     basegfx::B2DHomMatrix getFrameAreaTransformation() const;
     basegfx::B2DHomMatrix getFramePrintAreaTransformation() const;
+    void updateTransformationsAndAreas(
+        double fRotation,
+        const basegfx::B2DPoint& rCenter);
+
+    // RotateFlyFrame3 - Support for outer Frame of a SwGrfNode
+    // Only for local data extraction. To uniquely access information
+    // for local transformation, use getFrameArea(Print)Transformation
+    double getFrameRotation() const;
 };
 
 // Flys that are bound to LayoutFrames and not to Content
diff --git a/sw/source/core/inc/frame.hxx b/sw/source/core/inc/frame.hxx
index ddd4da107e30..d02426976204 100644
--- a/sw/source/core/inc/frame.hxx
+++ b/sw/source/core/inc/frame.hxx
@@ -835,11 +835,6 @@ public:
     void dumpChildrenAsXml(xmlTextWriterPtr writer) const;
     bool IsCollapse() const;
 
-    // RotateFlyFrame3 - Support for handing out a rotation, currently
-    // only used for SwGrfNode in inner SwFrame of a SwFlyFrame, but may
-    // be used in the future. Default returns 0.0 (no rotation)
-    virtual double getRotation() const;
-
     // RotateFlyFrame3 - Support for Transformations
     // Hand out the Transformations for the current FrameAreaDefinition
     // for the FrameArea and FramePrintArea.
diff --git a/sw/source/core/inc/frmtool.hxx b/sw/source/core/inc/frmtool.hxx
index 687bda2fe686..c0ecd3463b02 100644
--- a/sw/source/core/inc/frmtool.hxx
+++ b/sw/source/core/inc/frmtool.hxx
@@ -75,8 +75,9 @@ bool DrawFillAttributes(
 // RotGrfFlyFrame: Adapted to rotation
 void paintGraphicUsingPrimitivesHelper(
     OutputDevice & rOutputDevice,
-    GraphicObject const& rGraphicObj, GraphicAttr const& rGraphicAttr,
-    SwRect const& rAlignedGrfArea);
+    GraphicObject const& rGraphicObj,
+    GraphicAttr const& rGraphicAttr,
+    const basegfx::B2DHomMatrix& rGraphicTransform);
 
 // method to align rectangle.
 // Created declaration here to avoid <extern> declarations
diff --git a/sw/source/core/inc/notxtfrm.hxx b/sw/source/core/inc/notxtfrm.hxx
index 29163e3117d2..fa64a1be3214 100644
--- a/sw/source/core/inc/notxtfrm.hxx
+++ b/sw/source/core/inc/notxtfrm.hxx
@@ -28,6 +28,7 @@ struct SwCursorMoveState;
 
 class SwNoTextFrame: public SwContentFrame
 {
+private:
     friend void FrameFinit();
 
     // RotateFlyFrame3 - Support for Transformation, hold
@@ -64,12 +65,17 @@ public:
     void StopAnimation( OutputDevice* = nullptr ) const;
     bool HasAnimation()  const;
 
-    // RotateFlyFrame3 - Support for inner frame of a SwGrfNode
-    virtual double getRotation() const override;
-
     // RotateFlyFrame3 - Support for Transformations for inner frame of a SwGrfNode
     basegfx::B2DHomMatrix getFrameAreaTransformation() const;
     basegfx::B2DHomMatrix getFramePrintAreaTransformation() const;
+    void updateTransformationsAndAreas(
+        double fRotation,
+        const basegfx::B2DPoint& rCenter);
+
+    // RotateFlyFrame3 - Support for inner frame of a SwGrfNode.
+    // Only for local data extraction. To uniquely access information
+    // for local transformation, use getFrameArea(Print)Transformation.
+    double getFrameRotation() const;
 };
 
 #endif
diff --git a/sw/source/core/layout/flylay.cxx b/sw/source/core/layout/flylay.cxx
index 96c466a604be..3fcdb8f0ddff 100644
--- a/sw/source/core/layout/flylay.cxx
+++ b/sw/source/core/layout/flylay.cxx
@@ -111,7 +111,8 @@ void SwFlyFreeFrame::MakeAll(vcl::RenderContext* /*pRenderContext*/)
 
     if ( !GetAnchorFrame() || IsLocked() || IsColLocked() )
         return;
-    // #i28701# - use new method <GetPageFrame()>
+
+        // #i28701# - use new method <GetPageFrame()>
     if( !GetPageFrame() && GetAnchorFrame() && GetAnchorFrame()->IsInFly() )
     {
         SwFlyFrame* pFly = AnchorFrame()->FindFlyFrame();
@@ -119,8 +120,11 @@ void SwFlyFreeFrame::MakeAll(vcl::RenderContext* /*pRenderContext*/)
         if( pPageFrame )
             pPageFrame->AppendFlyToPage( this );
     }
+
     if( !GetPageFrame() )
+    {
         return;
+    }
 
     Lock(); // The curtain drops
 
@@ -225,9 +229,10 @@ void SwFlyFreeFrame::MakeAll(vcl::RenderContext* /*pRenderContext*/)
             nLoopControlRuns = 0;
     }
 
-    // RotateFlyFrame3 - inner frame
-    // After the unrotated layout is finished, apply possible set rotation to it
-    const double fRotation(getRotation());
+    // RotateFlyFrame3 - outer frame
+    // Do not refresh transforms/Areas self here, this will be done
+    // when inner and outer frame are layouted, in SwNoTextFrame::MakeAll
+    const double fRotation(getFrameRotation());
 
     if(basegfx::fTools::equalZero(fRotation))
     {
@@ -235,27 +240,6 @@ void SwFlyFreeFrame::MakeAll(vcl::RenderContext* /*pRenderContext*/)
         maFrameAreaTransformation.identity();
         maFramePrintAreaTransformation.identity();
     }
-    else
-    {
-        // save Transformations to local maFrameAreaTransformation
-        // and maFramePrintAreaTransformation.
-
-        // get center from outer frame (layout frame) to be on the safe side
-        const Point aCenter(GetUpper() ? GetUpper()->getFrameArea().Center() : getFrameArea().Center());
-        const basegfx::B2DPoint aB2DCenter(aCenter.X(), aCenter.Y());
-
-        createFrameAreaTransformations(
-            maFrameAreaTransformation,
-            maFramePrintAreaTransformation,
-            fRotation,
-            aB2DCenter);
-
-        // create BoundRects of FrameAreas and re-set the FrameArea definitions
-        // to represent the rotated geometry in the layout object
-        setFrameAreaDefinitionsToBoundRangesOfTransformations(
-            maFrameAreaTransformation,
-            maFramePrintAreaTransformation);
-    }
 
     Unlock();
 
@@ -268,6 +252,21 @@ void SwFlyFreeFrame::MakeAll(vcl::RenderContext* /*pRenderContext*/)
 #endif
 }
 
+void SwFlyFreeFrame::updateTransformationsAndAreas(
+    double fRotation,
+    const basegfx::B2DPoint& rCenter)
+{
+    createFrameAreaTransformations(
+        maFrameAreaTransformation,
+        maFramePrintAreaTransformation,
+        fRotation,
+        rCenter);
+
+    setFrameAreaDefinitionsToBoundRangesOfTransformations(
+        maFrameAreaTransformation,
+        maFramePrintAreaTransformation);
+}
+
 // RotateFlyFrame3 - Support for Transformations - outer frame
 basegfx::B2DHomMatrix SwFlyFreeFrame::getFrameAreaTransformation() const
 {
@@ -293,8 +292,8 @@ basegfx::B2DHomMatrix SwFlyFreeFrame::getFramePrintAreaTransformation() const
     return SwFlyFrame::getFramePrintAreaTransformation();
 }
 
-// RotateFlyFrame3 - inner frame
-double SwFlyFreeFrame::getRotation() const
+// RotateFlyFrame3 - outer frame
+double SwFlyFreeFrame::getFrameRotation() const
 {
     // SwLayoutFrame::Lower() != SwFrame::GetLower(), but SwFrame::GetLower()
     // calls SwLayoutFrame::Lower() when it's a SwLayoutFrame - so use GetLower()
@@ -302,11 +301,11 @@ double SwFlyFreeFrame::getRotation() const
 
     if(nullptr != pSwNoTextFrame)
     {
-        return pSwNoTextFrame->getRotation();
+        return pSwNoTextFrame->getFrameRotation();
     }
 
-    // call parent
-    return SwFlyFrame::getRotation();
+    // no rotation
+    return 0.0;
 }
 
 /** determines, if direct environment of fly frame has 'auto' size
diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx
index 0f88770afa8c..d549fe39ab3a 100644
--- a/sw/source/core/layout/paintfrm.cxx
+++ b/sw/source/core/layout/paintfrm.cxx
@@ -1723,8 +1723,16 @@ static void lcl_DrawGraphic( const SvxBrushItem& rBrush, vcl::RenderContext *pOu
     // used, these coordinates have to be determined on pixel level.
     ::SwAlignGrfRect( &aAlignedGrfRect, *pOut );
 
-    paintGraphicUsingPrimitivesHelper(*pOut,
-        *pGrf, pGrf->GetAttr(), aAlignedGrfRect);
+    const basegfx::B2DHomMatrix aGraphicTransform(
+        basegfx::utils::createScaleTranslateB2DHomMatrix(
+            aAlignedGrfRect.Width(), aAlignedGrfRect.Height(),
+            aAlignedGrfRect.Left(), aAlignedGrfRect.Top()));
+
+    paintGraphicUsingPrimitivesHelper(
+        *pOut,
+        *pGrf,
+        pGrf->GetAttr(),
+        aGraphicTransform);
 
     if ( bNotInside )
         pOut->Pop();
diff --git a/sw/source/core/layout/wsfrm.cxx b/sw/source/core/layout/wsfrm.cxx
index 8700bbe65f7d..4b639d337e71 100644
--- a/sw/source/core/layout/wsfrm.cxx
+++ b/sw/source/core/layout/wsfrm.cxx
@@ -166,13 +166,6 @@ void SwFrameAreaDefinition::setFrameAreaDefinitionsToBoundRangesOfTransformation
     }
 }
 
-// RotateFlyFrame3 - get a possible rotation from SwFrame
-double SwFrame::getRotation() const
-{
-    // default returns 0.0 (no rotation)
-    return 0.0;
-}
-
 // RotateFlyFrame3 - Support for Transformations
 basegfx::B2DHomMatrix SwFrame::getFrameAreaTransformation() const
 {


More information about the Libreoffice-commits mailing list