[Libreoffice-commits] core.git: Branch 'feature/chart-3d-chart' - 7 commits - chart2/source

Kohei Yoshida kohei.yoshida at collabora.com
Fri May 9 19:39:10 PDT 2014


 chart2/source/view/charttypes/GL3DBarChart.cxx |  108 ++++++++++++++++++++++---
 chart2/source/view/inc/3DChartObjects.hxx      |   15 +++
 chart2/source/view/inc/GL3DBarChart.hxx        |   19 ++--
 chart2/source/view/main/3DChartObjects.cxx     |   55 ++++++++++++
 chart2/source/view/main/ChartView.cxx          |   63 ++++++++------
 5 files changed, 213 insertions(+), 47 deletions(-)

New commits:
commit 715ee7e3576066ea285244ff32d7f31ea58da381
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Fri May 9 10:52:32 2014 -0400

    Best effort of blindly placing axes and background objects.
    
    Change-Id: I3a7c77ee8d9c6ff033b112158daec3923ed27034

diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx
index b1b29a5..3775d04 100644
--- a/chart2/source/view/charttypes/GL3DBarChart.cxx
+++ b/chart2/source/view/charttypes/GL3DBarChart.cxx
@@ -55,6 +55,7 @@ void GL3DBarChart::create3DShapes()
     const float nBarDistanceY = nBarSizeY / 2;
 
     sal_uInt32 nId = 1;
+    float nXEnd = 0.0;
     float nYPos = 0.0;
 
     maShapes.clear();
@@ -98,11 +99,46 @@ void GL3DBarChart::create3DShapes()
             maShapes.push_back(new opengl3D::Bar(mpRenderer.get(), aBarPosition, nColor, nId++));
         }
 
+        float nThisXEnd = nPointCount * (nBarSizeX + nBarDistanceX);
+        if (nXEnd < nThisXEnd)
+            nXEnd = nThisXEnd;
+
         ++nSeriesIndex;
     }
 
     nYPos += nBarSizeY + nBarDistanceY;
 
+    // X axis
+    maShapes.push_back(new opengl3D::Line(mpRenderer.get(), nId++));
+    opengl3D::Line* pAxis = static_cast<opengl3D::Line*>(&maShapes.back());
+    glm::vec3 aBegin;
+    aBegin.y = nYPos;
+    glm::vec3 aEnd = aBegin;
+    aEnd.x = nXEnd;
+    pAxis->setPosition(aBegin, aEnd);
+    pAxis->setLineColor(COL_WHITE);
+
+    // Y axis
+    maShapes.push_back(new opengl3D::Line(mpRenderer.get(), nId++));
+    pAxis = static_cast<opengl3D::Line*>(&maShapes.back());
+    aBegin.x = aBegin.y = 0;
+    aEnd = aBegin;
+    aEnd.y = nYPos;
+    pAxis->setPosition(aBegin, aEnd);
+    pAxis->setLineColor(COL_WHITE);
+
+    // Chart background.
+    maShapes.push_back(new opengl3D::Rectangle(mpRenderer.get(), nId++));
+    opengl3D::Rectangle* pRect = static_cast<opengl3D::Rectangle*>(&maShapes.back());
+    glm::vec3 aTopLeft;
+    glm::vec3 aTopRight = aTopLeft;
+    aTopRight.x = nXEnd;
+    glm::vec3 aBottomRight = aTopRight;
+    aBottomRight.y = nYPos;
+    pRect->setPosition(aTopLeft, aTopRight, aBottomRight);
+    pRect->setFillColor(COL_BLACK);
+    pRect->setLineColor(COL_WHITE);
+
     // Create category texts along X-axis at the bottom.
     uno::Sequence<OUString> aCats = mrCatProvider.getSimpleCategories();
     for (sal_Int32 i = 0; i < aCats.getLength(); ++i)
@@ -112,12 +148,11 @@ void GL3DBarChart::create3DShapes()
         maShapes.push_back(new opengl3D::Text(mpRenderer.get(), aCats[i], nId++));
         opengl3D::Text* p = static_cast<opengl3D::Text*>(&maShapes.back());
         Size aTextSize = p->getSize();
-        glm::vec3 aTopLeft;
         aTopLeft.x = nXPos;
         aTopLeft.y = nYPos;
-        glm::vec3 aTopRight = aTopLeft;
+        aTopRight = aTopLeft;
         aTopRight.x += aTextSize.getWidth();
-        glm::vec3 aBottomRight = aTopRight;
+        aBottomRight = aTopRight;
         aBottomRight.y += aTextSize.getHeight();
         p->setPosition(aTopLeft, aTopRight, aBottomRight);
     }
diff --git a/chart2/source/view/inc/3DChartObjects.hxx b/chart2/source/view/inc/3DChartObjects.hxx
index e93d656..8571fd8 100644
--- a/chart2/source/view/inc/3DChartObjects.hxx
+++ b/chart2/source/view/inc/3DChartObjects.hxx
@@ -53,6 +53,9 @@ public:
 
     virtual void render() SAL_OVERRIDE;
 
+    void setPosition(const glm::vec3& rBegin, const glm::vec3& rEnd);
+    void setLineColor(const Color& rColor);
+
 private:
     glm::vec3 maPosBegin;
     glm::vec3 maPosEnd;
@@ -81,6 +84,11 @@ class Rectangle : public Renderable3DObject
 public:
     Rectangle(OpenGL3DRenderer* pRenderer, sal_uInt32 nId);
     virtual void render() SAL_OVERRIDE;
+
+    void setPosition(const glm::vec3& rTopLeft, const glm::vec3& rTopRight, const glm::vec3& rBottomRight);
+    void setFillColor(const Color& rColor);
+    void setLineColor(const Color& rColor);
+
 private:
     glm::vec3 maTopLeft;
     glm::vec3 maTopRight;
diff --git a/chart2/source/view/main/3DChartObjects.cxx b/chart2/source/view/main/3DChartObjects.cxx
index 820e79d..6cad265 100644
--- a/chart2/source/view/main/3DChartObjects.cxx
+++ b/chart2/source/view/main/3DChartObjects.cxx
@@ -53,6 +53,17 @@ void Line::render()
     mpRenderer->EndAddShapePolygon3DObject();
 }
 
+void Line::setPosition(const glm::vec3& rBegin, const glm::vec3& rEnd)
+{
+    maPosBegin = rBegin;
+    maPosEnd = rEnd;
+}
+
+void Line::setLineColor(const Color& rColor)
+{
+    maLineColor = rColor;
+}
+
 Text::Text(OpenGL3DRenderer* pRenderer, const OUString& rStr, sal_uInt32 nId):
     Renderable3DObject(pRenderer, nId)
 {
@@ -124,6 +135,23 @@ void Rectangle::render()
     mpRenderer->EndAddShapePolygon3DObject();
 }
 
+void Rectangle::setPosition(const glm::vec3& rTopLeft, const glm::vec3& rTopRight, const glm::vec3& rBottomRight)
+{
+    maTopLeft = rTopLeft;
+    maTopRight = rTopRight;
+    maBottomRight = rBottomRight;
+}
+
+void Rectangle::setFillColor(const Color& rColor)
+{
+    maColor = rColor;
+}
+
+void Rectangle::setLineColor(const Color& rColor)
+{
+    maLineColor = rColor;
+}
+
 Camera::Camera(OpenGL3DRenderer* pRenderer):
     Renderable3DObject(pRenderer, 0),
     maPos(10,10,-10),
commit 3e684f09c5f53c9c5a25ee15f809d40c1f3d4c9c
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Fri May 9 10:09:24 2014 -0400

    No need to store these text objects separately.
    
    Change-Id: I0ee63480fa0f15f42c81818d89ff5b5a3407ece4

diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx
index 15fe291..b1b29a5 100644
--- a/chart2/source/view/charttypes/GL3DBarChart.cxx
+++ b/chart2/source/view/charttypes/GL3DBarChart.cxx
@@ -55,9 +55,6 @@ void GL3DBarChart::create3DShapes()
     const float nBarDistanceY = nBarSizeY / 2;
 
     sal_uInt32 nId = 1;
-
-    std::vector<opengl3D::Text*> aYAxisTexts;
-
     float nYPos = 0.0;
 
     maShapes.clear();
@@ -76,8 +73,8 @@ void GL3DBarChart::create3DShapes()
             DataSeriesHelper::getDataSeriesLabel(
                 rDataSeries.getModel(), mxChartType->getRoleOfSequenceForSeriesLabel());
 
-        aYAxisTexts.push_back(new opengl3D::Text(mpRenderer.get(), aSeriesName, nId++));
-        opengl3D::Text* p = aYAxisTexts.back();
+        maShapes.push_back(new opengl3D::Text(mpRenderer.get(), aSeriesName, nId++));
+        opengl3D::Text* p = static_cast<opengl3D::Text*>(&maShapes.back());
         Size aTextSize = p->getSize();
         glm::vec3 aTopLeft, aTopRight, aBottomRight;
         aTopLeft.x = aTextSize.getWidth() * -1.0;
@@ -124,15 +121,6 @@ void GL3DBarChart::create3DShapes()
         aBottomRight.y += aTextSize.getHeight();
         p->setPosition(aTopLeft, aTopRight, aBottomRight);
     }
-
-    {
-        // Transfer all Y-axis text objects to the shape collection.
-        std::vector<opengl3D::Text*>::iterator itText = aYAxisTexts.begin(), itTextEnd = aYAxisTexts.end();
-        for (; itText != itTextEnd; ++itText)
-            maShapes.push_back(*itText);
-    }
-
-    aYAxisTexts.clear();
 }
 
 void GL3DBarChart::render()
commit 0d095ee5995e9e8938b1302c6efe7c818a1ed055
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Thu May 8 16:13:42 2014 -0400

    Try without std::back_inserter. Some tinderboxes don't like that.
    
    Change-Id: I37b5da446abe123d0e0526b5556014df606e6156

diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx
index 6a96ecb..15fe291 100644
--- a/chart2/source/view/charttypes/GL3DBarChart.cxx
+++ b/chart2/source/view/charttypes/GL3DBarChart.cxx
@@ -125,8 +125,13 @@ void GL3DBarChart::create3DShapes()
         p->setPosition(aTopLeft, aTopRight, aBottomRight);
     }
 
-    // Transfer all Y-axis text objects to the shape collection.
-    std::copy(aYAxisTexts.begin(), aYAxisTexts.end(), std::back_inserter(maShapes));
+    {
+        // Transfer all Y-axis text objects to the shape collection.
+        std::vector<opengl3D::Text*>::iterator itText = aYAxisTexts.begin(), itTextEnd = aYAxisTexts.end();
+        for (; itText != itTextEnd; ++itText)
+            maShapes.push_back(*itText);
+    }
+
     aYAxisTexts.clear();
 }
 
commit eb1cc0205b720699817a7caf4c19b8471d2798cd
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Thu May 8 16:03:10 2014 -0400

    My best attempt at positioning text objects.
    
    Change-Id: I390b6d09558b7f2dea46cfd4e5db5ed6f2162b5f

diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx
index 761d4b2..6a96ecb 100644
--- a/chart2/source/view/charttypes/GL3DBarChart.cxx
+++ b/chart2/source/view/charttypes/GL3DBarChart.cxx
@@ -41,6 +41,14 @@ GL3DBarChart::~GL3DBarChart()
 
 void GL3DBarChart::create3DShapes()
 {
+    // Each series of data flows from left to right, and multiple series are
+    // stacked vertically along y axis.
+
+    // NOTE: These objects are created and positioned in a totally blind
+    // fashion since we don't even have a way to see them on screen.  So, no
+    // guarantee they are positioned correctly.  In fact, they are guaranteed
+    // to be positioned incorrectly.
+
     const float nBarSizeX = 10;
     const float nBarSizeY = 10;
     const float nBarDistanceX = nBarSizeX / 2;
@@ -48,10 +56,9 @@ void GL3DBarChart::create3DShapes()
 
     sal_uInt32 nId = 1;
 
-    uno::Sequence<OUString> aCats = mrCatProvider.getSimpleCategories();
-    for (sal_Int32 i = 0; i < aCats.getLength(); ++i)
-        // Category name text object.
-        maShapes.push_back(new opengl3D::Text(mpRenderer.get(), aCats[i], nId++));
+    std::vector<opengl3D::Text*> aYAxisTexts;
+
+    float nYPos = 0.0;
 
     maShapes.clear();
     maShapes.push_back(new opengl3D::Camera(mpRenderer.get()));
@@ -59,6 +66,8 @@ void GL3DBarChart::create3DShapes()
     for (boost::ptr_vector<VDataSeries>::const_iterator itr = maDataSeries.begin(),
             itrEnd = maDataSeries.end(); itr != itrEnd; ++itr)
     {
+        nYPos = nSeriesIndex * (nBarSizeY + nBarDistanceY);
+
         const VDataSeries& rDataSeries = *itr;
         sal_Int32 nPointCount = rDataSeries.getTotalPointCount();
 
@@ -67,13 +76,21 @@ void GL3DBarChart::create3DShapes()
             DataSeriesHelper::getDataSeriesLabel(
                 rDataSeries.getModel(), mxChartType->getRoleOfSequenceForSeriesLabel());
 
-        maShapes.push_back(new opengl3D::Text(mpRenderer.get(), aSeriesName, nId++));
+        aYAxisTexts.push_back(new opengl3D::Text(mpRenderer.get(), aSeriesName, nId++));
+        opengl3D::Text* p = aYAxisTexts.back();
+        Size aTextSize = p->getSize();
+        glm::vec3 aTopLeft, aTopRight, aBottomRight;
+        aTopLeft.x = aTextSize.getWidth() * -1.0;
+        aTopLeft.y = nYPos;
+        aTopRight.y = nYPos;
+        aBottomRight = aTopRight;
+        aBottomRight.y += aTextSize.getHeight();
+        p->setPosition(aTopLeft, aTopRight, aBottomRight);
 
         for(sal_Int32 nIndex = 0; nIndex < nPointCount; ++nIndex)
         {
             float nVal = rDataSeries.getYValue(nIndex);
             float nXPos = nIndex * (nBarSizeX + nBarDistanceX);
-            float nYPos = nSeriesIndex * (nBarSizeY + nBarDistanceY);
 
             sal_Int32 nColor = COL_RED;
 
@@ -86,6 +103,31 @@ void GL3DBarChart::create3DShapes()
 
         ++nSeriesIndex;
     }
+
+    nYPos += nBarSizeY + nBarDistanceY;
+
+    // Create category texts along X-axis at the bottom.
+    uno::Sequence<OUString> aCats = mrCatProvider.getSimpleCategories();
+    for (sal_Int32 i = 0; i < aCats.getLength(); ++i)
+    {
+        float nXPos = i * (nBarSizeX + nBarDistanceX);
+
+        maShapes.push_back(new opengl3D::Text(mpRenderer.get(), aCats[i], nId++));
+        opengl3D::Text* p = static_cast<opengl3D::Text*>(&maShapes.back());
+        Size aTextSize = p->getSize();
+        glm::vec3 aTopLeft;
+        aTopLeft.x = nXPos;
+        aTopLeft.y = nYPos;
+        glm::vec3 aTopRight = aTopLeft;
+        aTopRight.x += aTextSize.getWidth();
+        glm::vec3 aBottomRight = aTopRight;
+        aBottomRight.y += aTextSize.getHeight();
+        p->setPosition(aTopLeft, aTopRight, aBottomRight);
+    }
+
+    // Transfer all Y-axis text objects to the shape collection.
+    std::copy(aYAxisTexts.begin(), aYAxisTexts.end(), std::back_inserter(maShapes));
+    aYAxisTexts.clear();
 }
 
 void GL3DBarChart::render()
diff --git a/chart2/source/view/inc/3DChartObjects.hxx b/chart2/source/view/inc/3DChartObjects.hxx
index ca56580..e93d656 100644
--- a/chart2/source/view/inc/3DChartObjects.hxx
+++ b/chart2/source/view/inc/3DChartObjects.hxx
@@ -64,6 +64,11 @@ class Text : public Renderable3DObject
 public:
     Text(OpenGL3DRenderer* pRenderer, const OUString& rStr, sal_uInt32 nId);
     virtual void render() SAL_OVERRIDE;
+
+    Size getSize() const;
+
+    void setPosition(const glm::vec3& rTopLeft, const glm::vec3& rTopRight, const glm::vec3& rBottomRight);
+
 private:
     BitmapEx maText;
     glm::vec3 maTopLeft;
diff --git a/chart2/source/view/main/3DChartObjects.cxx b/chart2/source/view/main/3DChartObjects.cxx
index daa5eca..820e79d 100644
--- a/chart2/source/view/main/3DChartObjects.cxx
+++ b/chart2/source/view/main/3DChartObjects.cxx
@@ -8,6 +8,8 @@
  */
 
 #include "3DChartObjects.hxx"
+#include <vcl/virdev.hxx>
+#include <vcl/svapp.hxx>
 
 namespace chart {
 
@@ -51,10 +53,20 @@ void Line::render()
     mpRenderer->EndAddShapePolygon3DObject();
 }
 
-Text::Text(OpenGL3DRenderer* pRenderer, const OUString& /*rStr*/, sal_uInt32 nId):
+Text::Text(OpenGL3DRenderer* pRenderer, const OUString& rStr, sal_uInt32 nId):
     Renderable3DObject(pRenderer, nId)
 {
-    // TODO : convert OUString to BitmapEx.
+    // Convert OUString to BitmapEx.
+    VirtualDevice aDevice(*Application::GetDefaultDevice(), 0, 0);
+    Font aFont = aDevice.GetFont();
+    aFont.SetColor(COL_WHITE);
+    aDevice.SetFont(aFont);
+    aDevice.Erase();
+    aDevice.SetOutputSizePixel(Size(20,12));
+    aDevice.SetBackground(Wallpaper(COL_TRANSPARENT));
+    aDevice.DrawText(Point(0,0), rStr);
+
+    maText = BitmapEx(aDevice.GetBitmapEx(Point(0,0), Size(20,12)));
 }
 
 void Text::render()
@@ -64,6 +76,18 @@ void Text::render()
     mpRenderer->CreateTextTexture(maText, maTopLeft, maTopRight, maBottomRight, bottomLeft);
 }
 
+Size Text::getSize() const
+{
+    return maText.GetSizePixel();
+}
+
+void Text::setPosition(const glm::vec3& rTopLeft, const glm::vec3& rTopRight, const glm::vec3& rBottomRight)
+{
+    maTopLeft = rTopLeft;
+    maTopRight = rTopRight;
+    maBottomRight = rBottomRight;
+}
+
 Rectangle::Rectangle(OpenGL3DRenderer* pRenderer, sal_uInt32 nId):
     Renderable3DObject(pRenderer, nId)
 {
commit dc91bc9ab349f7487ab1dbff6357c682321e63d5
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Thu May 8 13:25:27 2014 -0400

    TemporaryContext is no more.
    
    Change-Id: I9cf0f5db276c5837921c132d98032cf2331362fd

diff --git a/chart2/source/view/inc/GL3DBarChart.hxx b/chart2/source/view/inc/GL3DBarChart.hxx
index 8237805..86115de 100644
--- a/chart2/source/view/inc/GL3DBarChart.hxx
+++ b/chart2/source/view/inc/GL3DBarChart.hxx
@@ -25,11 +25,7 @@ namespace opengl3D {
 class Renderable3DObject;
 class OpenGL3DRenderer;
 
-namespace temporary {
-
-class TemporaryContext;
-
-} }
+}
 
 class GL3DBarChart
 {
commit 4d00c32252b726340b76661adb68ffbe94077271
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Thu May 8 13:10:45 2014 -0400

    Stop the leak of VDataSeries instances.
    
    Change-Id: I36cfa84e4fb19c3da584672d510e8b35f9343950

diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx
index 51cfcbe..761d4b2 100644
--- a/chart2/source/view/charttypes/GL3DBarChart.cxx
+++ b/chart2/source/view/charttypes/GL3DBarChart.cxx
@@ -25,7 +25,7 @@ namespace chart {
 
 GL3DBarChart::GL3DBarChart(
     const css::uno::Reference<css::chart2::XChartType>& xChartType,
-    const std::vector<VDataSeries*>& rDataSeries,
+    const boost::ptr_vector<VDataSeries>& rDataSeries,
     OpenGLWindow& rWindow, ExplicitCategoriesProvider& rCatProvider ) :
     mxChartType(xChartType),
     maDataSeries(rDataSeries),
@@ -56,22 +56,22 @@ void GL3DBarChart::create3DShapes()
     maShapes.clear();
     maShapes.push_back(new opengl3D::Camera(mpRenderer.get()));
     sal_Int32 nSeriesIndex = 0;
-    for(std::vector<VDataSeries*>::const_iterator itr = maDataSeries.begin(),
+    for (boost::ptr_vector<VDataSeries>::const_iterator itr = maDataSeries.begin(),
             itrEnd = maDataSeries.end(); itr != itrEnd; ++itr)
     {
-        VDataSeries* pDataSeries = *itr;
-        sal_Int32 nPointCount = pDataSeries->getTotalPointCount();
+        const VDataSeries& rDataSeries = *itr;
+        sal_Int32 nPointCount = rDataSeries.getTotalPointCount();
 
         // Create series name text object.
         OUString aSeriesName =
             DataSeriesHelper::getDataSeriesLabel(
-                pDataSeries->getModel(), mxChartType->getRoleOfSequenceForSeriesLabel());
+                rDataSeries.getModel(), mxChartType->getRoleOfSequenceForSeriesLabel());
 
         maShapes.push_back(new opengl3D::Text(mpRenderer.get(), aSeriesName, nId++));
 
         for(sal_Int32 nIndex = 0; nIndex < nPointCount; ++nIndex)
         {
-            float nVal = pDataSeries->getYValue(nIndex);
+            float nVal = rDataSeries.getYValue(nIndex);
             float nXPos = nIndex * (nBarSizeX + nBarDistanceX);
             float nYPos = nSeriesIndex * (nBarSizeY + nBarDistanceY);
 
diff --git a/chart2/source/view/inc/GL3DBarChart.hxx b/chart2/source/view/inc/GL3DBarChart.hxx
index f3e225f..8237805 100644
--- a/chart2/source/view/inc/GL3DBarChart.hxx
+++ b/chart2/source/view/inc/GL3DBarChart.hxx
@@ -36,7 +36,7 @@ class GL3DBarChart
 public:
     GL3DBarChart(
         const css::uno::Reference<css::chart2::XChartType>& xChartType,
-        const std::vector<VDataSeries*>& rDataSeries, OpenGLWindow& rContext,
+        const boost::ptr_vector<VDataSeries>& rDataSeries, OpenGLWindow& rContext,
         ExplicitCategoriesProvider& rCatProvider );
 
     ~GL3DBarChart();
@@ -47,7 +47,7 @@ public:
 
 private:
     css::uno::Reference<css::chart2::XChartType> mxChartType;
-    std::vector<VDataSeries*> maDataSeries;
+    const boost::ptr_vector<VDataSeries>& maDataSeries;
     boost::ptr_vector<opengl3D::Renderable3DObject> maShapes;
 
     boost::scoped_ptr<opengl3D::OpenGL3DRenderer> mpRenderer;
diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx
index 0c23d05..13f4bf7 100644
--- a/chart2/source/view/main/ChartView.cxx
+++ b/chart2/source/view/main/ChartView.cxx
@@ -3120,7 +3120,7 @@ void ChartView::createShapes3D()
         return;
 
     uno::Sequence< uno::Reference< XCoordinateSystem > > aCooSysList( xCooSysContainer->getCoordinateSystems() );
-    std::vector<VDataSeries*> aDataSeries;
+    boost::ptr_vector<VDataSeries> aDataSeries;
 
     if (aCooSysList.getLength() != 1)
         // Supporting multiple coordinates in a truly 3D chart (which implies
@@ -3155,8 +3155,7 @@ void ChartView::createShapes3D()
         if(!xDataSeries.is())
             continue;
 
-        VDataSeries* pSeries = new VDataSeries( xDataSeries );
-        aDataSeries.push_back(pSeries);
+        aDataSeries.push_back(new VDataSeries(xDataSeries));
     }
 
     OpenGLWindow* pWindow = mrChartModel.getOpenGLWindow();
commit ef52afb234ef9f7ad19e2595f5ab0c7e0d9a5352
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Thu May 8 11:26:48 2014 -0400

    Put category and data series names into the shape collection.
    
    Their positions are yet to be calculated.
    
    Change-Id: Ibb1f2498eb2af3305c2afb6d41be99eaf279daaf

diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx
index 525b4fc..51cfcbe 100644
--- a/chart2/source/view/charttypes/GL3DBarChart.cxx
+++ b/chart2/source/view/charttypes/GL3DBarChart.cxx
@@ -16,16 +16,22 @@
 
 #include "3DChartObjects.hxx"
 #include "GL3DRenderer.hxx"
+#include <ExplicitCategoriesProvider.hxx>
+#include <DataSeriesHelper.hxx>
 
 using namespace com::sun::star;
 
 namespace chart {
 
-GL3DBarChart::GL3DBarChart(const std::vector<VDataSeries*>& rDataSeries,
-        OpenGLWindow& rWindow):
+GL3DBarChart::GL3DBarChart(
+    const css::uno::Reference<css::chart2::XChartType>& xChartType,
+    const std::vector<VDataSeries*>& rDataSeries,
+    OpenGLWindow& rWindow, ExplicitCategoriesProvider& rCatProvider ) :
+    mxChartType(xChartType),
     maDataSeries(rDataSeries),
     mpRenderer(new opengl3D::OpenGL3DRenderer()),
-    mrWindow(rWindow)
+    mrWindow(rWindow),
+    mrCatProvider(rCatProvider)
 {
 }
 
@@ -40,15 +46,29 @@ void GL3DBarChart::create3DShapes()
     const float nBarDistanceX = nBarSizeX / 2;
     const float nBarDistanceY = nBarSizeY / 2;
 
+    sal_uInt32 nId = 1;
+
+    uno::Sequence<OUString> aCats = mrCatProvider.getSimpleCategories();
+    for (sal_Int32 i = 0; i < aCats.getLength(); ++i)
+        // Category name text object.
+        maShapes.push_back(new opengl3D::Text(mpRenderer.get(), aCats[i], nId++));
+
     maShapes.clear();
     maShapes.push_back(new opengl3D::Camera(mpRenderer.get()));
     sal_Int32 nSeriesIndex = 0;
-    sal_uInt32 nId = 1;
     for(std::vector<VDataSeries*>::const_iterator itr = maDataSeries.begin(),
             itrEnd = maDataSeries.end(); itr != itrEnd; ++itr)
     {
         VDataSeries* pDataSeries = *itr;
         sal_Int32 nPointCount = pDataSeries->getTotalPointCount();
+
+        // Create series name text object.
+        OUString aSeriesName =
+            DataSeriesHelper::getDataSeriesLabel(
+                pDataSeries->getModel(), mxChartType->getRoleOfSequenceForSeriesLabel());
+
+        maShapes.push_back(new opengl3D::Text(mpRenderer.get(), aSeriesName, nId++));
+
         for(sal_Int32 nIndex = 0; nIndex < nPointCount; ++nIndex)
         {
             float nVal = pDataSeries->getYValue(nIndex);
diff --git a/chart2/source/view/inc/3DChartObjects.hxx b/chart2/source/view/inc/3DChartObjects.hxx
index 05c2f5b..ca56580 100644
--- a/chart2/source/view/inc/3DChartObjects.hxx
+++ b/chart2/source/view/inc/3DChartObjects.hxx
@@ -62,7 +62,7 @@ private:
 class Text : public Renderable3DObject
 {
 public:
-    Text(OpenGL3DRenderer* pRenderer, sal_uInt32 nId);
+    Text(OpenGL3DRenderer* pRenderer, const OUString& rStr, sal_uInt32 nId);
     virtual void render() SAL_OVERRIDE;
 private:
     BitmapEx maText;
diff --git a/chart2/source/view/inc/GL3DBarChart.hxx b/chart2/source/view/inc/GL3DBarChart.hxx
index 06b1be5..f3e225f 100644
--- a/chart2/source/view/inc/GL3DBarChart.hxx
+++ b/chart2/source/view/inc/GL3DBarChart.hxx
@@ -18,6 +18,8 @@
 
 namespace chart {
 
+class ExplicitCategoriesProvider;
+
 namespace opengl3D {
 
 class Renderable3DObject;
@@ -32,7 +34,11 @@ class TemporaryContext;
 class GL3DBarChart
 {
 public:
-    GL3DBarChart(const std::vector<VDataSeries*>& rDataSeries, OpenGLWindow& rContext);
+    GL3DBarChart(
+        const css::uno::Reference<css::chart2::XChartType>& xChartType,
+        const std::vector<VDataSeries*>& rDataSeries, OpenGLWindow& rContext,
+        ExplicitCategoriesProvider& rCatProvider );
+
     ~GL3DBarChart();
 
     void create3DShapes();
@@ -40,12 +46,13 @@ public:
     void render();
 
 private:
-
+    css::uno::Reference<css::chart2::XChartType> mxChartType;
     std::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/main/3DChartObjects.cxx b/chart2/source/view/main/3DChartObjects.cxx
index b4ca2c4..daa5eca 100644
--- a/chart2/source/view/main/3DChartObjects.cxx
+++ b/chart2/source/view/main/3DChartObjects.cxx
@@ -51,9 +51,10 @@ void Line::render()
     mpRenderer->EndAddShapePolygon3DObject();
 }
 
-Text::Text(OpenGL3DRenderer* pRenderer, sal_uInt32 nId):
+Text::Text(OpenGL3DRenderer* pRenderer, const OUString& /*rStr*/, sal_uInt32 nId):
     Renderable3DObject(pRenderer, nId)
 {
+    // TODO : convert OUString to BitmapEx.
 }
 
 void Text::render()
diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx
index 93d4133..0c23d05 100644
--- a/chart2/source/view/main/ChartView.cxx
+++ b/chart2/source/view/main/ChartView.cxx
@@ -3121,45 +3121,53 @@ void ChartView::createShapes3D()
 
     uno::Sequence< uno::Reference< XCoordinateSystem > > aCooSysList( xCooSysContainer->getCoordinateSystems() );
     std::vector<VDataSeries*> aDataSeries;
-    for( sal_Int32 nCS = 0; nCS < aCooSysList.getLength(); ++nCS )
-    {
-        uno::Reference< XCoordinateSystem > xCooSys( aCooSysList[nCS] );
 
-        //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() )
-            continue;
-        uno::Sequence< uno::Reference< XChartType > > aChartTypeList( xChartTypeContainer->getChartTypes() );
-        for( sal_Int32 nT = 0; nT < aChartTypeList.getLength(); ++nT )
-        {
-            uno::Reference< XChartType > xChartType( aChartTypeList[nT] );
+    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< XDataSeriesContainer > xDataSeriesContainer( xChartType, uno::UNO_QUERY );
-            OSL_ASSERT( xDataSeriesContainer.is());
-            if( !xDataSeriesContainer.is() )
-                continue;
+    uno::Reference<XCoordinateSystem> xCooSys( aCooSysList[0] );
 
-            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;
+    //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;
 
-                VDataSeries* pSeries = new VDataSeries( xDataSeries );
-                aDataSeries.push_back(pSeries);
-            }
-        }
+    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< XChartType > xChartType( aChartTypeList[0] );
+
+    uno::Reference< XDataSeriesContainer > xDataSeriesContainer( xChartType, uno::UNO_QUERY );
+    OSL_ASSERT( xDataSeriesContainer.is());
+    if( !xDataSeriesContainer.is() )
+        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;
+
+        VDataSeries* pSeries = new VDataSeries( xDataSeries );
+        aDataSeries.push_back(pSeries);
     }
 
     OpenGLWindow* pWindow = mrChartModel.getOpenGLWindow();
     if(!pWindow)
         return;
 
+    boost::scoped_ptr<ExplicitCategoriesProvider> pCatProvider(new ExplicitCategoriesProvider(xCooSys, mrChartModel));
+
     pWindow->Show();
 
-    GL3DBarChart aBarChart(aDataSeries, *pWindow);
+    GL3DBarChart aBarChart(xChartType, aDataSeries, *pWindow, *pCatProvider);
     aBarChart.create3DShapes();
     aBarChart.render();
 }


More information about the Libreoffice-commits mailing list