Kaydet (Commit) 53a0a86d authored tarafından Michael Stahl's avatar Michael Stahl

tdf#119109 sw: fix SwTableFrame follow chain formatting

The remaining problem is that with the previous commit, the layout stops
at some point and everything is crammed into the next-to-last page, with
the following symptom:

warn:legacy.osl:7667:7667:sw/source/core/layout/tabfrm.cxx:2642: debug assertion: <SwTabFrame::MakeAll()> - format of table lowers suppressed by fix i44910

This is apparently because of some very funny recursion that goes in
circles until it formats some part of the "outer" table again.

0  SwTabFrame::MakeAll(OutputDevice*) (this=0x82b0280) at tabfrm.cxx:2642
^ mpUpper -> 928 - top-level SwTabFrame and m_pFollow of 905
1  SwFrame::PrepareMake(OutputDevice*) (this=0x82b0280) at calcmove.cxx:372
2  SwFrame::Calc(OutputDevice*) const (this=0x82b0280) at trvlfrm.cxx:1790
3  SwFrame::PrepareMake(OutputDevice*) (this=0x6c06ba0) at calcmove.cxx:247
4  SwFrame::Calc(OutputDevice*) const (this=0x6c06ba0) at trvlfrm.cxx:1790
5  SwFrame::PrepareMake(OutputDevice*) (this=0x82aebf0) at calcmove.cxx:247
6  SwFrame::Calc(OutputDevice*) const (this=0x82aebf0) at trvlfrm.cxx:1790
7  SwFrame::PrepareMake(OutputDevice*) (this=0x6d674e0) at calcmove.cxx:247
8  SwFrame::Calc(OutputDevice*) const (this=0x6d674e0) at trvlfrm.cxx:1790
^ m_pFollow->mpNext -> 332 - again! it's now m_pFollow->mpNext
9  SwTabFrame::MakeAll(OutputDevice*) (this=0x6d64570) at tabfrm.cxx:2544
^ 303 - nested SwTabFrame, used to precede 332 but has now split and its m_pFollow precedes 332
10 SwFrame::PrepareMake(OutputDevice*) (this=0x6d674e0) at calcmove.cxx:313
11 SwFrame::Calc(OutputDevice*) const (this=0x6d674e0) at trvlfrm.cxx:1790
^ 332 - SwTextFrame originally inside 991, but moved under top-level SwTabFrame 928 at this point
12 SwContentFrame::CalcLowers(SwLayoutFrame*, SwLayoutFrame const*, long, bool) (pLay=0x6dccbf0, pDontLeave=0x6ed6e30, nBottom=9223372036854775807, bSkipRowSpanCells=true) at tabfrm.cxx:1479
^ m_pLower -> 991 - SwRowFrame
13 lcl_RecalcRow(SwRowFrame*, long) (pRow=0x6dccbf0, nBottom=9223372036854775807) at tabfrm.cxx:1614
14 lcl_RecalcTable(SwTabFrame&, SwLayoutFrame*, SwLayNotify&) (rTab=..., pFirstRow=0x6dccbf0, rNotify=...) at tabfrm.cxx:1691
15 SwTabFrame::MakeAll(OutputDevice*) (this=0x6ed6e30) at tabfrm.cxx:2082
^ m_pFollow -> 905 - top-level SwTabFrame
16 SwTabFrame::MakeAll(OutputDevice*) (this=0x381d3e0) at tabfrm.cxx:2504
17 SwFrame::PrepareMake(OutputDevice*) (this=0x381d3e0) at calcmove.cxx:372
18 SwFrame::Calc(OutputDevice*) const (this=0x381d3e0) at trvlfrm.cxx:1790
^ 866 - top-level SwTabFrame
19 SwLayAction::FormatLayoutTab(SwTabFrame*, bool) (this=0x7fff95aa3f20, pTab=0x381d3e0, bAddRect=true) at layact.cxx:1483
20 SwLayAction::FormatLayout(OutputDevice*, SwLayoutFrame*, bool) (this=0x7fff95aa3f20, pLay=0x6cfedc0, bAddRect=true) at layact.cxx:1375
21 SwLayAction::FormatLayout(OutputDevice*, SwLayoutFrame*, bool) (this=0x7fff95aa3f20, pLay=0x6e23fd0, bAddRect=true) at layact.cxx:1380

The first attempt was to add a TextFrameLockGuard around the
pFrame->MakeAll() call in PrepareMake(), with corresponding test in
SwTabFrame::MakeAll() ... but a similar problem still occurred, just now
on page 18 instead of page 12.

Another idea is to prevent PrepareMake() from formatting the
SwTableFrame's follow *again*; it was already formatted by
SwTabFrame::MakeAll() anyway, just before it calls pNxt->Calc().

With this, we get 23 pages for the bugdoc, same as before that commit:
(regression from 18765b9f)

Change-Id: I71e3f92b5f19b800626a008527fa75d08641e8de
Reviewed-on: https://gerrit.libreoffice.org/72799Reviewed-by: 's avatarMichael Stahl <Michael.Stahl@cib.de>
Tested-by: 's avatarMichael Stahl <Michael.Stahl@cib.de>
üst c24299c3
......@@ -2539,6 +2539,9 @@ void SwTabFrame::MakeAll(vcl::RenderContext* pRenderContext)
}
if ( bCalcNxt )
{
// tdf#119109 follow was just formatted,
// don't do it again now
FlowFrameJoinLockGuard g(GetFollow());
pNxt->Calc(pRenderContext);
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment