[Libreoffice-commits] core.git: sw/qa sw/source
Justin Luth (via logerrit)
logerrit at kemper.freedesktop.org
Mon Jul 20 14:02:33 UTC 2020
sw/qa/extras/ww8export/data/tdf117217_largeTableBackgrounds.odt |binary
sw/qa/extras/ww8export/ww8export3.cxx | 12 ++
sw/source/filter/ww8/wrtww8.cxx | 45 ++++++++--
sw/source/filter/ww8/ww8par.hxx | 2
sw/source/filter/ww8/ww8par2.cxx | 33 +++++--
5 files changed, 75 insertions(+), 17 deletions(-)
New commits:
commit 565912fa0334de1c05749768796a33a1a5e6b984
Author: Justin Luth <justin.luth at collabora.com>
AuthorDate: Wed Jul 15 17:07:46 2020 +0300
Commit: Miklos Vajna <vmiklos at collabora.com>
CommitDate: Mon Jul 20 16:01:47 2020 +0200
tdf#117217 ww8: export/import all cell backgrounds
... using TDefTableShd2nd and TDefTableShd3rd
P.S. There might be some other subtleties going on here.
> sprmTDefTableShdRaw:
> If a cell is set to ShdAuto in rgShd, the cell is
> not shaded. If a cell is set to ShdNil in rgShd, the cell is shaded
> according to the table style. By default, cells are shaded according
> to the table style.
(sprmTDefTableShdRaw not imported in LO, and ShdNil unknown)
> sprmTDefTableShd:
> If nFib is greater than 0x00D9 and the application understands
> table styles, then this Sprm MUST be ignored.
(aka NewShd from MSO 2000ish - never ignored by LO, and almost certainly
LO doesn't understand these table styles despite ?nFib == 0x0101? )
These seem to be very "late" modifications to the .doc format,
so likely very few things support the advanced features.
In any case, I haven't done anything novel here - just copying
what was done for template1 into template2 and template3,
so these subtleties are irrelevant for this patch.
Change-Id: Ic330179cf771a6f2531ed75dfb441fba10a04c7c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/98856
Tested-by: Justin Luth <justin_luth at sil.org>
Reviewed-by: Justin Luth <justin_luth at sil.org>
Reviewed-by: Miklos Vajna <vmiklos at collabora.com>
diff --git a/sw/qa/extras/ww8export/data/tdf117217_largeTableBackgrounds.odt b/sw/qa/extras/ww8export/data/tdf117217_largeTableBackgrounds.odt
new file mode 100644
index 000000000000..bbb1eaab3c8c
Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf117217_largeTableBackgrounds.odt differ
diff --git a/sw/qa/extras/ww8export/ww8export3.cxx b/sw/qa/extras/ww8export/ww8export3.cxx
index 13da2fec9d1b..460937c08895 100644
--- a/sw/qa/extras/ww8export/ww8export3.cxx
+++ b/sw/qa/extras/ww8export/ww8export3.cxx
@@ -417,6 +417,18 @@ DECLARE_WW8EXPORT_TEST(testTdf128608_tableParaBackColor, "tdf128608_tableParaBac
CPPUNIT_ASSERT_EQUAL_MESSAGE("No fillstyle", drawing::FillStyle_NONE, getProperty<drawing::FillStyle>(xPara, "FillStyle"));
}
+DECLARE_WW8EXPORT_TEST(testTdf117217_largeTableBackgrounds, "tdf117217_largeTableBackgrounds.odt")
+{
+ uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<container::XIndexAccess> xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY);
+ uno::Reference<text::XTextTable> xTable(xTables->getByIndex(0), uno::UNO_QUERY);
+ // Cell 22: light-red == 16711680
+ uno::Reference<text::XTextRange> xCell(xTable->getCellByName("V1"), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("light red", sal_Int32(0xE0C2CD), getProperty<sal_Int32>(xCell, "BackColor"));
+ xCell.set(xTable->getCellByName("Z1"), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("light red", sal_Int32(0xE0C2CD), getProperty<sal_Int32>(xCell, "BackColor"));
+}
+
DECLARE_WW8EXPORT_TEST(testTdf94009_zeroPgMargin, "tdf94009_zeroPgMargin.odt")
{
CPPUNIT_ASSERT_EQUAL(1, getPages());
diff --git a/sw/source/filter/ww8/wrtww8.cxx b/sw/source/filter/ww8/wrtww8.cxx
index c22eae519943..294ce05635fd 100644
--- a/sw/source/filter/ww8/wrtww8.cxx
+++ b/sw/source/filter/ww8/wrtww8.cxx
@@ -2683,18 +2683,49 @@ void WW8AttributeOutput::TableBackgrounds( ww8::WW8TableNodeInfoInner::Pointer_t
m_rWW8Export.InsUInt16( aShd.GetValue() );
}
+/*sprmTDefTableShdRaw:
+ * A DefTableShdOperand value that specifies the ... shading for cells 1 up to 22 in the row,
+ * ... Cells 23 to 44 are shaded by sprmTDefTableShdRaw2nd,
+ * and cells 45 to 63 are shaded by sprmTDefTableShdRaw3rd.
+ */
sal_uInt32 const aSprmIds[] { NS_sprm::TDefTableShd::val,
- NS_sprm::TDefTableShdRaw::val };
- sal_uInt8 nBoxes0 = rTabBoxes.size();
- if (nBoxes0 > 21)
- nBoxes0 = 21;
-
+ NS_sprm::TDefTableShdRaw::val,
+ NS_sprm::TDefTableShdRaw::val,
+ NS_sprm::TDefTableShd2nd::val,
+ NS_sprm::TDefTableShdRaw2nd::val,
+ NS_sprm::TDefTableShd3rd::val,
+ NS_sprm::TDefTableShdRaw3rd::val };
for (sal_uInt32 m : aSprmIds)
{
+ sal_uInt8 nStart = 0;
+ sal_uInt8 nStop = rTabBoxes.size();
+ switch ( m )
+ {
+ case NS_sprm::TDefTableShd::val:
+ case NS_sprm::TDefTableShdRaw::val:
+ if ( nStop > 21 )
+ nStop = 22;
+ break;
+ case NS_sprm::TDefTableShd2nd::val:
+ case NS_sprm::TDefTableShdRaw2nd::val:
+ nStart = 22;
+ if ( nStop > 43 )
+ nStop = 44;
+ break;
+ case NS_sprm::TDefTableShd3rd::val:
+ case NS_sprm::TDefTableShdRaw3rd::val:
+ nStart = 44;
+ if ( nStop > 62 )
+ nStop = 63;
+ break;
+ }
+ if ( nStart >= nStop )
+ break;
+
m_rWW8Export.InsUInt16( m );
- m_rWW8Export.pO->push_back( static_cast<sal_uInt8>(nBoxes0 * 10) );
+ m_rWW8Export.pO->push_back( static_cast<sal_uInt8>((nStop-nStart) * 10) );
- for ( sal_uInt8 n = 0; n < nBoxes0; n++ )
+ for ( sal_uInt8 n = nStart; n < nStop; n++ )
{
const SwTableBox * pBox1 = rTabBoxes[n];
const SwFrameFormat * pFrameFormat = pBox1->GetFrameFormat();
diff --git a/sw/source/filter/ww8/ww8par.hxx b/sw/source/filter/ww8/ww8par.hxx
index 810b692ee6aa..2ff459b161ca 100644
--- a/sw/source/filter/ww8/ww8par.hxx
+++ b/sw/source/filter/ww8/ww8par.hxx
@@ -1058,7 +1058,7 @@ struct WW8TabBandDesc
void ProcessSpacing(const sal_uInt8* pParamsTInsert);
void ProcessSpecificSpacing(const sal_uInt8* pParamsTInsert);
void ReadShd(const sal_uInt8* pS );
- void ReadNewShd(const sal_uInt8* pS, bool bVer67);
+ void ReadNewShd(const sal_uInt8* pS, bool bVer67, sal_uInt8 nStart);
enum wwDIR {wwTOP = 0, wwLEFT = 1, wwBOTTOM = 2, wwRIGHT = 3};
diff --git a/sw/source/filter/ww8/ww8par2.cxx b/sw/source/filter/ww8/ww8par2.cxx
index 4addec45a062..bda2cb26c1df 100644
--- a/sw/source/filter/ww8/ww8par2.cxx
+++ b/sw/source/filter/ww8/ww8par2.cxx
@@ -1593,20 +1593,20 @@ void WW8TabBandDesc::ReadShd(const sal_uInt8* pS )
pSHDs[i].SetWWValue( *pShd );
}
-void WW8TabBandDesc::ReadNewShd(const sal_uInt8* pS, bool bVer67)
+void WW8TabBandDesc::ReadNewShd(const sal_uInt8* pS, bool bVer67, sal_uInt8 nStart)
{
sal_uInt8 nLen = pS ? *(pS - 1) : 0;
- if (!nLen)
+ if (!nLen || nStart >= nWwCols)
return;
if (!pNewSHDs)
pNewSHDs = new Color[nWwCols];
- short nCount = nLen / 10; //10 bytes each
+ short nCount = nLen / 10 + nStart; //10 bytes each
if (nCount > nWwCols)
nCount = nWwCols;
- int i=0;
+ int i=nStart;
while (i < nCount)
pNewSHDs[i++] = SwWW8ImplReader::ExtractColour(pS, bVer67);
@@ -1637,7 +1637,8 @@ enum wwTableSprm
sprmTDefTable, sprmTDyaRowHeight, sprmTDefTableShd, sprmTDxaLeft,
sprmTSetBrc, sprmTSetBrc90, sprmTDxaCol, sprmTInsert, sprmTDelete,
sprmTTableHeader, sprmTDxaGapHalf, sprmTTableBorders, sprmTTableBorders90,
- sprmTDefTableNewShd, sprmTCellPadding, sprmTCellPaddingDefault
+ sprmTDefTableNewShd, sprmTDefTableNewShd2nd, sprmTDefTableNewShd3rd,
+ sprmTCellPadding, sprmTCellPaddingDefault
};
}
@@ -1681,6 +1682,10 @@ static wwTableSprm GetTableSprm(sal_uInt16 nId, ww::WordVersion eVer)
return sprmTDefTableShd;
case NS_sprm::TDefTableShd::val:
return sprmTDefTableNewShd;
+ case NS_sprm::TDefTableShd2nd::val:
+ return sprmTDefTableNewShd2nd;
+ case NS_sprm::TDefTableShd3rd::val:
+ return sprmTDefTableNewShd3rd;
case NS_sprm::TTableBorders::val:
return sprmTTableBorders90;
case NS_sprm::TSetBrc80::val:
@@ -1810,7 +1815,7 @@ WW8TabDesc::WW8TabDesc(SwWW8ImplReader* pIoClass, WW8_CP nStartCp) :
short nTabeDxaNew = SHRT_MAX;
bool bTabRowJustRead = false;
const sal_uInt8* pShadeSprm = nullptr;
- const sal_uInt8* pNewShadeSprm = nullptr;
+ const sal_uInt8* pNewShadeSprm[3] = {nullptr, nullptr, nullptr};
const sal_uInt8* pTableBorders = nullptr;
sal_uInt16 nTableBordersLen = 0;
const sal_uInt8* pTableBorders90 = nullptr;
@@ -1905,7 +1910,13 @@ WW8TabDesc::WW8TabDesc(SwWW8ImplReader* pIoClass, WW8_CP nStartCp) :
pShadeSprm = pParams;
break;
case sprmTDefTableNewShd:
- pNewShadeSprm = pParams;
+ pNewShadeSprm[0] = pParams;
+ break;
+ case sprmTDefTableNewShd2nd:
+ pNewShadeSprm[1] = pParams;
+ break;
+ case sprmTDefTableNewShd3rd:
+ pNewShadeSprm[2] = pParams;
break;
case sprmTDxaLeft:
// our Writer cannot shift single table lines
@@ -1963,8 +1974,12 @@ WW8TabDesc::WW8TabDesc(SwWW8ImplReader* pIoClass, WW8_CP nStartCp) :
// so they were saved up until here
if (pShadeSprm)
pNewBand->ReadShd(pShadeSprm);
- if (pNewShadeSprm)
- pNewBand->ReadNewShd(pNewShadeSprm, bOldVer);
+ if (pNewShadeSprm[0])
+ pNewBand->ReadNewShd(pNewShadeSprm[0], bOldVer, /*nStart=*/0);
+ if (pNewShadeSprm[1])
+ pNewBand->ReadNewShd(pNewShadeSprm[1], bOldVer, /*nStart=*/22);
+ if (pNewShadeSprm[2])
+ pNewBand->ReadNewShd(pNewShadeSprm[2], bOldVer, /*nStart=*/44);
if (pTableBorders90)
pNewBand->ProcessSprmTTableBorders(9, pTableBorders90, nTableBorders90Len);
else if (pTableBorders)
More information about the Libreoffice-commits
mailing list