diff options
author | Armin Le Grand <alg@apache.org> | 2014-02-18 21:18:13 +0000 |
---|---|---|
committer | Armin Le Grand <alg@apache.org> | 2014-02-18 21:18:13 +0000 |
commit | bbe35be767d76d08891c4f3d3600d80e0e6805f2 (patch) | |
tree | 2cce0f3a7ec90b40b9a4a641ce36e3df4953e12f /svx | |
parent | 0a0bcaaec8c80bce3bd83c2e3d3aa1b0001bd91f (diff) |
i123539 some optimizations for 3D chart geometry creation using UNO API
Notes
Notes:
merged as: db1d2af02861b49e4f53d726d59cd71c20cee9b1
Diffstat (limited to 'svx')
-rw-r--r-- | svx/inc/svx/sdr/contact/viewcontactofsdrole2obj.hxx | 7 | ||||
-rw-r--r-- | svx/source/engine3d/scene3d.cxx | 10 | ||||
-rw-r--r-- | svx/source/sdr/contact/viewcontactofsdrole2obj.cxx | 76 | ||||
-rw-r--r-- | svx/source/unodraw/unoshape.cxx | 10 |
4 files changed, 77 insertions, 26 deletions
diff --git a/svx/inc/svx/sdr/contact/viewcontactofsdrole2obj.hxx b/svx/inc/svx/sdr/contact/viewcontactofsdrole2obj.hxx index c6e56507cebe..479f4e62ba5c 100644 --- a/svx/inc/svx/sdr/contact/viewcontactofsdrole2obj.hxx +++ b/svx/inc/svx/sdr/contact/viewcontactofsdrole2obj.hxx @@ -41,6 +41,10 @@ namespace sdr { class ViewContactOfSdrOle2Obj : public ViewContactOfSdrRectObj { + private: + // #123539# allow local buffering of chart data (if chart) + drawinglayer::primitive2d::Primitive2DReference mxChartContent; + protected: // Create a Object-Specific ViewObjectContact, set ViewContact and // ObjectContact. Always needs to return something. @@ -66,6 +70,9 @@ namespace sdr // from the VOC which knows that drawinglayer::primitive2d::Primitive2DSequence createPrimitive2DSequenceWithParameters(bool bHighContrast) const; + // #123539# get rid of buffered chart content (if there) on change + virtual void ActionChanged(); + protected: // This method is responsible for creating the graphical visualisation data // ONLY based on model data, just wraps to call createPrimitive2DSequenceWithParameters(false) diff --git a/svx/source/engine3d/scene3d.cxx b/svx/source/engine3d/scene3d.cxx index 446b407e8a2e..afa492dc4c57 100644 --- a/svx/source/engine3d/scene3d.cxx +++ b/svx/source/engine3d/scene3d.cxx @@ -53,6 +53,7 @@ #include <drawinglayer/geometry/viewinformation3d.hxx> #include <basegfx/polygon/b2dpolypolygontools.hxx> #include <svx/e3dsceneupdater.hxx> +#include <svx/svdmodel.hxx> #define ITEMVALUE(ItemSet,Id,Cast) ((const Cast&)(ItemSet).Get(Id)).GetValue() @@ -455,7 +456,14 @@ void E3dScene::NewObjectInserted(const E3dObject* p3DObj) void E3dScene::StructureChanged() { E3dObject::StructureChanged(); - SetRectsDirty(); + + if(!GetModel() || !GetModel()->isLocked()) + { + // #123539# optimization for 3D chart object generation: do not reset + // already calculated scene projection data every time an object gets + // initialized + SetRectsDirty(); + } // #110988# ImpCleanup3DDepthMapper(); diff --git a/svx/source/sdr/contact/viewcontactofsdrole2obj.cxx b/svx/source/sdr/contact/viewcontactofsdrole2obj.cxx index 202f24106705..495d1680ec32 100644 --- a/svx/source/sdr/contact/viewcontactofsdrole2obj.cxx +++ b/svx/source/sdr/contact/viewcontactofsdrole2obj.cxx @@ -58,7 +58,8 @@ namespace sdr } ViewContactOfSdrOle2Obj::ViewContactOfSdrOle2Obj(SdrOle2Obj& rOle2Obj) - : ViewContactOfSdrRectObj(rOle2Obj) + : ViewContactOfSdrRectObj(rOle2Obj), + mxChartContent() { } @@ -104,30 +105,45 @@ namespace sdr if(GetOle2Obj().IsChart()) { - // try to get chart primitives and chart range directly from xChartModel - basegfx::B2DRange aChartContentRange; - const drawinglayer::primitive2d::Primitive2DSequence aChartSequence( - ChartHelper::tryToGetChartContentAsPrimitive2DSequence( - GetOle2Obj().getXModel(), - aChartContentRange)); - const double fWidth(aChartContentRange.getWidth()); - const double fHeight(aChartContentRange.getHeight()); - - if(aChartSequence.hasElements() - && basegfx::fTools::more(fWidth, 0.0) - && basegfx::fTools::more(fHeight, 0.0)) + // #123539# allow buffering and reuse of local chart data to not need to rebuild it + // on every ViewObjectContact::getPrimitive2DSequence call. TTTT: No tneeded for + // aw080, there this mechanism alraedy works differently + if(mxChartContent.is()) { - // create embedding transformation - basegfx::B2DHomMatrix aEmbed( - basegfx::tools::createTranslateB2DHomMatrix( - -aChartContentRange.getMinX(), - -aChartContentRange.getMinY())); - - aEmbed.scale(1.0 / fWidth, 1.0 / fHeight); - aEmbed = aObjectMatrix * aEmbed; - xContent = new drawinglayer::primitive2d::TransformPrimitive2D( - aEmbed, - aChartSequence); + xContent = mxChartContent; + } + else + { + // try to get chart primitives and chart range directly from xChartModel + basegfx::B2DRange aChartContentRange; + const drawinglayer::primitive2d::Primitive2DSequence aChartSequence( + ChartHelper::tryToGetChartContentAsPrimitive2DSequence( + GetOle2Obj().getXModel(), + aChartContentRange)); + const double fWidth(aChartContentRange.getWidth()); + const double fHeight(aChartContentRange.getHeight()); + + if(aChartSequence.hasElements() + && basegfx::fTools::more(fWidth, 0.0) + && basegfx::fTools::more(fHeight, 0.0)) + { + // create embedding transformation + basegfx::B2DHomMatrix aEmbed( + basegfx::tools::createTranslateB2DHomMatrix( + -aChartContentRange.getMinX(), + -aChartContentRange.getMinY())); + + aEmbed.scale(1.0 / fWidth, 1.0 / fHeight); + aEmbed = aObjectMatrix * aEmbed; + xContent = new drawinglayer::primitive2d::TransformPrimitive2D( + aEmbed, + aChartSequence); + } + + if(xContent.is()) + { + const_cast< ViewContactOfSdrOle2Obj* >(this)->mxChartContent = xContent; + } } } @@ -160,6 +176,18 @@ namespace sdr return drawinglayer::primitive2d::Primitive2DSequence(&xReference, 1); } + void ViewContactOfSdrOle2Obj::ActionChanged() + { + // call parent + ViewContactOfSdrRectObj::ActionChanged(); + + // #123539# if we have buffered chart data, reset it + if(mxChartContent.is()) + { + mxChartContent.clear(); + } + } + drawinglayer::primitive2d::Primitive2DSequence ViewContactOfSdrOle2Obj::createViewIndependentPrimitive2DSequence() const { // do as if no HC and call standard creator diff --git a/svx/source/unodraw/unoshape.cxx b/svx/source/unodraw/unoshape.cxx index 6ffa6e4f5cf2..c8d54ba50209 100644 --- a/svx/source/unodraw/unoshape.cxx +++ b/svx/source/unodraw/unoshape.cxx @@ -1313,7 +1313,15 @@ void SAL_CALL SvxShape::setSize( const awt::Size& rSize ) if( mpObj.is() && mpModel) { - Rectangle aRect( svx_getLogicRectHack(mpObj.get()) ); + // #123539# optimization for 3D chart object generation: do not use UNO + // API commmands to get the range, this is too expensive since for 3D + // scenes it may recalculate the whole scene since in AOO this depends + // on the contained geometry (layouted to show all content) + const bool b3DConstruction(dynamic_cast< E3dObject* >(mpObj.get()) && mpModel->isLocked()); + Rectangle aRect( + b3DConstruction ? + Rectangle(maPosition.X, maPosition.Y, maSize.Width, maSize.Height) : + svx_getLogicRectHack(mpObj.get()) ); Size aLocalSize( rSize.Width, rSize.Height ); ForceMetricToItemPoolMetric(aLocalSize); |