[Libreoffice-commits] core.git: Branch 'private/moggi/chart-lifetime-fixes' - 2 commits - chart2/source include/svx include/vcl svx/source

Markus Mohrhard markus.mohrhard at collabora.co.uk
Mon Apr 14 15:30:34 PDT 2014


 chart2/source/view/inc/AbstractShapeFactory.hxx |    4 +-
 chart2/source/view/inc/OpenglShapeFactory.hxx   |    4 +-
 chart2/source/view/inc/ShapeFactory.hxx         |    4 +-
 chart2/source/view/main/ChartView.cxx           |    4 +-
 chart2/source/view/main/OpenglShapeFactory.cxx  |   48 ++++++++++++++++++------
 include/svx/svdoopengl.hxx                      |    4 +-
 include/vcl/IOpenGLRenderer.hxx                 |   28 +++++++++++++-
 include/vcl/OpenGLContext.hxx                   |    5 ++
 svx/source/svdraw/svdoopengl.cxx                |    6 +++
 9 files changed, 85 insertions(+), 22 deletions(-)

New commits:
commit e1192ce1617f81706c6e20bc57e8ffbed00e896e
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date:   Tue Apr 15 00:27:25 2014 +0200

    only render through OpenGL after successful context creation
    
    Change-Id: I60ebceee2bf0eca1c7022e14fc43128347d682b5

diff --git a/chart2/source/view/inc/AbstractShapeFactory.hxx b/chart2/source/view/inc/AbstractShapeFactory.hxx
index 525220a..833380c 100644
--- a/chart2/source/view/inc/AbstractShapeFactory.hxx
+++ b/chart2/source/view/inc/AbstractShapeFactory.hxx
@@ -239,9 +239,9 @@ public:
     /**
      * Only necessary for stateless implementations
      */
-    virtual void render(com::sun::star::uno::Reference< com::sun::star::drawing::XShapes > xRootShape) = 0;
+    virtual void render(com::sun::star::uno::Reference< com::sun::star::drawing::XDrawPage > xDrawPage) = 0;
 
-    virtual void clearPage(com::sun::star::uno::Reference< com::sun::star::drawing::XShapes > xRootShape) = 0;
+    virtual void clearPage(com::sun::star::uno::Reference< com::sun::star::drawing::XDrawPage > xDrawPage) = 0;
 
     static ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >
          getChartRootShape( const ::com::sun::star::uno::Reference<
diff --git a/chart2/source/view/inc/OpenglShapeFactory.hxx b/chart2/source/view/inc/OpenglShapeFactory.hxx
index e9b2614..c93199f 100644
--- a/chart2/source/view/inc/OpenglShapeFactory.hxx
+++ b/chart2/source/view/inc/OpenglShapeFactory.hxx
@@ -184,9 +184,9 @@ public:
 
     virtual void setPageSize( com::sun::star::uno::Reference < com::sun::star::drawing::XShapes > xChartShapes, const com::sun::star::awt::Size& rSize ) SAL_OVERRIDE;
 
-    virtual void render(com::sun::star::uno::Reference< com::sun::star::drawing::XShapes > xRootShape) SAL_OVERRIDE;
+    virtual void render(com::sun::star::uno::Reference< com::sun::star::drawing::XDrawPage > xDrawPage) SAL_OVERRIDE;
 
-    virtual void clearPage(com::sun::star::uno::Reference< com::sun::star::drawing::XShapes > xRootShape) SAL_OVERRIDE;
+    virtual void clearPage(com::sun::star::uno::Reference< com::sun::star::drawing::XDrawPage > xDrawPage) SAL_OVERRIDE;
 };
 
 }
diff --git a/chart2/source/view/inc/ShapeFactory.hxx b/chart2/source/view/inc/ShapeFactory.hxx
index 74a4d38..87a4387 100644
--- a/chart2/source/view/inc/ShapeFactory.hxx
+++ b/chart2/source/view/inc/ShapeFactory.hxx
@@ -197,9 +197,9 @@ public:
     /**
      * not necessary right now
      */
-    virtual void render(com::sun::star::uno::Reference< com::sun::star::drawing::XShapes > ) SAL_OVERRIDE {}
+    virtual void render(com::sun::star::uno::Reference< com::sun::star::drawing::XDrawPage > ) SAL_OVERRIDE {}
 
-    virtual void clearPage(com::sun::star::uno::Reference< com::sun::star::drawing::XShapes > ) SAL_OVERRIDE {}
+    virtual void clearPage(com::sun::star::uno::Reference< com::sun::star::drawing::XDrawPage > ) SAL_OVERRIDE {}
 
 private:
     ShapeFactory();
diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx
index cd60243..37f3481 100644
--- a/chart2/source/view/main/ChartView.cxx
+++ b/chart2/source/view/main/ChartView.cxx
@@ -2476,7 +2476,7 @@ void ChartView::createShapes()
         OSL_FAIL("could not set page size correctly");
     }
     pShapeFactory->setPageSize(mxRootShape, aPageSize);
-    pShapeFactory->clearPage(mxRootShape);
+    pShapeFactory->clearPage(m_xDrawPage);
 
     if(isReal3DChart())
     {
@@ -2629,7 +2629,7 @@ void ChartView::createShapes()
         //cleanup: remove all empty group shapes to avoid grey border lines:
         lcl_removeEmptyGroupShapes( mxRootShape );
 
-        pShapeFactory->render( mxRootShape );
+        pShapeFactory->render( m_xDrawPage );
 
         if(maTimeBased.bTimeBased && maTimeBased.nFrame % 60 == 0)
         {
diff --git a/chart2/source/view/main/OpenglShapeFactory.cxx b/chart2/source/view/main/OpenglShapeFactory.cxx
index 75992c0..34c2ea6 100644
--- a/chart2/source/view/main/OpenglShapeFactory.cxx
+++ b/chart2/source/view/main/OpenglShapeFactory.cxx
@@ -71,7 +71,6 @@ public:
         mxShapes(xShapes) {}
 
     virtual ~OpenGLChartAdapter() {}
-    virtual void operator()() {}
 
     uno::Reference<drawing::XShapes> getShapes()
     {
@@ -483,15 +482,34 @@ uno::Reference< drawing::XShape >
     return pText;
 }
 
-void OpenglShapeFactory::render(uno::Reference< drawing::XShapes > xRootShape)
+void OpenglShapeFactory::render(uno::Reference< drawing::XDrawPage > xDrawPage)
 {
+    IOpenGLRenderer* pRenderer = getRenderer(xDrawPage);
+    if(!pRenderer)
+        return;
+
+    if(!pRenderer->isOpenGLInitialized())
+        return;
+
+    OpenGLChartAdapter* pAdapter = dynamic_cast<OpenGLChartAdapter*>(pRenderer);
+    if(!pAdapter)
+        return;
+
+    uno::Reference< drawing::XShapes > xRootShape = pAdapter->getShapes();
     dummy::DummyChart* pChart = dynamic_cast<dummy::DummyChart*>(xRootShape.get());
     assert(pChart);
     pChart->render();
 }
 
-void OpenglShapeFactory::clearPage(uno::Reference< drawing::XShapes > xRootShape)
+void OpenglShapeFactory::clearPage(uno::Reference< drawing::XDrawPage > xDrawPage)
 {
+    IOpenGLRenderer* pRenderer = getRenderer(xDrawPage);
+
+    OpenGLChartAdapter* pAdapter = dynamic_cast<OpenGLChartAdapter*>(pRenderer);
+    if(!pAdapter)
+        return;
+
+    uno::Reference< drawing::XShapes > xRootShape = pAdapter->getShapes();
     dummy::DummyChart* pChart = dynamic_cast<dummy::DummyChart*>(xRootShape.get());
     assert(pChart);
     pChart->clear();
diff --git a/include/svx/svdoopengl.hxx b/include/svx/svdoopengl.hxx
index 7760b82..a8e7a42 100644
--- a/include/svx/svdoopengl.hxx
+++ b/include/svx/svdoopengl.hxx
@@ -23,7 +23,7 @@ namespace sdr { namespace contact {
 
 class IOpenGLRenderer;
 
-class SVX_DLLPUBLIC SdrOpenGLObj : public SdrObject
+class SVX_DLLPUBLIC SdrOpenGLObj : public SdrObject, public IOpenGLInfoProvider
 {
 public:
     virtual ~SdrOpenGLObj();
@@ -36,6 +36,8 @@ public:
     void setRenderer(IOpenGLRenderer* pRenderer);
     IOpenGLRenderer* getRenderer();
 
+    virtual bool isOpenGLInitialized();
+
 private:
 
     OpenGLContext maContext;
diff --git a/include/vcl/IOpenGLRenderer.hxx b/include/vcl/IOpenGLRenderer.hxx
index 3efb2c5..b5b723b 100644
--- a/include/vcl/IOpenGLRenderer.hxx
+++ b/include/vcl/IOpenGLRenderer.hxx
@@ -10,12 +10,36 @@
 #ifndef VCL_IOPENGLRENDER_HXX
 #define VCL_IOPENGLRENDER_HXX
 
+class IOpenGLInfoProvider
+{
+public:
+    virtual ~IOpenGLInfoProvider() {}
+
+    virtual bool isOpenGLInitialized() = 0;
+};
+
 class IOpenGLRenderer
 {
 public:
-    virtual ~IOpenGLRenderer() {};
-    virtual void operator()() = 0;
+    IOpenGLRenderer():
+        mpInfoProvider(NULL) {}
+    virtual ~IOpenGLRenderer() {}
+
+    bool isOpenGLInitialized()
+    {
+        if(mpInfoProvider)
+            return mpInfoProvider->isOpenGLInitialized();
+
+        return false;
+    }
+
+    void setInfoProvider(IOpenGLInfoProvider* pInfo)
+    {
+        mpInfoProvider = pInfo;
+    }
 
+private:
+    IOpenGLInfoProvider* mpInfoProvider;
 };
 
 #endif
diff --git a/include/vcl/OpenGLContext.hxx b/include/vcl/OpenGLContext.hxx
index 220efb5..56d6a56 100644
--- a/include/vcl/OpenGLContext.hxx
+++ b/include/vcl/OpenGLContext.hxx
@@ -152,6 +152,11 @@ public:
 
     void renderToFile();
 
+    bool isInitialized()
+    {
+        return mbInitialized;
+    }
+
 private:
     SAL_DLLPRIVATE bool initWindow();
 
diff --git a/svx/source/svdraw/svdoopengl.cxx b/svx/source/svdraw/svdoopengl.cxx
index df2f07b..ce11c0d 100644
--- a/svx/source/svdraw/svdoopengl.cxx
+++ b/svx/source/svdraw/svdoopengl.cxx
@@ -38,6 +38,7 @@ void SdrOpenGLObj::NbcResize(const Point& rRef, const Fraction& xFact, const Fra
 void SdrOpenGLObj::setRenderer(IOpenGLRenderer* pRenderer)
 {
     mpRenderer.reset(pRenderer);
+    mpRenderer->setInfoProvider(this);
 }
 
 IOpenGLRenderer* SdrOpenGLObj::getRenderer()
@@ -45,4 +46,9 @@ IOpenGLRenderer* SdrOpenGLObj::getRenderer()
     return mpRenderer.get();
 }
 
+bool SdrOpenGLObj::isOpenGLInitialized()
+{
+    return maContext.isInitialized();
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit cef11da2df62e04aefc646880e3b8d81ef98473e
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date:   Mon Apr 14 23:51:13 2014 +0200

    extract method
    
    Change-Id: I95aacfa9dacd42936ca648ed42b55aa9ec50ebde

diff --git a/chart2/source/view/main/OpenglShapeFactory.cxx b/chart2/source/view/main/OpenglShapeFactory.cxx
index 56b8d28..75992c0 100644
--- a/chart2/source/view/main/OpenglShapeFactory.cxx
+++ b/chart2/source/view/main/OpenglShapeFactory.cxx
@@ -94,10 +94,8 @@ namespace opengl {
 
 namespace {
 
-uno::Reference< drawing::XShapes > getChartShape(
-    const uno::Reference< drawing::XDrawPage>& xDrawPage )
+IOpenGLRenderer* getRenderer(const uno::Reference< drawing::XDrawPage>& xDrawPage )
 {
-    uno::Reference< drawing::XShapes > xRet;
     uno::Reference< drawing::XShapes > xShapes( xDrawPage, uno::UNO_QUERY );
     if( xShapes.is() )
     {
@@ -114,15 +112,25 @@ uno::Reference< drawing::XShapes > getChartShape(
                 if( aRet.equals("com.sun.star.chart2.shapes") )
                 {
                     IOpenGLRenderer* pRenderer = dynamic_cast<SvxOpenGLObject*>(xShape.get())->getRenderer();
-                    OpenGLChartAdapter* pAdapter = dynamic_cast<OpenGLChartAdapter*>(pRenderer);
-                    if(pAdapter)
-                        xRet = pAdapter->getShapes();
-                    break;
+                    if(pRenderer)
+                        return pRenderer;
                 }
             }
         }
     }
-    return xRet;
+
+    return NULL;
+}
+
+uno::Reference< drawing::XShapes > getChartShape(
+    const uno::Reference< drawing::XDrawPage>& xDrawPage )
+{
+    IOpenGLRenderer* pRenderer = getRenderer(xDrawPage);
+    OpenGLChartAdapter* pAdapter = dynamic_cast<OpenGLChartAdapter*>(pRenderer);
+    if(pAdapter)
+        return pAdapter->getShapes();
+
+    return uno::Reference< drawing::XShapes> ();
 }
 
 }


More information about the Libreoffice-commits mailing list