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.mohrh...@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.mohrh...@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> (); } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits