summaryrefslogtreecommitdiff
path: root/writerfilter
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2016-05-03 09:35:58 +0200
committerMiklos Vajna <vmiklos@collabora.co.uk>2016-05-03 08:24:26 +0000
commit6bacfc8d95163a3eacc2784660282a8ce7d9a552 (patch)
tree23b86ea8ee5f160d4059814c29e37aca028d518c /writerfilter
parent79acc3da353ad05382db7b59d3be8e40983da4b7 (diff)
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@collabora.co.uk> Tested-by: Jenkins <ci@libreoffice.org>
Diffstat (limited to 'writerfilter')
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.cxx21
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.hxx3
-rw-r--r--writerfilter/source/rtftok/rtftokenizer.cxx4
3 files changed, 25 insertions, 3 deletions
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
index 9559e8d832f0..01ad171601c2 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 f3c18ede656d..434cab5e3941 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 1af73dea6cdd..0d4f376fd961 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)