summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--filter/source/msfilter/msdffimp.cxx8
-rw-r--r--include/vcl/graphicfilter.hxx2
-rw-r--r--sw/qa/extras/ww8import/ww8import.cxx6
-rw-r--r--vcl/inc/impgraph.hxx2
-rw-r--r--vcl/source/filter/graphicfilter.cxx5
-rw-r--r--vcl/source/gdi/impgraph.cxx42
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;