tdf#148359 Fix emfio regression: missing emf image
This patch fixes tdf#148359 which prevented the display of EMF images
embedded in the rtf files or even loading when loading them directly.
Looking into the problem caused by the cleanup commit
3e7dd04dd8ca1baea4b7918eb7a7080c595c4625, it became visible that
while enums were converted to enum class, there was a cast that
was wrongly ommited:
- sal_uInt16 nStockId = static_cast<sal_uInt8>(nIndex);
+ StockObject nStockId = static_cast<StockObject>(nIndex);
Now, it is re-written as:
StockObject nStockId = static_cast<StockObject>(nIndex & 0xFF);
The symptom was that the StockObject field was mishandled, and thus
the shapes were displayed in white, instead of black.
"Stock Logical Object" is discussed in the MS document for EMF:
* [MS-EMF] v20210625 - pages 44, 45 and 182
A unit test is provided to make sure that the regression does not
happen again. The test can be run by:
make CPPUNIT_TEST_NAME=testStockObject -sr CppunitTest_emfio_wmf
Change-Id: I9a7f1008e92a96d9fb12aeb7bd057af828c1722a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/132540
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
diff --git a/emfio/qa/cppunit/wmf/data/stockobject.emf b/emfio/qa/cppunit/wmf/data/stockobject.emf
new file mode 100644
index 0000000..8de7c1a
--- /dev/null
+++ b/emfio/qa/cppunit/wmf/data/stockobject.emf
Binary files differ
diff --git a/emfio/qa/cppunit/wmf/wmfimporttest.cxx b/emfio/qa/cppunit/wmf/wmfimporttest.cxx
index b8c2218..d8a4ed82 100644
--- a/emfio/qa/cppunit/wmf/wmfimporttest.cxx
+++ b/emfio/qa/cppunit/wmf/wmfimporttest.cxx
@@ -56,6 +56,7 @@ public:
void testTdf99402();
void testTdf39894();
void testETO_PDY();
void testStockObject();
CPPUNIT_TEST_SUITE(WmfTest);
CPPUNIT_TEST(testNonPlaceableWmf);
@@ -69,6 +70,7 @@ public:
CPPUNIT_TEST(testTdf99402);
CPPUNIT_TEST(testTdf39894);
CPPUNIT_TEST(testETO_PDY);
CPPUNIT_TEST(testStockObject);
CPPUNIT_TEST_SUITE_END();
};
@@ -389,6 +391,29 @@ void WmfTest::testETO_PDY()
}
}
void WmfTest::testStockObject()
{
SvFileStream aFileStream(getFullUrl(u"stockobject.emf"), StreamMode::READ);
GDIMetaFile aGDIMetaFile;
ReadWindowMetafile(aFileStream, aGDIMetaFile);
MetafileXmlDump dumper;
xmlDocUniquePtr pDoc = dumpAndParse(dumper, aGDIMetaFile);
CPPUNIT_ASSERT(pDoc);
// Without the fix in place, this test would have failed with
// - Expected: 42
// - Actual : 37
assertXPathChildren(pDoc, "/metafile/push[2]", 42);
// Without the fix in place, this test would have failed with
// - Expected: 1
// - Actual : 0
// - In <>, XPath '/metafile/push[2]/fillcolor[2]' number of nodes is incorrect
assertXPath(pDoc, "/metafile/push[2]/fillcolor[2]", "color", "#000000");
}
CPPUNIT_TEST_SUITE_REGISTRATION(WmfTest);
CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/emfio/source/reader/mtftools.cxx b/emfio/source/reader/mtftools.cxx
index f829788..5cb43ec 100644
--- a/emfio/source/reader/mtftools.cxx
+++ b/emfio/source/reader/mtftools.cxx
@@ -750,7 +750,7 @@ namespace emfio
if ( nIndex & ENHMETA_STOCK_OBJECT )
{
SAL_INFO ( "emfio", "\t\t ENHMETA_STOCK_OBJECT, StockObject Enumeration: 0x" << std::hex << nIndex );
StockObject nStockId = static_cast<StockObject>(nIndex);
StockObject nStockId = static_cast<StockObject>(nIndex & 0xFF);
switch( nStockId )
{
case StockObject::WHITE_BRUSH :