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

Armin Le Grand Armin.Le.Grand at cib.de
Fri Nov 17 12:25:17 UTC 2017


 editeng/source/items/frmitems.cxx |   16 +++++++++++
 include/editeng/brushitem.hxx     |    2 +
 sw/source/core/doc/notxtfrm.cxx   |   36 +++++++++++++++++++++++--
 sw/source/core/layout/fly.cxx     |   54 +++++++++++++++++++++-----------------
 sw/source/core/layout/flylay.cxx  |   29 ++++++++++++++++++++
 5 files changed, 111 insertions(+), 26 deletions(-)

New commits:
commit 09bbeba1df1f9951a0446d5806cba780d71a5c80
Author: Armin Le Grand <Armin.Le.Grand at cib.de>
Date:   Fri Nov 17 13:23:02 2017 +0100

    RotateFlyFrame3: Enhancements to AutoContour
    
    Added several conditions for AutoContour, need to
    work on reaction on changes to these. Corrected
    needed transform adaptions to Countour(s)
    
    Change-Id: Ia3d7845fd5d50c8a413d592ae07ce2041ccc91b9

diff --git a/editeng/source/items/frmitems.cxx b/editeng/source/items/frmitems.cxx
index c2bfc5e290fb..bb61ccaccc86 100644
--- a/editeng/source/items/frmitems.cxx
+++ b/editeng/source/items/frmitems.cxx
@@ -3157,6 +3157,22 @@ SvxBrushItem::~SvxBrushItem()
 {
 }
 
+bool SvxBrushItem::isUsed() const
+{
+    if (GPOS_NONE != GetGraphicPos())
+    {
+        // graphic used
+        return true;
+    }
+    else if (0xff != GetColor().GetTransparency())
+    {
+        // color used
+        return true;
+    }
+
+    return false;
+}
+
 sal_uInt16 SvxBrushItem::GetVersion( sal_uInt16 /*nFileVersion*/ ) const
 {
     return BRUSH_GRAPHIC_VERSION;
diff --git a/include/editeng/brushitem.hxx b/include/editeng/brushitem.hxx
index 516abdacd467..8aa177aa2adb 100644
--- a/include/editeng/brushitem.hxx
+++ b/include/editeng/brushitem.hxx
@@ -79,6 +79,8 @@ public:
     virtual ~SvxBrushItem() override;
 
 public:
+    // check if it's used
+    bool isUsed() const;
 
     virtual bool GetPresentation( SfxItemPresentation ePres,
                                   MapUnit eCoreMetric,
diff --git a/sw/source/core/doc/notxtfrm.cxx b/sw/source/core/doc/notxtfrm.cxx
index 93103489af70..1ebb9aaf0944 100644
--- a/sw/source/core/doc/notxtfrm.cxx
+++ b/sw/source/core/doc/notxtfrm.cxx
@@ -1308,15 +1308,47 @@ void SwNoTextFrame::PaintPicture( vcl::RenderContext* pOut, const SwRect &rGrfAr
 bool SwNoTextFrame::IsTransparent() const
 {
     const SwViewShell* pSh = getRootFrame()->GetCurrShell();
+
     if ( !pSh || !pSh->GetViewOptions()->IsGraphic() )
+    {
         return true;
+    }
 
     const SwGrfNode *pNd;
+
     if( nullptr != (pNd = GetNode()->GetGrfNode()) )
-        return pNd->IsTransparent();
+    {
+        if(pNd->IsTransparent())
+        {
+            return true;
+        }
+    }
+
+    // RotateFlyFrame3: If we are transformed, there are 'free' areas between
+    // the Graphic and the Border/Padding stuff - at least as long as those
+    // (Border and Padding) are not transformed, too
+    if(isTransformableSwFrame())
+    {
+        // we can be more specific - rotations of multiples of
+        // 90 degrees will leave no gaps. Go from [0.0 .. F_2PI]
+        // to [0 .. 360] and check modulo 90
+        const long nRot(static_cast<long>(getLocalFrameRotation() / F_PI180));
+        const bool bMultipleOf90(0 == (nRot % 90));
+
+        if(!bMultipleOf90)
+        {
+            return true;
+        }
+    }
 
     //#29381# OLE are always transparent
-    return true;
+    if(nullptr != GetNode()->GetOLENode())
+    {
+        return true;
+    }
+
+    // return false by default to avoid background paint
+    return false;
 }
 
 void SwNoTextFrame::StopAnimation( OutputDevice* pOut ) const
diff --git a/sw/source/core/layout/fly.cxx b/sw/source/core/layout/fly.cxx
index 4e7639411062..569a0ec86282 100644
--- a/sw/source/core/layout/fly.cxx
+++ b/sw/source/core/layout/fly.cxx
@@ -2447,6 +2447,8 @@ bool SwFlyFrame::GetContour( tools::PolyPolygon&   rContour,
 
     if(bIsCandidate)
     {
+        const SwFlyFreeFrame* pSwFlyFreeFrame(static_cast< const SwFlyFreeFrame* >(this));
+
         if(GetFormat()->GetSurround().IsContour())
         {
             SwNoTextNode *pNd = const_cast<SwNoTextNode*>(static_cast<const SwNoTextNode*>(static_cast<const SwContentFrame*>(Lower())->GetNode()));
@@ -2541,38 +2543,42 @@ bool SwFlyFrame::GetContour( tools::PolyPolygon&   rContour,
         }
         else
         {
-            const SwFlyFreeFrame* pSwFlyFreeFrame(static_cast< const SwFlyFreeFrame* >(this));
-
-            if(nullptr != pSwFlyFreeFrame && pSwFlyFreeFrame->supportsAutoContour())
+            if(nullptr != pSwFlyFreeFrame &&
+                pSwFlyFreeFrame->supportsAutoContour() &&
+                // isTransformableSwFrame already used in supportsAutoContour(), but
+                // better check twice when it may get changed there...
+                pSwFlyFreeFrame->isTransformableSwFrame())
             {
                 // RotateFlyFrame: use untransformed SwFrame to allow text floating around.
                 // Will be transformed below
                 const TransformableSwFrame* pTransformableSwFrame(pSwFlyFreeFrame->getTransformableSwFrame());
                 const SwRect aFrameArea(pTransformableSwFrame->getUntransformedFrameArea());
                 rContour = tools::PolyPolygon(tools::Polygon(aFrameArea.SVRect()));
+                bRet = (0 != rContour.Count());
+            }
+        }
 
-                if(0 != rContour.Count())
-                {
-                    // Need to adapt contour to transformation
-                    basegfx::B2DVector aScale, aTranslate;
-                    double fRotate, fShearX;
-                    getFrameAreaTransformation().decompose(aScale, aTranslate, fRotate, fShearX);
-
-                    if(!basegfx::fTools::equalZero(fRotate))
-                    {
-                        basegfx::B2DPolyPolygon aSource(rContour.getB2DPolyPolygon());
-                        const basegfx::B2DPoint aCenter(getFrameAreaTransformation() * basegfx::B2DPoint(0.5, 0.5));
-                        const basegfx::B2DHomMatrix aRotateAroundCenter(
-                            basegfx::utils::createRotateAroundPoint(
-                                aCenter.getX(),
-                                aCenter.getY(),
-                                fRotate));
-                        aSource.transform(aRotateAroundCenter);
-                        rContour = tools::PolyPolygon(aSource);
-                    }
+        if(bRet &&
+            0 != rContour.Count() &&
+            nullptr != pSwFlyFreeFrame &&
+            pSwFlyFreeFrame->isTransformableSwFrame())
+        {
+            // Need to adapt contour to transformation
+            basegfx::B2DVector aScale, aTranslate;
+            double fRotate, fShearX;
+            getFrameAreaTransformation().decompose(aScale, aTranslate, fRotate, fShearX);
 
-                    bRet = true;
-                }
+            if(!basegfx::fTools::equalZero(fRotate))
+            {
+                basegfx::B2DPolyPolygon aSource(rContour.getB2DPolyPolygon());
+                const basegfx::B2DPoint aCenter(getFrameAreaTransformation() * basegfx::B2DPoint(0.5, 0.5));
+                const basegfx::B2DHomMatrix aRotateAroundCenter(
+                    basegfx::utils::createRotateAroundPoint(
+                        aCenter.getX(),
+                        aCenter.getY(),
+                        fRotate));
+                aSource.transform(aRotateAroundCenter);
+                rContour = tools::PolyPolygon(aSource);
             }
         }
     }
diff --git a/sw/source/core/layout/flylay.cxx b/sw/source/core/layout/flylay.cxx
index c3cf51baa343..8f6452b9b874 100644
--- a/sw/source/core/layout/flylay.cxx
+++ b/sw/source/core/layout/flylay.cxx
@@ -43,6 +43,7 @@
 #include <IDocumentSettingAccess.hxx>
 #include <IDocumentDrawModelAccess.hxx>
 #include <basegfx/matrix/b2dhommatrixtools.hxx>
+#include <svx/sdr/attribute/sdrallfillattributeshelper.hxx>
 
 using namespace ::com::sun::star;
 
@@ -316,10 +317,38 @@ bool SwFlyFreeFrame::supportsAutoContour() const
 
     // Check for Padding. Do not support when padding is used, this will
     // produce a covered space around the object (filled with fill defines)
+    const SfxPoolItem* pItem(nullptr);
 
+    if(GetFormat() && SfxItemState::SET == GetFormat()->GetItemState(RES_BOX, false, &pItem))
+    {
+        const SvxBoxItem& rBox = *static_cast< const SvxBoxItem* >(pItem);
 
+        if(rBox.HasBorder(/*bTreatPaddingAsBorder*/true))
+        {
+            return false;
+        }
+    }
 
+    // check for Fill - if we have fill, it will fill the gaps and we will not
+    // support AutoContour
+    if(GetFormat() && GetFormat()->supportsFullDrawingLayerFillAttributeSet())
+    {
+        const drawinglayer::attribute::SdrAllFillAttributesHelperPtr aFillAttributes(GetFormat()->getSdrAllFillAttributesHelper());
+
+        if(aFillAttributes.get() && aFillAttributes->isUsed())
+        {
+            return false;
+        }
+    }
+    else
+    {
+        const SvxBrushItem aBack(GetFormat()->makeBackgroundBrushItem());
 
+        if(aBack.isUsed())
+        {
+            return false;
+        }
+    }
 
     // else, support
     return true;


More information about the Libreoffice-commits mailing list