summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sw/qa/extras/layout/data/tdf127235.odtbin0 -> 3239 bytes
-rw-r--r--sw/qa/extras/layout/layout.cxx7
-rw-r--r--sw/source/core/text/txtfly.cxx21
3 files changed, 26 insertions, 2 deletions
diff --git a/sw/qa/extras/layout/data/tdf127235.odt b/sw/qa/extras/layout/data/tdf127235.odt
new file mode 100644
index 000000000000..5b27c921cf17
--- /dev/null
+++ b/sw/qa/extras/layout/data/tdf127235.odt
Binary files differ
diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx
index af3cde2db379..59e1e08939e0 100644
--- a/sw/qa/extras/layout/layout.cxx
+++ b/sw/qa/extras/layout/layout.cxx
@@ -3089,6 +3089,13 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf113014)
assertXPathContent(pXmlDoc, "/metafile/push[1]/push[1]/push[1]/textarray[5]/text", "3.");
}
+CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf127235)
+{
+ SwDoc* pDoc = createDoc("tdf127235.odt");
+ // This resulted in a layout loop.
+ pDoc->getIDocumentLayoutAccess().GetCurrentViewShell()->CalcLayout();
+}
+
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/text/txtfly.cxx b/sw/source/core/text/txtfly.cxx
index 82b16055e82a..51befd6f2878 100644
--- a/sw/source/core/text/txtfly.cxx
+++ b/sw/source/core/text/txtfly.cxx
@@ -999,6 +999,24 @@ bool SwTextFly::ForEach( const SwRect &rRect, SwRect* pRect, bool bAvoid ) const
{
SwSwapIfSwapped swap(const_cast<SwTextFrame *>(m_pCurrFrame));
+ // Optimization
+ SwRectFnSet aRectFnSet(m_pCurrFrame);
+
+ // tdf#127235 stop if the area is larger than the page
+ if( aRectFnSet.GetHeight(pPage->getFrameArea()) < aRectFnSet.GetHeight(rRect))
+ {
+ // get the doc model description
+ const SwPageDesc* pPageDesc = pPage->GetPageDesc();
+
+ // if there is no next page style or it is the same as the current
+ // => stop trying to place the frame (it would end in an infinite loop)
+ if( pPageDesc &&
+ ( !pPageDesc->GetFollow() || pPageDesc->GetFollow() == pPageDesc) )
+ {
+ return false;
+ }
+ }
+
bool bRet = false;
// #i68520#
const SwAnchoredObjList::size_type nCount( bOn ? GetAnchoredObjList()->size() : 0 );
@@ -1011,10 +1029,9 @@ bool SwTextFly::ForEach( const SwRect &rRect, SwRect* pRect, bool bAvoid ) const
SwRect aRect( pAnchoredObj->GetObjRectWithSpaces() );
- // Optimization
- SwRectFnSet aRectFnSet(m_pCurrFrame);
if( aRectFnSet.GetLeft(aRect) > aRectFnSet.GetRight(rRect) )
break;
+
// #i68520#
if ( mpCurrAnchoredObj != pAnchoredObj && aRect.IsOver( rRect ) )
{