diff options
-rw-r--r-- | emfio/inc/wmfreader.hxx | 5 | ||||
-rw-r--r-- | emfio/source/emfuno/xemfparser.cxx | 5 | ||||
-rw-r--r-- | emfio/source/reader/emfreader.cxx | 2 | ||||
-rw-r--r-- | emfio/source/reader/wmfreader.cxx | 1 | ||||
-rw-r--r-- | vcl/source/filter/wmf/wmf.cxx | 10 |
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, |