[Libreoffice-commits] core.git: Branch 'feature/opengl-canvas-rework' - 4 commits - basegfx/source canvas/source include/basegfx
Michael Jaumann
meta_dev at yahoo.com
Wed Jan 14 05:01:10 PST 2015
basegfx/source/polygon/b2dpolygon.cxx | 36 ++++++++++++++++++++----
basegfx/source/polygon/b2dpolypolygon.cxx | 12 ++++++++
canvas/source/opengl/ogl_canvascustomsprite.cxx | 24 ++++++++--------
canvas/source/opengl/ogl_canvastools.cxx | 11 ++++---
canvas/source/opengl/ogl_renderHelper.cxx | 10 ++++++
canvas/source/opengl/ogl_renderHelper.hxx | 5 +++
canvas/source/opengl/ogl_spritedevicehelper.cxx | 1
include/basegfx/polygon/b2dpolygon.hxx | 9 ++++++
include/basegfx/polygon/b2dpolypolygon.hxx | 9 ++++++
9 files changed, 96 insertions(+), 21 deletions(-)
New commits:
commit 8c9106457ac8c515b052cbd27f6c14414b11cfbf
Author: Michael Jaumann <meta_dev at yahoo.com>
Date: Wed Jan 14 12:51:43 2015 +0000
set correct projection and viewport for sprites
each sprite is drawn to a framebuffer/ texture
set projection and viewport to the sprite resolution
Change-Id: I3c6c53729c76ee1dc4fcb53b5b31b912be782d49
diff --git a/canvas/source/opengl/ogl_canvascustomsprite.cxx b/canvas/source/opengl/ogl_canvascustomsprite.cxx
index ac8272e..7acaceb 100644
--- a/canvas/source/opengl/ogl_canvascustomsprite.cxx
+++ b/canvas/source/opengl/ogl_canvascustomsprite.cxx
@@ -139,6 +139,9 @@ namespace oglcanvas
RenderHelper* pRenderHelper = maCanvasHelper.getDeviceHelper()->getRenderHelper();
IBufferContextSharedPtr pBufferContext;
+ GLint myviewport[4];
+ glGetIntegerv(GL_VIEWPORT, myviewport);
+
if( mfAlpha != 0.0 || mxClip.is() )
{
// drats. need to render to temp surface before, and then
@@ -146,12 +149,20 @@ namespace oglcanvas
// TODO(P3): buffer texture
pBufferContext = maCanvasHelper.getDeviceHelper()->createBufferContext(aSpriteSizePixel);
- //glViewport(0, 0,aSpriteSizePixel.x,aSpriteSizePixel.y);
pBufferContext->startBufferRendering();
}
// this ends up in pBufferContext, if that one's "current"
+ // Draw in spriteresolution
+ const glm::mat4 oldResulution = pRenderHelper->GetVP();
+ pRenderHelper->SetVP(aSpriteSizePixel.x, aSpriteSizePixel.y);
+ glViewport(0, 0,aSpriteSizePixel.x,aSpriteSizePixel.y);
+
if( !maCanvasHelper.renderRecordedActions() )
return false;
+
+ //go back to window resolution
+ pRenderHelper->SetVP(oldResulution);
+ glViewport(myviewport[0], myviewport[1],myviewport[2],myviewport[3]);
const glm::mat4 translate = glm::translate(glm::vec3(maPosition.getX(), maPosition.getY(), 0));
if( pBufferContext )
{
@@ -172,6 +183,7 @@ namespace oglcanvas
pRenderHelper->SetModelAndMVP( translate *aGLTransform );
+
GLuint nTexture = pBufferContext->getTextureId();
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, nTexture);
@@ -237,16 +249,6 @@ namespace oglcanvas
glBindTexture(GL_TEXTURE_2D, 0);
}
- std::vector<glm::vec2> vertices;
- vertices.reserve(6);
- vertices.push_back(glm::vec2(-2, -2));
- vertices.push_back(glm::vec2(-2, (float) maSize.Height+4));
- vertices.push_back(glm::vec2((float) maSize.Width+4, (float) maSize.Height+4));
- vertices.push_back(glm::vec2((float) maSize.Width+4, -2));
- vertices.push_back(glm::vec2(-2, -2));
- vertices.push_back(glm::vec2((float) maSize.Width+4, (float) maSize.Height+4));
-
- pRenderHelper->renderVertexConstColor(vertices, glm::vec4(1, 0, 0, 1), GL_LINE_STRIP);
#ifdef DEBUG_RENDERING
std::vector<double> aVec;
diff --git a/canvas/source/opengl/ogl_renderHelper.cxx b/canvas/source/opengl/ogl_renderHelper.cxx
index 50e1269..21e03b4 100644
--- a/canvas/source/opengl/ogl_renderHelper.cxx
+++ b/canvas/source/opengl/ogl_renderHelper.cxx
@@ -87,6 +87,15 @@ namespace oglcanvas
void RenderHelper::SetVP(const float nwidth, const float nheight)
{
m_VP = glm::ortho(0.0f, nwidth, nheight, 0.0f);
+
+ void RenderHelper::SetVP(const glm::mat4 vp)
+ {
+ m_VP = vp;
+ }
+
+ glm::mat4 RenderHelper::GetVP()
+ {
+ return m_VP;
}
static void cleanUp()
@@ -142,6 +151,7 @@ namespace oglcanvas
glDeleteProgram( m_texManProgID);
glDeleteProgram( m_simpleProgID);
glDeleteProgram( m_texProgID);
+ glDeleteProgram( m_texTransProgID);
glDeleteProgram( mnRectangularTwoColorGradientProgram );
glDeleteProgram( mnRectangularMultiColorGradientProgram );
glDeleteProgram( mnRadialTwoColorGradientProgram );
diff --git a/canvas/source/opengl/ogl_renderHelper.hxx b/canvas/source/opengl/ogl_renderHelper.hxx
index 011120a..383bbbc 100644
--- a/canvas/source/opengl/ogl_renderHelper.hxx
+++ b/canvas/source/opengl/ogl_renderHelper.hxx
@@ -55,6 +55,11 @@ namespace oglcanvas
RenderHelper();
void SetVP(const float width, const float height);
+
+ void SetVP(const glm::mat4 vp);
+
+ glm::mat4 GetVP();
+
void SetModelAndMVP(const glm::mat4& mat);
void dispose();
void InitOpenGL();
commit 90a283dd5fcaf58b1955061cfcaa7baff140392c
Author: Michael Jaumann <meta_dev at yahoo.com>
Date: Tue Jan 13 13:21:05 2015 +0000
show backbuffer
Change-Id: Iefec84321103ca0d5ac28585403dbeed74d1a9f3
diff --git a/canvas/source/opengl/ogl_spritedevicehelper.cxx b/canvas/source/opengl/ogl_spritedevicehelper.cxx
index 087cedd..ce2a5f3 100644
--- a/canvas/source/opengl/ogl_spritedevicehelper.cxx
+++ b/canvas/source/opengl/ogl_spritedevicehelper.cxx
@@ -310,6 +310,7 @@ namespace oglcanvas
unx::glXWaitGL();
XSync( reinterpret_cast<unx::Display*>(mpDisplay), false );
*/
+ pChildWindow->Show();
mpContext->swapBuffers();
// flush texture cache, such that it does not build up
commit eac0340c53a2b642ed6dd7cadd80e535ab21f908
Author: Michael Jaumann <meta_dev at yahoo.com>
Date: Fri Dec 19 08:45:59 2014 +0000
subdevide bezier segments into more points
Change-Id: I239bb6cba30c5a01c0b7973d55b94779898ddb90
diff --git a/canvas/source/opengl/ogl_canvastools.cxx b/canvas/source/opengl/ogl_canvastools.cxx
index cc41d1c..eacac6b 100644
--- a/canvas/source/opengl/ogl_canvastools.cxx
+++ b/canvas/source/opengl/ogl_canvastools.cxx
@@ -21,8 +21,9 @@
#include <com/sun/star/rendering/ARGBColor.hpp>
#include <GL/glew.h>
-#include <glm/gtc/type_ptr.hpp>
+//subdivision count of bezier segments
+#define COUNT_OF_ADAPTIVE_SUBDIVISION 40
using namespace ::com::sun::star;
@@ -34,7 +35,7 @@ namespace oglcanvas
{
::basegfx::B2DPolyPolygon aPolyPoly(rPolyPoly);
if( aPolyPoly.areControlPointsUsed() )
- aPolyPoly = rPolyPoly.getDefaultAdaptiveSubdivision();
+ aPolyPoly = rPolyPoly.getAdaptiveSubdivision(COUNT_OF_ADAPTIVE_SUBDIVISION);
const ::basegfx::B2DPolygon& rTriangulatedPolygon(
::basegfx::triangulator::triangulate(aPolyPoly));
if(rTriangulatedPolygon.count()>0)
@@ -56,7 +57,7 @@ namespace oglcanvas
{
::basegfx::B2DPolyPolygon aPolyPoly(rPolyPoly);
if( aPolyPoly.areControlPointsUsed() )
- aPolyPoly = rPolyPoly.getDefaultAdaptiveSubdivision();
+ aPolyPoly = rPolyPoly.getAdaptiveSubdivision(COUNT_OF_ADAPTIVE_SUBDIVISION);
const ::basegfx::B2DRange& rBounds(aPolyPoly.getB2DRange());
const double nWidth=rBounds.getWidth();
const double nHeight=rBounds.getHeight();
@@ -75,6 +76,7 @@ namespace oglcanvas
}
}
+
/** only use this for line polygons.
better not leave triangulation to OpenGL. also, ignores texturing
@@ -83,11 +85,10 @@ namespace oglcanvas
{
::basegfx::B2DPolyPolygon aPolyPoly(rPolyPoly);
if( aPolyPoly.areControlPointsUsed() )
- aPolyPoly = rPolyPoly.getDefaultAdaptiveSubdivision();
+ aPolyPoly = rPolyPoly.getAdaptiveSubdivision(COUNT_OF_ADAPTIVE_SUBDIVISION);
for(sal_uInt32 i=0; i<aPolyPoly.count(); i++ )
{
-
const ::basegfx::B2DPolygon& rPolygon( aPolyPoly.getB2DPolygon(i) );
const sal_uInt32 nPts=rPolygon.count();
commit 39fabcb219f9025abd9acc3109611b8410755e68
Author: Michael Jaumann <meta_dev at yahoo.com>
Date: Fri Dec 19 08:38:47 2014 +0000
adaptive subdivision of bezier curves
additional method with a parameter, count of calculated points,
instead of default point count
Change-Id: I60d8977f6785dfb804228b0c88118897e860db6c
diff --git a/basegfx/source/polygon/b2dpolygon.cxx b/basegfx/source/polygon/b2dpolygon.cxx
index 096c4a0..850c41e 100644
--- a/basegfx/source/polygon/b2dpolygon.cxx
+++ b/basegfx/source/polygon/b2dpolygon.cxx
@@ -481,12 +481,17 @@ public:
const basegfx::B2DPolygon& getDefaultAdaptiveSubdivision(const basegfx::B2DPolygon& rSource) const
{
- if(!mpDefaultSubdivision)
- {
- const_cast< ImplBufferedData* >(this)->mpDefaultSubdivision.reset(new basegfx::B2DPolygon(basegfx::tools::adaptiveSubdivideByCount(rSource, 9)));
- }
+ return getAdaptiveSubdivision(rSource, 9);
+ }
- return *mpDefaultSubdivision;
+
+ const basegfx::B2DPolygon& getAdaptiveSubdivision(const basegfx::B2DPolygon& rSource, const sal_uInt32 nCount) const
+ {
+ if(!mpDefaultSubdivision)
+ {
+ const_cast< ImplBufferedData* >(this)->mpDefaultSubdivision.reset(new basegfx ::B2DPolygon(basegfx::tools::adaptiveSubdivideByCount(rSource,nCount)));
+ }
+ return *mpDefaultSubdivision;
}
const basegfx::B2DRange& getB2DRange(const basegfx::B2DPolygon& rSource) const
@@ -591,6 +596,22 @@ public:
return mpBufferedData->getDefaultAdaptiveSubdivision(rSource);
}
+
+ const basegfx::B2DPolygon& getAdaptiveSubdivision(const basegfx::B2DPolygon& rSource, const sal_uInt32 nCount) const
+ {
+ if(!mpControlVector || !mpControlVector->isUsed())
+ {
+ return rSource;
+ }
+
+ if(!mpBufferedData)
+ {
+ const_cast< ImplB2DPolygon* >(this)->mpBufferedData.reset(new ImplBufferedData);
+ }
+
+ return mpBufferedData->getAdaptiveSubdivision(rSource, nCount);
+ }
+
const basegfx::B2DRange& getB2DRange(const basegfx::B2DPolygon& rSource) const
{
if(!mpBufferedData)
@@ -1379,6 +1400,11 @@ namespace basegfx
return mpPolygon->getDefaultAdaptiveSubdivision(*this);
}
+ B2DPolygon B2DPolygon::getAdaptiveSubdivision(const sal_uInt32 nCount) const
+ {
+ return mpPolygon->getAdaptiveSubdivision(*this, nCount);
+ }
+
B2DRange B2DPolygon::getB2DRange() const
{
return mpPolygon->getB2DRange(*this);
diff --git a/basegfx/source/polygon/b2dpolypolygon.cxx b/basegfx/source/polygon/b2dpolypolygon.cxx
index 92b74e7..4b0dfe9 100644
--- a/basegfx/source/polygon/b2dpolypolygon.cxx
+++ b/basegfx/source/polygon/b2dpolypolygon.cxx
@@ -283,6 +283,18 @@ namespace basegfx
return aRetval;
}
+ B2DPolyPolygon B2DPolyPolygon::getAdaptiveSubdivision(const sal_uInt32 nCount) const
+ {
+ B2DPolyPolygon aRetval;
+
+ for(sal_uInt32 a(0L); a < mpPolyPolygon->count(); a++)
+ {
+ aRetval.append(mpPolyPolygon->getB2DPolygon(a).getAdaptiveSubdivision(nCount));
+ }
+
+ return aRetval;
+ }
+
B2DRange B2DPolyPolygon::getB2DRange() const
{
B2DRange aRetval;
diff --git a/include/basegfx/polygon/b2dpolygon.hxx b/include/basegfx/polygon/b2dpolygon.hxx
index da88050..a74fdfb 100644
--- a/include/basegfx/polygon/b2dpolygon.hxx
+++ b/include/basegfx/polygon/b2dpolygon.hxx
@@ -148,6 +148,15 @@ namespace basegfx
*/
B2DPolygon getDefaultAdaptiveSubdivision() const;
+ /** adaptive subdivision access
+
+ see getDefaultAdaptiveSubdivision
+
+ @nCount
+ count of subdivision, creates nCount+1 edges
+ and nCount +2 points
+ */
+ B2DPolygon getAdaptiveSubdivision(const sal_uInt32 nCount) const;
/** Get the B2DRange (Rectangle dimensions) of this B2DPolygon
A polygon may have up to three ranges:
diff --git a/include/basegfx/polygon/b2dpolypolygon.hxx b/include/basegfx/polygon/b2dpolypolygon.hxx
index 07bffcd..37a9a36 100644
--- a/include/basegfx/polygon/b2dpolypolygon.hxx
+++ b/include/basegfx/polygon/b2dpolypolygon.hxx
@@ -85,6 +85,15 @@ namespace basegfx
*/
B2DPolyPolygon getDefaultAdaptiveSubdivision() const;
+ /** adaptive subdivision access
+
+ For details refer to B2DPolygon::getAdaptiveSubdivision()
+
+ @return
+ The default subdivision of this polygon
+ */
+ B2DPolyPolygon getAdaptiveSubdivision(const sal_uInt32 nCount) const;
+
/** Get the B2DRange (Rectangle dimensions) of this B2DPolyPolygon
For details refer to B2DPolygon::getB2DRange()
More information about the Libreoffice-commits
mailing list