[Libreoffice-commits] core.git: sw/source
Bjoern Michaelsen
bjoern.michaelsen at canonical.com
Wed Dec 21 19:29:05 UTC 2016
sw/source/core/text/itrform2.cxx | 8 -
sw/source/core/text/porfly.cxx | 180 +++++++++++++++++++++------------------
sw/source/core/text/porfly.hxx | 38 +++++---
3 files changed, 128 insertions(+), 98 deletions(-)
New commits:
commit 65042d82a474fb6020add272cd7615517d606dc9
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date: Mon Dec 19 04:09:55 2016 +0100
dont encde typeinfo in bool members
Change-Id: I5eeb566fd023d261d4236ec6de2b3f17e6744a07
Reviewed-on: https://gerrit.libreoffice.org/32147
Reviewed-by: Björn Michaelsen <bjoern.michaelsen at canonical.com>
Tested-by: Björn Michaelsen <bjoern.michaelsen at canonical.com>
diff --git a/sw/source/core/text/itrform2.cxx b/sw/source/core/text/itrform2.cxx
index e03d118..1ff4763 100644
--- a/sw/source/core/text/itrform2.cxx
+++ b/sw/source/core/text/itrform2.cxx
@@ -2476,7 +2476,6 @@ void SwTextFormatter::CalcFlyWidth( SwTextFormatInfo &rInf )
SwFlyCntPortion *SwTextFormatter::NewFlyCntPortion( SwTextFormatInfo &rInf,
SwTextAttr *pHint ) const
{
- SwFlyCntPortion *pRet = nullptr;
const SwFrame *pFrame = static_cast<SwFrame*>(m_pFrame);
SwFlyInContentFrame *pFly;
@@ -2537,10 +2536,10 @@ SwFlyCntPortion *SwTextFormatter::NewFlyCntPortion( SwTextFormatInfo &rInf,
if ( GetInfo().GetTextFrame()->IsVertical() )
GetInfo().GetTextFrame()->SwitchHorizontalToVertical( aTmpBase );
+ SwFlyCntPortion* pRet(nullptr);
if( pFly )
{
- pRet = new SwFlyCntPortion( *GetInfo().GetTextFrame(), pFly, aTmpBase,
- nTmpAscent, nTmpDescent, nFlyAsc, nFlyDesc, nMode );
+ pRet = SwFlyCntPortion::Create(*GetInfo().GetTextFrame(), pFly, aTmpBase, nTmpAscent, nTmpDescent, nFlyAsc, nFlyDesc, nMode);
// We need to make sure that our font is set again in the OutputDevice
// It could be that the FlyInCnt was added anew and GetFlyFrame() would
// in turn cause, that it'd be created anew again.
@@ -2563,8 +2562,7 @@ SwFlyCntPortion *SwTextFormatter::NewFlyCntPortion( SwTextFormatInfo &rInf,
}
else
{
- pRet = new SwFlyCntPortion( *rInf.GetTextFrame(), static_cast<SwDrawContact*>(pFrameFormat->FindContactObj()),
- aTmpBase, nTmpAscent, nTmpDescent, nFlyAsc, nFlyDesc, nMode );
+ pRet = sw::DrawFlyCntPortion::Create(*rInf.GetTextFrame(), static_cast<SwDrawContact*>(pFrameFormat->FindContactObj()), aTmpBase, nTmpAscent, nTmpDescent, nFlyAsc, nFlyDesc, nMode);
}
return pRet;
}
diff --git a/sw/source/core/text/porfly.cxx b/sw/source/core/text/porfly.cxx
index 1d35375..298f4ea 100644
--- a/sw/source/core/text/porfly.cxx
+++ b/sw/source/core/text/porfly.cxx
@@ -205,74 +205,92 @@ sal_Int32 SwTextFrame::CalcFlyPos( SwFrameFormat* pSearch )
void SwFlyCntPortion::Paint( const SwTextPaintInfo &rInf ) const
{
- if( bDraw )
- {
- if( !static_cast<SwDrawContact*>(pContact)->GetAnchorFrame() )
- {
- // No direct positioning of the drawing object is needed
- SwDrawContact* pDrawContact = static_cast<SwDrawContact*>(pContact);
- pDrawContact->ConnectToLayout();
- }
- }
- else
- {
- // Baseline output
- // Re-paint everything at a CompletePaint call
- SwRect aRepaintRect( rInf.GetPaintRect() );
+ // Baseline output
+ // Re-paint everything at a CompletePaint call
+ SwRect aRepaintRect( rInf.GetPaintRect() );
- if ( rInf.GetTextFrame()->IsRightToLeft() )
- rInf.GetTextFrame()->SwitchLTRtoRTL( aRepaintRect );
+ if ( rInf.GetTextFrame()->IsRightToLeft() )
+ rInf.GetTextFrame()->SwitchLTRtoRTL( aRepaintRect );
- if ( rInf.GetTextFrame()->IsVertical() )
- rInf.GetTextFrame()->SwitchHorizontalToVertical( aRepaintRect );
+ if ( rInf.GetTextFrame()->IsVertical() )
+ rInf.GetTextFrame()->SwitchHorizontalToVertical( aRepaintRect );
- if( (GetFlyFrame()->IsCompletePaint() ||
- GetFlyFrame()->Frame().IsOver( aRepaintRect )) &&
- SwFlyFrame::IsPaint( const_cast<SwVirtFlyDrawObj*>(GetFlyFrame()->GetVirtDrawObj()),
- GetFlyFrame()->getRootFrame()->GetCurrShell() ))
- {
- SwRect aRect( GetFlyFrame()->Frame() );
- if( !GetFlyFrame()->IsCompletePaint() )
- aRect.Intersection_( aRepaintRect );
+ if( (GetFlyFrame()->IsCompletePaint() ||
+ GetFlyFrame()->Frame().IsOver( aRepaintRect )) &&
+ SwFlyFrame::IsPaint( const_cast<SwVirtFlyDrawObj*>(GetFlyFrame()->GetVirtDrawObj()),
+ GetFlyFrame()->getRootFrame()->GetCurrShell() ))
+ {
+ SwRect aRect( GetFlyFrame()->Frame() );
+ if( !GetFlyFrame()->IsCompletePaint() )
+ aRect.Intersection_( aRepaintRect );
- // GetFlyFrame() may change the layout mode at the output device.
- {
- SwLayoutModeModifier aLayoutModeModifier( *rInf.GetOut() );
- GetFlyFrame()->Paint( const_cast<vcl::RenderContext&>(*rInf.GetOut()), aRect );
- }
- ((SwTextPaintInfo&)rInf).GetRefDev()->SetLayoutMode(
- rInf.GetOut()->GetLayoutMode() );
+ // GetFlyFrame() may change the layout mode at the output device.
+ {
+ SwLayoutModeModifier aLayoutModeModifier( *rInf.GetOut() );
+ GetFlyFrame()->Paint( const_cast<vcl::RenderContext&>(*rInf.GetOut()), aRect );
+ }
+ ((SwTextPaintInfo&)rInf).GetRefDev()->SetLayoutMode(
+ rInf.GetOut()->GetLayoutMode() );
- // As the OutputDevice might be anything, the font must be re-selected.
- // Being in const method should not be a problem.
- ((SwTextPaintInfo&)rInf).SelectFont();
+ // As the OutputDevice might be anything, the font must be re-selected.
+ // Being in const method should not be a problem.
+ ((SwTextPaintInfo&)rInf).SelectFont();
- OSL_ENSURE( ! rInf.GetVsh() || rInf.GetVsh()->GetOut() == rInf.GetOut(),
- "SwFlyCntPortion::Paint: Outdev has changed" );
- if( rInf.GetVsh() )
- ((SwTextPaintInfo&)rInf).SetOut( rInf.GetVsh()->GetOut() );
- }
+ OSL_ENSURE( ! rInf.GetVsh() || rInf.GetVsh()->GetOut() == rInf.GetOut(),
+ "SwFlyCntPortion::Paint: Outdev has changed" );
+ if( rInf.GetVsh() )
+ ((SwTextPaintInfo&)rInf).SetOut( rInf.GetVsh()->GetOut() );
+ }
+}
+void sw::DrawFlyCntPortion::Paint(const SwTextPaintInfo&) const
+{
+ if(!static_cast<SwDrawContact*>(pContact)->GetAnchorFrame())
+ {
+ // No direct positioning of the drawing object is needed
+ SwDrawContact* pDrawContact = static_cast<SwDrawContact*>(pContact);
+ pDrawContact->ConnectToLayout();
}
}
/**
* Use the dimensions of pFly->OutRect()
*/
-SwFlyCntPortion::SwFlyCntPortion( const SwTextFrame& rFrame,
- SwFlyInContentFrame *pFly, const Point &rBase,
- long nLnAscent, long nLnDescent,
- long nFlyAsc, long nFlyDesc,
- AsCharFlags nFlags ) :
- pContact( pFly ),
- bDraw( false ),
- bMax( false ),
- nAlign( 0 )
+SwFlyCntPortion::SwFlyCntPortion(SwFlyInContentFrame* pFly)
+ : pContact(pFly)
+ , bMax(false)
+ , nAlign(0)
{
- OSL_ENSURE( pFly, "SwFlyCntPortion::SwFlyCntPortion: no SwFlyInContentFrame!" );
+ SAL_WARN_IF(!pFly, "sw.core", "SwFlyCntPortion::SwFlyCntPortion: no SwFlyInContentFrame!");
nLineLength = 1;
- nFlags |= AsCharFlags::UlSpace | AsCharFlags::Init;
- SetBase( rFrame, rBase, nLnAscent, nLnDescent, nFlyAsc, nFlyDesc, nFlags );
- SetWhichPor( POR_FLYCNT );
+ SetWhichPor(POR_FLYCNT);
+}
+
+sw::DrawFlyCntPortion::DrawFlyCntPortion(SwDrawContact* pDrawContact)
+ : SwFlyCntPortion((SwFlyInContentFrame*) pDrawContact)
+{
+ SAL_WARN_IF(!pDrawContact, "sw.core", "SwFlyCntPortion::SwFlyCntPortion: no SwDrawContact!");
+ if(!pDrawContact->GetAnchorFrame())
+ {
+ // No direct positioning needed any more
+ pDrawContact->ConnectToLayout();
+ // Move object to visible layer
+ pDrawContact->MoveObjToVisibleLayer(pDrawContact->GetMaster());
+ }
+
+}
+
+SwFlyCntPortion* SwFlyCntPortion::Create(const SwTextFrame& rFrame, SwFlyInContentFrame* pFly, const Point& rBase, long nLnAscent, long nLnDescent, long nFlyAsc, long nFlyDesc, AsCharFlags nFlags)
+{
+ auto pNew(new SwFlyCntPortion(pFly));
+ pNew->SetBase(rFrame, rBase, nLnAscent, nLnDescent, nFlyAsc, nFlyDesc, nFlags | AsCharFlags::UlSpace | AsCharFlags::Init);
+ return pNew;
+}
+
+sw::DrawFlyCntPortion* sw::DrawFlyCntPortion::Create(const SwTextFrame& rFrame, SwDrawContact* pDrawContact, const Point& rBase, long nLnAscent, long nLnDescent, long nFlyAsc, long nFlyDesc, AsCharFlags nFlags)
+{
+ auto pNew(new DrawFlyCntPortion(pDrawContact));
+ pNew->SetBase(rFrame, rBase, nLnAscent, nLnDescent, nFlyAsc, nFlyDesc, nFlags | AsCharFlags::UlSpace | AsCharFlags::Init);
+ return pNew;
}
SwFlyCntPortion::SwFlyCntPortion( const SwTextFrame& rFrame,
@@ -281,11 +299,9 @@ SwFlyCntPortion::SwFlyCntPortion( const SwTextFrame& rFrame,
long nFlyAsc, long nFlyDesc,
AsCharFlags nFlags ) :
pContact( pDrawContact ),
- bDraw( true ),
bMax( false ),
nAlign( 0 )
{
- OSL_ENSURE( pDrawContact, "SwFlyCntPortion::SwFlyCntPortion: no SwDrawContact!" );
if( !pDrawContact->GetAnchorFrame() )
{
// No direct positioning needed any more
@@ -302,6 +318,33 @@ SwFlyCntPortion::SwFlyCntPortion( const SwTextFrame& rFrame,
SetWhichPor( POR_FLYCNT );
}
+SwFlyCntPortion::~SwFlyCntPortion() {};
+
+sw::DrawFlyCntPortion::~DrawFlyCntPortion() {};
+
+SdrObject* SwFlyCntPortion::GetSdrObj(const SwTextFrame&)
+{
+ return GetFlyFrame()->GetVirtDrawObj();
+}
+
+SdrObject* sw::DrawFlyCntPortion::GetSdrObj(const SwTextFrame& rFrame)
+{
+ SdrObject* pSdrObj;
+ // Determine drawing object ('master' or 'virtual') by frame
+ pSdrObj = GetDrawContact()->GetDrawObjectByAnchorFrame(rFrame);
+ if(!pSdrObj)
+ {
+ SAL_WARN("sw.core", "SwFlyCntPortion::SetBase(..) - No drawing object found by <GetDrawContact()->GetDrawObjectByAnchorFrame( rFrame )>");
+ pSdrObj = GetDrawContact()->GetMaster();
+ }
+
+ // Call <SwAnchoredDrawObject::MakeObjPos()> to assure that flag at
+ // the <DrawFrameFormat> and at the <SwAnchoredDrawObject> instance are
+ // correctly set
+ if(pSdrObj)
+ GetDrawContact()->GetAnchoredObj(pSdrObj)->MakeObjPos();
+ return pSdrObj;
+}
/**
* After setting the RefPoints, the ascent needs to be recalculated
* because it is dependent on RelPos
@@ -315,30 +358,7 @@ void SwFlyCntPortion::SetBase( const SwTextFrame& rFrame, const Point &rBase,
{
// Use new class to position object
// Determine drawing object
- SdrObject* pSdrObj = nullptr;
- if( bDraw )
- {
- // Determine drawing object ('master' or 'virtual') by frame
- pSdrObj = GetDrawContact()->GetDrawObjectByAnchorFrame( rFrame );
- if ( !pSdrObj )
- {
- OSL_FAIL( "SwFlyCntPortion::SetBase(..) - No drawing object found by <GetDrawContact()->GetDrawObjectByAnchorFrame( rFrame )>" );
- pSdrObj = GetDrawContact()->GetMaster();
- }
-
- // Call <SwAnchoredDrawObject::MakeObjPos()> to assure that flag at
- // the <DrawFrameFormat> and at the <SwAnchoredDrawObject> instance are
- // correctly set
- if ( pSdrObj )
- {
- GetDrawContact()->GetAnchoredObj( pSdrObj )->MakeObjPos();
- }
- }
- else
- {
- pSdrObj = GetFlyFrame()->GetVirtDrawObj();
- }
-
+ SdrObject* pSdrObj = GetSdrObj(rFrame);
if (!pSdrObj)
return;
diff --git a/sw/source/core/text/porfly.hxx b/sw/source/core/text/porfly.hxx
index 67e29f1..28749ea 100644
--- a/sw/source/core/text/porfly.hxx
+++ b/sw/source/core/text/porfly.hxx
@@ -44,23 +44,23 @@ public:
/// This portion represents an as-character anchored fly (shape, frame, etc.)
class SwFlyCntPortion : public SwLinePortion
{
+protected:
+
void *pContact; // bDraw ? DrawContact : FlyInContentFrame
Point aRef; // Relatively to this point we calculate the AbsPos
- bool bDraw : 1; // DrawContact?
bool bMax : 1; // Line adjustment and height == line height
sal_uInt8 nAlign : 3; // Line adjustment? No, above, middle, bottom
-public:
- // Use new datatype for parameter <nFlags>
- SwFlyCntPortion( const SwTextFrame& rFrame, SwFlyInContentFrame *pFly,
- const Point &rBase,
- long nAscent, long nDescent, long nFlyAsc, long nFlyDesc,
- AsCharFlags nFlags );
// Use new datatype for parameter <nFlags>
SwFlyCntPortion( const SwTextFrame& rFrame, SwDrawContact *pDrawContact,
const Point &rBase,
long nAscent, long nDescent, long nFlyAsc, long nFlyDesc,
AsCharFlags nFlags );
+ virtual SdrObject* GetSdrObj(const SwTextFrame&);
+
+public:
+ SwFlyCntPortion(SwFlyInContentFrame* pFly);
+ static SwFlyCntPortion* Create(const SwTextFrame& rFrame, SwFlyInContentFrame* pFly, const Point& rBase, long nAscent, long nDescent, long nFlyAsc, long nFlyDesc, AsCharFlags nFlags);
inline const Point& GetRefPoint() const { return aRef; }
inline SwFlyInContentFrame *GetFlyFrame() { return static_cast<SwFlyInContentFrame*>(pContact); }
inline const SwFlyInContentFrame *GetFlyFrame() const
@@ -68,22 +68,34 @@ public:
inline SwDrawContact *GetDrawContact() { return static_cast<SwDrawContact*>(pContact); }
inline const SwDrawContact* GetDrawContact() const
{ return static_cast<SwDrawContact*>(pContact); }
- inline bool IsDraw() const { return bDraw; }
+ virtual bool IsDraw() const { return false; }
inline bool IsMax() const { return bMax; }
inline sal_uInt8 GetAlign() const { return nAlign; }
inline void SetAlign( sal_uInt8 nNew ) { nAlign = nNew; }
inline void SetMax( bool bNew ) { bMax = bNew; }
- // Use new datatype for parameter <nFlags>
- void SetBase( const SwTextFrame& rFrame, const Point &rBase,
- long nLnAscent, long nLnDescent,
- long nFlyAscent, long nFlyDescent,
- AsCharFlags nFlags );
+ void SetBase(const SwTextFrame& rFrame, const Point &rBase, long nLnAscent, long nLnDescent, long nFlyAscent, long nFlyDescent, AsCharFlags nFlags);
void GetFlyCursorOfst(Point &rPoint, SwPosition& rPos, SwCursorMoveState* pCMS) const;
virtual bool Format( SwTextFormatInfo &rInf ) override;
virtual void Paint( const SwTextPaintInfo &rInf ) const override;
OUTPUT_OPERATOR_OVERRIDE
+ virtual ~SwFlyCntPortion();
};
+namespace sw
+{
+ class DrawFlyCntPortion : public SwFlyCntPortion
+ {
+ protected:
+ virtual SdrObject* GetSdrObj(const SwTextFrame&) override;
+ public:
+ DrawFlyCntPortion(SwDrawContact* pDrawContact);
+ static DrawFlyCntPortion* Create(const SwTextFrame& rFrame, SwDrawContact* pDrawContact, const Point& rBase, long nAsc, long nDescent, long nFlyAsc, long nFlyDesc, AsCharFlags nFlags);
+ virtual bool IsDraw() const { return true; }
+ virtual void Paint( const SwTextPaintInfo &rInf ) const override;
+ virtual ~DrawFlyCntPortion();
+ };
+}
+
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
More information about the Libreoffice-commits
mailing list