summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2020-03-09 22:11:35 +0100
committerMichael Stahl <michael.stahl@cib.de>2020-03-10 17:07:40 +0100
commit72c0723bf97938d7eabd9ebe631e8442cb6b7699 (patch)
tree611eac48df62b307f4852631337e758a4812c6c8
parent5e503630895c7c213bef503cfed69e71e312ff88 (diff)
tdf#128880 sw btlr: fix SwFrame::GetPaintArea() for the row span case
To be specific, this focuses on the case where a single cell has btlr direction, but the containing row does not, and there is a row span. The old code that took the logical right of the cell frame served two purposes, it seems to me: - in the rare case where the 1st row is wider then a subsequent row, we make sure that as the cell frame is expanded downwards, we're still inside the table polygon - in the tb-rl ("Japanese") case, the logical right maps to physical bottom, and this way the cell frame is OK to render not only into its own row frame, but can expand also downwards. Given that btlr maps left to bottom, this mechanism is broken there. Be consistent with the working tbrl case, so just expand towards the logical left in the btlr case. The rest of the changes just make sure that SwAttrHandler::FontChg() calls SwFont::SetVertical() with the correct bVertLayoutLRBT parameter, which instantly fixes the actual position of the text. (cherry picked from commit 74f0105a2c140d078932576b457a327f3d2490a6) Conflicts: sw/qa/core/layout/layout.cxx Change-Id: I9032e7c6de72cec704843f3aae3c7848e139ebfa Reviewed-on: https://gerrit.libreoffice.org/c/core/+/90251 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.stahl@cib.de>
-rw-r--r--sw/qa/extras/layout/data/btlr-table-row-span.odtbin0 -> 11958 bytes
-rw-r--r--sw/qa/extras/layout/layout.cxx18
-rw-r--r--sw/source/core/layout/ssfrm.cxx14
-rw-r--r--sw/source/core/text/atrhndl.hxx3
-rw-r--r--sw/source/core/text/atrstck.cxx6
-rw-r--r--sw/source/core/text/redlnitr.cxx9
6 files changed, 42 insertions, 8 deletions
diff --git a/sw/qa/extras/layout/data/btlr-table-row-span.odt b/sw/qa/extras/layout/data/btlr-table-row-span.odt
new file mode 100644
index 000000000000..ca4b6872fb3b
--- /dev/null
+++ b/sw/qa/extras/layout/data/btlr-table-row-span.odt
Binary files differ
diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx
index 36e34918f9a3..7752f2e53e1d 100644
--- a/sw/qa/extras/layout/layout.cxx
+++ b/sw/qa/extras/layout/layout.cxx
@@ -3727,6 +3727,24 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testStableAtPageAnchoredFlyPosition)
CPPUNIT_ASSERT_EQUAL(aOrigRect, aRelayoutRect);
}
+CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testBtlrTableRowSpan)
+{
+ // Load a document which has a table. The A1 cell has btlr text direction, and the A1..A3 cells
+ // are merged.
+ load(DATA_DIRECTORY, "btlr-table-row-span.odt");
+ SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get());
+ SwDocShell* pShell = pTextDoc->GetDocShell();
+ std::shared_ptr<GDIMetaFile> xMetaFile = pShell->GetPreviewMetaFile();
+ MetafileXmlDump aDumper;
+ xmlDocPtr pXmlDoc = dumpAndParse(aDumper, *xMetaFile);
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: USA
+ // - Actual : West
+ // i.e. the "USA" text completely disappeared.
+ assertXPathContent(pXmlDoc, "//textarray[1]/text", "USA");
+}
+
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/layout/ssfrm.cxx b/sw/source/core/layout/ssfrm.cxx
index a38c784f146f..6905c1e06134 100644
--- a/sw/source/core/layout/ssfrm.cxx
+++ b/sw/source/core/layout/ssfrm.cxx
@@ -607,7 +607,19 @@ SwRect SwFrame::GetPaintArea() const
if( pTmp->IsVertical() )
nTmpLeft = (pNxt->getFrameArea().*fnRect->fnGetLeft)();
else
- nTmpRight = (pNxt->getFrameArea().*fnRect->fnGetRight)();
+ {
+ // pTmp is a row frame, but it's not vertical.
+ if (IsVertLRBT())
+ {
+ // This frame cell is OK to expand towards the physical down direction.
+ // Physical down is left.
+ nTmpLeft = (pNxt->getFrameArea().*fnRect->fnGetLeft)();
+ }
+ else
+ {
+ nTmpRight = (pNxt->getFrameArea().*fnRect->fnGetRight)();
+ }
+ }
}
OSL_ENSURE( pTmp, "GetPaintArea lost in time and space" );
if( pTmp->IsPageFrame() || pTmp->IsFlyFrame() ||
diff --git a/sw/source/core/text/atrhndl.hxx b/sw/source/core/text/atrhndl.hxx
index 8abb678ea9fd..e391b0825886 100644
--- a/sw/source/core/text/atrhndl.hxx
+++ b/sw/source/core/text/atrhndl.hxx
@@ -50,6 +50,7 @@ private:
std::unique_ptr<SwFont> m_pFnt;
bool m_bVertLayout;
+ bool m_bVertLayoutLRBT;
const SwTextAttr* GetTop(sal_uInt16 nStack);
void RemoveFromStack(sal_uInt16 nWhich, const SwTextAttr& rAttr);
@@ -76,7 +77,7 @@ public:
void Init( const SfxPoolItem** pPoolItem, const SwAttrSet* pAttrSet,
const IDocumentSettingAccess& rIDocumentSettingAccess,
const SwViewShell* pShell, SwFont& rFnt,
- bool bVertLayout );
+ bool bVertLayout, bool bVertLayoutLRBT );
bool IsVertLayout() const { return m_bVertLayout; }
diff --git a/sw/source/core/text/atrstck.cxx b/sw/source/core/text/atrstck.cxx
index 79740aa73c42..2169657f8ed5 100644
--- a/sw/source/core/text/atrstck.cxx
+++ b/sw/source/core/text/atrstck.cxx
@@ -266,6 +266,7 @@ SwAttrHandler::SwAttrHandler()
: m_pIDocumentSettingAccess(nullptr)
, m_pShell(nullptr)
, m_bVertLayout(false)
+ , m_bVertLayoutLRBT(false)
{
memset( m_pDefaultArray, 0, NUM_DEFAULT_VALUES * sizeof(SfxPoolItem*) );
}
@@ -287,7 +288,7 @@ void SwAttrHandler::Init( const SwAttrSet& rAttrSet,
void SwAttrHandler::Init( const SfxPoolItem** pPoolItem, const SwAttrSet* pAS,
const IDocumentSettingAccess& rIDocumentSettingAcces,
const SwViewShell* pSh,
- SwFont& rFnt, bool bVL )
+ SwFont& rFnt, bool bVL, bool bVertLayoutLRBT )
{
// initialize default array
memcpy( m_pDefaultArray, pPoolItem,
@@ -298,6 +299,7 @@ void SwAttrHandler::Init( const SfxPoolItem** pPoolItem, const SwAttrSet* pAS,
// do we have to apply additional paragraph attributes?
m_bVertLayout = bVL;
+ m_bVertLayoutLRBT = bVertLayoutLRBT;
if ( pAS && pAS->Count() )
{
@@ -760,7 +762,7 @@ void SwAttrHandler::FontChg(const SfxPoolItem& rItem, SwFont& rFnt, bool bPush )
if ( !bTwoLineAct )
rFnt.SetVertical( static_cast<const SvxCharRotateItem&>(rItem).GetValue(),
- m_bVertLayout );
+ m_bVertLayout, m_bVertLayoutLRBT );
break;
}
diff --git a/sw/source/core/text/redlnitr.cxx b/sw/source/core/text/redlnitr.cxx
index 045603417850..8ea8b5916202 100644
--- a/sw/source/core/text/redlnitr.cxx
+++ b/sw/source/core/text/redlnitr.cxx
@@ -328,11 +328,11 @@ void SwAttrIter::InitFontAndAttrHandler(
// set font to vertical if frame layout is vertical
// if it's a re-init, the vert flag never changes
+ bool bVertLayoutLRBT = false;
+ if (pbVertLayoutLRBT)
+ bVertLayoutLRBT = *pbVertLayoutLRBT;
if (pbVertLayout ? *pbVertLayout : m_aAttrHandler.IsVertLayout())
{
- bool bVertLayoutLRBT = false;
- if (pbVertLayoutLRBT)
- bVertLayoutLRBT = *pbVertLayoutLRBT;
m_pFont->SetVertical(m_pFont->GetOrientation(), true, bVertLayoutLRBT);
}
@@ -343,7 +343,8 @@ void SwAttrIter::InitFontAndAttrHandler(
// them to the font
m_aAttrHandler.Init(aFontAccess.Get()->GetDefault(), rTextNode.GetpSwAttrSet(),
*rTextNode.getIDocumentSettingAccess(), m_pViewShell, *m_pFont,
- pbVertLayout ? *pbVertLayout : m_aAttrHandler.IsVertLayout() );
+ pbVertLayout ? *pbVertLayout : m_aAttrHandler.IsVertLayout(),
+ bVertLayoutLRBT );
m_aFontCacheIds[SwFontScript::Latin] = m_aFontCacheIds[SwFontScript::CJK] = m_aFontCacheIds[SwFontScript::CTL] = nullptr;