diff options
author | Justin Luth <justin.luth@collabora.com> | 2021-04-09 11:06:13 +0200 |
---|---|---|
committer | Justin Luth <justin_luth@sil.org> | 2021-04-09 14:48:03 +0200 |
commit | 32013f0dccde8407aa907112399dc2a9efb7f906 (patch) | |
tree | 6f2f62d214d92eb1ffd52feacfa20d954d3b55ac | |
parent | 7f3deaa2963d3b240b4770d6494d539de68a310f (diff) |
tdf#120768 doc import: z-order background shapes behind others
Interestingly, there were NO ww8export examples
where a background item was attempting to insert
itself after a foreground one.
I think GENERALLY the order of shapes in a DOC
file format is from bottom to top - and so it
just worked by accident.
Change-Id: If5226b4ad071455d1e3c30e334676cc5932a1064
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/113837
Tested-by: Justin Luth <justin_luth@sil.org>
Reviewed-by: Justin Luth <justin_luth@sil.org>
-rw-r--r-- | sw/qa/extras/ww8import/data/tdf120768_zOrder.doc | bin | 0 -> 53760 bytes | |||
-rw-r--r-- | sw/qa/extras/ww8import/ww8import.cxx | 8 | ||||
-rw-r--r-- | sw/source/filter/ww8/ww8graf.cxx | 3 | ||||
-rw-r--r-- | sw/source/filter/ww8/ww8graf.hxx | 6 | ||||
-rw-r--r-- | sw/source/filter/ww8/ww8graf2.cxx | 9 |
5 files changed, 23 insertions, 3 deletions
diff --git a/sw/qa/extras/ww8import/data/tdf120768_zOrder.doc b/sw/qa/extras/ww8import/data/tdf120768_zOrder.doc Binary files differnew file mode 100644 index 000000000000..b70a7d840b6d --- /dev/null +++ b/sw/qa/extras/ww8import/data/tdf120768_zOrder.doc diff --git a/sw/qa/extras/ww8import/ww8import.cxx b/sw/qa/extras/ww8import/ww8import.cxx index a9b75588a1b3..ccae8638a2c3 100644 --- a/sw/qa/extras/ww8import/ww8import.cxx +++ b/sw/qa/extras/ww8import/ww8import.cxx @@ -262,6 +262,14 @@ DECLARE_WW8IMPORT_TEST(testTdf110987, "tdf110987") CPPUNIT_ASSERT(sFilterName != "MS Word 97 Vorlage"); } +DECLARE_WW8IMPORT_TEST(testTdf120768_zOrder, "tdf120768_zOrder.doc") +{ + //The blue shape was covering everything (highest zorder = 2) instead of the lowest(0) + uno::Reference<drawing::XShape> xShape(getShapeByName(u"Picture 2"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(0), getProperty<sal_uInt32>(xShape, "ZOrder")); +} + + // tests should only be added to ww8IMPORT *if* they fail round-tripping in ww8EXPORT CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/source/filter/ww8/ww8graf.cxx b/sw/source/filter/ww8/ww8graf.cxx index 89a3e8ac14f2..07ff4d41f730 100644 --- a/sw/source/filter/ww8/ww8graf.cxx +++ b/sw/source/filter/ww8/ww8graf.cxx @@ -2798,6 +2798,7 @@ SwFrameFormat* SwWW8ImplReader::Read_GrafLayer( tools::Long nGrafAnchorCp ) /* Need to make sure that the correct layer ordering is applied. */ // pass information, if object is in page header|footer to method. m_xWWZOrder->InsertEscherObject( pObject, pF->nSpId, + pRecord->bDrawHell, m_bIsHeader || m_bIsFooter ); } else @@ -3029,6 +3030,7 @@ SwFlyFrameFormat* SwWW8ImplReader::ConvertDrawTextToFly(SdrObject* &rpObject, { // pass information, if object is in page header|footer to method. m_xWWZOrder->InsertEscherObject( rpOurNewObject, pF->nSpId, + pRecord->bDrawHell, m_bIsHeader || m_bIsFooter ); } } @@ -3180,6 +3182,7 @@ SwFlyFrameFormat* SwWW8ImplReader::ImportReplaceableDrawables( SdrObject* &rpObj { // pass information, if object is in page header|footer to method. m_xWWZOrder->InsertEscherObject( rpOurNewObject, pF->nSpId, + pRecord->bDrawHell, m_bIsHeader || m_bIsFooter ); } } diff --git a/sw/source/filter/ww8/ww8graf.hxx b/sw/source/filter/ww8/ww8graf.hxx index 3b05c53d2c5d..7058fd1af897 100644 --- a/sw/source/filter/ww8/ww8graf.hxx +++ b/sw/source/filter/ww8/ww8graf.hxx @@ -33,12 +33,14 @@ struct EscherShape { sal_uLong mnEscherShapeOrder; sal_uLong mnNoInlines; - // new member <mbInHeaderFooter> + bool mbInHellLayer; bool mbInHeaderFooter; EscherShape( sal_uLong nEscherShapeOrder, + bool bInHellLayer, bool _bInHeaderFooter ) : mnEscherShapeOrder(nEscherShapeOrder), mnNoInlines(0), + mbInHellLayer(bInHellLayer), mbInHeaderFooter( _bInHeaderFooter ) {} }; @@ -71,6 +73,7 @@ private: // new parameter <_bInHeaderFooter>, indicating // that object is in header or footer sal_uLong GetEscherObjectPos( sal_uLong nSpId, + const bool bInHellLayer, const bool _bInHeaderFooter ); sal_uLong GetDrawingObjectPos(short nWwHeight); void InsertObject(SdrObject *pObject, sal_uLong nPos); @@ -86,6 +89,7 @@ public: // new parameter <_bInHeaderFooter>, indicating that object is in header or footer void InsertEscherObject( SdrObject* pObject, sal_uLong nSpId, + const bool bInHellLayer, const bool _bInHeaderFooter ); void InsideEscher(sal_uLong nIndex); void OutsideEscher(); diff --git a/sw/source/filter/ww8/ww8graf2.cxx b/sw/source/filter/ww8/ww8graf2.cxx index 08ef81f6e397..13bf81c97c9f 100644 --- a/sw/source/filter/ww8/ww8graf2.cxx +++ b/sw/source/filter/ww8/ww8graf2.cxx @@ -69,9 +69,10 @@ void wwZOrderer::OutsideEscher() // consider new parameter <_bInHeaderFooter> void wwZOrderer::InsertEscherObject( SdrObject* pObject, sal_uLong nSpId, + const bool bInHellLayer, const bool _bInHeaderFooter ) { - sal_uLong nInsertPos = GetEscherObjectPos( nSpId, _bInHeaderFooter ); + sal_uLong nInsertPos = GetEscherObjectPos( nSpId, bInHellLayer, _bInHeaderFooter ); InsertObject(pObject, nInsertPos + mnNoInitialObjects + mnInlines); } @@ -100,6 +101,7 @@ sal_uInt16 wwZOrderer::GetEscherObjectIdx(sal_uLong nSpId) // consider new parameter <_bInHeaderFooter> sal_uLong wwZOrderer::GetEscherObjectPos( sal_uLong nSpId, + const bool bInHellLayer, const bool _bInHeaderFooter ) { /* @@ -137,12 +139,15 @@ sal_uLong wwZOrderer::GetEscherObjectPos( sal_uLong nSpId, { break; } + if ( bInHellLayer && !aIter->mbInHellLayer ) + break; + if ( aIter->mnEscherShapeOrder > nFound ) break; nRet += aIter->mnNoInlines+1; ++aIter; } - maEscherLayer.insert(aIter, EscherShape( nFound, _bInHeaderFooter ) ); + maEscherLayer.insert(aIter, EscherShape( nFound, bInHellLayer, _bInHeaderFooter ) ); return nRet; } |