chart2/source/view/charttypes/GL3DBarChart.cxx | 30 +++++--- chart2/source/view/inc/GL3DBarChart.hxx | 14 ++- chart2/source/view/inc/GL3DPlotterBase.hxx | 8 +- chart2/source/view/main/ChartView.cxx | 90 ++++++++++++------------- include/vcl/openglwin.hxx | 13 +++ sc/Module_sc.mk | 2 vcl/source/window/openglwin.cxx | 14 +++ 7 files changed, 107 insertions(+), 64 deletions(-)
New commits: commit 15e2c82acb60a2f9916f55a144299f64513fdde0 Author: Markus Mohrhard <markus.mohrh...@collabora.co.uk> Date: Tue May 13 05:28:18 2014 +0200 restore correct repaint after changed value in 3D chart Change-Id: Ied1904a56b8d526288a89fd8df0bed639cd317d0 diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx index c164bd2..35bcb51 100644 --- a/chart2/source/view/charttypes/GL3DBarChart.cxx +++ b/chart2/source/view/charttypes/GL3DBarChart.cxx @@ -25,13 +25,10 @@ namespace chart { GL3DBarChart::GL3DBarChart( const css::uno::Reference<css::chart2::XChartType>& xChartType, - const boost::ptr_vector<VDataSeries>& rDataSeries, - OpenGLWindow& rWindow, ExplicitCategoriesProvider& rCatProvider ) : + OpenGLWindow& rWindow) : mxChartType(xChartType), - maDataSeries(rDataSeries), mpRenderer(new opengl3D::OpenGL3DRenderer()), - mrWindow(rWindow), - mrCatProvider(rCatProvider) + mrWindow(rWindow) { mrWindow.setRenderer(this); mpRenderer->init(); @@ -42,7 +39,8 @@ GL3DBarChart::~GL3DBarChart() mrWindow.setRenderer(NULL); } -void GL3DBarChart::create3DShapes() +void GL3DBarChart::create3DShapes(const boost::ptr_vector<VDataSeries>& rDataSeriesContainer, + ExplicitCategoriesProvider& rCatProvider) { // Each series of data flows from left to right, and multiple series are // stacked vertically along y axis. @@ -68,8 +66,8 @@ void GL3DBarChart::create3DShapes() maShapes.clear(); maShapes.push_back(new opengl3D::Camera(mpRenderer.get())); sal_Int32 nSeriesIndex = 0; - for (boost::ptr_vector<VDataSeries>::const_iterator itr = maDataSeries.begin(), - itrEnd = maDataSeries.end(); itr != itrEnd; ++itr) + for (boost::ptr_vector<VDataSeries>::const_iterator itr = rDataSeriesContainer.begin(), + itrEnd = rDataSeriesContainer.end(); itr != itrEnd; ++itr) { nYPos = nSeriesIndex * (nBarSizeY + nBarDistanceY) + nBarSizeY; @@ -147,7 +145,7 @@ void GL3DBarChart::create3DShapes() pRect->setLineColor(COL_BLUE); // Create category texts along X-axis at the bottom. - uno::Sequence<OUString> aCats = mrCatProvider.getSimpleCategories(); + uno::Sequence<OUString> aCats = rCatProvider.getSimpleCategories(); for (sal_Int32 i = 0; i < aCats.getLength(); ++i) { float nXPos = i * (nBarSizeX + nBarDistanceX); diff --git a/chart2/source/view/inc/GL3DBarChart.hxx b/chart2/source/view/inc/GL3DBarChart.hxx index 7c1fc51..1741b3d 100644 --- a/chart2/source/view/inc/GL3DBarChart.hxx +++ b/chart2/source/view/inc/GL3DBarChart.hxx @@ -34,12 +34,12 @@ class GL3DBarChart : public GL3DPlotterBase, public IRenderer public: GL3DBarChart( const css::uno::Reference<css::chart2::XChartType>& xChartType, - const boost::ptr_vector<VDataSeries>& rDataSeries, OpenGLWindow& rContext, - ExplicitCategoriesProvider& rCatProvider ); + OpenGLWindow& rContext); virtual ~GL3DBarChart(); - virtual void create3DShapes() SAL_OVERRIDE; + virtual void create3DShapes(const boost::ptr_vector<VDataSeries>& rDataSeries, + ExplicitCategoriesProvider& rCatProvider) SAL_OVERRIDE; virtual void render() SAL_OVERRIDE; @@ -49,12 +49,10 @@ public: private: css::uno::Reference<css::chart2::XChartType> mxChartType; - const boost::ptr_vector<VDataSeries>& maDataSeries; boost::ptr_vector<opengl3D::Renderable3DObject> maShapes; boost::scoped_ptr<opengl3D::OpenGL3DRenderer> mpRenderer; OpenGLWindow& mrWindow; - ExplicitCategoriesProvider& mrCatProvider; }; } diff --git a/chart2/source/view/inc/GL3DPlotterBase.hxx b/chart2/source/view/inc/GL3DPlotterBase.hxx index 9c89008..cd69bf2 100644 --- a/chart2/source/view/inc/GL3DPlotterBase.hxx +++ b/chart2/source/view/inc/GL3DPlotterBase.hxx @@ -10,14 +10,20 @@ #ifndef CHART2_GL3DPLOTTERBASE_HXX #define CHART2_GL3DPLOTTERBASE_HXX +#include <boost/ptr_container/ptr_vector.hpp> +#include "VDataSeries.hxx" + namespace chart { +class ExplicitCategoriesProvider; + class GL3DPlotterBase { public: virtual ~GL3DPlotterBase(); - virtual void create3DShapes() = 0; + virtual void create3DShapes(const boost::ptr_vector<VDataSeries>& rDataSeries, + ExplicitCategoriesProvider& rCatProvider) = 0; virtual void render() = 0; }; diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx index 49c3202..6c5d725 100644 --- a/chart2/source/view/main/ChartView.cxx +++ b/chart2/source/view/main/ChartView.cxx @@ -3115,65 +3115,67 @@ IMPL_LINK_NOARG(ChartView, UpdateTimeBased) void ChartView::createShapes3D() { - if (!m_pGL3DPlotter) - { - uno::Reference< XDiagram > xDiagram( mrChartModel.getFirstDiagram() ); - uno::Reference< XCoordinateSystemContainer > xCooSysContainer( xDiagram, uno::UNO_QUERY ); - if( !xCooSysContainer.is()) - return; - - uno::Sequence< uno::Reference< XCoordinateSystem > > aCooSysList( xCooSysContainer->getCoordinateSystems() ); - boost::ptr_vector<VDataSeries> aDataSeries; + OpenGLWindow* pWindow = mrChartModel.getOpenGLWindow(); + if(!pWindow) + return; - if (aCooSysList.getLength() != 1) - // Supporting multiple coordinates in a truly 3D chart (which implies - // it's a Cartesian coordinate system) is a bit of a challenge, if not - // impossible. - return; + uno::Reference< XDiagram > xDiagram( mrChartModel.getFirstDiagram() ); + uno::Reference< XCoordinateSystemContainer > xCooSysContainer( xDiagram, uno::UNO_QUERY ); + if( !xCooSysContainer.is()) + return; - uno::Reference<XCoordinateSystem> xCooSys( aCooSysList[0] ); + uno::Sequence< uno::Reference< XCoordinateSystem > > aCooSysList( xCooSysContainer->getCoordinateSystems() ); - //iterate through all chart types in the current coordinate system - uno::Reference< XChartTypeContainer > xChartTypeContainer( xCooSys, uno::UNO_QUERY ); - OSL_ASSERT( xChartTypeContainer.is()); - if( !xChartTypeContainer.is() ) - return; + if (aCooSysList.getLength() != 1) + // Supporting multiple coordinates in a truly 3D chart (which implies + // it's a Cartesian coordinate system) is a bit of a challenge, if not + // impossible. + return; - uno::Sequence< uno::Reference< XChartType > > aChartTypeList( xChartTypeContainer->getChartTypes() ); - if (aChartTypeList.getLength() != 1) - // Likewise, we can't really support multiple chart types here. - return; + uno::Reference<XCoordinateSystem> xCooSys( aCooSysList[0] ); - uno::Reference< XChartType > xChartType( aChartTypeList[0] ); + //iterate through all chart types in the current coordinate system + uno::Reference< XChartTypeContainer > xChartTypeContainer( xCooSys, uno::UNO_QUERY ); + OSL_ASSERT( xChartTypeContainer.is()); + if( !xChartTypeContainer.is() ) + return; - uno::Reference< XDataSeriesContainer > xDataSeriesContainer( xChartType, uno::UNO_QUERY ); - OSL_ASSERT( xDataSeriesContainer.is()); - if( !xDataSeriesContainer.is() ) - return; + uno::Sequence< uno::Reference< XChartType > > aChartTypeList( xChartTypeContainer->getChartTypes() ); + if (aChartTypeList.getLength() != 1) + // Likewise, we can't really support multiple chart types here. + return; - uno::Sequence< uno::Reference< XDataSeries > > aSeriesList( xDataSeriesContainer->getDataSeries() ); - for( sal_Int32 nS = 0; nS < aSeriesList.getLength(); ++nS ) - { - uno::Reference< XDataSeries > xDataSeries( aSeriesList[nS], uno::UNO_QUERY ); - if(!xDataSeries.is()) - continue; + uno::Reference< XChartType > xChartType( aChartTypeList[0] ); - aDataSeries.push_back(new VDataSeries(xDataSeries)); - } + if (!m_pGL3DPlotter) + { + m_pGL3DPlotter.reset(new GL3DBarChart(xChartType, *pWindow)); + } - OpenGLWindow* pWindow = mrChartModel.getOpenGLWindow(); - if(!pWindow) - return; - boost::scoped_ptr<ExplicitCategoriesProvider> pCatProvider(new ExplicitCategoriesProvider(xCooSys, mrChartModel)); + uno::Reference< XDataSeriesContainer > xDataSeriesContainer( xChartType, uno::UNO_QUERY ); + OSL_ASSERT( xDataSeriesContainer.is()); + if( !xDataSeriesContainer.is() ) + return; - pWindow->Show(); + boost::ptr_vector<VDataSeries> aDataSeries; + uno::Sequence< uno::Reference< XDataSeries > > aSeriesList( xDataSeriesContainer->getDataSeries() ); + for( sal_Int32 nS = 0; nS < aSeriesList.getLength(); ++nS ) + { + uno::Reference< XDataSeries > xDataSeries( aSeriesList[nS], uno::UNO_QUERY ); + if(!xDataSeries.is()) + continue; - m_pGL3DPlotter.reset(new GL3DBarChart(xChartType, aDataSeries, *pWindow, *pCatProvider)); - m_pGL3DPlotter->create3DShapes(); + aDataSeries.push_back(new VDataSeries(xDataSeries)); } + boost::scoped_ptr<ExplicitCategoriesProvider> pCatProvider(new ExplicitCategoriesProvider(xCooSys, mrChartModel)); + + + m_pGL3DPlotter->create3DShapes(aDataSeries, *pCatProvider); + m_pGL3DPlotter->render(); + pWindow->Show(); } } //namespace chart commit 9fbafe9fe867fa727ce38612bd24431afd0100c1 Author: Markus Mohrhard <markus.mohrh...@collabora.co.uk> Date: Tue May 13 05:12:55 2014 +0200 rerender after redrawing of the window Change-Id: Ia967ba08a9bd0499ae5fb0865492783834204963 diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx index a5d4a36..c164bd2 100644 --- a/chart2/source/view/charttypes/GL3DBarChart.cxx +++ b/chart2/source/view/charttypes/GL3DBarChart.cxx @@ -33,10 +33,13 @@ GL3DBarChart::GL3DBarChart( mrWindow(rWindow), mrCatProvider(rCatProvider) { + mrWindow.setRenderer(this); + mpRenderer->init(); } GL3DBarChart::~GL3DBarChart() { + mrWindow.setRenderer(NULL); } void GL3DBarChart::create3DShapes() @@ -166,7 +169,6 @@ void GL3DBarChart::render() { mrWindow.getContext()->makeCurrent(); Size aSize = mrWindow.GetSizePixel(); - mpRenderer->init(); mpRenderer->SetSize(aSize); mrWindow.getContext()->setWinSize(aSize); for(boost::ptr_vector<opengl3D::Renderable3DObject>::iterator itr = maShapes.begin(), @@ -178,6 +180,16 @@ void GL3DBarChart::render() mrWindow.getContext()->swapBuffers(); } +void GL3DBarChart::update() +{ + render(); +} + +void GL3DBarChart::clickedAt(const Point& ) +{ + +} + } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/chart2/source/view/inc/GL3DBarChart.hxx b/chart2/source/view/inc/GL3DBarChart.hxx index 7a1733e..7c1fc51 100644 --- a/chart2/source/view/inc/GL3DBarChart.hxx +++ b/chart2/source/view/inc/GL3DBarChart.hxx @@ -29,7 +29,7 @@ class OpenGL3DRenderer; } -class GL3DBarChart : public GL3DPlotterBase +class GL3DBarChart : public GL3DPlotterBase, public IRenderer { public: GL3DBarChart( @@ -43,6 +43,10 @@ public: virtual void render() SAL_OVERRIDE; + virtual void update() SAL_OVERRIDE; + + virtual void clickedAt(const Point& rPos) SAL_OVERRIDE; + private: css::uno::Reference<css::chart2::XChartType> mxChartType; const boost::ptr_vector<VDataSeries>& maDataSeries; diff --git a/include/vcl/openglwin.hxx b/include/vcl/openglwin.hxx index b766f05..e9b823e 100644 --- a/include/vcl/openglwin.hxx +++ b/include/vcl/openglwin.hxx @@ -18,6 +18,14 @@ class OpenGLContext; class OpenGLWindowImpl; +class VCLOPENGL_DLLPUBLIC IRenderer +{ +public: + virtual ~IRenderer() {} + virtual void update() = 0; + virtual void clickedAt(const Point& rPos) = 0; +}; + // pImpl Pattern to avoid linking against OpenGL libs when using the class without the context class VCLOPENGL_DLLPUBLIC OpenGLWindow : public SystemChildWindow { @@ -26,11 +34,14 @@ public: virtual ~OpenGLWindow(); OpenGLContext* getContext(); - virtual void Paint(const Rectangle&) SAL_OVERRIDE {} + void setRenderer(IRenderer* pRenderer); + + virtual void Paint(const Rectangle&) SAL_OVERRIDE; virtual void MouseButtonDown( const MouseEvent& rMEvt ) SAL_OVERRIDE; private: boost::scoped_ptr<OpenGLWindowImpl> mpImpl; + IRenderer* mpRenderer; }; #endif diff --git a/vcl/source/window/openglwin.cxx b/vcl/source/window/openglwin.cxx index 77ab2d9..c1716b7 100644 --- a/vcl/source/window/openglwin.cxx +++ b/vcl/source/window/openglwin.cxx @@ -32,7 +32,8 @@ OpenGLContext* OpenGLWindowImpl::getContext() OpenGLWindow::OpenGLWindow(Window* pParent): SystemChildWindow(pParent, 0), - mpImpl(new OpenGLWindowImpl(this)) + mpImpl(new OpenGLWindowImpl(this)), + mpRenderer(NULL) { } @@ -45,6 +46,12 @@ OpenGLContext* OpenGLWindow::getContext() return mpImpl->getContext(); } +void OpenGLWindow::Paint(const Rectangle&) +{ + if(mpRenderer) + mpRenderer->update(); +} + void OpenGLWindow::MouseButtonDown( const MouseEvent& rMEvt ) { Point aPoint = rMEvt.GetPosPixel(); @@ -53,4 +60,9 @@ void OpenGLWindow::MouseButtonDown( const MouseEvent& rMEvt ) SAL_WARN("vcl.opengl", aColor.GetColor()); } +void OpenGLWindow::setRenderer(IRenderer* pRenderer) +{ + mpRenderer = pRenderer; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit f02999aa267c40876f29edf37d39694b619e69ba Author: Markus Mohrhard <markus.mohrh...@collabora.co.uk> Date: Tue May 13 03:31:19 2014 +0200 move the test to slowcheck Change-Id: I628ff6af8fb28b86fbf74b547504721718e48606 diff --git a/sc/Module_sc.mk b/sc/Module_sc.mk index 41804b2..2b82efa 100644 --- a/sc/Module_sc.mk +++ b/sc/Module_sc.mk @@ -54,12 +54,12 @@ $(eval $(call gb_Module_add_check_targets,sc,\ CppunitTest_sc_ucalc \ CppunitTest_sc_filters_test \ CppunitTest_sc_rangelst_test \ - CppunitTest_sc_html_export_test \ )) $(eval $(call gb_Module_add_slowcheck_targets,sc, \ CppunitTest_sc_subsequent_filters_test \ CppunitTest_sc_subsequent_export_test \ + CppunitTest_sc_html_export_test \ CppunitTest_sc_opencl_test \ )) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits