summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuboš Luňák <l.lunak@collabora.com>2021-06-11 15:48:32 +0200
committerMiklos Vajna <vmiklos@collabora.com>2021-06-15 17:55:00 +0200
commite47ab1464692c5130e19db5a027d694ea5b8c12a (patch)
tree27dfcab9c12d11e028b6e0db5926da180bfbed9c
parent7a5717cb8ad4c6b30d46ad86326fa4274bd84f12 (diff)
drop EMF+ also when converting WMF, not just EMF
A WMF may have EMF with EMF+ actions embedded. When we read that, we drop drawing non-EMF+ actions if we use EMF+. But EMF+ actions are stored as MetaCommentAction in the metafile, and WMF writer (unlike EMF) writer simply ignores comments. So when writing WMF, make sure to read non-EMF actions so that something is written. This is an extension of 295626a0bd39540544b774094a63df23e5376839. Change-Id: I37355f694fe656b661abe54274ea203934e68151 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117062 Tested-by: Jenkins Reviewed-by: Luboš Luňák <l.lunak@collabora.com> (cherry picked from commit b342a445cd8b115e76d261860088b012b74c0b0e)
-rw-r--r--emfio/inc/wmfreader.hxx5
-rw-r--r--emfio/source/emfuno/xemfparser.cxx5
-rw-r--r--emfio/source/reader/emfreader.cxx2
-rw-r--r--emfio/source/reader/wmfreader.cxx1
-rw-r--r--vcl/source/filter/wmf/wmf.cxx10
5 files changed, 17 insertions, 6 deletions
diff --git a/emfio/inc/wmfreader.hxx b/emfio/inc/wmfreader.hxx
index 9e1059d63760..85b7c9f0b604 100644
--- a/emfio/inc/wmfreader.hxx
+++ b/emfio/inc/wmfreader.hxx
@@ -51,6 +51,8 @@ namespace emfio
// eventually handed over external header
const WmfExternal* mpExternalHeader;
+ bool mbEnableEMFPlus = true;
+
// reads header of the WMF-Datei
bool ReadHeader();
@@ -68,6 +70,9 @@ namespace emfio
// read WMF file from stream and fill the GDIMetaFile
void ReadWMF();
+
+ // Allows disabling EMF+ if EMF is embedded in this WMF.
+ void SetEnableEMFPlus(bool bEnableEMFPlus) { mbEnableEMFPlus = bEnableEMFPlus; }
};
}
diff --git a/emfio/source/emfuno/xemfparser.cxx b/emfio/source/emfuno/xemfparser.cxx
index 0fd49da1c097..dd5277a7941c 100644
--- a/emfio/source/emfuno/xemfparser.cxx
+++ b/emfio/source/emfuno/xemfparser.cxx
@@ -151,7 +151,10 @@ namespace emfio::emfreader
}
else
{
- emfio::WmfReader(*pStream, aMtf, bExternalHeaderUsed ? &aExternalHeader : nullptr).ReadWMF();
+ emfio::WmfReader aReader(*pStream, aMtf, bExternalHeaderUsed ? &aExternalHeader : nullptr);
+ if (!bEnableEMFPlus)
+ aReader.SetEnableEMFPlus(bEnableEMFPlus);
+ aReader.ReadWMF();
// Need to check for ErrCode at stream to not lose former work.
// This may contain important information and will behave the
diff --git a/emfio/source/reader/emfreader.cxx b/emfio/source/reader/emfreader.cxx
index 56349bf0774c..c32ee1e84041 100644
--- a/emfio/source/reader/emfreader.cxx
+++ b/emfio/source/reader/emfreader.cxx
@@ -735,7 +735,7 @@ namespace emfio
bEnableEMFPlus = mbEnableEMFPlus;
}
- SAL_INFO("emfio", "EMF_PLUS_DISABLE is " << (bEnableEMFPlus ? "enabled" : "disabled"));
+ SAL_INFO("emfio", "EMF+ reading is " << (bEnableEMFPlus ? "enabled" : "disabled"));
while( bStatus && mnRecordCount-- && mpInputStream->good())
{
diff --git a/emfio/source/reader/wmfreader.cxx b/emfio/source/reader/wmfreader.cxx
index aa1c2be7a00e..1a505ae46a3f 100644
--- a/emfio/source/reader/wmfreader.cxx
+++ b/emfio/source/reader/wmfreader.cxx
@@ -1443,6 +1443,7 @@ namespace emfio
GDIMetaFile aMeta;
mpEMFStream->Seek( 0 );
std::unique_ptr<EmfReader> pEMFReader(std::make_unique<EmfReader>( *mpEMFStream, aMeta ));
+ pEMFReader->SetEnableEMFPlus(mbEnableEMFPlus);
bEMFAvailable = pEMFReader->ReadEnhWMF();
pEMFReader.reset(); // destroy first!!!
diff --git a/vcl/source/filter/wmf/wmf.cxx b/vcl/source/filter/wmf/wmf.cxx
index 8a04bc1d3025..17e7634bd756 100644
--- a/vcl/source/filter/wmf/wmf.cxx
+++ b/vcl/source/filter/wmf/wmf.cxx
@@ -90,14 +90,16 @@ bool ConvertGraphicToWMF(const Graphic& rGraphic, SvStream& rTargetStream,
FilterConfigItem const* pConfigItem, bool bPlaceable)
{
GfxLink aLink = rGraphic.GetGfxLink();
- if (aLink.IsEMF() && aLink.GetData() && aLink.GetDataSize())
+ if (aLink.GetType() == GfxLinkType::NativeWmf && aLink.GetData() && aLink.GetDataSize())
{
- // This may be an EMF+ file, converting that to WMF is better done by re-parsing EMF+ as EMF
- // and converting that to WMF.
+ // This may be an EMF+ file or WMF file with EMF+ embedded. In EmfReader::ReadEnhWMF()
+ // we normally drop non-EMF commands when reading EMF+, so converting that to WMF
+ // is better done by re-parsing with EMF+ disabled.
uno::Sequence<sal_Int8> aData(reinterpret_cast<const sal_Int8*>(aLink.GetData()),
aLink.GetDataSize());
auto aVectorGraphicData
- = std::make_shared<VectorGraphicData>(aData, OUString(), VectorGraphicDataType::Emf);
+ = std::make_shared<VectorGraphicData>(aData, OUString(),
+ aLink.IsEMF() ? VectorGraphicDataType::Emf : VectorGraphicDataType::Wmf);
aVectorGraphicData->setEnableEMFPlus(false);
Graphic aGraphic(aVectorGraphicData);
bool bRet = ConvertGDIMetaFileToWMF(aGraphic.GetGDIMetaFile(), rTargetStream, pConfigItem,