[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