[Libreoffice-commits] core.git: sw/qa writerfilter/source
Miklos Vajna
vmiklos at collabora.co.uk
Tue May 3 08:24:56 UTC 2016
sw/qa/extras/rtfimport/data/tdf95707.rtf | 178 +++++++++++++++++++++++++
sw/qa/extras/rtfimport/rtfimport.cxx | 6
writerfilter/source/rtftok/rtfdocumentimpl.cxx | 21 ++
writerfilter/source/rtftok/rtfdocumentimpl.hxx | 3
writerfilter/source/rtftok/rtftokenizer.cxx | 4
5 files changed, 209 insertions(+), 3 deletions(-)
New commits:
commit 6bacfc8d95163a3eacc2784660282a8ce7d9a552
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date: Tue May 3 09:35:58 2016 +0200
tdf#95707 RTF import: handle device-independent bitmaps
See
<https://msdn.microsoft.com/en-us/library/dd183374%28v=vs.85%29.aspx>
for more info about the header structure that has to be prepended to the
real data to make our BMP import filter happy.
Change-Id: Iabdf4cd169b82ea951d1c1b12432d97d61b7af51
Reviewed-on: https://gerrit.libreoffice.org/24604
Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
Tested-by: Jenkins <ci at libreoffice.org>
diff --git a/sw/qa/extras/rtfimport/data/tdf95707.rtf b/sw/qa/extras/rtfimport/data/tdf95707.rtf
new file mode 100644
index 0000000..d4f7678
--- /dev/null
+++ b/sw/qa/extras/rtfimport/data/tdf95707.rtf
@@ -0,0 +1,178 @@
+{\rtf\ansi
+\pard\plain
+before
+{\pict \picw200\pich29\dibitmap\wbmbitspixel8\wbmplanes1\wbmwidthbytes26\picwgoal4000\pichgoal580\picscalex75\picscaley75
+28000000c80000001d000000010008000000000000000000130b0000130b00000000000000000000
+00000000e6e8d80073727300090088003a3a3b00afafa8006673f2002c37ef0016141700cccccc00
+555456000000ea00a5a5a600fbfcf1000d0c0f0088887e00242225000c00ce000000740052479b00
+9591af004746480093a6f800d9dacd001e10980006030700bbbcac004f66f300f5f7e5001915ec00
+aaaae5002b2a2d005a4bef00787778008c7ff3007d76b600d6d6d6000f045e00443899000100bd00
+1a1354005f5e5f00a5a69700e7e6ec004953f1008f83f2007d90f7001e00e6001e1d1f004f4e5000
+2f2592003e3d3f003e51f2007f7c85000b00b1007d70f10066666600b1b0b100c9c5f200c7c9b800
+e1e1e2006c83f6002c1baf001900dd00635c940093928f00dadadb00e0e5fb003723e8000a090c00
+0a00ac00424242001c00e8007464f00010101100404bd200878788003447f1009d93f7006a5fc300
+29244f00191919000800a6001900be00f4f3f30033333300282aee002106ec00a3a4f7004c495600
+e6e6e6001c00d600141316003a3750002a292a001000ec003a2da50008070900bcbdbd00a19af100
+677ef600c2c1c2002e1abd00d4d7fb00b2adf500888698008a84b300dedede00d7d7ce00cdd7fa00
+afaeb2008f9ef700251b6f00f0eff800695df0005e5d62003345f10042424a0052525200ffffff00
+2000f000eff0e500dedeff0079759e006e6b71001200bf001700b4006156ae00efefef006463f700
+4b61f300988df500b7b6c200898889001a00c500191921001910ec0073737b00291aed001b00cf00
+647bf500403396002f17eb0085867800f7f6ff00999999004a4a4b0092909700848484007388f600
+d5d1f000d4dcfa002100de000700ea00423a420097aaf900a1b4fa00220ec800bab1f600cfd0c400
+5a5a5b002120220024179d00f7f9ec005044b0005557f200736ce900384bf1000e00a200363bef00
+0e016c00847af200cecebd00978eea00aaa9ab007b7b7c001606ec003142f7002432f0002423ed00
+736b7300879af8000f00b00009007e009185f6001e0ca0005a70f4001200c700ccccff00efeefd00
+9f9aa900bfbfb500867fb4007387f6002210ed00a9a6ba00837f9d00f7ffef006767f10066666600
+f7f7f700eff7ef00adadad00a3a09f00bfbec600b6b5b6008c8b8c002100d60099999900c5c5c500
+0b00ec003b51f2000f00b70029212900526af400e6e7de002f3af0001a00ed003941f10044425200
+080094009aa6f500807f8000495ef200191057004057f200fffff600e7e6fb008c8c94009caff900
+5a525a000300eb000e00cc000a007000dedece008494f7008276ee00c4c5fa00c3c3bf0098998a00
+3c26e900a195f7002d265100423a52003729ab00707bf400b8b7f7008c8cb5009b8ff3003524ed00
+dbddf900c1bbf5000e0ba6009488f20021139900ced6ff0077777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+777777777777777777777777777777777777777777777777777777777777777777777777777777a3
+016ceebfac17d7547777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+7777777777777777777777777777777777777777777777777777777777777777777754c8771ccc23
+a4f43e3e60137bae6c80777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+777777777777777777777777777777c8c8c877777777777777777777777777777777777777777777
+777777777777777777777777777777777777777777777777777777777777777777549491844f9d11
+1111bb7d7d3636a240056b77777777777777777777650215043338ca77777777cba02902c8777777
+772baf91774c4c54777777777777773938470433a0415a77afcec87777777777777724af92333392
+7cae80777777776202153333153129ca7741de8077777777247c3304385477777777772476763131
+9292313894cd777777777777cba055a1a15e0415a080cd38382154777777777791ce779141c87777
+77777793383802547777777777777777777777777777777777777777777777777777090f70273f3f
+3f5b5b86865353b65232939fc8777777777777543861196119191919156b77773800003054777777
+3c1f00a07733004780777777770933191945454519005580550015547777777777ce4a0000000000
+0000387777c838190000000061610029773100042b77774230000e195c5a77777777776200616100
+00000000006155397777809200004555041f0e61196baf000000807777778047001f771500048077
+777762000000af7777777777777777777777777777777777777777777777777777e277779128463f
+48483f5b5b8686537e5218696c777777777777a00051455c045e6108191f2b7702194a1f54777777
+7c0061387792450041777777655c61514a1908304a00302b150e00917777777741005c4555382129
+040031777738005c4a38ae0c554a613877a06100de7777af00515c0e105a7777777777650e084a02
+cb91ce29084a0e190c7721000e04247777801f4a5c3c4c00005c80777777de000004770a0000af77
+7754100000157777777777777777777777777777777777777777777777777777771eab77773bf303
+3f782f2f3f5b8b86537e52fecb5a77777777ca00514547097780415c5100217702194a1f54777777
+330e6138779245197c77776b300e51451041245a0994553c150e197c777777420808613854777777
+77ae9477d1610861ce7777777661613877a06161a0777738614a1f0942c87777777777650e086165
+77777777d1305c0e5e5a040e0e62777777801f0e5c3c4c00005c8077777733000004770a00003377
+777c00004a6b7777777777777777777777777777777777777777777777777777804499f67777797c
+aabb78782f2f5b5b86537e528dbfc8777777a0195ca15a7777777702614a557721194a1f54777777
+470e6138779245457c7777a0005161045a77777777776b80470e190277777794194a1f5477777777
+7777777721194a55c87777773145453877a06161a07777386161767777777777777777650e0861cd
+7777777777ce19510e0c040e0842777777801f0e5c3c4c00005c8077777704000004770a00004777
+65000000cb777777777777777777777777777777777777777777777777777777add2d28ae3777777
+efe0d4d9d92f2f5b8b86537ea8c4d7777777154545927777777777ca614aa154af194a1f54777777
+470e6138779245457c77094a084aa13c7777777777777777330e1902777777314519027777777777
+7777777731616129777777773145453877a06161a07777386161317777777777777777650e0861cd
+77777777776261081993a06161ae777777801f0e5c3c4c00005c8077777733000004770a000015c8
+5e00000a777777777777777777777777777777777777777777777777777777c8f05f78d220777777
+771af2a848782f2f5b8b867e46269f777777154545927777777777ca454a1054af194a1f54777777
+470e6138779245450277af00511991777777777777777777330e1902777777040e5c1f0a02416e09
+6b547777470e197c777777773145453877a06161a07777386161317777777777777777650e0861cd
+7777777777cd610819396500191fd17777771f0e5c3c4c00005c8077777733000004770a00007621
+0000512b7777777777777777777777777777777777777777777777777777773ad9d9d9d9d2b87777
+777717db033f782f2f5b8686d4b96ec87777154545927777777777ca454a1054af194a1f54777777
+470e613877924545027715455ca12b777777777777777777330e19027777c8554a5119000000000e
+511f156b920e197c777777773145453877a06161a07777386161317777777777777777650e0861cd
+777777777721194a513c77cb30000047de915e4a5c3c4c00005c8077777733000004770a00000e00
+0000627777777777777777777777777777777777777777777777777777777763d2787878d9d9ed77
+7777777929e98b782f3f8b8b53b6140d7777154545927777777777ca454a1054af194a1f54777777
+470e61387792454502771f4a617677777777777777777777330e1902777777040e4a7c217604105c
+5c0e452429616129777777773145453877a06161a07777386161317777777777777777650e0861d1
+77777777ae5c4500917777772b910a1045000808083c4c00005c8077777733000004770a00005e30
+00006277777777777777777777777777777777777777777777777777777777ecd2785757c2b0f9bd
+77777777778f25bbd92f5b8b86b66a0d7777154545927777777777ca454a1054af194a1f54777777
+470e61387792454521c8a14a192177777777777777777777330e19027777770a6161cd7777778024
+55453054ce000e55777777773145453877a06161a07777386161317777777777777777650e084a02
+cbcb85150e0e5ecb77777777777777775a655e4a4a6b4c00005c8077777733000004770a00000acd
+00003080777777777777777777777777777777777777777777777777777777375fc2b35656561dc6
+7777777777772a28362f2f8b86d4c00d7777154545927777777777ca454a1054af194a1fc8777777
+470e19387792454521c8a14a19af77777777777777777777330e1902777777410061027777777780
+a1193377240e5c610c7777777661613877a06161a07777381961317777777777777777650e085100
+000000004a298077777777777777777777775e0e08809400005c8077777733000004770a00004777
+3800000a7777777777777777777777777777777777777777777777777777772d5f56d874747474b3
+58777777777777bf50523f3f86d4f70d7777154545927777777777ca454a1054af194a1f54777765
+510800947792454502771f4a61a077777777777777777777330e613877778042104551627777c838
+610041777702004a51cb5a5a150e613877a0616129c83ca04545156b6b777777777777650e080e94
+cdcd91760e08330977773caf4277777777ae0e455577de00005c7777775a51000076777600004777
+54100000cb7777777777777777777777777777777777777777777777777777681dd834df1b1b82a7
+07677777777777776c5ddc8b8b7ec3e27777154545927777777777ca454a10540200080833a07651
+4a61516b77920e61027715454a5e54777777777777777777551908304792103c391919080a7c0445
+0033547777c82900191951510851613877a0616138094a085151514a102b7777777777650e086165
+77777777ce6161306b7742000e9221de29084500ae770200000076217ca1000000cd777600004777
+776500000e6b77777777777777777777777777777777777777777777777777fa07a71b8c95958cd6
+742cbd7777777777770159b7bb666c777777154545927777777777ca454a1080ca5e4a6100000000
+6155d177773300003877de005161ca777777777777777777de5161190000002477ae101900000061
+312b77777777770c925e301fa1086138773100002909004a51515c005c5a7777777777650e0861cd
+77777777c81f4a0002775438510000000019a1cb7777411900000000000000004c77777600004777
+777721000055807777777777777777777777777777777777777777777777777706d38cb59c9cb58c
+dfb281907777777777777973127fa3777777154545927777777777ca454a105a77c824caceafafce
+62c8777777910202ca77244a080e55c87777777777777777775acdceafaf8580777780cadeafced1
+777777777777777777805a549245453877cb0202ae5aaf044a4a1f2194547777777777650e0861cd
+7777777777330e45927777775a629194ce392b77777777240c027604553194247777777600004777
+7777c891414c3c77777777777777777777777777777777777777777777777777bce13de543439c95
+d674fcbe777777777777770d7c3554777777154545927777777777ca454a105a7777777777777777
+7777777777777777777777290051190a547777777777092b77777777777777777777777777777777
+77777777777777777777777792454538777777777777777c1961767777777777777777650e0861cd
+77777777c8554a617677777777777777777777777777777777777777777777777777777600004777
+7777777777777777777777777777777777777777777777777777777777777777776fba9b6d97e5c1
+1b4bcb807777777777777777c841807777779261619277777777776e615c105a7777777777777777
+7777777777cd33150977775a10615119040c6b8009de103c77777777777777777777777777777777
+7777777777777777777777779245453877653347657777381945317777777777777777650e086165
+77777777cb4551004177777777777777777777777777777777777777777777777777773100004777
+77777777777777777777777777777777777777777777777777777777777777777790953d16162e8c
+a7dd77777777777777777777775a77777777940061927777777777424a45105a7777777777777777
+777777775410000047777777093019510e19305e5c00512b77777777777777777777777777777777
+777777777777777777777777de00197c771f00005577779100613177777777777777776219084a38
+cacdae384a4a0015547777777777777777777777777777777777777777777777777777af00004777
+77777777777777777777777777777777777777777777777777777777777777777777bd95ba646482
+4ddaa572492283f1f1b896e27777777777775431000477777777777741000e5a7777777777777777
+77777777773100000277777777427661191919000000335477777777777777777777777777777777
+777777777777777777777777809200a077a00000297777c82900337777777777777777245e191900
+0000000000087c807777777777777777777777777777777777777777777777777777772b5e005577
+7777777777777777777777777777777777777777777777777777777777777777777777906fe14d4d
+d8b3d95f5f5fe7e7e7a62b777777777777777777ae0c77777777777777d193807777777777777777
+77777777778093cbc877777777777765dea0920a02ca547777777777777777777777777777777777
+77777777777777777777777777770c39775491915477777777ca0c77777777777777777754cdce7c
+29a0a002cb427777777777777777777777777777777777777777777777777777777777775a7c0277
+777777777777777777777777777777777777777777777777777777777777777777777777776df5a9
+885fd2d2d2d28e499677777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+777777777777777777777777777777777777777777777777777777777777777777777777777777e3
+9efdababf8fb71777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+77777777777777777777777777777777777777777777777777777777777777777777777777777777
+777777777777777777777777777777777777777777777777}
+after\par
+}
diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx
index 186af7f..4fae9da 100644
--- a/sw/qa/extras/rtfimport/rtfimport.cxx
+++ b/sw/qa/extras/rtfimport/rtfimport.cxx
@@ -2584,6 +2584,12 @@ DECLARE_RTFIMPORT_TEST(testTdf90097, "tdf90097.rtf")
}
#endif
+DECLARE_RTFIMPORT_TEST(testTdf95707, "tdf95707.rtf")
+{
+ // Graphic was replaced with a "Read-Error" placeholder.
+ CPPUNIT_ASSERT(getProperty<OUString>(getShape(1), "GraphicURL") != "vnd.sun.star.GraphicObject:0000000000000000000000000000000000000000");
+}
+
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
index 9559e8d..01ad171 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
@@ -790,6 +790,24 @@ void RTFDocumentImpl::resolvePict(bool const bInline, uno::Reference<drawing::XS
// No destination text? Then we'll get it later.
return;
+ SvMemoryStream aDIBStream;
+ if (m_aStates.top().aPicture.eStyle == RTFBmpStyle::DIBITMAP)
+ {
+ // Construct a BITMAPFILEHEADER structure before the real data.
+ SvStream& rBodyStream = *pStream;
+ aDIBStream.WriteChar('B');
+ aDIBStream.WriteChar('M');
+ // The size of the real data.
+ aDIBStream.WriteUInt32(rBodyStream.Tell());
+ // Reserved.
+ aDIBStream.WriteUInt32(0);
+ // The offset of the real data, i.e. the size of the header, including this number.
+ aDIBStream.WriteUInt32(14);
+ rBodyStream.Seek(0);
+ aDIBStream.WriteStream(rBodyStream);
+ pStream = &aDIBStream;
+ }
+
// Store, and get its URL.
pStream->Seek(0);
uno::Reference<io::XInputStream> xInputStream(new utl::OInputStreamWrapper(pStream));
@@ -4871,6 +4889,9 @@ RTFError RTFDocumentImpl::dispatchValue(RTFKeyword nKeyword, int nParam)
}
}
break;
+ case RTF_DIBITMAP:
+ m_aStates.top().aPicture.eStyle = RTFBmpStyle::DIBITMAP;
+ break;
default:
{
SAL_INFO("writerfilter", "TODO handle value '" << lcl_RtfToString(nKeyword) << "'");
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
index f3c18ed..434cab5 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
@@ -73,7 +73,8 @@ enum class RTFBmpStyle
{
NONE,
PNG,
- JPEG
+ JPEG,
+ DIBITMAP
};
enum class RTFFieldStatus
diff --git a/writerfilter/source/rtftok/rtftokenizer.cxx b/writerfilter/source/rtftok/rtftokenizer.cxx
index 1af73de..0d4f376 100644
--- a/writerfilter/source/rtftok/rtftokenizer.cxx
+++ b/writerfilter/source/rtftok/rtftokenizer.cxx
@@ -330,8 +330,8 @@ RTFError RTFTokenizer::dispatchKeyword(OString& rKeyword, bool bParam, int nPara
return ret;
break;
case CONTROL_VALUE:
- // values require a parameter by definition
- if (bParam)
+ // Values require a parameter by definition, but Word doesn't respect this for \dibitmap.
+ if (bParam || s_m_aRTFControlWords[i].nIndex == RTF_DIBITMAP)
{
ret = m_rImport.dispatchValue(s_m_aRTFControlWords[i].nIndex, nParam);
if (ret != RTFError::OK)
More information about the Libreoffice-commits
mailing list