svx: make SdrGrafObj::mpReplacementGraphic swappable

These GraphicObjects clog up the GraphicManager cache so it's
effectively useless.

Round-tripping the ML bugdoc, this doesn't provide much of a
speed-up by itself, but together with the previous fix it goes from
3:00 to 1:30 (in an optimized build).

Change-Id: If52e176c790b94ffef9984be53376a34345b06e3
This commit is contained in:
Michael Stahl 2017-07-12 15:14:48 +02:00
parent b3992ddcd1
commit c96e3e226f
2 changed files with 31 additions and 0 deletions

View File

@ -112,6 +112,7 @@ private:
bool ImpUpdateGraphicLink( bool bAsynchron = true ) const;
void ImpSetLinkedGraphic( const Graphic& rGraphic );
DECL_LINK( ImpSwapHdl, const GraphicObject*, SvStream* );
DECL_LINK( ReplacementSwapHdl, const GraphicObject*, SvStream* );
void onGraphicChanged();
GDIMetaFile GetMetaFile(GraphicType &rGraphicType) const;

View File

@ -439,8 +439,15 @@ const GraphicObject* SdrGrafObj::GetReplacementGraphicObject() const
const_cast< SdrGrafObj* >(this)->mpReplacementGraphic = new GraphicObject(rSvgDataPtr->getReplacement());
}
else if (pGraphic->GetGraphic().getPdfData().hasElements())
{
// Replacement graphic for bitmap + PDF is just the bitmap.
const_cast<SdrGrafObj*>(this)->mpReplacementGraphic = new GraphicObject(pGraphic->GetGraphic().GetBitmapEx());
}
if (mpReplacementGraphic)
{
mpReplacementGraphic->SetSwapStreamHdl(
LINK(const_cast<SdrGrafObj*>(this), SdrGrafObj, ReplacementSwapHdl));
}
}
return mpReplacementGraphic;
@ -1279,6 +1286,29 @@ void SdrGrafObj::AdjustToMaxRect( const tools::Rectangle& rMaxRect, bool bShrink
}
}
IMPL_LINK(SdrGrafObj, ReplacementSwapHdl, const GraphicObject*, pO, SvStream*)
{
// replacement image is always swapped
if (pO->IsInSwapOut())
{
SdrSwapGraphicsMode const nSwapMode(pModel->GetSwapGraphicsMode());
if (nSwapMode & SdrSwapGraphicsMode::TEMP)
{
return GRFMGR_AUTOSWAPSTREAM_TEMP;
}
}
else if (pO->IsInSwapIn())
{
return GRFMGR_AUTOSWAPSTREAM_TEMP;
}
else
{
assert(!"why is swap handler being called?");
}
return GRFMGR_AUTOSWAPSTREAM_NONE;
}
IMPL_LINK( SdrGrafObj, ImpSwapHdl, const GraphicObject*, pO, SvStream* )
{
SvStream* pRet = GRFMGR_AUTOSWAPSTREAM_NONE;