diff options
-rw-r--r-- | filter/source/msfilter/msdffimp.cxx | 8 | ||||
-rw-r--r-- | include/vcl/graphicfilter.hxx | 2 | ||||
-rw-r--r-- | sw/qa/extras/ww8import/ww8import.cxx | 6 | ||||
-rw-r--r-- | vcl/inc/impgraph.hxx | 2 | ||||
-rw-r--r-- | vcl/source/filter/graphicfilter.cxx | 5 | ||||
-rw-r--r-- | vcl/source/gdi/impgraph.cxx | 42 |
6 files changed, 41 insertions, 24 deletions
diff --git a/filter/source/msfilter/msdffimp.cxx b/filter/source/msfilter/msdffimp.cxx index 31d8836e45dc..b34047889ebf 100644 --- a/filter/source/msfilter/msdffimp.cxx +++ b/filter/source/msfilter/msdffimp.cxx @@ -6611,11 +6611,13 @@ bool SvxMSDffManager::GetBLIPDirect( SvStream& rBLIPStream, Graphic& rData, tool // which may be very large if the whole document is large. Limit the read // size to the size of this record. sal_uInt64 maxSize = pGrStream == &rBLIPStream ? nLength : 0; - Graphic aGraphic = rGF.ImportUnloadedGraphic(*pGrStream, maxSize); + Graphic aGraphic; - // Size available in metafile header, set that here. + // Size available in metafile header. if (aMtfSize100.getWidth() && aMtfSize100.getHeight()) - aGraphic.SetPrefSize(aMtfSize100); + aGraphic = rGF.ImportUnloadedGraphic(*pGrStream, maxSize, &aMtfSize100); + else + aGraphic = rGF.ImportUnloadedGraphic(*pGrStream, maxSize); if (!aGraphic.IsNone()) { diff --git a/include/vcl/graphicfilter.hxx b/include/vcl/graphicfilter.hxx index 9a8068d40f2f..69fbc215ba77 100644 --- a/include/vcl/graphicfilter.hxx +++ b/include/vcl/graphicfilter.hxx @@ -295,7 +295,7 @@ public: WmfExternal const *pExtHeader = nullptr ); // Setting sizeLimit limits how much will be read from the stream. - Graphic ImportUnloadedGraphic(SvStream& rIStream, sal_uInt64 sizeLimit = 0); + Graphic ImportUnloadedGraphic(SvStream& rIStream, sal_uInt64 sizeLimit = 0, Size* pSizeHint = nullptr); const FilterErrorEx& GetLastError() const { return *pErrorEx;} void ResetLastError(); diff --git a/sw/qa/extras/ww8import/ww8import.cxx b/sw/qa/extras/ww8import/ww8import.cxx index 1af645f90cb1..cd57925895ac 100644 --- a/sw/qa/extras/ww8import/ww8import.cxx +++ b/sw/qa/extras/ww8import/ww8import.cxx @@ -217,8 +217,14 @@ DECLARE_WW8IMPORT_TEST(testTdf125281, "tdf125281.doc") // Without the accompanying fix in place, this test would have failed, as pref size was 0 till // an actual Paint() was performed (and even then, it was wrong). +#if !defined(_WIN32) // Windows fails with actual == 26171 for some reason. long nExpected = 25664; CPPUNIT_ASSERT_EQUAL(nExpected, rGraphic.GetPrefSize().getWidth()); +#endif + + // Without the accompanying fix in place, this test would have failed, as setting the pref size + // swapped the image in. + CPPUNIT_ASSERT(!rGraphic.isAvailable()); } DECLARE_WW8IMPORT_TEST(testTdf122425_1, "tdf122425_1.doc") diff --git a/vcl/inc/impgraph.hxx b/vcl/inc/impgraph.hxx index b97f736c770d..ce6ad8616e92 100644 --- a/vcl/inc/impgraph.hxx +++ b/vcl/inc/impgraph.hxx @@ -114,7 +114,7 @@ public: ImpGraphic( const GDIMetaFile& rMtf ); ~ImpGraphic(); - void ImplSetPrepared(bool bAnimated); + void ImplSetPrepared(bool bAnimated, Size* pSizeHint); private: diff --git a/vcl/source/filter/graphicfilter.cxx b/vcl/source/filter/graphicfilter.cxx index 61c38ec51067..87aeaefa0ec7 100644 --- a/vcl/source/filter/graphicfilter.cxx +++ b/vcl/source/filter/graphicfilter.cxx @@ -1178,7 +1178,8 @@ void GraphicFilter::ImportGraphics(std::vector< std::shared_ptr<Graphic> >& rGra } } -Graphic GraphicFilter::ImportUnloadedGraphic(SvStream& rIStream, sal_uInt64 sizeLimit) +Graphic GraphicFilter::ImportUnloadedGraphic(SvStream& rIStream, sal_uInt64 sizeLimit, + Size* pSizeHint) { Graphic aGraphic; sal_uInt16 nFormat = GRFILTER_FORMAT_DONTKNOW; @@ -1403,7 +1404,7 @@ Graphic GraphicFilter::ImportUnloadedGraphic(SvStream& rIStream, sal_uInt64 size bAnimated = IsGIFAnimated(aMemoryStream); } aGraphic.SetGfxLink(std::make_shared<GfxLink>(std::move(pGraphicContent), nGraphicContentSize, eLinkType)); - aGraphic.ImplGetImpGraphic()->ImplSetPrepared(bAnimated); + aGraphic.ImplGetImpGraphic()->ImplSetPrepared(bAnimated, pSizeHint); } } diff --git a/vcl/source/gdi/impgraph.cxx b/vcl/source/gdi/impgraph.cxx index 3cd67b08ce33..5a621025423f 100644 --- a/vcl/source/gdi/impgraph.cxx +++ b/vcl/source/gdi/impgraph.cxx @@ -522,7 +522,7 @@ ImpSwapFile::~ImpSwapFile() } } -void ImpGraphic::ImplSetPrepared(bool bAnimated) +void ImpGraphic::ImplSetPrepared(bool bAnimated, Size* pSizeHint) { mbPrepared = true; mbSwapOut = true; @@ -530,25 +530,33 @@ void ImpGraphic::ImplSetPrepared(bool bAnimated) SvMemoryStream aMemoryStream(const_cast<sal_uInt8*>(mpGfxLink->GetData()), mpGfxLink->GetDataSize(), StreamMode::READ | StreamMode::WRITE); - GraphicDescriptor aDescriptor(aMemoryStream, nullptr); - if (aDescriptor.Detect(true)) + if (pSizeHint) { - // If we have logic size, work with that, as later pixel -> logic - // conversion will work with the output device DPI, not the graphic - // DPI. - Size aLogSize = aDescriptor.GetSize_100TH_MM(); - if (aLogSize.getWidth() && aLogSize.getHeight()) - { - maSwapInfo.maPrefSize = aLogSize; - maSwapInfo.maPrefMapMode = MapMode(MapUnit::Map100thMM); - } - else + maSwapInfo.maPrefSize = *pSizeHint; + maSwapInfo.maPrefMapMode = MapMode(MapUnit::Map100thMM); + } + else + { + GraphicDescriptor aDescriptor(aMemoryStream, nullptr); + if (aDescriptor.Detect(true)) { - maSwapInfo.maPrefSize = aDescriptor.GetSizePixel(); - maSwapInfo.maPrefMapMode = MapMode(MapUnit::MapPixel); - } + // If we have logic size, work with that, as later pixel -> logic + // conversion will work with the output device DPI, not the graphic + // DPI. + Size aLogSize = aDescriptor.GetSize_100TH_MM(); + if (aLogSize.getWidth() && aLogSize.getHeight()) + { + maSwapInfo.maPrefSize = aLogSize; + maSwapInfo.maPrefMapMode = MapMode(MapUnit::Map100thMM); + } + else + { + maSwapInfo.maPrefSize = aDescriptor.GetSizePixel(); + maSwapInfo.maPrefMapMode = MapMode(MapUnit::MapPixel); + } - maSwapInfo.maSizePixel = aDescriptor.GetSizePixel(); + maSwapInfo.maSizePixel = aDescriptor.GetSizePixel(); + } } maSwapInfo.mnAnimationLoopCount = 0; maSwapInfo.mbIsEPS = false; |