chart2/source/view/main/DummyXShape.cxx | 20 +++++- chart2/source/view/main/OpenGLRender.cxx | 95 +++++++++++++++++++++---------- chart2/source/view/main/OpenGLRender.hxx | 5 - 3 files changed, 85 insertions(+), 35 deletions(-)
New commits: commit 38726b6d5fed0e2b714b14068f84824de2fe61ad Author: Markus Mohrhard <markus.mohrh...@collabora.co.uk> Date: Sun Jan 19 15:50:21 2014 +0100 more work on correct rectangle handling We now render black borders around rectangles and correctly handle rectangles with just fill or just borders. Still to be done: * correct border style handling * correct border color handling (maybe switch GLSL program) * gradient handling * still using GL_QUADS * border line widths * transparence Change-Id: I3912ccf3dc5df686142a5d1758ee9b97fe435d7b diff --git a/chart2/source/view/main/DummyXShape.cxx b/chart2/source/view/main/DummyXShape.cxx index 103c58d..3c7c551 100644 --- a/chart2/source/view/main/DummyXShape.cxx +++ b/chart2/source/view/main/DummyXShape.cxx @@ -578,14 +578,14 @@ void DummyRectangle::render() return; } + bool bFill = true; itr = maProperties.find("FillStyle"); if(itr != maProperties.end()) { drawing::FillStyle eStyle = itr->second.get<drawing::FillStyle>(); if(eStyle == drawing::FillStyle_NONE) { - SAL_WARN("chart2.opengl", "no fill style"); - return; + bFill = false; } } @@ -594,7 +594,19 @@ void DummyRectangle::render() { uno::Any co = itr->second; sal_Int32 nColorValue = co.get<sal_Int32>(); - pChart->m_GLRender.SetColor(nColorValue); + pChart->m_GLRender.SetBackGroundColor(nColorValue, nColorValue); + } + + bool bBorder = true; + itr = maProperties.find(UNO_NAME_LINESTYLE); + if (itr != maProperties.end()) + { + uno::Any cow = itr->second; + drawing::LineStyle nStyle = cow.get<drawing::LineStyle>(); + if (drawing::LineStyle_NONE == nStyle) + { + bBorder = false; + } } //TODO: moggi: correct handling of gradients @@ -609,7 +621,7 @@ void DummyRectangle::render() } } pChart->m_GLRender.RectangleShapePoint(maPosition.X, maPosition.Y, maSize.Width, maSize.Height); - pChart->m_GLRender.RenderRectangleShape(); + pChart->m_GLRender.RenderRectangleShape(bBorder, bFill); } DummyText::DummyText(const OUString& rText, const tNameSequence& rNames, diff --git a/chart2/source/view/main/OpenGLRender.cxx b/chart2/source/view/main/OpenGLRender.cxx index 4366425..41728713 100644 --- a/chart2/source/view/main/OpenGLRender.cxx +++ b/chart2/source/view/main/OpenGLRender.cxx @@ -1348,13 +1348,13 @@ int OpenGLRender::RectangleShapePoint(float x, float y, float directionX, float aRectangle.points[1] = actualY; aRectangle.points[2] = m_fZStep; aRectangle.points[3] = actualX + actualSizeX; - aRectangle.points[4] = actualX; + aRectangle.points[4] = actualY; aRectangle.points[5] = m_fZStep; aRectangle.points[6] = actualX + actualSizeX; - aRectangle.points[7] = actualX + actualSizeY; + aRectangle.points[7] = actualY + actualSizeY; aRectangle.points[8] = m_fZStep; aRectangle.points[9] = actualX; - aRectangle.points[10] = actualX + actualSizeY; + aRectangle.points[10] = actualY + actualSizeY; aRectangle.points[11] = m_fZStep; m_RectangleShapePointList.push_back(aRectangle); @@ -1362,7 +1362,7 @@ int OpenGLRender::RectangleShapePoint(float x, float y, float directionX, float } -int OpenGLRender::RenderRectangleShape() +int OpenGLRender::RenderRectangleShape(bool bBorder, bool bFill) { m_fZStep += 0.001; size_t listNum = m_RectangleShapePointList.size(); @@ -1386,31 +1386,68 @@ int OpenGLRender::RenderRectangleShape() glUseProgram(m_BackgroundProID); glUniformMatrix4fv(m_BackgroundMatrixID, 1, GL_FALSE, &m_MVP[0][0]); - // 1rst attribute buffer : vertices - glEnableVertexAttribArray(m_BackgroundVertexID); - glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer); - glVertexAttribPointer( - m_BackgroundVertexID, // attribute. No particular reason for 0, but must match the layout in the shader. - 2, // size - GL_FLOAT, // type - GL_FALSE, // normalized? - 0, // stride - (void*)0 // array buffer offset - ); - - // 2nd attribute buffer : color - glEnableVertexAttribArray(m_BackgroundColorID); - glBindBuffer(GL_ARRAY_BUFFER, m_ColorBuffer); - glVertexAttribPointer( - m_BackgroundColorID, // attribute. No particular reason for 0, but must match the layout in the shader. - 4, // size - GL_FLOAT, // type - GL_FALSE, // normalized? - 0, // stride - (void*)0 // array buffer offset - ); - //TODO: moggi: get rid of GL_QUADS - glDrawArrays(GL_QUADS, 0, 4); + if(bFill) + { + glEnableVertexAttribArray(m_BackgroundVertexID); + glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer); + glVertexAttribPointer( + m_BackgroundVertexID, // 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 + ); + + // 2nd attribute buffer : color + glEnableVertexAttribArray(m_BackgroundColorID); + glBindBuffer(GL_ARRAY_BUFFER, m_ColorBuffer); + glVertexAttribPointer( + m_BackgroundColorID, // attribute. No particular reason for 0, but must match the layout in the shader. + 4, // size + GL_FLOAT, // type + GL_FALSE, // normalized? + 0, // stride + (void*)0 // array buffer offset + ); + //TODO: moggi: get rid of GL_QUADS + glDrawArrays(GL_QUADS, 0, 4); + glDisableVertexAttribArray(m_BackgroundVertexID); + glDisableVertexAttribArray(m_BackgroundColorID); + } + if(bBorder) + { + SetBackGroundColor(COL_BLACK, COL_BLACK); + + glBindBuffer(GL_ARRAY_BUFFER, m_ColorBuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(m_BackgroundColor), m_BackgroundColor, GL_STATIC_DRAW); + // 1rst attribute buffer : vertices + glEnableVertexAttribArray(m_BackgroundVertexID); + glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer); + glVertexAttribPointer( + m_BackgroundVertexID, // 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 + ); + + // 2nd attribute buffer : color + glEnableVertexAttribArray(m_BackgroundColorID); + glBindBuffer(GL_ARRAY_BUFFER, m_ColorBuffer); + glVertexAttribPointer( + m_BackgroundColorID, // attribute. No particular reason for 0, but must match the layout in the shader. + 4, // size + GL_FLOAT, // type + GL_FALSE, // normalized? + 0, // stride + (void*)0 // array buffer offset + ); + glDrawArrays(GL_LINE_LOOP, 0, 4); + glDisableVertexAttribArray(m_BackgroundVertexID); + glDisableVertexAttribArray(m_BackgroundColorID); + } glDisableVertexAttribArray(m_BackgroundVertexID); glDisableVertexAttribArray(m_BackgroundColorID); glUseProgram(0); diff --git a/chart2/source/view/main/OpenGLRender.hxx b/chart2/source/view/main/OpenGLRender.hxx index dc9beb5..e082be7 100644 --- a/chart2/source/view/main/OpenGLRender.hxx +++ b/chart2/source/view/main/OpenGLRender.hxx @@ -165,7 +165,7 @@ public: void SetTransparency(sal_uInt32 transparency); - int RenderRectangleShape(); + int RenderRectangleShape(bool bBorder, bool bFill); int RectangleShapePoint(float x, float y, float directionX, float directionY); int CreateTextTexture(::rtl::OUString textValue, sal_uInt32 color, const Font& rFont, @@ -180,6 +180,8 @@ public: void renderDebug(); #endif + void SetBackGroundColor(sal_uInt32 color1, sal_uInt32 color2); + private: GLint LoadShaders(const char *vertexShader,const char *fragmentShader); int CreateTextureObj(int width, int height); @@ -193,7 +195,6 @@ private: #endif int CreateMultiSampleFrameBufObj(); int Create2DCircle(int detail); - void SetBackGroundColor(sal_uInt32 color1, sal_uInt32 color2); private: // Projection matrix : default 45 degree Field of View, 4:3 ratio, display range : 0.1 unit <-> 100 units _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits