diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2016-05-03 09:35:58 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2016-05-03 08:24:26 +0000 |
commit | 6bacfc8d95163a3eacc2784660282a8ce7d9a552 (patch) | |
tree | 23b86ea8ee5f160d4059814c29e37aca028d518c /writerfilter | |
parent | 79acc3da353ad05382db7b59d3be8e40983da4b7 (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.cxx | 21 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfdocumentimpl.hxx | 3 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtftokenizer.cxx | 4 |
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) |