tdf#50613 buffer OLE primitives for charts

If OLE is a chart, buffer the primitives used for presentation as
info at the SwOLEObj, after getting them the first time using the
ChartHelper.

Change-Id: I6d7486185f6eac450de9328d37ea800f424f351b
This commit is contained in:
Armin Le Grand
2016-07-01 14:20:00 +02:00
committed by Thorsten Behrens
parent 30fdc46969
commit 64e1113916
3 changed files with 61 additions and 23 deletions

View File

@@ -41,6 +41,10 @@ class SW_DLLPUBLIC SwOLEObj
svt::EmbeddedObjectRef xOLERef;
OUString aName;
// eventually buffered data if it is a chart OLE
drawinglayer::primitive2d::Primitive2DContainer m_aPrimitive2DSequence;
basegfx::B2DRange m_aRange;
SwOLEObj( const SwOLEObj& rObj ) = delete;
void SetNode( SwOLENode* pNode );
@@ -62,6 +66,11 @@ public:
const OUString& GetCurrentPersistName() const { return aName; }
OUString GetStyleString();
bool IsOleRef() const; ///< To avoid unnecessary loading of object.
// try to get OLE visualization in form of a Primitive2DSequence
// and the corresponding B2DRange. This data may be locally buffered
drawinglayer::primitive2d::Primitive2DContainer tryToGetChartContentAsPrimitive2DSequence(basegfx::B2DRange& rRange);
void resetBufferedData();
};
// SwOLENode

View File

@@ -69,7 +69,6 @@
#include <com/sun/star/embed/EmbedMisc.hpp>
#include <com/sun/star/embed/EmbedStates.hpp>
#include <svtools/embedhlp.hxx>
#include <svx/charthelper.hxx>
#include <dview.hxx>
#include <basegfx/matrix/b2dhommatrix.hxx>
#include <drawinglayer/processor2d/baseprocessor2d.hxx>
@@ -999,29 +998,22 @@ void SwNoTextFrame::PaintPicture( vcl::RenderContext* pOut, const SwRect &rGrfAr
if(bIsChart)
{
const uno::Reference< frame::XModel > aXModel(pOLENd->GetOLEObj().GetOleRef()->getComponent(), uno::UNO_QUERY);
basegfx::B2DRange aSourceRange;
const drawinglayer::primitive2d::Primitive2DContainer aSequence(
pOLENd->GetOLEObj().tryToGetChartContentAsPrimitive2DSequence(
aSourceRange));
if(aXModel.is())
if(!aSequence.empty() && !aSourceRange.isEmpty())
{
basegfx::B2DRange aSourceRange;
const basegfx::B2DRange aTargetRange(
aAlignedGrfArea.Left(), aAlignedGrfArea.Top(),
aAlignedGrfArea.Right(), aAlignedGrfArea.Bottom());
const drawinglayer::primitive2d::Primitive2DContainer aSequence(
ChartHelper::tryToGetChartContentAsPrimitive2DSequence(
aXModel,
aSourceRange));
if(!aSequence.empty() && !aSourceRange.isEmpty())
{
const basegfx::B2DRange aTargetRange(
aAlignedGrfArea.Left(), aAlignedGrfArea.Top(),
aAlignedGrfArea.Right(), aAlignedGrfArea.Bottom());
bDone = paintUsingPrimitivesHelper(
*pOut,
aSequence,
aSourceRange,
aTargetRange);
}
bDone = paintUsingPrimitivesHelper(
*pOut,
aSequence,
aSourceRange,
aTargetRange);
}
}

View File

@@ -56,6 +56,7 @@
#include <unotools/ucbstreamhelper.hxx>
#include <vcl/graphicfilter.hxx>
#include <comcore.hrc>
#include <svx/charthelper.hxx>
#include <deque>
@@ -124,6 +125,10 @@ void SAL_CALL SwOLEListener_Impl::stateChanged( const lang::EventObject&, ::sal_
if (g_pOLELRU_Cache)
g_pOLELRU_Cache->RemoveObj( *mpObj );
}
else if(mpObj && nNewState == embed::EmbedStates::RUNNING)
{
mpObj->resetBufferedData();
}
}
void SwOLEListener_Impl::Release()
@@ -640,7 +645,9 @@ bool SwOLENode::IsChart() const
SwOLEObj::SwOLEObj( const svt::EmbeddedObjectRef& xObj ) :
pOLENd( nullptr ),
pListener( nullptr ),
xOLERef( xObj )
xOLERef( xObj ),
m_aPrimitive2DSequence(),
m_aRange()
{
xOLERef.Lock();
if ( xObj.is() )
@@ -654,7 +661,9 @@ SwOLEObj::SwOLEObj( const svt::EmbeddedObjectRef& xObj ) :
SwOLEObj::SwOLEObj( const OUString &rString, sal_Int64 nAspect ) :
pOLENd( nullptr ),
pListener( nullptr ),
aName( rString )
aName( rString ),
m_aPrimitive2DSequence(),
m_aRange()
{
xOLERef.Lock();
xOLERef.SetViewAspect( nAspect );
@@ -899,6 +908,34 @@ OUString SwOLEObj::GetDescription()
return SW_RESSTR(STR_OLE);
}
drawinglayer::primitive2d::Primitive2DContainer SwOLEObj::tryToGetChartContentAsPrimitive2DSequence(basegfx::B2DRange& rRange)
{
if(m_aPrimitive2DSequence.empty() && m_aRange.isEmpty() && xOLERef.is() && xOLERef.IsChart())
{
const uno::Reference< frame::XModel > aXModel(xOLERef->getComponent(), uno::UNO_QUERY);
if(aXModel.is())
{
m_aPrimitive2DSequence = ChartHelper::tryToGetChartContentAsPrimitive2DSequence(
aXModel,
m_aRange);
}
}
if(!m_aPrimitive2DSequence.empty() && !m_aRange.isEmpty())
{
rRange = m_aRange;
}
return m_aPrimitive2DSequence;
}
void SwOLEObj::resetBufferedData()
{
m_aPrimitive2DSequence = drawinglayer::primitive2d::Primitive2DContainer();
m_aRange.reset();
}
SwOLELRUCache::SwOLELRUCache()
: utl::ConfigItem(OUString("Office.Common/Cache"))
, m_nLRU_InitSize( 20 )