summaryrefslogtreecommitdiff
path: root/sw/source
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source')
-rw-r--r--sw/source/core/doc/notxtfrm.cxx75
-rw-r--r--sw/source/core/inc/flyfrms.hxx10
-rw-r--r--sw/source/core/inc/frame.hxx34
-rw-r--r--sw/source/core/inc/notxtfrm.hxx10
-rw-r--r--sw/source/core/layout/flylay.cxx89
-rw-r--r--sw/source/core/layout/wsfrm.cxx110
6 files changed, 234 insertions, 94 deletions
diff --git a/sw/source/core/doc/notxtfrm.cxx b/sw/source/core/doc/notxtfrm.cxx
index 4631dbb7a2e3..4a040cedfb9d 100644
--- a/sw/source/core/doc/notxtfrm.cxx
+++ b/sw/source/core/doc/notxtfrm.cxx
@@ -143,7 +143,9 @@ static void lcl_PaintReplacement( const SwRect &rRect, const OUString &rText,
}
SwNoTextFrame::SwNoTextFrame(SwNoTextNode * const pNode, SwFrame* pSib )
- : SwContentFrame( pNode, pSib )
+: SwContentFrame( pNode, pSib ),
+ maFrameAreaTransformation(),
+ maFramePrintAreaTransformation()
{
mnFrameType = SwFrameType::NoTxt;
}
@@ -493,34 +495,63 @@ void SwNoTextFrame::MakeAll(vcl::RenderContext* /*pRenderContext*/)
}
}
- // RotateFlyFrame3 - inner frame
- // After the layout is finished, apply possible set rotation to it
+ // RotateFlyFrame3 - outer frame
+ // After the unrotated layout is finished, apply possible set rotation to it
const double fRotation(getRotation());
- if(0.0 != fRotation)
+ if(basegfx::fTools::equalZero(fRotation))
{
- SwRect aFrameArea(getFrameArea());
- SwRect aFramePrintArea(getFramePrintArea());
- const Point aCenter(aFrameArea.Center());
+ // reset transformations to show that they are not used
+ maFrameAreaTransformation.identity();
+ maFramePrintAreaTransformation.identity();
+ }
+ 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);
+ }
+}
- // apply rotation and re-set the FrameArea definitions
- rotateFrameAreaDefinitionAroundPoint(aFrameArea, aFramePrintArea, aCenter, fRotation);
+// RotateFlyFrame3 - Support for Transformations - outer frame
+basegfx::B2DHomMatrix SwNoTextFrame::getFrameAreaTransformation() const
+{
+ if(!maFrameAreaTransformation.isIdentity())
+ {
+ // use pre-created transformation
+ return maFrameAreaTransformation;
+ }
- if(aFrameArea != getFrameArea())
- {
- SwFrameAreaDefinition::FrameAreaWriteAccess aFrm(*this);
- aFrm.setSwRect(aFrameArea);
- }
+ // call parent
+ return SwContentFrame::getFrameAreaTransformation();
+}
- if(aFramePrintArea != getFramePrintArea())
- {
- SwFrameAreaDefinition::FramePrintAreaWriteAccess aPrt(*this);
- aPrt.setSwRect(aFramePrintArea);
- }
+basegfx::B2DHomMatrix SwNoTextFrame::getFramePrintAreaTransformation() const
+{
+ if(!maFramePrintAreaTransformation.isIdentity())
+ {
+ // use pre-created transformation
+ return maFramePrintAreaTransformation;
}
+
+ // call parent
+ return SwContentFrame::getFramePrintAreaTransformation();
}
-// RotateFlyFrame3 - inner frame
+// RotateFlyFrame3 - outer frame
// Check if we contain a SwGrfNode and get possible rotation from it
double SwNoTextFrame::getRotation() const
{
@@ -701,7 +732,9 @@ void SwNoTextFrame::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
}
// RotateFlyFrame3 - invalidate needed for ContentFrame (inner, this)
- // and LayoutFrame (outer, GetUpper)
+ // 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())
diff --git a/sw/source/core/inc/flyfrms.hxx b/sw/source/core/inc/flyfrms.hxx
index 91b4188fb48a..3b6ce2292bce 100644
--- a/sw/source/core/inc/flyfrms.hxx
+++ b/sw/source/core/inc/flyfrms.hxx
@@ -40,6 +40,12 @@ class SwFlyFreeFrame : public SwFlyFrame
SwRect maUnclippedFrame;
+ // RotateFlyFrame3 - Support for Transformations, hold
+ // FrameAreaTransformation and FramePrintAreaTransformation
+ // here when rotation is used
+ basegfx::B2DHomMatrix maFrameAreaTransformation;
+ basegfx::B2DHomMatrix maFramePrintAreaTransformation;
+
void CheckClip( const SwFormatFrameSize &rSz ); //'Emergency' Clipping.
/** determines, if direct environment of fly frame has 'auto' size
@@ -119,6 +125,10 @@ public:
// 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;
};
// 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 dbef917b206e..ddd4da107e30 100644
--- a/sw/source/core/inc/frame.hxx
+++ b/sw/source/core/inc/frame.hxx
@@ -144,6 +144,20 @@ protected:
void setFrameAreaSizeValid(bool bNew);
void setFramePrintAreaValid(bool bNew);
+ // helper method to create FrameAreaTransformations based on the
+ // curent FrameAreaDefinition
+ void createFrameAreaTransformations(
+ basegfx::B2DHomMatrix& rFrameAreaTransformation,
+ basegfx::B2DHomMatrix& rFramePrintAreaTransformation,
+ double fRotation,
+ const basegfx::B2DPoint& rCenter) const;
+
+ // helper method to set FrameAreaDefinitions based on given
+ // transformations
+ void setFrameAreaDefinitionsToBoundRangesOfTransformations(
+ const basegfx::B2DHomMatrix& rFrameAreaTransformation,
+ const basegfx::B2DHomMatrix& rFramePrintAreaTransformation);
+
public:
SwFrameAreaDefinition();
@@ -196,15 +210,6 @@ public:
};
};
-// RotateFlyFrame3 - Helper method that rotates a FrameAreaDefinition content
-// around a given point. It takes care for FramePrintArea being relative to
-// FrameArea and creates the rotated BoundRects
-void rotateFrameAreaDefinitionAroundPoint(
- SwRect& rFrameArea,
- SwRect& rFramePrintArea,
- const Point& rCenter,
- double fRotation);
-
/**
* Base class of the Writer layout elements.
*
@@ -834,6 +839,17 @@ public:
// 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.
+ // FramePrintArea is not relative to FrameArea in this
+ // transformation representation (to make it easier to use and understand).
+ // There is no 'set' method since SwFrame is a layout obejct. For
+ // some cases rotation will be included (used for SwGrfNode in inner
+ // SwFrame of a SwFlyFrame)
+ basegfx::B2DHomMatrix getFrameAreaTransformation() const;
+ basegfx::B2DHomMatrix getFramePrintAreaTransformation() const;
};
inline bool SwFrame::IsInDocBody() const
diff --git a/sw/source/core/inc/notxtfrm.hxx b/sw/source/core/inc/notxtfrm.hxx
index a1936193af44..29163e3117d2 100644
--- a/sw/source/core/inc/notxtfrm.hxx
+++ b/sw/source/core/inc/notxtfrm.hxx
@@ -30,6 +30,12 @@ class SwNoTextFrame: public SwContentFrame
{
friend void FrameFinit();
+ // RotateFlyFrame3 - Support for Transformation, hold
+ // FrameAreaTransformation and FramePrintAreaTransformation
+ // here when rotation is used
+ basegfx::B2DHomMatrix maFrameAreaTransformation;
+ basegfx::B2DHomMatrix maFramePrintAreaTransformation;
+
const Size& GetSize() const;
void Format ( vcl::RenderContext* pRenderContext, const SwBorderAttrs *pAttrs = nullptr ) override;
@@ -60,6 +66,10 @@ public:
// 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;
};
#endif
diff --git a/sw/source/core/layout/flylay.cxx b/sw/source/core/layout/flylay.cxx
index 69fa2615a733..e21991a32f4b 100644
--- a/sw/source/core/layout/flylay.cxx
+++ b/sw/source/core/layout/flylay.cxx
@@ -44,13 +44,16 @@
using namespace ::com::sun::star;
-SwFlyFreeFrame::SwFlyFreeFrame( SwFlyFrameFormat *pFormat, SwFrame* pSib, SwFrame *pAnch ) :
- SwFlyFrame( pFormat, pSib, pAnch ),
+SwFlyFreeFrame::SwFlyFreeFrame( SwFlyFrameFormat *pFormat, SwFrame* pSib, SwFrame *pAnch )
+: SwFlyFrame( pFormat, pSib, pAnch ),
// #i34753#
mbNoMakePos( false ),
// #i37068#
mbNoMoveOnCheckClip( false ),
- maUnclippedFrame( )
+ maUnclippedFrame( ),
+ // RotateFlyFrame3
+ maFrameAreaTransformation(),
+ maFramePrintAreaTransformation()
{
}
@@ -223,36 +226,35 @@ void SwFlyFreeFrame::MakeAll(vcl::RenderContext* /*pRenderContext*/)
}
// RotateFlyFrame3 - inner frame
+ // After the unrotated layout is finished, apply possible set rotation to it
const double fRotation(getRotation());
- if(0.0 != fRotation)
+ if(basegfx::fTools::equalZero(fRotation))
{
- SwRect aFrameArea(getFrameArea());
- SwRect aFramePrintArea(getFramePrintArea());
- Point aCenter(aFrameArea.Center());
-
- if(GetUpper())
- {
- // get center from outer frame (layout frame)
- const SwRect aUpperFrameArea(GetUpper()->getFrameArea());
-
- aCenter = aUpperFrameArea.Center();
- }
-
- // apply rotation and re-set the FrameArea definitions
- rotateFrameAreaDefinitionAroundPoint(aFrameArea, aFramePrintArea, aCenter, fRotation);
-
- if(aFrameArea != getFrameArea())
- {
- SwFrameAreaDefinition::FrameAreaWriteAccess aFrm(*this);
- aFrm.setSwRect(aFrameArea);
- }
-
- if(aFramePrintArea != getFramePrintArea())
- {
- SwFrameAreaDefinition::FramePrintAreaWriteAccess aPrt(*this);
- aPrt.setSwRect(aFramePrintArea);
- }
+ // reset transformations to show that they are not used
+ 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();
@@ -266,7 +268,32 @@ void SwFlyFreeFrame::MakeAll(vcl::RenderContext* /*pRenderContext*/)
#endif
}
-// RotateFlyFrame3
+// RotateFlyFrame3 - Support for Transformations - outer frame
+basegfx::B2DHomMatrix SwFlyFreeFrame::getFrameAreaTransformation() const
+{
+ if(!maFrameAreaTransformation.isIdentity())
+ {
+ // use pre-created transformation
+ return maFrameAreaTransformation;
+ }
+
+ // call parent
+ return SwFlyFrame::getFrameAreaTransformation();
+}
+
+basegfx::B2DHomMatrix SwFlyFreeFrame::getFramePrintAreaTransformation() const
+{
+ if(!maFramePrintAreaTransformation.isIdentity())
+ {
+ // use pre-created transformation
+ return maFramePrintAreaTransformation;
+ }
+
+ // call parent
+ return SwFlyFrame::getFramePrintAreaTransformation();
+}
+
+// RotateFlyFrame3 - inner frame
double SwFlyFreeFrame::getRotation() const
{
// SwLayoutFrame::Lower() != SwFrame::GetLower(), but SwFrame::GetLower()
diff --git a/sw/source/core/layout/wsfrm.cxx b/sw/source/core/layout/wsfrm.cxx
index dbe44b5084e6..bf9f3fd4c53e 100644
--- a/sw/source/core/layout/wsfrm.cxx
+++ b/sw/source/core/layout/wsfrm.cxx
@@ -105,54 +105,98 @@ SwFrameAreaDefinition::FramePrintAreaWriteAccess::~FramePrintAreaWriteAccess()
}
}
-void rotateFrameAreaDefinitionAroundPoint(
- SwRect& rFrameArea,
- SwRect& rFramePrintArea,
- const Point& rCenter,
- double fRotation)
+void SwFrameAreaDefinition::createFrameAreaTransformations(
+ basegfx::B2DHomMatrix& rFrameAreaTransformation,
+ basegfx::B2DHomMatrix& rFramePrintAreaTransformation,
+ double fRotation,
+ const basegfx::B2DPoint& rCenter) const
{
- if(!basegfx::fTools::equalZero(fRotation) && rFrameArea.HasArea())
+ // save Transformations to rFrameAreaTransformation and
+ // rFramePrintAreaTransformation. Do not forget that PrintArea
+ // is *relative* to FrameArea
+ const basegfx::B2DHomMatrix aRotateAroundCenter(
+ basegfx::utils::createRotateAroundPoint(
+ rCenter.getX(),
+ rCenter.getY(),
+ fRotation));
+ rFrameAreaTransformation = aRotateAroundCenter * basegfx::utils::createScaleTranslateB2DHomMatrix(
+ getFrameArea().Width(), getFrameArea().Height(),
+ getFrameArea().Left(), getFrameArea().Top());
+ rFramePrintAreaTransformation = aRotateAroundCenter * basegfx::utils::createScaleTranslateB2DHomMatrix(
+ getFramePrintArea().Width(), getFramePrintArea().Height(),
+ getFramePrintArea().Left() + getFrameArea().Left(), getFramePrintArea().Top() + getFrameArea().Top());
+}
+
+void SwFrameAreaDefinition::setFrameAreaDefinitionsToBoundRangesOfTransformations(
+ const basegfx::B2DHomMatrix& rFrameAreaTransformation,
+ const basegfx::B2DHomMatrix& rFramePrintAreaTransformation)
+{
+ if(!rFrameAreaTransformation.isIdentity())
{
- basegfx::B2DRange aFrameRange(
- rFrameArea.Left(),
- rFrameArea.Top(),
- rFrameArea.Right(),
- rFrameArea.Bottom());
- const basegfx::B2DPoint aOldTopLeft(aFrameRange.getMinimum());
- const basegfx::B2DHomMatrix aRotateAroundCenter(basegfx::utils::createRotateAroundPoint(rCenter.X(), rCenter.Y(), fRotation));
+ basegfx::B2DRange aRangeFrameArea(0.0, 0.0, 1.0, 1.0);
- aFrameRange.transform(aRotateAroundCenter);
- rFrameArea = SwRect(
- basegfx::fround(aFrameRange.getMinX()),
- basegfx::fround(aFrameRange.getMinY()),
- basegfx::fround(aFrameRange.getWidth()),
- basegfx::fround(aFrameRange.getHeight()));
+ aRangeFrameArea.transform(rFrameAreaTransformation);
- if(rFramePrintArea.HasArea())
+ const SwRect aNewFrm(
+ basegfx::fround(aRangeFrameArea.getMinX()), basegfx::fround(aRangeFrameArea.getMinY()),
+ basegfx::fround(aRangeFrameArea.getWidth()), basegfx::fround(aRangeFrameArea.getHeight()));
+
+ if(aNewFrm != getFrameArea())
{
- basegfx::B2DRange aFramePrintRange(
- rFramePrintArea.Left() + aOldTopLeft.getX(),
- rFramePrintArea.Top() + aOldTopLeft.getY(),
- rFramePrintArea.Right() + aOldTopLeft.getX(),
- rFramePrintArea.Bottom() + aOldTopLeft.getY());
- const basegfx::B2DPoint aNewTopLeft(aFrameRange.getMinimum());
+ maFrameArea = aNewFrm;
+ }
+ }
+
+ if(!rFramePrintAreaTransformation.isIdentity())
+ {
+ basegfx::B2DRange aRangeFramePrintArea(0.0, 0.0, 1.0, 1.0);
+
+ aRangeFramePrintArea.transform(rFramePrintAreaTransformation);
+
+ const SwRect aNewPrt(
+ basegfx::fround(aRangeFramePrintArea.getMinX()) - getFrameArea().Left(),
+ basegfx::fround(aRangeFramePrintArea.getMinY()) - getFrameArea().Top(),
+ basegfx::fround(aRangeFramePrintArea.getWidth()),
+ basegfx::fround(aRangeFramePrintArea.getHeight()));
- aFramePrintRange.transform(aRotateAroundCenter);
- rFramePrintArea = SwRect(
- basegfx::fround(aFramePrintRange.getMinX() - aNewTopLeft.getX()),
- basegfx::fround(aFramePrintRange.getMinY() - aNewTopLeft.getY()),
- basegfx::fround(aFramePrintRange.getWidth()),
- basegfx::fround(aFramePrintRange.getHeight()));
+ if(aNewPrt != getFramePrintArea())
+ {
+ maFramePrintArea = aNewPrt;
}
}
}
-// RotateFlyFrame3 - get a possible rotation from SwFrame, default returns 0.0 (no rotation)
+// 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
+{
+ // default implementation hands out FrameArea (outer frame)
+ const SwRect& rFrameArea(getFrameArea());
+
+ return basegfx::utils::createScaleTranslateB2DHomMatrix(
+ rFrameArea.Width(), rFrameArea.Height(),
+ rFrameArea.Left(), rFrameArea.Top());
+}
+
+basegfx::B2DHomMatrix SwFrame::getFramePrintAreaTransformation() const
+{
+ // default implementation hands out FramePrintArea (outer frame)
+ // Take into account that FramePrintArea is relative to FrameArea
+ const SwRect& rFrameArea(getFrameArea());
+ const SwRect& rFramePrintArea(getFramePrintArea());
+
+ return basegfx::utils::createScaleTranslateB2DHomMatrix(
+ rFramePrintArea.Width(), rFramePrintArea.Height(),
+ rFramePrintArea.Left() + rFrameArea.Left(),
+ rFramePrintArea.Top() + rFrameArea.Top());
+}
+
SwFrame::SwFrame( SwModify *pMod, SwFrame* pSib )
: SwFrameAreaDefinition(),
SwClient( pMod ),