summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Luth <justin.luth@collabora.com>2021-04-09 11:06:13 +0200
committerJustin Luth <justin_luth@sil.org>2021-04-09 14:48:03 +0200
commit32013f0dccde8407aa907112399dc2a9efb7f906 (patch)
tree6f2f62d214d92eb1ffd52feacfa20d954d3b55ac
parent7f3deaa2963d3b240b4770d6494d539de68a310f (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.docbin0 -> 53760 bytes
-rw-r--r--sw/qa/extras/ww8import/ww8import.cxx8
-rw-r--r--sw/source/filter/ww8/ww8graf.cxx3
-rw-r--r--sw/source/filter/ww8/ww8graf.hxx6
-rw-r--r--sw/source/filter/ww8/ww8graf2.cxx9
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
new file mode 100644
index 000000000000..b70a7d840b6d
--- /dev/null
+++ b/sw/qa/extras/ww8import/data/tdf120768_zOrder.doc
Binary files differ
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;
}