[Libreoffice-commits] core.git: 183 commits - chart2/inc chart2/Library_chartcore.mk chart2/Library_chartopengl.mk chart2/Module_chart2.mk chart2/opengl chart2/Package_opengl.mk chart2/source config_host.mk.in configure.ac download.lst external/glew external/glm external/Module_external.mk include/svx Makefile.fetch offapi/com offapi/UnoApi_offapi.mk RepositoryExternal.mk Repository.mk sc/inc sc/source sfx2/source svx/source vcl/source

Markus Mohrhard markus.mohrhard at collabora.co.uk
Tue Jan 28 23:10:36 PST 2014


 Makefile.fetch                                                  |    2 
 Repository.mk                                                   |    1 
 RepositoryExternal.mk                                           |   44 
 chart2/Library_chartcore.mk                                     |    1 
 chart2/Library_chartopengl.mk                                   |   24 
 chart2/Module_chart2.mk                                         |    4 
 chart2/Package_opengl.mk                                        |   29 
 chart2/inc/ChartModel.hxx                                       |   14 
 chart2/inc/ChartView.hxx                                        |   36 
 chart2/inc/GL/glew.h                                            |18060 ----------
 chart2/inc/GL/glxew.h                                           | 1669 
 chart2/inc/GL/wglew.h                                           | 1421 
 chart2/opengl/backgroundFragmentShader.glsl                     |    6 
 chart2/opengl/backgroundVertexShader.glsl                       |   10 
 chart2/opengl/commonFragmentShader.glsl                         |    6 
 chart2/opengl/commonVertexShader.glsl                           |   10 
 chart2/opengl/debugFragmentShader.glsl                          |    7 
 chart2/opengl/debugVertexShader.glsl                            |    9 
 chart2/opengl/renderFragmentShader.glsl                         |    7 
 chart2/opengl/renderVertexShader.glsl                           |    9 
 chart2/opengl/symbolFragmentShader.glsl                         |   12 
 chart2/opengl/symbolVertexShader.glsl                           |   13 
 chart2/opengl/textFragmentShader.glsl                           |    6 
 chart2/opengl/textVertexShader.glsl                             |    9 
 chart2/source/controller/dialogs/DialogModel.cxx                |   28 
 chart2/source/controller/dialogs/DialogModel.hxx                |   18 
 chart2/source/controller/dialogs/tp_DataSource.cxx              |   23 
 chart2/source/controller/dialogs/tp_DataSource.hxx              |    6 
 chart2/source/controller/dialogs/tp_RangeChooser.cxx            |   28 
 chart2/source/controller/dialogs/tp_RangeChooser.hxx            |    5 
 chart2/source/controller/dialogs/tp_Wizard_TitlesAndObjects.hrc |    7 
 chart2/source/inc/InternalDataProvider.hxx                      |    1 
 chart2/source/model/main/ChartModel.cxx                         |   58 
 chart2/source/view/charttypes/BarChart.cxx                      |    9 
 chart2/source/view/charttypes/BubbleChart.cxx                   |   16 
 chart2/source/view/charttypes/PieChart.cxx                      |    9 
 chart2/source/view/inc/AbstractShapeFactory.hxx                 |   68 
 chart2/source/view/inc/DummyXShape.hxx                          |  108 
 chart2/source/view/inc/OpenglShapeFactory.hxx                   |   18 
 chart2/source/view/inc/ShapeFactory.hxx                         |   23 
 chart2/source/view/inc/VDataSeries.hxx                          |   26 
 chart2/source/view/inc/VSeriesPlotter.hxx                       |    4 
 chart2/source/view/main/AbstractShapeFactory.cxx                |    8 
 chart2/source/view/main/ChartView.cxx                           |  128 
 chart2/source/view/main/DrawModelWrapper.cxx                    |    4 
 chart2/source/view/main/DummyXShape.cxx                         |  873 
 chart2/source/view/main/OpenGLRender.cxx                        | 1778 
 chart2/source/view/main/OpenGLRender.hxx                        |  321 
 chart2/source/view/main/OpenglShapeFactory.cxx                  |   67 
 chart2/source/view/main/ShapeFactory.cxx                        |   22 
 chart2/source/view/main/VDataSeries.cxx                         |   98 
 config_host.mk.in                                               |    2 
 configure.ac                                                    |   10 
 download.lst                                                    |    2 
 external/Module_external.mk                                     |    2 
 external/glew/ExternalPackage_glew.mk                           |   24 
 external/glew/ExternalProject_glew.mk                           |   32 
 external/glew/Makefile                                          |    7 
 external/glew/Module_glew.mk                                    |   18 
 external/glew/UnpackedTarball_glew.mk                           |   22 
 external/glew/glew-fix-rc-error.patch.1                         |   15 
 external/glm/Makefile                                           |    7 
 external/glm/Module_glm.mk                                      |   20 
 external/glm/README                                             |    3 
 external/glm/UnpackedTarball_glm.mk                             |   16 
 external/glm/Wshadow-unix.patch                                 | 2659 +
 external/glm/Wshadow-windows.patch                              | 2659 +
 include/svx/unoshape.hxx                                        |   23 
 offapi/UnoApi_offapi.mk                                         |    1 
 offapi/com/sun/star/chart2/XTimeBased.idl                       |   39 
 sc/inc/chart2uno.hxx                                            |   18 
 sc/source/ui/unoobj/chart2uno.cxx                               |  123 
 sfx2/source/appl/shutdownicon.cxx                               |   42 
 svx/source/unodraw/unoshap4.cxx                                 |    8 
 vcl/source/app/timer.cxx                                        |   27 
 75 files changed, 9354 insertions(+), 21588 deletions(-)

New commits:
commit 5fc4d9e468807cdd64ef2742d172c30bbb15c99a
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date:   Mon Jan 27 05:58:01 2014 +0100

    gl_PointCoord is already in GLSL 110
    
    Change-Id: I35de1aad6f7e8dbdcefc1107c843b7b95357c4c6

diff --git a/chart2/opengl/symbolFragmentShader.glsl b/chart2/opengl/symbolFragmentShader.glsl
index c340be2..0567321 100644
--- a/chart2/opengl/symbolFragmentShader.glsl
+++ b/chart2/opengl/symbolFragmentShader.glsl
@@ -1,4 +1,4 @@
-#version 130
+#version 110
 
 varying vec4 fragmentColor;
 
diff --git a/chart2/opengl/symbolVertexShader.glsl b/chart2/opengl/symbolVertexShader.glsl
index 6aef1e8..0ab01d3 100644
--- a/chart2/opengl/symbolVertexShader.glsl
+++ b/chart2/opengl/symbolVertexShader.glsl
@@ -1,4 +1,4 @@
-#version 130
+#version 110
 
 attribute vec3 vPosition;
 uniform mat4 MVP;
commit ddc893e345675c74e8ca2ad9899e0b5ad3798538
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date:   Mon Jan 27 05:56:40 2014 +0100

    use point sprites for symbol rendering
    
    Change-Id: Ib2b35c367c0b70e3ba140c15fae5378c7a2edebc

diff --git a/chart2/source/view/main/DummyXShape.cxx b/chart2/source/view/main/DummyXShape.cxx
index 4779c0f..6b18a2f 100644
--- a/chart2/source/view/main/DummyXShape.cxx
+++ b/chart2/source/view/main/DummyXShape.cxx
@@ -459,509 +459,8 @@ DummySymbol2D::DummySymbol2D(const drawing::Position3D& rPos, const drawing::Dir
     mnBorderColor(nBorderColor),
     mnFillColor(nFillColor)
 {
-    //setPosition(Position3DToAWTPoint(rPos));
-    //setSize(Direction3DToAWTSize(rSize));
-}
-drawing::PolyPolygonShape3D oglCreatePolyPolygon_Symbol( const drawing::Position3D& rPos
-                                 , const drawing::Direction3D& rSize
-                                 , sal_Int32 nStandardSymbol )
-{
-    printf("***  createPolyPolygon_Symbol\n");
-    if(nStandardSymbol<0)
-        nStandardSymbol*=-1;
-    nStandardSymbol = nStandardSymbol%Symbol_COUNT;
-    SymbolEnum eSymbolType=static_cast<SymbolEnum>(nStandardSymbol);
-
-    const double& fX = rPos.PositionX;
-    const double& fY = rPos.PositionY;
-
-    const double fWidthH  = rSize.DirectionX/2.0; //fWidthH stands for Half Width
-    const double fHeightH = rSize.DirectionY/2.0; //fHeightH stands for Half Height
-
-    const sal_Int32 nQuarterCount = 35; // points inside a quadrant, used in case circle
-
-    sal_Int32 nPointCount = 4; //all arrow symbols only need 4 points
-    switch( eSymbolType )
-    {
-        case Symbol_Square:
-        case Symbol_Diamond:
-        case Symbol_Bowtie:
-        case Symbol_Sandglass:
-        case Symbol_HorizontalBar:
-        case Symbol_VerticalBar:
-            nPointCount = 5;
-            break;
-        case Symbol_X:
-            nPointCount = 13;
-            break;
-        case Symbol_Plus:
-            nPointCount = 13;
-            break;
-        case Symbol_Star:
-            nPointCount = 9;
-            break;
-        case Symbol_Asterisk:
-            nPointCount = 19;
-            break;
-        case Symbol_Circle:
-            nPointCount = 5 + 4 * nQuarterCount;
-            break;
-        default:
-            break;
-    }
-
-    drawing::PolyPolygonShape3D aPP;
-
-    aPP.SequenceX.realloc(1);
-    aPP.SequenceY.realloc(1);
-    aPP.SequenceZ.realloc(1);
-
-    drawing::DoubleSequence* pOuterSequenceX = aPP.SequenceX.getArray();
-    drawing::DoubleSequence* pOuterSequenceY = aPP.SequenceY.getArray();
-    drawing::DoubleSequence* pOuterSequenceZ = aPP.SequenceZ.getArray();
-
-    pOuterSequenceX->realloc(nPointCount);
-    pOuterSequenceY->realloc(nPointCount);
-    pOuterSequenceZ->realloc(nPointCount);
-
-    double* pInnerSequenceX = pOuterSequenceX->getArray();
-    double* pInnerSequenceY = pOuterSequenceY->getArray();
-    double* pInnerSequenceZ = pOuterSequenceZ->getArray();
-
-    for(sal_Int32 nN = nPointCount; nN--;)
-        *pInnerSequenceZ++ = 0.0;
-
-    switch(eSymbolType)
-    {
-        case Symbol_Square:
-        {
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-            break;
-        }
-        case Symbol_UpArrow:
-        {
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-            break;
-        }
-        case Symbol_DownArrow:
-        {
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-            break;
-        }
-        case Symbol_RightArrow:
-        {
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-            break;
-        }
-        case Symbol_LeftArrow:
-        {
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY;
-            break;
-        }
-        case Symbol_Bowtie:
-        {
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-            break;
-        }
-        case Symbol_Sandglass:
-        {
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-            break;
-        }
-        case Symbol_Diamond:
-        {
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY;
-
-            *pInnerSequenceX++ = fX;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY;
-
-            *pInnerSequenceX++ = fX;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY;
-            break;
-        }
-        case Symbol_HorizontalBar:
-        {
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-0.2*fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY-0.2*fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY+0.2*fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY+0.2*fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-0.2*fHeightH;
-            break;
-        }
-        case Symbol_VerticalBar:
-        {
-            *pInnerSequenceX++ = fX-0.2*fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX+0.2*fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX+0.2*fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX-0.2*fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX-0.2*fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            break;
-        }
-        case Symbol_Circle:
-        {
-            double fOmega = 1.5707963267948966192 / (nQuarterCount + 1.0);
-            // one point in the middle of each edge to get full size bounding rectangle
-            *pInnerSequenceX++ = fX + fWidthH;
-            *pInnerSequenceY++ = fY;
-            // 0 to PI/2
-            for (sal_Int32 i = 1; i <= nQuarterCount; ++i)
-            {
-                *pInnerSequenceX++ = fX + fWidthH * cos( i * fOmega );
-                *pInnerSequenceY++ = fY - fHeightH * sin( i * fOmega );
-            }
-            // PI/2 to PI
-            *pInnerSequenceX++ = fX;
-            *pInnerSequenceY++ = fY - fHeightH;
-            for (sal_Int32 i = 1; i <= nQuarterCount; ++i)
-            {
-                *pInnerSequenceX++ = fX - fWidthH * sin( i * fOmega);
-                *pInnerSequenceY++ = fY - fHeightH * cos( i * fOmega);
-            }
-            // PI to 3/2*PI
-            *pInnerSequenceX++ = fX - fWidthH;
-            *pInnerSequenceY++ = fY;
-            for (sal_Int32 i = 1; i <= nQuarterCount; ++i)
-            {
-                *pInnerSequenceX++ = fX - fWidthH * cos( i * fOmega);
-                *pInnerSequenceY++ = fY + fHeightH * sin( i * fOmega);
-            }
-            // 3/2*PI to 2*PI
-            *pInnerSequenceX++ = fX;
-            *pInnerSequenceY++ = fY + fHeightH;
-            for (sal_Int32 i = 1; i <= nQuarterCount; ++i)
-            {
-                *pInnerSequenceX++ = fX + fWidthH * sin(i * fOmega);
-                *pInnerSequenceY++ = fY + fHeightH * cos(i * fOmega);
-            }
-            // close polygon
-            *pInnerSequenceX++ = fX + fWidthH;
-            *pInnerSequenceY++ = fY;
-            break;
-        }
-        case Symbol_Star:
-        {
-            *pInnerSequenceX++ = fX;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX+0.2*fWidthH;
-            *pInnerSequenceY++ = fY-0.2*fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY;
-
-            *pInnerSequenceX++ = fX+0.2*fWidthH;
-            *pInnerSequenceY++ = fY+0.2*fHeightH;
-
-            *pInnerSequenceX++ = fX;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX-0.2*fWidthH;
-            *pInnerSequenceY++ = fY+0.2*fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY;
-
-            *pInnerSequenceX++ = fX-0.2*fWidthH;
-            *pInnerSequenceY++ = fY-0.2*fHeightH;
-
-            *pInnerSequenceX++ = fX;
-            *pInnerSequenceY++ = fY-fHeightH;
-            break;
-        }
-        case Symbol_X:
-        {
-            const double fScaleX = fWidthH / 128.0;
-            const double fScaleY = fHeightH / 128.0;
-            const double fSmall = sqrt(200.0);
-            const double fLarge = 128.0 - fSmall;
-
-            *pInnerSequenceX++ = fX;
-            *pInnerSequenceY++ = fY - fScaleY * fSmall;
-
-            *pInnerSequenceX++ = fX - fScaleX * fLarge;
-            *pInnerSequenceY++ = fY - fHeightH;
-
-            *pInnerSequenceX++ = fX - fWidthH;
-            *pInnerSequenceY++ = fY - fScaleY * fLarge;
-
-            *pInnerSequenceX++ = fX - fScaleX * fSmall;
-            *pInnerSequenceY++ = fY;
-
-            *pInnerSequenceX++ = fX - fWidthH;
-            *pInnerSequenceY++ = fY + fScaleY * fLarge;
-
-            *pInnerSequenceX++ = fX - fScaleX * fLarge;
-            *pInnerSequenceY++ = fY + fHeightH;
-
-            *pInnerSequenceX++ = fX;
-            *pInnerSequenceY++ = fY + fScaleY * fSmall;
-
-            *pInnerSequenceX++ = fX + fScaleX * fLarge;
-            *pInnerSequenceY++ = fY + fHeightH;
-
-            *pInnerSequenceX++ = fX + fWidthH;
-            *pInnerSequenceY++ = fY + fScaleY * fLarge;
-
-            *pInnerSequenceX++ = fX + fScaleX * fSmall;
-            *pInnerSequenceY++ = fY;
-
-            *pInnerSequenceX++ = fX + fWidthH;
-            *pInnerSequenceY++ = fY - fScaleY * fLarge;
-
-            *pInnerSequenceX++ = fX + fScaleX * fLarge;
-            *pInnerSequenceY++ = fY - fHeightH;
-
-            *pInnerSequenceX++ = fX;
-            *pInnerSequenceY++ = fY - fScaleY * fSmall;
-            break;
-
-        }
-        case Symbol_Plus:
-        {
-            const double fScaleX = fWidthH / 128.0;
-            const double fScaleY = fHeightH / 128.0;
-            const double fHalf = 10.0; //half line width on 256 size square
-            const double fdX = fScaleX * fHalf;
-            const double fdY = fScaleY * fHalf;
-
-            *pInnerSequenceX++ = fX-fdX;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX-fdX;
-            *pInnerSequenceY++ = fY-fdY;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-fdY;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY+fdY;
-
-            *pInnerSequenceX++ = fX-fdX;
-            *pInnerSequenceY++ = fY+fdY;
-
-            *pInnerSequenceX++ = fX-fdX;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX+fdX;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX+fdX;
-            *pInnerSequenceY++ = fY+fdY;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY+fdY;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY-fdY;
-
-            *pInnerSequenceX++ = fX+fdX;
-            *pInnerSequenceY++ = fY-fdY;
-
-            *pInnerSequenceX++ = fX+fdY;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX-fdX;
-            *pInnerSequenceY++ = fY-fHeightH;
-            break;
-
-        }
-        case Symbol_Asterisk:
-        {
-            const double fHalf = 10.0; // half line width on 256 size square
-            const double fTwoY = fHalf * sqrt(3.0);
-            const double fFourY = (128.0 - 2.0 * fHalf ) / sqrt(3.0);
-            const double fThreeX = 128.0 - fHalf;
-            const double fThreeY = fHalf * sqrt(3.0) + fFourY;
-            const double fFiveX = 2.0 * fHalf;
-
-            const double fScaleX = fWidthH / 128.0;
-            const double fScaleY = fHeightH / 128.0;
-
-            //1
-            *pInnerSequenceX++ = fX-fScaleX * fHalf;
-            *pInnerSequenceY++ = fY-fHeightH;
-            //2
-            *pInnerSequenceX++ = fX-fScaleX * fHalf;
-            *pInnerSequenceY++ = fY-fScaleY * fTwoY;
-            //3
-            *pInnerSequenceX++ = fX-fScaleX * fThreeX;
-            *pInnerSequenceY++ = fY-fScaleY * fThreeY;
-            //4
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-fScaleY * fFourY;
-            //5
-            *pInnerSequenceX++ = fX-fScaleX * fFiveX;
-            *pInnerSequenceY++ = fY;
-            //6 as 4
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY+fScaleY * fFourY;
-            //7 as 3
-            *pInnerSequenceX++ = fX-fScaleX * fThreeX;
-            *pInnerSequenceY++ = fY+fScaleY * fThreeY;
-            //8 as 2
-            *pInnerSequenceX++ = fX-fScaleX * fHalf;
-            *pInnerSequenceY++ = fY+fScaleY * fTwoY;
-            //9 as 1
-            *pInnerSequenceX++ = fX-fScaleX * fHalf;
-            *pInnerSequenceY++ = fY+fHeightH;
-            //10 as 1
-            *pInnerSequenceX++ = fX+fScaleX * fHalf;
-            *pInnerSequenceY++ = fY+fHeightH;
-            //11 as 2
-            *pInnerSequenceX++ = fX+fScaleX * fHalf;
-            *pInnerSequenceY++ = fY+fScaleY * fTwoY;
-            //12 as 3
-            *pInnerSequenceX++ = fX+fScaleX * fThreeX;
-            *pInnerSequenceY++ = fY+fScaleY * fThreeY;
-            //13 as 4
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY+fScaleY * fFourY;
-            //14 as 5
-            *pInnerSequenceX++ = fX+fScaleX * fFiveX;
-            *pInnerSequenceY++ = fY;
-            //15 as 4
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY-fScaleY * fFourY;
-            //16 as 3
-            *pInnerSequenceX++ = fX+fScaleX * fThreeX;
-            *pInnerSequenceY++ = fY-fScaleY * fThreeY;
-            //17 as 2
-            *pInnerSequenceX++ = fX+fScaleX * fHalf;
-            *pInnerSequenceY++ = fY-fScaleY * fTwoY;
-            // 18 as 1
-            *pInnerSequenceX++ = fX+fScaleX * fHalf;
-            *pInnerSequenceY++ = fY-fHeightH;
-            // 19 = 1, closing
-            *pInnerSequenceX++ = fX-fScaleX * fHalf;
-            *pInnerSequenceY++ = fY-fHeightH;
-            break;
-        }
-        default: //case Symbol_Square:
-        {
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY+fHeightH;
-
-            *pInnerSequenceX++ = fX+fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-
-            *pInnerSequenceX++ = fX-fWidthH;
-            *pInnerSequenceY++ = fY-fHeightH;
-            break;
-        }
-    }
-
-    return aPP;
+    setPosition(Position3DToAWTPoint(rPos));
+    setSize(Direction3DToAWTSize(rSize));
 }
 
 void DummySymbol2D::render()
@@ -970,21 +469,7 @@ void DummySymbol2D::render()
 
     pChart->m_GLRender.SetColor(mnFillColor);
 
-    drawing::PointSequenceSequence aPointss( PolyToPointSequence(
-                oglCreatePolyPolygon_Symbol( mrPosition, mrSize, mnStandardSymbol ) ));
-
-    sal_Int32 nPointssCount = aPointss.getLength();
-    for(sal_Int32 i = 0; i < nPointssCount; i++)
-    {
-        const com::sun::star::uno::Sequence<com::sun::star::awt::Point>& points = aPointss[i];
-        sal_Int32 nPointsCount = points.getLength();
-        for(sal_Int32 j = 0; j < nPointsCount; j++)
-        {
-            const com::sun::star::awt::Point& p = points[j];
-            pChart->m_GLRender.SetSymbol2DShapePoint((float)p.X, (float)p.Y, nPointsCount);
-        }
-    }
-    pChart->m_GLRender.RenderSymbol2DShape();
+    pChart->m_GLRender.RenderSymbol2DShape(maPosition.X, maPosition.Y, maSize.Width, maSize.Height, mnStandardSymbol);
 }
 
 DummyCircle::DummyCircle(const awt::Point& rPos, const awt::Size& rSize)
diff --git a/chart2/source/view/main/OpenGLRender.cxx b/chart2/source/view/main/OpenGLRender.cxx
index 49ab3ea..e80e210 100755
--- a/chart2/source/view/main/OpenGLRender.cxx
+++ b/chart2/source/view/main/OpenGLRender.cxx
@@ -384,6 +384,11 @@ int OpenGLRender::InitOpenGL(GLWindow aWindow)
     m_BackgroundVertexID = glGetAttribLocation(m_BackgroundProID, "vPosition");
     m_BackgroundColorID = glGetAttribLocation(m_BackgroundProID, "vColor");
 
+    m_SymbolProID = LoadShaders("symbolVertexShader", "symbolFragmentShader");
+    m_SymbolVertexID = glGetAttribLocation(m_SymbolProID, "vPosition");
+    m_SymbolMatrixID = glGetAttribLocation(m_SymbolProID, "MVP");
+    m_SymbolColorID = glGetAttribLocation(m_SymbolProID, "vColor");
+
     m_TextProID = LoadShaders("textVertexShader", "textFragmentShader");
     m_TextMatrixID = glGetUniformLocation(m_TextProID, "MVP");
     m_TextVertexID = glGetAttribLocation(m_TextProID, "vPosition");
@@ -1720,67 +1725,48 @@ int OpenGLRender::RenderPieSegment2DShape(float fSize, float fPosX, float fPosY)
     CHECK_GL_ERROR();
     return 0;
 }
-int OpenGLRender::SetSymbol2DShapePoint(float x, float y, int listLength)
-{
-    if (m_Symbol2DPointList.empty())
-    {
-        m_Symbol2DPointList.reserve(listLength);
-    }
-    float actualX = (x / OPENGL_SCALE_VALUE);
-    float actualY = (y / OPENGL_SCALE_VALUE);
-    m_Symbol2DPointList.push_back(actualX);
-    m_Symbol2DPointList.push_back(actualY);
-    m_Symbol2DPointList.push_back(m_fZStep);
-
-    if (m_Symbol2DPointList.size() == size_t(listLength * 3))
-    {
-        m_Symbol2DShapePointList.push_back(m_Symbol2DPointList);
-        m_Symbol2DPointList.clear();
-    }
-    return 0;
-}
-
-int OpenGLRender::RenderSymbol2DShape()
+int OpenGLRender::RenderSymbol2DShape(float x, float y, float width, float height, sal_Int32)
 {
     CHECK_GL_ERROR();
 
+    glDisable(GL_POINT_SMOOTH);
     glDisable(GL_MULTISAMPLE);
-    size_t listNum = m_Symbol2DShapePointList.size();
-    PosVecf3 trans = {0.0f, 0.0f, 0.0f};
+    glPointSize(10.f);
+    PosVecf3 trans = {x/OPENGL_SCALE_VALUE, y/OPENGL_SCALE_VALUE, m_fZStep};
     PosVecf3 angle = {0.0f, 0.0f, 0.0f};
-    PosVecf3 scale = {1.0f, 1.0f, 1.0f};
+    PosVecf3 scale = {width/OPENGL_SCALE_VALUE, height/OPENGL_SCALE_VALUE, 1.0f};
     MoveModelf(trans, angle, scale);
     m_MVP = m_Projection * m_View * m_Model;
-    for (size_t i = 0; i < listNum; ++i)
-    {
-        PointList &pointList = m_Symbol2DShapePointList.back();
-        //fill vertex buffer
-        glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
-        glBufferData(GL_ARRAY_BUFFER, pointList.size() * sizeof(float), &pointList[0], GL_STATIC_DRAW);
-        // Use our shader
-        glUseProgram(m_CommonProID);
 
-        glUniform4fv(m_2DColorID, 1, &m_2DColor[0]);
+    float aPos[3] = { 0.f, 0.f, 0.f };
+    //fill vertex buffer
+    glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
+    glBufferData(GL_ARRAY_BUFFER, 3 * sizeof(float), aPos, GL_STATIC_DRAW);
 
-        glUniformMatrix4fv(m_MatrixID, 1, GL_FALSE, &m_MVP[0][0]);
+    // Use our shader
+    glUseProgram(m_SymbolProID);
 
-        // 1rst attribute buffer : vertices
-        glEnableVertexAttribArray(m_2DVertexID);
-        glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
-        glVertexAttribPointer(
-            m_2DVertexID,                  // attribute. No particular reason for 0, but must match the layout in the shader.
+    glUniform4fv(m_SymbolColorID, 1, &m_2DColor[0]);
+
+    glUniformMatrix4fv(m_SymbolMatrixID, 1, GL_FALSE, &m_MVP[0][0]);
+
+    // 1rst attribute buffer : vertices
+    glEnableVertexAttribArray(m_SymbolVertexID);
+    glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
+    glVertexAttribPointer(
+            m_SymbolVertexID,                  // attribute. No particular reason for 0, but must match the layout in the shader.
             3,                  // size
             GL_FLOAT,           // type
             GL_FALSE,           // normalized?
             0,                  // stride
             (void*)0            // array buffer offset
             );
-        glDrawArrays(GL_POLYGON, 0, pointList.size() / 3); // 12*3 indices starting at 0 -> 12 triangles
-        glDisableVertexAttribArray(m_2DVertexID);
-        glUseProgram(0);
-        m_Symbol2DShapePointList.pop_back();
-    }
+    glDrawArrays(GL_POINTS, 0, 1); // 12*3 indices starting at 0 -> 12 triangles
+
+    glDisableVertexAttribArray(m_SymbolVertexID);
+    glUseProgram(0);
     glEnable(GL_MULTISAMPLE);
+    glEnable(GL_POINT_SMOOTH);
     m_fZStep += 0.01f;
 
     CHECK_GL_ERROR();
diff --git a/chart2/source/view/main/OpenGLRender.hxx b/chart2/source/view/main/OpenGLRender.hxx
index 2faf556..76217ac 100755
--- a/chart2/source/view/main/OpenGLRender.hxx
+++ b/chart2/source/view/main/OpenGLRender.hxx
@@ -180,8 +180,7 @@ public:
     void GeneratePieSegment2D(double, double, double, double);
     int RenderPieSegment2DShape(float, float, float);
 
-    int SetSymbol2DShapePoint(float, float, int);
-    int RenderSymbol2DShape();
+    int RenderSymbol2DShape(float, float, float, float, sal_Int32);
 #if DEBUG_POSITIONING
     void renderDebug();
 #endif
@@ -306,6 +305,11 @@ private:
     PointList m_Symbol2DPointList;
     std::list<PointList> m_Symbol2DShapePointList;
 
+    GLuint m_SymbolProID;
+    GLuint m_SymbolVertexID;
+    GLuint m_SymbolMatrixID;
+    GLuint m_SymbolColorID;
+
 #if DEBUG_POSITIONING
     GLuint m_DebugProID;
     GLuint m_DebugVertexID;
commit a7b0b253f086cd8c5d7947d9e1d958263c18a3e3
Author: Peilin <peilin at multicorewareinc.com>
Date:   Thu Jan 23 02:49:10 2014 +0100

    add Symbol2D rendering
    
    Change-Id: Ic294ffc4bc675495fe83ac182dbebbba7245c7b9

diff --git a/chart2/Module_chart2.mk b/chart2/Module_chart2.mk
index f610a03..9d6e019 100644
--- a/chart2/Module_chart2.mk
+++ b/chart2/Module_chart2.mk
@@ -14,6 +14,7 @@ $(eval $(call gb_Module_add_targets,chart2,\
     Library_chartcore \
 	$(if $(filter LINUX FREEBSD WNT,$(OS)), \
 		Library_chartopengl \
+		Package_opengl \
 	) \
 ))
 
diff --git a/chart2/Package_opengl.mk b/chart2/Package_opengl.mk
new file mode 100644
index 0000000..499ca0c
--- /dev/null
+++ b/chart2/Package_opengl.mk
@@ -0,0 +1,29 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+$(eval $(call gb_Package_Package,chart2_opengl_shader,$(SRCDIR)/chart2/opengl))
+
+$(eval $(call gb_Package_set_outdir,chart2_opengl_shader,$(INSTDIR)/program))
+
+$(eval $(call gb_Package_add_files,chart2_opengl_shader,opengl,\
+	backgroundFragmentShader.glsl \
+	backgroundVertexShader.glsl \
+	commonFragmentShader.glsl \
+	commonVertexShader.glsl \
+	debugFragmentShader.glsl \
+	debugVertexShader.glsl \
+	renderFragmentShader.glsl \
+	renderVertexShader.glsl \
+	symbolFragmentShader.glsl \
+	symbolVertexShader.glsl \
+	textFragmentShader.glsl \
+	textVertexShader.glsl \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/chart2/opengl/backgroundFragmentShader.glsl b/chart2/opengl/backgroundFragmentShader.glsl
new file mode 100644
index 0000000..e772587
--- /dev/null
+++ b/chart2/opengl/backgroundFragmentShader.glsl
@@ -0,0 +1,6 @@
+varying vec4 fragmentColor;
+
+void main()
+{
+    gl_FragColor = fragmentColor;
+}
diff --git a/chart2/opengl/backgroundVertexShader.glsl b/chart2/opengl/backgroundVertexShader.glsl
new file mode 100644
index 0000000..2a3a341
--- /dev/null
+++ b/chart2/opengl/backgroundVertexShader.glsl
@@ -0,0 +1,10 @@
+attribute vec3 vPosition;
+uniform mat4 MVP;
+attribute vec4 vColor;
+varying vec4 fragmentColor;
+
+void main()
+{
+    gl_Position =  MVP * vec4(vPosition, 1);
+    fragmentColor = vColor;
+}
diff --git a/chart2/opengl/commonFragmentShader.glsl b/chart2/opengl/commonFragmentShader.glsl
new file mode 100644
index 0000000..e772587
--- /dev/null
+++ b/chart2/opengl/commonFragmentShader.glsl
@@ -0,0 +1,6 @@
+varying vec4 fragmentColor;
+
+void main()
+{
+    gl_FragColor = fragmentColor;
+}
diff --git a/chart2/opengl/commonVertexShader.glsl b/chart2/opengl/commonVertexShader.glsl
new file mode 100644
index 0000000..862a35b
--- /dev/null
+++ b/chart2/opengl/commonVertexShader.glsl
@@ -0,0 +1,10 @@
+attribute vec3 vPosition;
+uniform mat4 MVP;
+uniform vec4 vColor;
+varying vec4 fragmentColor;
+
+void main()
+{
+    gl_Position =  MVP * vec4(vPosition, 1);
+    fragmentColor = vColor;
+}
diff --git a/chart2/opengl/debugFragmentShader.glsl b/chart2/opengl/debugFragmentShader.glsl
new file mode 100644
index 0000000..ce7f863
--- /dev/null
+++ b/chart2/opengl/debugFragmentShader.glsl
@@ -0,0 +1,7 @@
+varying vec4 fragmentColor;
+
+void main()
+{
+    gl_FragColor = vec4(1.0, 1.0, 0.0, 0.5);
+}
+
diff --git a/chart2/opengl/debugVertexShader.glsl b/chart2/opengl/debugVertexShader.glsl
new file mode 100644
index 0000000..c0f3d03
--- /dev/null
+++ b/chart2/opengl/debugVertexShader.glsl
@@ -0,0 +1,9 @@
+attribute vec3 vPosition;
+uniform vec4 vColor;
+varying vec4 fragmentColor;
+
+void main()
+{
+    gl_Position = vec4(vPosition, 1);
+}
+
diff --git a/chart2/opengl/renderFragmentShader.glsl b/chart2/opengl/renderFragmentShader.glsl
new file mode 100644
index 0000000..dd08d9a
--- /dev/null
+++ b/chart2/opengl/renderFragmentShader.glsl
@@ -0,0 +1,7 @@
+uniform sampler2D RenderTex;
+varying vec2 vTexCoord;
+
+void main()
+{
+    gl_FragColor = vec4(texture2D(RenderTex, vTexCoord).rgb, 1.0);
+}
diff --git a/chart2/opengl/renderVertexShader.glsl b/chart2/opengl/renderVertexShader.glsl
new file mode 100644
index 0000000..1c9d3ce
--- /dev/null
+++ b/chart2/opengl/renderVertexShader.glsl
@@ -0,0 +1,9 @@
+attribute vec4 vPosition;
+attribute vec2 texCoord;
+varying vec2 vTexCoord;
+
+void main()
+{
+    gl_Position =  vPosition;
+    vTexCoord = texCoord;
+}
diff --git a/chart2/opengl/symbolFragmentShader.glsl b/chart2/opengl/symbolFragmentShader.glsl
new file mode 100644
index 0000000..c340be2
--- /dev/null
+++ b/chart2/opengl/symbolFragmentShader.glsl
@@ -0,0 +1,12 @@
+#version 130
+
+varying vec4 fragmentColor;
+
+void main()
+{
+    vec2 p = gl_PointCoord * 2.0 - vec2(1.0); // (0,0) in the center
+    if (abs(p.x) < abs(p.y))
+        discard;
+
+    gl_FragColor = fragmentColor;
+}
diff --git a/chart2/opengl/symbolVertexShader.glsl b/chart2/opengl/symbolVertexShader.glsl
new file mode 100644
index 0000000..6aef1e8
--- /dev/null
+++ b/chart2/opengl/symbolVertexShader.glsl
@@ -0,0 +1,13 @@
+#version 130
+
+attribute vec3 vPosition;
+uniform mat4 MVP;
+uniform vec4 vColor;
+varying vec4 fragmentColor;
+
+void main()
+{
+    gl_Position =  MVP * vec4(vPosition, 1);
+    fragmentColor = vColor;
+    gl_PointSize = 10.0;
+}
diff --git a/chart2/opengl/textFragmentShader.glsl b/chart2/opengl/textFragmentShader.glsl
new file mode 100644
index 0000000..83d0d82
--- /dev/null
+++ b/chart2/opengl/textFragmentShader.glsl
@@ -0,0 +1,6 @@
+uniform sampler2D TextTex;
+varying vec2 vTexCoord;
+void main()
+{
+    gl_FragColor = vec4(texture2D(TextTex, vTexCoord).rgba);
+}
diff --git a/chart2/opengl/textVertexShader.glsl b/chart2/opengl/textVertexShader.glsl
new file mode 100644
index 0000000..013f43c
--- /dev/null
+++ b/chart2/opengl/textVertexShader.glsl
@@ -0,0 +1,9 @@
+attribute vec3 vPosition;
+uniform mat4 MVP;
+attribute vec2 texCoord;
+varying vec2 vTexCoord;
+void main()
+{
+    gl_Position =  MVP * vec4(vPosition, 1);
+    vTexCoord = texCoord;
+}
diff --git a/chart2/source/view/inc/DummyXShape.hxx b/chart2/source/view/inc/DummyXShape.hxx
index 9b3eed2..2916aae 100644
--- a/chart2/source/view/inc/DummyXShape.hxx
+++ b/chart2/source/view/inc/DummyXShape.hxx
@@ -311,9 +311,13 @@ class DummySymbol2D : public DummyXShape
 public:
     DummySymbol2D(const drawing::Position3D& rPosition, const drawing::Direction3D& rSize,
             sal_Int32 nStandardSymbol, sal_Int32 nBorderColor, sal_Int32 nFillColor);
-
+    void render();
 private:
+    drawing::Position3D mrPosition;
+    drawing::Direction3D mrSize;
     sal_Int32 mnStandardSymbol;
+    sal_Int32 mnBorderColor;
+    sal_Int32 mnFillColor;
 };
 
 class DummyGraphic2D : public DummyXShape
diff --git a/chart2/source/view/main/DummyXShape.cxx b/chart2/source/view/main/DummyXShape.cxx
index 6213d8d..4779c0f 100644
--- a/chart2/source/view/main/DummyXShape.cxx
+++ b/chart2/source/view/main/DummyXShape.cxx
@@ -17,7 +17,9 @@
 #include <stdlib.h>
 #include <string.h>
 
+
 #include "CommonConverters.hxx"
+
 #include <rtl/ustring.hxx>
 
 #include <vcl/window.hxx>
@@ -39,6 +41,25 @@ using namespace com::sun::star;
 
 using namespace std;
 
+enum SymbolEnum { Symbol_Square=0
+                 , Symbol_Diamond
+                 , Symbol_DownArrow
+                 , Symbol_UpArrow
+                 , Symbol_RightArrow
+                 , Symbol_LeftArrow
+                 , Symbol_Bowtie
+                 , Symbol_Sandglass
+                 , Symbol_Circle
+                 , Symbol_Star
+                 , Symbol_X
+                 , Symbol_Plus
+                 , Symbol_Asterisk
+                 , Symbol_HorizontalBar
+                 , Symbol_VerticalBar
+                 , Symbol_COUNT
+};
+
+
 namespace chart {
 
 namespace dummy {
@@ -431,11 +452,539 @@ void DummyArea2D::render()
 }
 
 DummySymbol2D::DummySymbol2D(const drawing::Position3D& rPos, const drawing::Direction3D& rSize,
-        sal_Int32 nStandardSymbol, sal_Int32 , sal_Int32 ):
-    mnStandardSymbol(nStandardSymbol)
+        sal_Int32 nStandardSymbol, sal_Int32 nBorderColor, sal_Int32 nFillColor):
+    mrPosition(rPos),
+    mrSize(rSize),
+    mnStandardSymbol(nStandardSymbol),
+    mnBorderColor(nBorderColor),
+    mnFillColor(nFillColor)
 {
-    setPosition(Position3DToAWTPoint(rPos));
-    setSize(Direction3DToAWTSize(rSize));
+    //setPosition(Position3DToAWTPoint(rPos));
+    //setSize(Direction3DToAWTSize(rSize));
+}
+drawing::PolyPolygonShape3D oglCreatePolyPolygon_Symbol( const drawing::Position3D& rPos
+                                 , const drawing::Direction3D& rSize
+                                 , sal_Int32 nStandardSymbol )
+{
+    printf("***  createPolyPolygon_Symbol\n");
+    if(nStandardSymbol<0)
+        nStandardSymbol*=-1;
+    nStandardSymbol = nStandardSymbol%Symbol_COUNT;
+    SymbolEnum eSymbolType=static_cast<SymbolEnum>(nStandardSymbol);
+
+    const double& fX = rPos.PositionX;
+    const double& fY = rPos.PositionY;
+
+    const double fWidthH  = rSize.DirectionX/2.0; //fWidthH stands for Half Width
+    const double fHeightH = rSize.DirectionY/2.0; //fHeightH stands for Half Height
+
+    const sal_Int32 nQuarterCount = 35; // points inside a quadrant, used in case circle
+
+    sal_Int32 nPointCount = 4; //all arrow symbols only need 4 points
+    switch( eSymbolType )
+    {
+        case Symbol_Square:
+        case Symbol_Diamond:
+        case Symbol_Bowtie:
+        case Symbol_Sandglass:
+        case Symbol_HorizontalBar:
+        case Symbol_VerticalBar:
+            nPointCount = 5;
+            break;
+        case Symbol_X:
+            nPointCount = 13;
+            break;
+        case Symbol_Plus:
+            nPointCount = 13;
+            break;
+        case Symbol_Star:
+            nPointCount = 9;
+            break;
+        case Symbol_Asterisk:
+            nPointCount = 19;
+            break;
+        case Symbol_Circle:
+            nPointCount = 5 + 4 * nQuarterCount;
+            break;
+        default:
+            break;
+    }
+
+    drawing::PolyPolygonShape3D aPP;
+
+    aPP.SequenceX.realloc(1);
+    aPP.SequenceY.realloc(1);
+    aPP.SequenceZ.realloc(1);
+
+    drawing::DoubleSequence* pOuterSequenceX = aPP.SequenceX.getArray();
+    drawing::DoubleSequence* pOuterSequenceY = aPP.SequenceY.getArray();
+    drawing::DoubleSequence* pOuterSequenceZ = aPP.SequenceZ.getArray();
+
+    pOuterSequenceX->realloc(nPointCount);
+    pOuterSequenceY->realloc(nPointCount);
+    pOuterSequenceZ->realloc(nPointCount);
+
+    double* pInnerSequenceX = pOuterSequenceX->getArray();
+    double* pInnerSequenceY = pOuterSequenceY->getArray();
+    double* pInnerSequenceZ = pOuterSequenceZ->getArray();
+
+    for(sal_Int32 nN = nPointCount; nN--;)
+        *pInnerSequenceZ++ = 0.0;
+
+    switch(eSymbolType)
+    {
+        case Symbol_Square:
+        {
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY+fHeightH;
+
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY+fHeightH;
+
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY-fHeightH;
+            break;
+        }
+        case Symbol_UpArrow:
+        {
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY+fHeightH;
+
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY+fHeightH;
+
+            *pInnerSequenceX++ = fX;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY+fHeightH;
+            break;
+        }
+        case Symbol_DownArrow:
+        {
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            *pInnerSequenceX++ = fX;
+            *pInnerSequenceY++ = fY+fHeightH;
+
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY-fHeightH;
+            break;
+        }
+        case Symbol_RightArrow:
+        {
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY+fHeightH;
+
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY;
+
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY-fHeightH;
+            break;
+        }
+        case Symbol_LeftArrow:
+        {
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY;
+
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY+fHeightH;
+
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY;
+            break;
+        }
+        case Symbol_Bowtie:
+        {
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY+fHeightH;
+
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY+fHeightH;
+
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY-fHeightH;
+            break;
+        }
+        case Symbol_Sandglass:
+        {
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY+fHeightH;
+
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY+fHeightH;
+
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY+fHeightH;
+            break;
+        }
+        case Symbol_Diamond:
+        {
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY;
+
+            *pInnerSequenceX++ = fX;
+            *pInnerSequenceY++ = fY+fHeightH;
+
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY;
+
+            *pInnerSequenceX++ = fX;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY;
+            break;
+        }
+        case Symbol_HorizontalBar:
+        {
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY-0.2*fHeightH;
+
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY-0.2*fHeightH;
+
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY+0.2*fHeightH;
+
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY+0.2*fHeightH;
+
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY-0.2*fHeightH;
+            break;
+        }
+        case Symbol_VerticalBar:
+        {
+            *pInnerSequenceX++ = fX-0.2*fWidthH;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            *pInnerSequenceX++ = fX+0.2*fWidthH;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            *pInnerSequenceX++ = fX+0.2*fWidthH;
+            *pInnerSequenceY++ = fY+fHeightH;
+
+            *pInnerSequenceX++ = fX-0.2*fWidthH;
+            *pInnerSequenceY++ = fY+fHeightH;
+
+            *pInnerSequenceX++ = fX-0.2*fWidthH;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            break;
+        }
+        case Symbol_Circle:
+        {
+            double fOmega = 1.5707963267948966192 / (nQuarterCount + 1.0);
+            // one point in the middle of each edge to get full size bounding rectangle
+            *pInnerSequenceX++ = fX + fWidthH;
+            *pInnerSequenceY++ = fY;
+            // 0 to PI/2
+            for (sal_Int32 i = 1; i <= nQuarterCount; ++i)
+            {
+                *pInnerSequenceX++ = fX + fWidthH * cos( i * fOmega );
+                *pInnerSequenceY++ = fY - fHeightH * sin( i * fOmega );
+            }
+            // PI/2 to PI
+            *pInnerSequenceX++ = fX;
+            *pInnerSequenceY++ = fY - fHeightH;
+            for (sal_Int32 i = 1; i <= nQuarterCount; ++i)
+            {
+                *pInnerSequenceX++ = fX - fWidthH * sin( i * fOmega);
+                *pInnerSequenceY++ = fY - fHeightH * cos( i * fOmega);
+            }
+            // PI to 3/2*PI
+            *pInnerSequenceX++ = fX - fWidthH;
+            *pInnerSequenceY++ = fY;
+            for (sal_Int32 i = 1; i <= nQuarterCount; ++i)
+            {
+                *pInnerSequenceX++ = fX - fWidthH * cos( i * fOmega);
+                *pInnerSequenceY++ = fY + fHeightH * sin( i * fOmega);
+            }
+            // 3/2*PI to 2*PI
+            *pInnerSequenceX++ = fX;
+            *pInnerSequenceY++ = fY + fHeightH;
+            for (sal_Int32 i = 1; i <= nQuarterCount; ++i)
+            {
+                *pInnerSequenceX++ = fX + fWidthH * sin(i * fOmega);
+                *pInnerSequenceY++ = fY + fHeightH * cos(i * fOmega);
+            }
+            // close polygon
+            *pInnerSequenceX++ = fX + fWidthH;
+            *pInnerSequenceY++ = fY;
+            break;
+        }
+        case Symbol_Star:
+        {
+            *pInnerSequenceX++ = fX;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            *pInnerSequenceX++ = fX+0.2*fWidthH;
+            *pInnerSequenceY++ = fY-0.2*fHeightH;
+
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY;
+
+            *pInnerSequenceX++ = fX+0.2*fWidthH;
+            *pInnerSequenceY++ = fY+0.2*fHeightH;
+
+            *pInnerSequenceX++ = fX;
+            *pInnerSequenceY++ = fY+fHeightH;
+
+            *pInnerSequenceX++ = fX-0.2*fWidthH;
+            *pInnerSequenceY++ = fY+0.2*fHeightH;
+
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY;
+
+            *pInnerSequenceX++ = fX-0.2*fWidthH;
+            *pInnerSequenceY++ = fY-0.2*fHeightH;
+
+            *pInnerSequenceX++ = fX;
+            *pInnerSequenceY++ = fY-fHeightH;
+            break;
+        }
+        case Symbol_X:
+        {
+            const double fScaleX = fWidthH / 128.0;
+            const double fScaleY = fHeightH / 128.0;
+            const double fSmall = sqrt(200.0);
+            const double fLarge = 128.0 - fSmall;
+
+            *pInnerSequenceX++ = fX;
+            *pInnerSequenceY++ = fY - fScaleY * fSmall;
+
+            *pInnerSequenceX++ = fX - fScaleX * fLarge;
+            *pInnerSequenceY++ = fY - fHeightH;
+
+            *pInnerSequenceX++ = fX - fWidthH;
+            *pInnerSequenceY++ = fY - fScaleY * fLarge;
+
+            *pInnerSequenceX++ = fX - fScaleX * fSmall;
+            *pInnerSequenceY++ = fY;
+
+            *pInnerSequenceX++ = fX - fWidthH;
+            *pInnerSequenceY++ = fY + fScaleY * fLarge;
+
+            *pInnerSequenceX++ = fX - fScaleX * fLarge;
+            *pInnerSequenceY++ = fY + fHeightH;
+
+            *pInnerSequenceX++ = fX;
+            *pInnerSequenceY++ = fY + fScaleY * fSmall;
+
+            *pInnerSequenceX++ = fX + fScaleX * fLarge;
+            *pInnerSequenceY++ = fY + fHeightH;
+
+            *pInnerSequenceX++ = fX + fWidthH;
+            *pInnerSequenceY++ = fY + fScaleY * fLarge;
+
+            *pInnerSequenceX++ = fX + fScaleX * fSmall;
+            *pInnerSequenceY++ = fY;
+
+            *pInnerSequenceX++ = fX + fWidthH;
+            *pInnerSequenceY++ = fY - fScaleY * fLarge;
+
+            *pInnerSequenceX++ = fX + fScaleX * fLarge;
+            *pInnerSequenceY++ = fY - fHeightH;
+
+            *pInnerSequenceX++ = fX;
+            *pInnerSequenceY++ = fY - fScaleY * fSmall;
+            break;
+
+        }
+        case Symbol_Plus:
+        {
+            const double fScaleX = fWidthH / 128.0;
+            const double fScaleY = fHeightH / 128.0;
+            const double fHalf = 10.0; //half line width on 256 size square
+            const double fdX = fScaleX * fHalf;
+            const double fdY = fScaleY * fHalf;
+
+            *pInnerSequenceX++ = fX-fdX;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            *pInnerSequenceX++ = fX-fdX;
+            *pInnerSequenceY++ = fY-fdY;
+
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY-fdY;
+
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY+fdY;
+
+            *pInnerSequenceX++ = fX-fdX;
+            *pInnerSequenceY++ = fY+fdY;
+
+            *pInnerSequenceX++ = fX-fdX;
+            *pInnerSequenceY++ = fY+fHeightH;
+
+            *pInnerSequenceX++ = fX+fdX;
+            *pInnerSequenceY++ = fY+fHeightH;
+
+            *pInnerSequenceX++ = fX+fdX;
+            *pInnerSequenceY++ = fY+fdY;
+
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY+fdY;
+
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY-fdY;
+
+            *pInnerSequenceX++ = fX+fdX;
+            *pInnerSequenceY++ = fY-fdY;
+
+            *pInnerSequenceX++ = fX+fdY;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            *pInnerSequenceX++ = fX-fdX;
+            *pInnerSequenceY++ = fY-fHeightH;
+            break;
+
+        }
+        case Symbol_Asterisk:
+        {
+            const double fHalf = 10.0; // half line width on 256 size square
+            const double fTwoY = fHalf * sqrt(3.0);
+            const double fFourY = (128.0 - 2.0 * fHalf ) / sqrt(3.0);
+            const double fThreeX = 128.0 - fHalf;
+            const double fThreeY = fHalf * sqrt(3.0) + fFourY;
+            const double fFiveX = 2.0 * fHalf;
+
+            const double fScaleX = fWidthH / 128.0;
+            const double fScaleY = fHeightH / 128.0;
+
+            //1
+            *pInnerSequenceX++ = fX-fScaleX * fHalf;
+            *pInnerSequenceY++ = fY-fHeightH;
+            //2
+            *pInnerSequenceX++ = fX-fScaleX * fHalf;
+            *pInnerSequenceY++ = fY-fScaleY * fTwoY;
+            //3
+            *pInnerSequenceX++ = fX-fScaleX * fThreeX;
+            *pInnerSequenceY++ = fY-fScaleY * fThreeY;
+            //4
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY-fScaleY * fFourY;
+            //5
+            *pInnerSequenceX++ = fX-fScaleX * fFiveX;
+            *pInnerSequenceY++ = fY;
+            //6 as 4
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY+fScaleY * fFourY;
+            //7 as 3
+            *pInnerSequenceX++ = fX-fScaleX * fThreeX;
+            *pInnerSequenceY++ = fY+fScaleY * fThreeY;
+            //8 as 2
+            *pInnerSequenceX++ = fX-fScaleX * fHalf;
+            *pInnerSequenceY++ = fY+fScaleY * fTwoY;
+            //9 as 1
+            *pInnerSequenceX++ = fX-fScaleX * fHalf;
+            *pInnerSequenceY++ = fY+fHeightH;
+            //10 as 1
+            *pInnerSequenceX++ = fX+fScaleX * fHalf;
+            *pInnerSequenceY++ = fY+fHeightH;
+            //11 as 2
+            *pInnerSequenceX++ = fX+fScaleX * fHalf;
+            *pInnerSequenceY++ = fY+fScaleY * fTwoY;
+            //12 as 3
+            *pInnerSequenceX++ = fX+fScaleX * fThreeX;
+            *pInnerSequenceY++ = fY+fScaleY * fThreeY;
+            //13 as 4
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY+fScaleY * fFourY;
+            //14 as 5
+            *pInnerSequenceX++ = fX+fScaleX * fFiveX;
+            *pInnerSequenceY++ = fY;
+            //15 as 4
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY-fScaleY * fFourY;
+            //16 as 3
+            *pInnerSequenceX++ = fX+fScaleX * fThreeX;
+            *pInnerSequenceY++ = fY-fScaleY * fThreeY;
+            //17 as 2
+            *pInnerSequenceX++ = fX+fScaleX * fHalf;
+            *pInnerSequenceY++ = fY-fScaleY * fTwoY;
+            // 18 as 1
+            *pInnerSequenceX++ = fX+fScaleX * fHalf;
+            *pInnerSequenceY++ = fY-fHeightH;
+            // 19 = 1, closing
+            *pInnerSequenceX++ = fX-fScaleX * fHalf;
+            *pInnerSequenceY++ = fY-fHeightH;
+            break;
+        }
+        default: //case Symbol_Square:
+        {
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY+fHeightH;
+
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY+fHeightH;
+
+            *pInnerSequenceX++ = fX+fWidthH;
+            *pInnerSequenceY++ = fY-fHeightH;
+
+            *pInnerSequenceX++ = fX-fWidthH;
+            *pInnerSequenceY++ = fY-fHeightH;
+            break;
+        }
+    }
+
+    return aPP;
+}
+
+void DummySymbol2D::render()
+{
+    DummyChart* pChart = getRootShape();
+
+    pChart->m_GLRender.SetColor(mnFillColor);
+
+    drawing::PointSequenceSequence aPointss( PolyToPointSequence(
+                oglCreatePolyPolygon_Symbol( mrPosition, mrSize, mnStandardSymbol ) ));
+
+    sal_Int32 nPointssCount = aPointss.getLength();
+    for(sal_Int32 i = 0; i < nPointssCount; i++)
+    {
+        const com::sun::star::uno::Sequence<com::sun::star::awt::Point>& points = aPointss[i];
+        sal_Int32 nPointsCount = points.getLength();
+        for(sal_Int32 j = 0; j < nPointsCount; j++)
+        {
+            const com::sun::star::awt::Point& p = points[j];
+            pChart->m_GLRender.SetSymbol2DShapePoint((float)p.X, (float)p.Y, nPointsCount);
+        }
+    }
+    pChart->m_GLRender.RenderSymbol2DShape();
 }
 
 DummyCircle::DummyCircle(const awt::Point& rPos, const awt::Size& rSize)
diff --git a/chart2/source/view/main/OpenGLRender.cxx b/chart2/source/view/main/OpenGLRender.cxx
index 980c074..49ab3ea 100755
--- a/chart2/source/view/main/OpenGLRender.cxx
+++ b/chart2/source/view/main/OpenGLRender.cxx
@@ -36,6 +36,10 @@
 #include <vcl/virdev.hxx>
 #include <vcl/dibtools.hxx>
 
+#include <osl/file.hxx>
+#include <rtl/bootstrap.hxx>
+#include <config_folders.h>
+
 #include <boost/scoped_array.hpp>
 
 using namespace com::sun::star;
@@ -51,8 +55,6 @@ using namespace std;
 #include <vcl/pngwrite.hxx>
 #endif
 
-#define OPENGL_SHADER( ... )# __VA_ARGS__
-
 #define GL_PI 3.14159f
 
 #if defined( _WIN32 )
@@ -60,140 +62,6 @@ using namespace std;
 #define WGL_SAMPLES_ARB          0x2042
 #endif
 
-//begin shaders
-
-#if DEBUG_POSITIONING
-
-const char* DebugVertexShader = OPENGL_SHADER (
-
-attribute vec3 vPosition;
-uniform vec4 vColor;
-varying vec4 fragmentColor;
-
-void main()
-{
-    gl_Position = vec4(vPosition, 1);
-}
-
-);
-
-const char* DebugFragmentShader = OPENGL_SHADER (
-
-varying vec4 fragmentColor;
-
-void main()
-{
-    gl_FragColor = vec4(1.0, 1.0, 0.0, 0.5);
-}
-
-);
-
-#endif
-
-const char *CommonFragmemtShader = OPENGL_SHADER (
-
-varying vec4 fragmentColor;
-
-void main()
-{
-    gl_FragColor = fragmentColor;
-}
-
-);
-
-const char *CommonVertexShader = OPENGL_SHADER (
-
-attribute vec3 vPosition;
-uniform mat4 MVP;
-uniform vec4 vColor;
-varying vec4 fragmentColor;
-
-void main()
-{
-    gl_Position =  MVP * vec4(vPosition, 1);
-    fragmentColor = vColor;
-}
-
-);
-
-
-const char *BackgroundFragmemtShader = OPENGL_SHADER (
-
-varying vec4 fragmentColor;
-
-void main()
-{
-    gl_FragColor = fragmentColor;
-}
-
-);
-
-const char *BackgroundVertexShader = OPENGL_SHADER (
-
-attribute vec3 vPosition;
-uniform mat4 MVP;
-attribute vec4 vColor;
-varying vec4 fragmentColor;
-
-void main()
-{
-    gl_Position =  MVP * vec4(vPosition, 1);
-    fragmentColor = vColor;
-}
-
-);
-
-
-const char *RenderFragmentShader = OPENGL_SHADER (
-
-uniform sampler2D RenderTex;
-varying vec2 vTexCoord;
-
-void main()
-{
-    gl_FragColor = vec4(texture2D(RenderTex, vTexCoord).rgb, 1.0);
-}
-
-);
-
-const char *RenderVertexShader = OPENGL_SHADER (
-
-attribute vec4 vPosition;
-attribute vec2 texCoord;
-varying vec2 vTexCoord;
-
-void main()
-{
-    gl_Position =  vPosition;
-    vTexCoord = texCoord;
-}
-
-);
-
-const char *TextFragmentShader = OPENGL_SHADER (
-uniform sampler2D TextTex;
-varying vec2 vTexCoord;
-void main()
-{
-    gl_FragColor = vec4(texture2D(TextTex, vTexCoord).rgba);
-}
-
-);
-
-const char *TextVertexShader = OPENGL_SHADER (
-
-attribute vec3 vPosition;
-uniform mat4 MVP;
-attribute vec2 texCoord;
-varying vec2 vTexCoord;
-void main()
-{
-    gl_Position =  MVP * vec4(vPosition, 1);
-    vTexCoord = texCoord;
-}
-
-);
-
 // end shaders
 
 static GLfloat squareVertices[] = {
@@ -321,7 +189,46 @@ int static checkGLError(const char *file, int line)
         return -1;\
     }
 
-GLint OpenGLRender::LoadShaders(const char *vertexShader,const char *fragmentShader)
+namespace {
+
+OUString getShaderFolder()
+{
+    OUString aUrl("$BRAND_BASE_DIR/" LIBO_ETC_FOLDER);
+    rtl::Bootstrap::expandMacros(aUrl);
+
+    return aUrl + "/opengl/";
+}
+
+OUString maShaderFolder = getShaderFolder();
+
+OString loadShader(const OUString& rFilename)
+{
+    OUString aFileURL = maShaderFolder + rFilename +".glsl";
+    osl::File aFile(aFileURL);
+    if(aFile.open(osl_File_OpenFlag_Read) == osl::FileBase::E_None)
+    {
+        sal_uInt64 nSize = 0;
+        aFile.getSize(nSize);
+        char* content = new char[nSize+1];
+        sal_uInt64 nBytesRead = 0;
+        aFile.read(content, nSize, nBytesRead);
+        if(nSize != nBytesRead)
+            assert(false);
+
+        content[nSize] = 0;
+        return OString(content);
+    }
+    else
+    {
+        SAL_WARN("chart2.opengl", "could not load the file: " << aFileURL);
+    }
+
+    return OString();
+}
+
+}
+
+GLint OpenGLRender::LoadShaders(const OUString& rVertexShaderName,const OUString& rFragmentShaderName)
 {
     // Create the shaders
     GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER);
@@ -331,7 +238,8 @@ GLint OpenGLRender::LoadShaders(const char *vertexShader,const char *fragmentSha
     int InfoLogLength;
 
     // Compile Vertex Shader
-    char const * VertexSourcePointer = vertexShader;
+    OString aVertexShaderSource = loadShader(rVertexShaderName);
+    char const * VertexSourcePointer = aVertexShaderSource.getStr();
     glShaderSource(VertexShaderID, 1, &VertexSourcePointer , NULL);
     glCompileShader(VertexShaderID);
 
@@ -354,7 +262,8 @@ GLint OpenGLRender::LoadShaders(const char *vertexShader,const char *fragmentSha
     }
 
     // Compile Fragment Shader
-    char const * FragmentSourcePointer = fragmentShader;
+    OString aFragmentShaderSource = loadShader(rFragmentShaderName);
+    char const * FragmentSourcePointer = aFragmentShaderSource.getStr();
     glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer , NULL);
     glCompileShader(FragmentShaderID);
 
@@ -453,29 +362,29 @@ int OpenGLRender::InitOpenGL(GLWindow aWindow)
     glGenBuffers(1, &m_VertexBuffer);
     glGenBuffers(1, &m_ColorBuffer);
 
-    m_RenderProID = LoadShaders(RenderVertexShader, RenderFragmentShader);
+    m_RenderProID = LoadShaders("renderVertexShader", "renderFragmentShader");
     m_RenderVertexID = glGetAttribLocation(m_RenderProID, "vPosition");
     m_RenderTexCoordID = glGetAttribLocation(m_RenderProID, "texCoord");
     m_RenderTexID = glGetUniformLocation(m_RenderProID, "RenderTex");
 
-    m_CommonProID = LoadShaders(CommonVertexShader, CommonFragmemtShader);
+    m_CommonProID = LoadShaders("commonVertexShader", "commonFragmentShader");
     m_MatrixID = glGetUniformLocation(m_CommonProID, "MVP");
     m_2DVertexID = glGetAttribLocation(m_CommonProID, "vPosition");
     m_2DColorID = glGetUniformLocation(m_CommonProID, "vColor");
     CHECK_GL_ERROR();
 
 #if DEBUG_POSITIONING
-    m_DebugProID = LoadShaders(DebugVertexShader, DebugFragmentShader);
+    m_DebugProID = LoadShaders("debugVertexShader", "debugFragmentShader");
     m_DebugVertexID = glGetAttribLocation(m_DebugProID, "vPosition");
 #endif
     CHECK_GL_ERROR();
 
-    m_BackgroundProID = LoadShaders(BackgroundVertexShader, BackgroundFragmemtShader);
+    m_BackgroundProID = LoadShaders("backgroundVertexShader", "backgroundFragmentShader");
     m_BackgroundMatrixID = glGetUniformLocation(m_BackgroundProID, "MVP");
     m_BackgroundVertexID = glGetAttribLocation(m_BackgroundProID, "vPosition");
     m_BackgroundColorID = glGetAttribLocation(m_BackgroundProID, "vColor");
 
-    m_TextProID = LoadShaders(TextVertexShader, TextFragmentShader);
+    m_TextProID = LoadShaders("textVertexShader", "textFragmentShader");
     m_TextMatrixID = glGetUniformLocation(m_TextProID, "MVP");
     m_TextVertexID = glGetAttribLocation(m_TextProID, "vPosition");
     m_TextTexCoordID = glGetAttribLocation(m_TextProID, "texCoord");
@@ -1811,5 +1720,73 @@ int OpenGLRender::RenderPieSegment2DShape(float fSize, float fPosX, float fPosY)
     CHECK_GL_ERROR();
     return 0;
 }
+int OpenGLRender::SetSymbol2DShapePoint(float x, float y, int listLength)
+{
+    if (m_Symbol2DPointList.empty())
+    {
+        m_Symbol2DPointList.reserve(listLength);
+    }
+    float actualX = (x / OPENGL_SCALE_VALUE);
+    float actualY = (y / OPENGL_SCALE_VALUE);
+    m_Symbol2DPointList.push_back(actualX);
+    m_Symbol2DPointList.push_back(actualY);
+    m_Symbol2DPointList.push_back(m_fZStep);
+
+    if (m_Symbol2DPointList.size() == size_t(listLength * 3))
+    {
+        m_Symbol2DShapePointList.push_back(m_Symbol2DPointList);
+        m_Symbol2DPointList.clear();
+    }
+    return 0;
+}
+
+int OpenGLRender::RenderSymbol2DShape()
+{
+    CHECK_GL_ERROR();
+
+    glDisable(GL_MULTISAMPLE);
+    size_t listNum = m_Symbol2DShapePointList.size();
+    PosVecf3 trans = {0.0f, 0.0f, 0.0f};
+    PosVecf3 angle = {0.0f, 0.0f, 0.0f};
+    PosVecf3 scale = {1.0f, 1.0f, 1.0f};
+    MoveModelf(trans, angle, scale);
+    m_MVP = m_Projection * m_View * m_Model;
+    for (size_t i = 0; i < listNum; ++i)
+    {
+        PointList &pointList = m_Symbol2DShapePointList.back();
+        //fill vertex buffer
+        glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
+        glBufferData(GL_ARRAY_BUFFER, pointList.size() * sizeof(float), &pointList[0], GL_STATIC_DRAW);
+        // Use our shader
+        glUseProgram(m_CommonProID);
+
+        glUniform4fv(m_2DColorID, 1, &m_2DColor[0]);
+
+        glUniformMatrix4fv(m_MatrixID, 1, GL_FALSE, &m_MVP[0][0]);
+
+        // 1rst attribute buffer : vertices
+        glEnableVertexAttribArray(m_2DVertexID);
+        glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
+        glVertexAttribPointer(
+            m_2DVertexID,                  // attribute. No particular reason for 0, but must match the layout in the shader.
+            3,                  // size
+            GL_FLOAT,           // type
+            GL_FALSE,           // normalized?
+            0,                  // stride
+            (void*)0            // array buffer offset
+            );
+        glDrawArrays(GL_POLYGON, 0, pointList.size() / 3); // 12*3 indices starting at 0 -> 12 triangles
+        glDisableVertexAttribArray(m_2DVertexID);
+        glUseProgram(0);
+        m_Symbol2DShapePointList.pop_back();
+    }
+    glEnable(GL_MULTISAMPLE);
+    m_fZStep += 0.01f;
+
+    CHECK_GL_ERROR();
+
+    return 0;
+}
+
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/view/main/OpenGLRender.hxx b/chart2/source/view/main/OpenGLRender.hxx
index 21a05cb..2faf556 100755
--- a/chart2/source/view/main/OpenGLRender.hxx
+++ b/chart2/source/view/main/OpenGLRender.hxx
@@ -101,6 +101,7 @@ typedef struct TextInfo
 
 typedef std::vector<GLfloat> Area2DPointList;
 typedef std::vector<GLfloat> PieSegment2DPointList;
+typedef std::vector<GLfloat> PointList;
 
 /// Holds the information of our new child window
 struct GLWindow
@@ -178,6 +179,9 @@ public:
 
     void GeneratePieSegment2D(double, double, double, double);
     int RenderPieSegment2DShape(float, float, float);
+
+    int SetSymbol2DShapePoint(float, float, int);
+    int RenderSymbol2DShape();
 #if DEBUG_POSITIONING
     void renderDebug();
 #endif
@@ -185,7 +189,7 @@ public:
     void SetBackGroundColor(sal_uInt32 color1, sal_uInt32 color2);
 
 private:
-    GLint LoadShaders(const char *vertexShader,const char *fragmentShader);
+    GLint LoadShaders(const OUString& rVertexShaderName, const OUString& rFragmentShaderName);
     int CreateTextureObj(int width, int height);
     int CreateRenderObj(int width, int height);
     int CreateFrameBufferObj();
@@ -203,7 +207,7 @@ private:
     glm::mat4 m_Projection;
     // Camera matrix
     glm::mat4 m_View;
-    // Model matrix : an identity matrix (model will be at the origin)
+    // Model matrix : an identity matrix (model will be at the origin#elif defined( UNX )
     glm::mat4 m_Model;
     // Our ModelViewProjection : multiplication of our 3 matrices
     glm::mat4 m_MVP;
@@ -299,6 +303,8 @@ private:
     glm::vec4 m_ClearColor;
 
     std::list <PieSegment2DPointList> m_PieSegment2DShapePointList;
+    PointList m_Symbol2DPointList;
+    std::list<PointList> m_Symbol2DShapePointList;
 
 #if DEBUG_POSITIONING
     GLuint m_DebugProID;
commit 06f4573a87d861c50c0017702aed75a389619b46
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date:   Wed Jan 22 06:20:18 2014 +0100

    enable transparency again
    
    Change-Id: I5c3464995f3ef6bfe6c4e6895fa9f73e801a31b5

diff --git a/chart2/source/view/main/DummyXShape.cxx b/chart2/source/view/main/DummyXShape.cxx
index 51b2bcc..6213d8d 100644
--- a/chart2/source/view/main/DummyXShape.cxx
+++ b/chart2/source/view/main/DummyXShape.cxx
@@ -354,14 +354,12 @@ void DummyPieSegment2D::render()
         sal_Int32 nColor = itr->second.get<sal_Int32>();
         pChart->m_GLRender.SetColor(nColor);
     }
-    /*
     itr = maProperties.find(UNO_NAME_FILL_TRANSPARENCE);
     if(itr != maProperties.end())
     {
         sal_Int32 transparency = itr->second.get<sal_Int32>();
-        pChart->m_GLRender.SetTransparency(transparency&(0xFF));
+        pChart->m_GLRender.SetTransparency(255-(transparency&(0xFF)));
     }
-    */
 
     float nSize = std::max<float>(maUnitCircleToScene.Line1.Column1, maUnitCircleToScene.Line2.Column2);
     pChart->m_GLRender.RenderPieSegment2DShape(nSize, maUnitCircleToScene.Line1.Column4 + maOffset.DirectionX,
diff --git a/chart2/source/view/main/OpenGLRender.cxx b/chart2/source/view/main/OpenGLRender.cxx
index e570a9e..980c074 100755
--- a/chart2/source/view/main/OpenGLRender.cxx
+++ b/chart2/source/view/main/OpenGLRender.cxx
@@ -1806,7 +1806,6 @@ int OpenGLRender::RenderPieSegment2DShape(float fSize, float fPosX, float fPosY)
         CHECK_GL_ERROR();
 
     }
-    glEnable(GL_MULTISAMPLE);
     m_fZStep += 0.01f;
 
     CHECK_GL_ERROR();
commit 070bab44fb97e08f6e9b694b95c6924c3487cb37
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date:   Wed Jan 22 06:01:31 2014 +0100

    improve pie segment rendering
    
    Change-Id: I57c213420718f2be338b94459c6273fbfcb32881

diff --git a/chart2/source/view/main/DummyXShape.cxx b/chart2/source/view/main/DummyXShape.cxx
index 4788390..51b2bcc 100644
--- a/chart2/source/view/main/DummyXShape.cxx
+++ b/chart2/source/view/main/DummyXShape.cxx
@@ -364,7 +364,8 @@ void DummyPieSegment2D::render()
     */
 
     float nSize = std::max<float>(maUnitCircleToScene.Line1.Column1, maUnitCircleToScene.Line2.Column2);
-    pChart->m_GLRender.RenderPieSegment2DShape(nSize, maUnitCircleToScene.Line1.Column4, maUnitCircleToScene.Line2.Column4);
+    pChart->m_GLRender.RenderPieSegment2DShape(nSize, maUnitCircleToScene.Line1.Column4 + maOffset.DirectionX,
+            maUnitCircleToScene.Line2.Column4 + maOffset.DirectionY);
 
 }
 
diff --git a/chart2/source/view/main/OpenGLRender.cxx b/chart2/source/view/main/OpenGLRender.cxx
index 35f33e4..e570a9e 100755
--- a/chart2/source/view/main/OpenGLRender.cxx
+++ b/chart2/source/view/main/OpenGLRender.cxx
@@ -1737,6 +1737,7 @@ void OpenGLRender::GeneratePieSegment2D(double fInnerRadius, double fOutterRadiu
     if(bInnerRadiusNotZero)
         nVectorSize *= 2;
 
+    nAngleStart += 90;
     aPointList.reserve(nVectorSize);
     // if inner radius = 0 generate a normal pie segment (triangle fan)
     // if inner radius != 0 generate a pie segment - inner pie (triangle strip)
commit 651402e550ff7819c6472a5f92237db672b4adf9
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date:   Wed Jan 22 05:48:02 2014 +0100

    remove unused variable
    
    Change-Id: I07e45a42fc24d5b9169a9d5bc3b47e9d98d7163a

diff --git a/chart2/source/view/main/OpenGLRender.hxx b/chart2/source/view/main/OpenGLRender.hxx
index 9e07c92..21a05cb 100755
--- a/chart2/source/view/main/OpenGLRender.hxx
+++ b/chart2/source/view/main/OpenGLRender.hxx
@@ -298,7 +298,6 @@ private:
     float m_BackgroundColor[16];
     glm::vec4 m_ClearColor;
 
-    PieSegment2DPointList m_PieSegment2DPointList;
     std::list <PieSegment2DPointList> m_PieSegment2DShapePointList;
 
 #if DEBUG_POSITIONING
commit 093fa2a359a7a25644e3983e6c525296d6bfe05c
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date:   Wed Jan 22 05:46:32 2014 +0100

    use a direct method for pie segment crastion
    
    Change-Id: I4b42ebe994b4e498acd32d08a063e4626b3c97d8

diff --git a/chart2/source/view/main/DummyXShape.cxx b/chart2/source/view/main/DummyXShape.cxx
index 70d94c1..4788390 100644
--- a/chart2/source/view/main/DummyXShape.cxx
+++ b/chart2/source/view/main/DummyXShape.cxx
@@ -324,168 +324,6 @@ DummyCone::DummyCone(const drawing::Position3D& rPos, const drawing::Direction3D
     setPosition(Position3DToAWTPoint(rPos));
     setSize(Direction3DToAWTSize(rSize));
 }
-void appendAndCloseBezierCoords( drawing::PolyPolygonBezierCoords& rReturn, const drawing::PolyPolygonBezierCoords& rAdd, sal_Bool bAppendInverse )
-{
-    if(!rAdd.Coordinates.getLength())
-        return;
-    sal_Int32 nAddCount = rAdd.Coordinates[0].getLength();
-    if(!nAddCount)
-        return;
-
-    sal_Int32 nOldCount = rReturn.Coordinates[0].getLength();
-
-    rReturn.Coordinates[0].realloc(nOldCount+nAddCount+1);
-    rReturn.Flags[0].realloc(nOldCount+nAddCount+1);
-
-    for(sal_Int32 nN=0;nN<nAddCount; nN++ )
-    {
-        sal_Int32 nAdd = bAppendInverse ? (nAddCount-1-nN) : nN;
-        rReturn.Coordinates[0][nOldCount+nN] = rAdd.Coordinates[0][nAdd];
-        rReturn.Flags[0][nOldCount+nN] = rAdd.Flags[0][nAdd];
-    }
-
-    //close
-    rReturn.Coordinates[0][nOldCount+nAddCount] = rReturn.Coordinates[0][0];
-    rReturn.Flags[0][nOldCount+nAddCount] = rReturn.Flags[0][0];
-}
-
-drawing::PolyPolygonBezierCoords getCircularArcBezierCoords(
-        double fStartAngleRadian, double fWidthAngleRadian, double fUnitRadius
-        , const ::basegfx::B2DHomMatrix& rTransformationFromUnitCircle
-        , const double fAngleSubdivisionRadian )
-{
-    //at least one polygon is created using two normal and two control points
-    //if the angle is larger it is separated into multiple sub angles
-
-    drawing::PolyPolygonBezierCoords aReturn = drawing::PolyPolygonBezierCoords();
-    sal_Int32 nSegmentCount = static_cast< sal_Int32 >( fWidthAngleRadian/fAngleSubdivisionRadian );
-    if( fWidthAngleRadian > fAngleSubdivisionRadian*nSegmentCount )
-        nSegmentCount++;
-
-    double fFirstSegmentAngle = fAngleSubdivisionRadian;
-    double fLastSegmentAngle = fAngleSubdivisionRadian;
-    if(nSegmentCount==1)
-    {
-        fFirstSegmentAngle = fWidthAngleRadian;
-        fLastSegmentAngle = 0.0;
-    }
-    else
-    {
-        double fFirstAngleOnSubDevision = (static_cast<sal_Int32>(fStartAngleRadian/fAngleSubdivisionRadian)+1)*fAngleSubdivisionRadian;
-        if( !::rtl::math::approxEqual( fStartAngleRadian, fFirstAngleOnSubDevision ) )
-            fFirstSegmentAngle = fFirstAngleOnSubDevision-fStartAngleRadian;
-
-        if(nSegmentCount>1)
-        {
-            fLastSegmentAngle = fWidthAngleRadian-fFirstSegmentAngle-fAngleSubdivisionRadian*(nSegmentCount-2);
-            if( fLastSegmentAngle<0 )
-                nSegmentCount--;
-            if( fLastSegmentAngle>fAngleSubdivisionRadian )
-            {
-                fLastSegmentAngle-=fAngleSubdivisionRadian;
-                nSegmentCount++;
-            }
-        }
-    }
-
-    sal_Int32 nPointCount     = 1 + 3*nSegmentCount; //first point of next segment equals last point of former segment
-
-    aReturn.Coordinates = drawing::PointSequenceSequence(1);
-    aReturn.Flags       = drawing::FlagSequenceSequence(1);
-
-    drawing::PointSequence aPoints(nPointCount);
-    drawing::FlagSequence  aFlags(nPointCount);
-
-    //
-
-    //!! applying matrix to vector does ignore translation, so it is important to use a B2DPoint here instead of B2DVector
-    ::basegfx::B2DPoint P0,P1,P2,P3;
-
-    sal_Int32 nPoint=0;
-    double fCurrentRotateAngle = fStartAngleRadian;
-    for(sal_Int32 nSegment=0; nSegment<nSegmentCount; nSegment++)
-    {
-        double fCurrentSegmentAngle = fAngleSubdivisionRadian;
-        if(nSegment==0)//first segment gets only a smaller peace until the next subdevision
-            fCurrentSegmentAngle = fFirstSegmentAngle;
-        else if(nSegment==(nSegmentCount-1)) //the last segment gets the rest angle that does not fit into equal pieces
-            fCurrentSegmentAngle = fLastSegmentAngle;
-
-        //first create untransformed points for a unit circle arc:
-        const double fCos = cos(fCurrentSegmentAngle/2.0);
-        const double fSin = sin(fCurrentSegmentAngle/2.0);
-        P0.setX(fCos);
-        P3.setX(fCos);
-        P0.setY(-fSin);
-        P3.setY(-P0.getY());
-
-        P1.setX((4.0-fCos)/3.0);
-        P2.setX(P1.getX());
-        P1.setY((1.0-fCos)*(fCos-3.0)/(3.0*fSin));
-        P2.setY(-P1.getY());
-        //transform thus startangle equals NULL
-        ::basegfx::B2DHomMatrix aStart;
-        aStart.rotate(fCurrentSegmentAngle/2.0 + fCurrentRotateAngle );
-        fCurrentRotateAngle+=fCurrentSegmentAngle;
-
-        aStart.scale( fUnitRadius, fUnitRadius );
-
-        //apply given transformation to get final points
-        P0 = rTransformationFromUnitCircle*(aStart*P0);
-        P1 = rTransformationFromUnitCircle*(aStart*P1);
-        P2 = rTransformationFromUnitCircle*(aStart*P2);
-        P3 = rTransformationFromUnitCircle*(aStart*P3);
-
-        aPoints[nPoint].X = static_cast< sal_Int32 >( P0.getX());
-        aPoints[nPoint].Y = static_cast< sal_Int32 >( P0.getY());
-        aFlags [nPoint++] = drawing::PolygonFlags_NORMAL;
-
-        aPoints[nPoint].X = static_cast< sal_Int32 >( P1.getX());
-        aPoints[nPoint].Y = static_cast< sal_Int32 >( P1.getY());
-        aFlags[nPoint++] = drawing::PolygonFlags_CONTROL;
-
-        aPoints[nPoint].X = static_cast< sal_Int32 >( P2.getX());
-        aPoints[nPoint].Y = static_cast< sal_Int32 >( P2.getY());
-        aFlags [nPoint++] = drawing::PolygonFlags_CONTROL;
-
-        if(nSegment==(nSegmentCount-1))
-        {
-            aPoints[nPoint].X = static_cast< sal_Int32 >( P3.getX());
-            aPoints[nPoint].Y = static_cast< sal_Int32 >( P3.getY());
-            aFlags [nPoint++] = drawing::PolygonFlags_NORMAL;
-        }
-    }
-
-    aReturn.Coordinates[0] = aPoints;
-    aReturn.Flags[0] = aFlags;
-
-    return aReturn;
-}
-
-
-drawing::PolyPolygonBezierCoords getRingBezierCoords(
-            double fUnitCircleInnerRadius
-            , double fUnitCircleOuterRadius
-            , double fStartAngleRadian, double fWidthAngleRadian
-            , ::basegfx::B2DHomMatrix aTransformationFromUnitCircle
-            , const double fAngleSubdivisionRadian )
-{
-    drawing::PolyPolygonBezierCoords aReturn = drawing::PolyPolygonBezierCoords();
-
-    aReturn.Coordinates = drawing::PointSequenceSequence(1);
-    aReturn.Flags       = drawing::FlagSequenceSequence(1);
-
-    drawing::PolyPolygonBezierCoords aOuterArc = getCircularArcBezierCoords(
-        fStartAngleRadian, fWidthAngleRadian, fUnitCircleOuterRadius, aTransformationFromUnitCircle, fAngleSubdivisionRadian );
-    aReturn.Coordinates[0] = aOuterArc.Coordinates[0];
-    aReturn.Flags[0] = aOuterArc.Flags[0];
-
-    drawing::PolyPolygonBezierCoords aInnerArc = getCircularArcBezierCoords(
-        fStartAngleRadian, fWidthAngleRadian, fUnitCircleInnerRadius, aTransformationFromUnitCircle, fAngleSubdivisionRadian );
-    appendAndCloseBezierCoords( aReturn, aInnerArc, sal_True );
-
-    return aReturn;
-}
 
 DummyPieSegment2D::DummyPieSegment2D(double fUnitCircleStartAngleDegree, double fUnitCircleWidthAngleDegree,
         double fUnitCircleInnerRadius, double fUnitCircleOuterRadius,
@@ -506,21 +344,9 @@ void DummyPieSegment2D::render()
         mfUnitCircleWidthAngleDegree -= 360.0;
     while(mfUnitCircleWidthAngleDegree<0)
         mfUnitCircleWidthAngleDegree += 360.0;
-    ::basegfx::B2DHomMatrix aTransformationFromUnitCircle( IgnoreZ( HomogenMatrixToB3DHomMatrix(maUnitCircleToScene) ) );
-    aTransformationFromUnitCircle.translate(maOffset.DirectionX,maOffset.DirectionY);
-    const double fAngleSubdivisionRadian = F_PI/30.0;
 
-    drawing::PolyPolygonBezierCoords aCoords = getRingBezierCoords(
-                    mfUnitCircleInnerRadius, mfUnitCircleOuterRadius
-                    , mfUnitCircleStartAngleDegree*F_PI/180.0, mfUnitCircleWidthAngleDegree*F_PI/180.0
-                    , aTransformationFromUnitCircle, fAngleSubdivisionRadian );
-
-    sal_Int32 pointCount = aCoords.Coordinates[0].getLength();
-    for (sal_Int32 i = 0; i < pointCount; i++)
-    {
-        com::sun::star::awt::Point p = aCoords.Coordinates[0][i];
-        pChart->m_GLRender.SetPieSegment2DShapePoint((float)p.X, (float)p.Y, pointCount);
-    }
+    pChart->m_GLRender.GeneratePieSegment2D(mfUnitCircleInnerRadius, mfUnitCircleOuterRadius,
+            mfUnitCircleStartAngleDegree, mfUnitCircleWidthAngleDegree);
 
     std::map<OUString, uno::Any>::const_iterator itr = maProperties.find(UNO_NAME_FILLCOLOR);
     if(itr != maProperties.end())
@@ -528,14 +354,17 @@ void DummyPieSegment2D::render()
         sal_Int32 nColor = itr->second.get<sal_Int32>();
         pChart->m_GLRender.SetColor(nColor);
     }
+    /*
     itr = maProperties.find(UNO_NAME_FILL_TRANSPARENCE);
     if(itr != maProperties.end())
     {
         sal_Int32 transparency = itr->second.get<sal_Int32>();
         pChart->m_GLRender.SetTransparency(transparency&(0xFF));
     }
+    */
 
-    pChart->m_GLRender.RenderPieSegment2DShape();
+    float nSize = std::max<float>(maUnitCircleToScene.Line1.Column1, maUnitCircleToScene.Line2.Column2);
+    pChart->m_GLRender.RenderPieSegment2DShape(nSize, maUnitCircleToScene.Line1.Column4, maUnitCircleToScene.Line2.Column4);
 
 }
 
diff --git a/chart2/source/view/main/OpenGLRender.cxx b/chart2/source/view/main/OpenGLRender.cxx
index 0419a57..35f33e4 100755
--- a/chart2/source/view/main/OpenGLRender.cxx
+++ b/chart2/source/view/main/OpenGLRender.cxx
@@ -1726,32 +1726,51 @@ void OpenGLRender::SetChartTransparencyGradient(long transparencyGradient)
         m_BackgroundColor[15] = 0.0;
     }
 }
-int OpenGLRender::SetPieSegment2DShapePoint(float x, float y, int listLength)
+
+void OpenGLRender::GeneratePieSegment2D(double fInnerRadius, double fOutterRadius, double nAngleStart, double nAngleWidth)
 {
-    if (m_PieSegment2DPointList.empty())
+    double nAngleStep = 1;
+    PieSegment2DPointList aPointList;
+    // TODO: moggi: GL_TRIANGLE_FAN seems not to work
+    bool bInnerRadiusNotZero = true; //!rtl::math::approxEqual(0.0, fInnerRadius);
+    size_t nVectorSize = 3*(nAngleWidth/nAngleStep);
+    if(bInnerRadiusNotZero)
+        nVectorSize *= 2;
+
+    aPointList.reserve(nVectorSize);
+    // if inner radius = 0 generate a normal pie segment (triangle fan)
+    // if inner radius != 0 generate a pie segment - inner pie (triangle strip)
+    if(!bInnerRadiusNotZero)
     {
-        m_PieSegment2DPointList.reserve(listLength);
+        aPointList.push_back(0);
+        aPointList.push_back(0);
+        aPointList.push_back(m_fZStep);
     }
-    float actualX = (x / OPENGL_SCALE_VALUE);
-    float actualY = (y / OPENGL_SCALE_VALUE);
-    m_PieSegment2DPointList.push_back(actualX);
-    m_PieSegment2DPointList.push_back(actualY);
-    m_PieSegment2DPointList.push_back(m_fZStep);
-
-    if (m_PieSegment2DPointList.size() == size_t(listLength * 3))
+    for(double nAngle = nAngleStart; nAngle <= nAngleStart + nAngleWidth; nAngle += nAngleStep)
     {
-        m_PieSegment2DShapePointList.push_back(m_PieSegment2DPointList);
-        m_PieSegment2DPointList.clear();
+        float xVal = sin(nAngle/360*2*GL_PI);
+        float yVal = cos(nAngle/360*2*GL_PI);
+        aPointList.push_back(fOutterRadius * xVal);
+        aPointList.push_back(fOutterRadius * yVal);
+        aPointList.push_back(m_fZStep);
+
+        if(bInnerRadiusNotZero)
+        {
+            aPointList.push_back(fInnerRadius * xVal);
+            aPointList.push_back(fInnerRadius * yVal);
+            aPointList.push_back(m_fZStep);
+        }
     }
-    return 0;
+
+    m_PieSegment2DShapePointList.push_back(aPointList);
 }
 
-int OpenGLRender::RenderPieSegment2DShape()
+int OpenGLRender::RenderPieSegment2DShape(float fSize, float fPosX, float fPosY)
 {
     int listNum = m_PieSegment2DShapePointList.size();
-    PosVecf3 trans = {0.0f, 0.0f, 0.0f};
+    PosVecf3 trans = {fPosX/OPENGL_SCALE_VALUE, fPosY/OPENGL_SCALE_VALUE, 0.0f};
     PosVecf3 angle = {0.0f, 0.0f, 0.0f};
-    PosVecf3 scale = {1.0f, 1.0f, 1.0f};
+    PosVecf3 scale = {fSize/OPENGL_SCALE_VALUE, fSize/OPENGL_SCALE_VALUE, 1.0f};
     MoveModelf(trans, angle, scale);
     m_MVP = m_Projection * m_View * m_Model;
 
@@ -1779,10 +1798,11 @@ int OpenGLRender::RenderPieSegment2DShape()
             0,                  // stride
             (void*)0            // array buffer offset
             );
-        glDrawArrays(GL_POLYGON, 0, pointList.size() / 3); // 12*3 indices starting at 0 -> 12 triangles
+        glDrawArrays(GL_TRIANGLE_STRIP, 0, pointList.size() / 3); // 12*3 indices starting at 0 -> 12 triangles
         glDisableVertexAttribArray(m_2DVertexID);
         glUseProgram(0);
         m_PieSegment2DShapePointList.pop_back();
+        CHECK_GL_ERROR();
 
     }
     glEnable(GL_MULTISAMPLE);
diff --git a/chart2/source/view/main/OpenGLRender.hxx b/chart2/source/view/main/OpenGLRender.hxx
index 6f2a8d9..9e07c92 100755
--- a/chart2/source/view/main/OpenGLRender.hxx
+++ b/chart2/source/view/main/OpenGLRender.hxx
@@ -176,8 +176,8 @@ public:
     int RenderArea2DShape();
     void SetChartTransparencyGradient(long transparencyGradient);
 
-    int SetPieSegment2DShapePoint(float x, float y, int listLength);
-    int RenderPieSegment2DShape();
+    void GeneratePieSegment2D(double, double, double, double);
+    int RenderPieSegment2DShape(float, float, float);
 #if DEBUG_POSITIONING
     void renderDebug();
 #endif
commit 82ed9053e7353fe784cebac4d249cad5ed4a2bf4
Author: Peilin <peilin at multicorewareinc.com>
Date:   Mon Jan 20 14:47:19 2014 +0800

    piesegment2d gl rendering && mov coords operation to dummy shape
    
    Change-Id: Ic709fe37554cf29b4a644cabdc618c15959593d7

diff --git a/chart2/source/view/inc/DummyXShape.hxx b/chart2/source/view/inc/DummyXShape.hxx
index 7112ac7..9b3eed2 100644
--- a/chart2/source/view/inc/DummyXShape.hxx
+++ b/chart2/source/view/inc/DummyXShape.hxx
@@ -239,7 +239,7 @@ public:
     DummyPieSegment2D(double fUnitCircleStartAngleDegree, double fUnitCircleWidthAngleDegree,
             double fUnitCircleInnerRadius, double fUnitCircleOuterRadius,
             const drawing::Direction3D& rOffset, const drawing::HomogenMatrix& rUnitCircleToScene);
-
+    void render();
 private:
     double mfUnitCircleStartAngleDegree;
     double mfUnitCircleWidthAngleDegree;
diff --git a/chart2/source/view/main/DummyXShape.cxx b/chart2/source/view/main/DummyXShape.cxx
index 1ec63b9..70d94c1 100644
--- a/chart2/source/view/main/DummyXShape.cxx
+++ b/chart2/source/view/main/DummyXShape.cxx
@@ -30,6 +30,9 @@
 
 #include <algorithm>
 
+#include <basegfx/point/b2dpoint.hxx>
+#include <basegfx/matrix/b3dhommatrix.hxx>
+
 #define ENABLE_DEBUG_PROPERTIES 0
 
 using namespace com::sun::star;
@@ -321,6 +324,168 @@ DummyCone::DummyCone(const drawing::Position3D& rPos, const drawing::Direction3D
     setPosition(Position3DToAWTPoint(rPos));
     setSize(Direction3DToAWTSize(rSize));
 }
+void appendAndCloseBezierCoords( drawing::PolyPolygonBezierCoords& rReturn, const drawing::PolyPolygonBezierCoords& rAdd, sal_Bool bAppendInverse )
+{
+    if(!rAdd.Coordinates.getLength())
+        return;
+    sal_Int32 nAddCount = rAdd.Coordinates[0].getLength();
+    if(!nAddCount)
+        return;
+
+    sal_Int32 nOldCount = rReturn.Coordinates[0].getLength();
+
+    rReturn.Coordinates[0].realloc(nOldCount+nAddCount+1);
+    rReturn.Flags[0].realloc(nOldCount+nAddCount+1);
+
+    for(sal_Int32 nN=0;nN<nAddCount; nN++ )
+    {
+        sal_Int32 nAdd = bAppendInverse ? (nAddCount-1-nN) : nN;
+        rReturn.Coordinates[0][nOldCount+nN] = rAdd.Coordinates[0][nAdd];
+        rReturn.Flags[0][nOldCount+nN] = rAdd.Flags[0][nAdd];
+    }
+
+    //close
+    rReturn.Coordinates[0][nOldCount+nAddCount] = rReturn.Coordinates[0][0];
+    rReturn.Flags[0][nOldCount+nAddCount] = rReturn.Flags[0][0];
+}
+
+drawing::PolyPolygonBezierCoords getCircularArcBezierCoords(
+        double fStartAngleRadian, double fWidthAngleRadian, double fUnitRadius
+        , const ::basegfx::B2DHomMatrix& rTransformationFromUnitCircle
+        , const double fAngleSubdivisionRadian )
+{
+    //at least one polygon is created using two normal and two control points
+    //if the angle is larger it is separated into multiple sub angles
+
+    drawing::PolyPolygonBezierCoords aReturn = drawing::PolyPolygonBezierCoords();
+    sal_Int32 nSegmentCount = static_cast< sal_Int32 >( fWidthAngleRadian/fAngleSubdivisionRadian );
+    if( fWidthAngleRadian > fAngleSubdivisionRadian*nSegmentCount )
+        nSegmentCount++;
+
+    double fFirstSegmentAngle = fAngleSubdivisionRadian;
+    double fLastSegmentAngle = fAngleSubdivisionRadian;
+    if(nSegmentCount==1)
+    {
+        fFirstSegmentAngle = fWidthAngleRadian;
+        fLastSegmentAngle = 0.0;
+    }
+    else
+    {
+        double fFirstAngleOnSubDevision = (static_cast<sal_Int32>(fStartAngleRadian/fAngleSubdivisionRadian)+1)*fAngleSubdivisionRadian;
+        if( !::rtl::math::approxEqual( fStartAngleRadian, fFirstAngleOnSubDevision ) )
+            fFirstSegmentAngle = fFirstAngleOnSubDevision-fStartAngleRadian;
+
+        if(nSegmentCount>1)
+        {
+            fLastSegmentAngle = fWidthAngleRadian-fFirstSegmentAngle-fAngleSubdivisionRadian*(nSegmentCount-2);
+            if( fLastSegmentAngle<0 )
+                nSegmentCount--;
+            if( fLastSegmentAngle>fAngleSubdivisionRadian )
+            {
+                fLastSegmentAngle-=fAngleSubdivisionRadian;
+                nSegmentCount++;
+            }
+        }
+    }
+
+    sal_Int32 nPointCount     = 1 + 3*nSegmentCount; //first point of next segment equals last point of former segment
+
+    aReturn.Coordinates = drawing::PointSequenceSequence(1);
+    aReturn.Flags       = drawing::FlagSequenceSequence(1);
+
+    drawing::PointSequence aPoints(nPointCount);
+    drawing::FlagSequence  aFlags(nPointCount);
+
+    //
+
+    //!! applying matrix to vector does ignore translation, so it is important to use a B2DPoint here instead of B2DVector
+    ::basegfx::B2DPoint P0,P1,P2,P3;
+
+    sal_Int32 nPoint=0;
+    double fCurrentRotateAngle = fStartAngleRadian;
+    for(sal_Int32 nSegment=0; nSegment<nSegmentCount; nSegment++)
+    {
+        double fCurrentSegmentAngle = fAngleSubdivisionRadian;
+        if(nSegment==0)//first segment gets only a smaller peace until the next subdevision
+            fCurrentSegmentAngle = fFirstSegmentAngle;
+        else if(nSegment==(nSegmentCount-1)) //the last segment gets the rest angle that does not fit into equal pieces
+            fCurrentSegmentAngle = fLastSegmentAngle;
+
+        //first create untransformed points for a unit circle arc:
+        const double fCos = cos(fCurrentSegmentAngle/2.0);
+        const double fSin = sin(fCurrentSegmentAngle/2.0);
+        P0.setX(fCos);
+        P3.setX(fCos);
+        P0.setY(-fSin);
+        P3.setY(-P0.getY());
+
+        P1.setX((4.0-fCos)/3.0);
+        P2.setX(P1.getX());
+        P1.setY((1.0-fCos)*(fCos-3.0)/(3.0*fSin));
+        P2.setY(-P1.getY());
+        //transform thus startangle equals NULL
+        ::basegfx::B2DHomMatrix aStart;
+        aStart.rotate(fCurrentSegmentAngle/2.0 + fCurrentRotateAngle );
+        fCurrentRotateAngle+=fCurrentSegmentAngle;
+
+        aStart.scale( fUnitRadius, fUnitRadius );
+
+        //apply given transformation to get final points
+        P0 = rTransformationFromUnitCircle*(aStart*P0);
+        P1 = rTransformationFromUnitCircle*(aStart*P1);
+        P2 = rTransformationFromUnitCircle*(aStart*P2);
+        P3 = rTransformationFromUnitCircle*(aStart*P3);
+
+        aPoints[nPoint].X = static_cast< sal_Int32 >( P0.getX());
+        aPoints[nPoint].Y = static_cast< sal_Int32 >( P0.getY());
+        aFlags [nPoint++] = drawing::PolygonFlags_NORMAL;
+
+        aPoints[nPoint].X = static_cast< sal_Int32 >( P1.getX());
+        aPoints[nPoint].Y = static_cast< sal_Int32 >( P1.getY());
+        aFlags[nPoint++] = drawing::PolygonFlags_CONTROL;
+
+        aPoints[nPoint].X = static_cast< sal_Int32 >( P2.getX());
+        aPoints[nPoint].Y = static_cast< sal_Int32 >( P2.getY());
+        aFlags [nPoint++] = drawing::PolygonFlags_CONTROL;
+
+        if(nSegment==(nSegmentCount-1))
+        {
+            aPoints[nPoint].X = static_cast< sal_Int32 >( P3.getX());
+            aPoints[nPoint].Y = static_cast< sal_Int32 >( P3.getY());
+            aFlags [nPoint++] = drawing::PolygonFlags_NORMAL;
+        }
+    }
+
+    aReturn.Coordinates[0] = aPoints;
+    aReturn.Flags[0] = aFlags;
+
+    return aReturn;
+}
+
+
+drawing::PolyPolygonBezierCoords getRingBezierCoords(
+            double fUnitCircleInnerRadius
+            , double fUnitCircleOuterRadius
+            , double fStartAngleRadian, double fWidthAngleRadian
+            , ::basegfx::B2DHomMatrix aTransformationFromUnitCircle
+            , const double fAngleSubdivisionRadian )
+{
+    drawing::PolyPolygonBezierCoords aReturn = drawing::PolyPolygonBezierCoords();
+
+    aReturn.Coordinates = drawing::PointSequenceSequence(1);
+    aReturn.Flags       = drawing::FlagSequenceSequence(1);
+
+    drawing::PolyPolygonBezierCoords aOuterArc = getCircularArcBezierCoords(
+        fStartAngleRadian, fWidthAngleRadian, fUnitCircleOuterRadius, aTransformationFromUnitCircle, fAngleSubdivisionRadian );
+    aReturn.Coordinates[0] = aOuterArc.Coordinates[0];
+    aReturn.Flags[0] = aOuterArc.Flags[0];
+
+    drawing::PolyPolygonBezierCoords aInnerArc = getCircularArcBezierCoords(
+        fStartAngleRadian, fWidthAngleRadian, fUnitCircleInnerRadius, aTransformationFromUnitCircle, fAngleSubdivisionRadian );
+    appendAndCloseBezierCoords( aReturn, aInnerArc, sal_True );
+
+    return aReturn;
+}
 
 DummyPieSegment2D::DummyPieSegment2D(double fUnitCircleStartAngleDegree, double fUnitCircleWidthAngleDegree,
         double fUnitCircleInnerRadius, double fUnitCircleOuterRadius,
@@ -333,6 +498,46 @@ DummyPieSegment2D::DummyPieSegment2D(double fUnitCircleStartAngleDegree, double
     maUnitCircleToScene(rUnitCircleToScene)
 {
 }
+void DummyPieSegment2D::render()
+{
+    DummyChart* pChart = getRootShape();
+
+    while(mfUnitCircleWidthAngleDegree>360)
+        mfUnitCircleWidthAngleDegree -= 360.0;
+    while(mfUnitCircleWidthAngleDegree<0)
+        mfUnitCircleWidthAngleDegree += 360.0;
+    ::basegfx::B2DHomMatrix aTransformationFromUnitCircle( IgnoreZ( HomogenMatrixToB3DHomMatrix(maUnitCircleToScene) ) );
+    aTransformationFromUnitCircle.translate(maOffset.DirectionX,maOffset.DirectionY);
+    const double fAngleSubdivisionRadian = F_PI/30.0;
+
+    drawing::PolyPolygonBezierCoords aCoords = getRingBezierCoords(
+                    mfUnitCircleInnerRadius, mfUnitCircleOuterRadius
+                    , mfUnitCircleStartAngleDegree*F_PI/180.0, mfUnitCircleWidthAngleDegree*F_PI/180.0
+                    , aTransformationFromUnitCircle, fAngleSubdivisionRadian );
+
+    sal_Int32 pointCount = aCoords.Coordinates[0].getLength();
+    for (sal_Int32 i = 0; i < pointCount; i++)
+    {
+        com::sun::star::awt::Point p = aCoords.Coordinates[0][i];
+        pChart->m_GLRender.SetPieSegment2DShapePoint((float)p.X, (float)p.Y, pointCount);
+    }
+
+    std::map<OUString, uno::Any>::const_iterator itr = maProperties.find(UNO_NAME_FILLCOLOR);
+    if(itr != maProperties.end())
+    {
+        sal_Int32 nColor = itr->second.get<sal_Int32>();
+        pChart->m_GLRender.SetColor(nColor);
+    }
+    itr = maProperties.find(UNO_NAME_FILL_TRANSPARENCE);
+    if(itr != maProperties.end())
+    {
+        sal_Int32 transparency = itr->second.get<sal_Int32>();
+        pChart->m_GLRender.SetTransparency(transparency&(0xFF));
+    }
+
+    pChart->m_GLRender.RenderPieSegment2DShape();
+
+}
 
 DummyPieSegment::DummyPieSegment(double fUnitCircleStartAngleDegree, double fUnitCircleWidthAngleDegree,
         double fUnitCircleInnerRadius, double fUnitCircleOuterRadius,
diff --git a/chart2/source/view/main/OpenGLRender.cxx b/chart2/source/view/main/OpenGLRender.cxx
index d96b219..0419a57 100755
--- a/chart2/source/view/main/OpenGLRender.cxx
+++ b/chart2/source/view/main/OpenGLRender.cxx
@@ -1726,4 +1726,70 @@ void OpenGLRender::SetChartTransparencyGradient(long transparencyGradient)
         m_BackgroundColor[15] = 0.0;
     }
 }
+int OpenGLRender::SetPieSegment2DShapePoint(float x, float y, int listLength)
+{
+    if (m_PieSegment2DPointList.empty())
+    {
+        m_PieSegment2DPointList.reserve(listLength);
+    }
+    float actualX = (x / OPENGL_SCALE_VALUE);
+    float actualY = (y / OPENGL_SCALE_VALUE);
+    m_PieSegment2DPointList.push_back(actualX);
+    m_PieSegment2DPointList.push_back(actualY);
+    m_PieSegment2DPointList.push_back(m_fZStep);
+
+    if (m_PieSegment2DPointList.size() == size_t(listLength * 3))
+    {
+        m_PieSegment2DShapePointList.push_back(m_PieSegment2DPointList);
+        m_PieSegment2DPointList.clear();
+    }
+    return 0;
+}
+
+int OpenGLRender::RenderPieSegment2DShape()
+{
+    int listNum = m_PieSegment2DShapePointList.size();
+    PosVecf3 trans = {0.0f, 0.0f, 0.0f};
+    PosVecf3 angle = {0.0f, 0.0f, 0.0f};
+    PosVecf3 scale = {1.0f, 1.0f, 1.0f};
+    MoveModelf(trans, angle, scale);
+    m_MVP = m_Projection * m_View * m_Model;
+
+    for (int i = 0; i < listNum; i++)
+    {
+        PieSegment2DPointList &pointList = m_PieSegment2DShapePointList.back();
+        //fill vertex buffer
+        glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
+        glBufferData(GL_ARRAY_BUFFER, pointList.size() * sizeof(float), &pointList[0] , GL_STATIC_DRAW);
+        // Use our shader
+        glUseProgram(m_CommonProID);
+
+        glUniform4fv(m_2DColorID, 1, &m_2DColor[0]);
+
+        glUniformMatrix4fv(m_MatrixID, 1, GL_FALSE, &m_MVP[0][0]);
+
+        // 1rst attribute buffer : vertices
+        glEnableVertexAttribArray(m_2DVertexID);
+        glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
+        glVertexAttribPointer(
+            m_2DVertexID,                  // attribute. No particular reason for 0, but must match the layout in the shader.
+            3,                  // size
+            GL_FLOAT,           // type
+            GL_FALSE,           // normalized?
+            0,                  // stride
+            (void*)0            // array buffer offset
+            );
+        glDrawArrays(GL_POLYGON, 0, pointList.size() / 3); // 12*3 indices starting at 0 -> 12 triangles
+        glDisableVertexAttribArray(m_2DVertexID);
+        glUseProgram(0);
+        m_PieSegment2DShapePointList.pop_back();
+
+    }
+    glEnable(GL_MULTISAMPLE);
+    m_fZStep += 0.01f;
+
+    CHECK_GL_ERROR();
+    return 0;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/view/main/OpenGLRender.hxx b/chart2/source/view/main/OpenGLRender.hxx
index 435e76d..6f2a8d9 100755
--- a/chart2/source/view/main/OpenGLRender.hxx
+++ b/chart2/source/view/main/OpenGLRender.hxx
@@ -100,6 +100,7 @@ typedef struct TextInfo
 }TextInfo;
 
 typedef std::vector<GLfloat> Area2DPointList;
+typedef std::vector<GLfloat> PieSegment2DPointList;
 
 /// Holds the information of our new child window
 struct GLWindow
@@ -175,6 +176,8 @@ public:
     int RenderArea2DShape();
     void SetChartTransparencyGradient(long transparencyGradient);
 
+    int SetPieSegment2DShapePoint(float x, float y, int listLength);
+    int RenderPieSegment2DShape();
 #if DEBUG_POSITIONING
     void renderDebug();
 #endif
@@ -295,6 +298,9 @@ private:
     float m_BackgroundColor[16];
     glm::vec4 m_ClearColor;
 
+    PieSegment2DPointList m_PieSegment2DPointList;
+    std::list <PieSegment2DPointList> m_PieSegment2DShapePointList;
+
 #if DEBUG_POSITIONING
     GLuint m_DebugProID;
     GLuint m_DebugVertexID;
commit 84778c9eb090a6141f2248d0ac8dc2526dcb5080
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date:   Tue Jan 21 23:43:52 2014 +0100

    fix some warnings
    
    Change-Id: I3bded252fb6af9166dc533e7e2756e7569a82112

diff --git a/chart2/source/view/main/DummyXShape.cxx b/chart2/source/view/main/DummyXShape.cxx
index 9b861f9..1ec63b9 100644
--- a/chart2/source/view/main/DummyXShape.cxx
+++ b/chart2/source/view/main/DummyXShape.cxx
@@ -715,7 +715,6 @@ void DummyText::render()
     DummyChart* pChart = getRootShape();
 
     drawing::HomogenMatrix3 aTransformation;
-    bool bHasTransformation = false;
     std::map<OUString, uno::Any>::const_iterator itr =
         maProperties.find("Transformation");
     if(itr != maProperties.end())
@@ -724,7 +723,6 @@ void DummyText::render()
         if(itr->second.hasValue())
         {
             aTransformation = itr->second.get<drawing::HomogenMatrix3>();
-            bHasTransformation = true;
         }
     }
     else if(maTrans.hasValue())
@@ -732,7 +730,7 @@ void DummyText::render()
         aTransformation = maTrans.get<drawing::HomogenMatrix3>();
     }
     pChart->m_GLRender.CreateTextTexture(maBitmap, maPosition, maSize, 0,
-            bHasTransformation, aTransformation);
+            aTransformation);
     pChart->m_GLRender.RenderTextShape();
 }
 
diff --git a/chart2/source/view/main/OpenGLRender.cxx b/chart2/source/view/main/OpenGLRender.cxx
index 98681d6..d96b219 100755
--- a/chart2/source/view/main/OpenGLRender.cxx
+++ b/chart2/source/view/main/OpenGLRender.cxx
@@ -43,7 +43,9 @@ using namespace com::sun::star;
 using namespace std;
 
 #define DEBUG_PNG 1
+#if RENDER_TO_FILE
 #define BMP_HEADER_LEN 54
+#endif
 
 #if DEBUG_PNG
 #include <vcl/pngwrite.hxx>
@@ -1457,7 +1459,7 @@ int OpenGLRender::RenderRectangleShape(bool bBorder, bool bFill)
 
 
 int OpenGLRender::CreateTextTexture(const BitmapEx& rBitmapEx, awt::Point aPos, awt::Size aSize, long rotation,
-        bool bRotation, const drawing::HomogenMatrix3& rTrans)
+        const drawing::HomogenMatrix3& rTrans)
 {
     glm::mat3 aTrans(rTrans.Line1.Column1, rTrans.Line1.Column2, rTrans.Line1.Column3,
                     rTrans.Line2.Column1, rTrans.Line2.Column2, rTrans.Line2.Column3,
@@ -1504,26 +1506,18 @@ int OpenGLRender::CreateTextTexture(const BitmapEx& rBitmapEx, awt::Point aPos,
     aTextInfo.y = (float)(aPos.Y + aSize.Height / 2);
     aTextInfo.z = m_fZStep;
     aTextInfo.rotation = -(double)rotation * GL_PI / 18000.0f;
-    glm::vec3 aPos1( 0, 0, 1 );
-    glm::vec3 aPos1Trans = aTrans * aPos1;
     aTextInfo.vertex[0] = rTrans.Line1.Column3 / OPENGL_SCALE_VALUE;
     aTextInfo.vertex[1] = rTrans.Line2.Column3 / OPENGL_SCALE_VALUE;
     aTextInfo.vertex[2] = m_fZStep;
 
-    glm::vec3 aPos2( 1, 0, 1 );
-    glm::vec3 aPos2Trans = aTrans * aPos2;
     aTextInfo.vertex[3] = (rTrans.Line1.Column3 + aSize.Width ) / OPENGL_SCALE_VALUE ;
     aTextInfo.vertex[4] = rTrans.Line2.Column3 / OPENGL_SCALE_VALUE;
     aTextInfo.vertex[5] = m_fZStep;
 
-    glm::vec3 aPos3( 1, 1, 1 );
-    glm::vec3 aPos3Trans = aTrans * aPos3;
     aTextInfo.vertex[6] = (rTrans.Line1.Column3 + aSize.Width) / OPENGL_SCALE_VALUE;
     aTextInfo.vertex[7] = (rTrans.Line2.Column3 + aSize.Height) / OPENGL_SCALE_VALUE;
     aTextInfo.vertex[8] = m_fZStep;
 
-    glm::vec3 aPos4( 0, 1, 1 );
-    glm::vec3 aPos4Trans = aTrans * aPos4;
     aTextInfo.vertex[9] = rTrans.Line1.Column3 / OPENGL_SCALE_VALUE;
     aTextInfo.vertex[10] = (rTrans.Line2.Column3 + aSize.Height) / OPENGL_SCALE_VALUE;
     aTextInfo.vertex[11] = m_fZStep;
diff --git a/chart2/source/view/main/OpenGLRender.hxx b/chart2/source/view/main/OpenGLRender.hxx
index ebd3b2a..435e76d 100755
--- a/chart2/source/view/main/OpenGLRender.hxx
+++ b/chart2/source/view/main/OpenGLRender.hxx
@@ -168,7 +168,7 @@ public:
 
     int CreateTextTexture(const BitmapEx& rBitmapEx,
             com::sun::star::awt::Point aPos, com::sun::star::awt::Size aSize, long rotation,
-            bool bTransformation, const com::sun::star::drawing::HomogenMatrix3& rTrans);
+            const com::sun::star::drawing::HomogenMatrix3& rTrans);
     int RenderTextShape();
 
     int SetArea2DShapePoint(float x, float y, int listLength);
commit 8d8a2f2be58529d70f4783d5d1e91fca350f119f
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date:   Tue Jan 21 00:17:55 2014 +0100

    more work in the direction of correct text rendering
    
    It still does not render text correctly (or visible) but at least
    according to my debugging skills we are making progress.
    
    Change-Id: I2bff955b7395126770295ba1546e8cb3f70557c7

diff --git a/chart2/source/view/main/DummyXShape.cxx b/chart2/source/view/main/DummyXShape.cxx
index 9f6316a..9b861f9 100644
--- a/chart2/source/view/main/DummyXShape.cxx
+++ b/chart2/source/view/main/DummyXShape.cxx
@@ -122,6 +122,10 @@ void DummyXShape::setPropertyValue( const OUString& rName, const uno::Any& rValu
 {
     SAL_WARN("chart2", "DummyXShape::setProperty: " << rName << " " << "Any");
     maProperties[rName] = rValue;
+    if(rName == "Transformation")
+    {
+        SAL_WARN("chart2.opengl", "Transformation");
+    }
 }
 
 uno::Any DummyXShape::getPropertyValue( const OUString& rName )
@@ -642,8 +646,8 @@ struct FontAttribSetter
         }

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list