[Libreoffice-commits] core.git: Branch 'feature/opengl-canvas-rework' - 2 commits - canvas/opengl canvas/source
Michael Jaumann
meta_dev at yahoo.com
Fri Nov 7 03:28:08 PST 2014
canvas/opengl/rectangularMultiColorGradientFragmentShader.glsl | 6
canvas/source/opengl/ogl_canvascustomsprite.cxx | 30 +--
canvas/source/opengl/ogl_canvascustomsprite.hxx | 1
canvas/source/opengl/ogl_canvashelper.cxx | 78 ++++++----
canvas/source/opengl/ogl_canvashelper.hxx | 2
canvas/source/opengl/ogl_renderHelper.cxx | 6
canvas/source/opengl/ogl_renderHelper.hxx | 3
canvas/source/opengl/ogl_spritedevicehelper.cxx | 8 +
canvas/source/opengl/ogl_spritedevicehelper.hxx | 7
9 files changed, 86 insertions(+), 55 deletions(-)
New commits:
commit 56fb90618a731567bf44339bd4e0b8d0e4dd4dd9
Author: Michael Jaumann <meta_dev at yahoo.com>
Date: Fri Nov 7 11:22:32 2014 +0000
mv renderHelper->Spritedevicehelper,init OglContxt
Change-Id: I81e4035796e47bd845c8f211d30cc2655b9c09f0
diff --git a/canvas/source/opengl/ogl_canvascustomsprite.cxx b/canvas/source/opengl/ogl_canvascustomsprite.cxx
index f64e25c..58b2561 100644
--- a/canvas/source/opengl/ogl_canvascustomsprite.cxx
+++ b/canvas/source/opengl/ogl_canvascustomsprite.cxx
@@ -47,7 +47,6 @@ namespace oglcanvas
::canvas::tools::setIdentityAffineMatrix2D(maTransformation);
maCanvasHelper.init( *rRefDevice.get(),
rDeviceHelper );
- mRenderHelper.SetVP(1600, 900);//is this right?
}
void CanvasCustomSprite::disposeThis()
@@ -55,7 +54,6 @@ namespace oglcanvas
::osl::MutexGuard aGuard( m_aMutex );
mpSpriteCanvas.clear();
- mRenderHelper.dispose();
// forward to parent
CanvasCustomSpriteBaseT::disposeThis();
}
@@ -132,10 +130,10 @@ namespace oglcanvas
if( ::basegfx::fTools::equalZero( mfAlpha ) )
return true;
- const ::basegfx::B2IVector aSpriteSizePixel(
+ const glm::vec2 aSpriteSizePixel(
::canvas::tools::roundUp( maSize.Width ),
::canvas::tools::roundUp( maSize.Height ));
-
+ RenderHelper* pRenderHelper = maCanvasHelper.getDeviceHelper()->getRenderHelper();
IBufferContextSharedPtr pBufferContext;
if( mfAlpha != 1.0 || mxClip.is() )
{
@@ -161,7 +159,7 @@ namespace oglcanvas
maTransformation.m02, maTransformation.m12, 0, 1
);
- mRenderHelper.SetModelAndMVP(translate * aGLTransform);
+ pRenderHelper->SetModelAndMVP(translate * aGLTransform);
// content ended up in background buffer - compose to
// screen now. Calls below switches us back to window
// context, and binds to generated, dynamic texture
@@ -197,8 +195,8 @@ namespace oglcanvas
rTriangulatedPolygon,
basegfx::B2DRange(
0,0,
- aSpriteSizePixel.getX(),
- aSpriteSizePixel.getY())));
+ aSpriteSizePixel.x,
+ aSpriteSizePixel.y)));
GLfloat vertices[rTriangulatedPolygon.count()*2];
for( sal_uInt32 i=0; i<rTriangulatedPolygon.count(); i++ )
@@ -207,29 +205,29 @@ namespace oglcanvas
vertices[i*2]= rPt.getX();
vertices[i*2+1]= rPt.getY();
}
- mRenderHelper.renderVertexTex( vertices, fWidth, fHeight, color, GL_TRIANGLES);
+ pRenderHelper->renderVertexTex( vertices, fWidth, fHeight, color, GL_TRIANGLES);
}
else
{
- const double fWidth=maSize.Width/aSpriteSizePixel.getX();
- const double fHeight=maSize.Height/aSpriteSizePixel.getY();
+ const double fWidth=maSize.Width/aSpriteSizePixel.x;
+ const double fHeight=maSize.Height/aSpriteSizePixel.y;
GLfloat vertices[] = {0, 0,
- 0, (float) aSpriteSizePixel.getY(),
- (float) aSpriteSizePixel.getX(), 0,
- (float) aSpriteSizePixel.getX(), (float) aSpriteSizePixel.getY() };
+ 0, (float) aSpriteSizePixel.y,
+ (float) aSpriteSizePixel.x, 0,
+ (float) aSpriteSizePixel.x, (float) aSpriteSizePixel.y };
GLfloat uvCoordinates[] = {0, 0,
0, (float) fHeight,
(float) fWidth, 0,
(float) fWidth, (float) fHeight };
- mRenderHelper.renderVertexUVTex(vertices, uvCoordinates, color, GL_TRIANGLE_STRIP );
+ pRenderHelper->renderVertexUVTex(vertices, uvCoordinates, color, GL_TRIANGLE_STRIP );
}
glBindTexture(GL_TEXTURE_2D, 0);
}
// translate sprite to output position
- mRenderHelper.SetModelAndMVP(translate);
+ pRenderHelper->SetModelAndMVP(translate);
GLfloat vertices[] = {-2, -2,
-2, (float) maSize.Height+4,
(float) maSize.Width+4, (float) maSize.Height+4,
@@ -237,7 +235,7 @@ namespace oglcanvas
-2, -2,
(float) maSize.Width+4, (float) maSize.Height+4 };
- mRenderHelper.renderVertexConstColor(vertices, glm::vec4(1, 0, 0, 1), GL_LINE_STRIP);
+ pRenderHelper->renderVertexConstColor(vertices, glm::vec4(1, 0, 0, 1), GL_LINE_STRIP);
std::vector<double> aVec;
aVec.push_back(mfAlpha);
diff --git a/canvas/source/opengl/ogl_canvascustomsprite.hxx b/canvas/source/opengl/ogl_canvascustomsprite.hxx
index 6f78a72..730d600 100644
--- a/canvas/source/opengl/ogl_canvascustomsprite.hxx
+++ b/canvas/source/opengl/ogl_canvascustomsprite.hxx
@@ -92,7 +92,6 @@ namespace oglcanvas
::basegfx::B2DPoint maPosition;
double mfAlpha;
double mfPriority;
- RenderHelper mRenderHelper;
};
}
diff --git a/canvas/source/opengl/ogl_canvashelper.cxx b/canvas/source/opengl/ogl_canvashelper.cxx
index 58e234f..60216ec 100644
--- a/canvas/source/opengl/ogl_canvashelper.cxx
+++ b/canvas/source/opengl/ogl_canvashelper.cxx
@@ -93,61 +93,86 @@ namespace oglcanvas
namespace
{
- bool lcl_drawPoint( const CanvasHelper& /*rHelper*/,
+ bool lcl_drawPoint( const CanvasHelper& rHelper,
const ::basegfx::B2DHomMatrix& rTransform,
GLenum eSrcBlend,
GLenum eDstBlend,
const rendering::ARGBColor& rColor,
- const geometry::RealPoint2D& rPoint,
- RenderHelper& mRenderHelper)
+ const geometry::RealPoint2D& rPoint)
{
- mRenderHelper.SetModelAndMVP(setupState(rTransform, eSrcBlend, eDstBlend));
+ RenderHelper* pRenderHelper = rHelper.getDeviceHelper()->getRenderHelper();
+ pRenderHelper->SetModelAndMVP(setupState(rTransform, eSrcBlend, eDstBlend));
glm::vec4 color = glm::vec4( (float) rColor.Red,
(float) rColor.Green,
(float) rColor.Blue,
(float) rColor.Alpha);
GLfloat vertices[] = {(float) rPoint.X, (float) rPoint.Y};
- mRenderHelper.renderVertexConstColor(vertices, color, GL_POINTS);
+ pRenderHelper->renderVertexConstColor(vertices, color, GL_POINTS);
return true;
}
- bool lcl_drawLine( const CanvasHelper& /*rHelper*/,
+ bool lcl_drawLine( const CanvasHelper& rHelper,
const ::basegfx::B2DHomMatrix& rTransform,
GLenum eSrcBlend,
GLenum eDstBlend,
const rendering::ARGBColor& rColor,
const geometry::RealPoint2D& rStartPoint,
- const geometry::RealPoint2D& rEndPoint,
- RenderHelper& mRenderHelper)
+ const geometry::RealPoint2D& rEndPoint)
{
- mRenderHelper.SetModelAndMVP(setupState(rTransform, eSrcBlend, eDstBlend));
+ RenderHelper* pRenderHelper = rHelper.getDeviceHelper()->getRenderHelper();
+ pRenderHelper->SetModelAndMVP(setupState(rTransform, eSrcBlend, eDstBlend));
glm::vec4 color = glm::vec4( (float) rColor.Red,
(float) rColor.Green,
(float) rColor.Blue,
(float) rColor.Alpha);
GLfloat vertices[] = {(float) rStartPoint.X, (float) rStartPoint.Y,
(float) rEndPoint.X, (float) rEndPoint.Y };
- mRenderHelper.renderVertexConstColor(vertices, color, GL_LINES);
+ pRenderHelper->renderVertexConstColor(vertices, color, GL_LINES);
return true;
}
- bool lcl_drawPolyPolygon( const CanvasHelper& /*rHelper*/,
+ bool lcl_drawPolyPolygon( const CanvasHelper& rHelper,
const ::basegfx::B2DHomMatrix& rTransform,
GLenum eSrcBlend,
GLenum eDstBlend,
const rendering::ARGBColor& rColor,
- const ::basegfx::B2DPolyPolygonVector& rPolyPolygons )
+ const ::basegfx::B2DPolyPolygonVector& rPolyPolygons)
{
- //move renderPolyPolygon here?
- // mRenderHelper.SetModelAndMVP(setupState(rTransform, eSrcBlend, eDstBlend));
+ RenderHelper* pRenderHelper = rHelper.getDeviceHelper()->getRenderHelper();
+ pRenderHelper->SetModelAndMVP(setupState(rTransform, eSrcBlend, eDstBlend));
glm::vec4 color = glm::vec4( (float) rColor.Red,
(float) rColor.Green,
(float) rColor.Blue,
(float) rColor.Alpha);
+
::basegfx::B2DPolyPolygonVector::const_iterator aCurr=rPolyPolygons.begin();
const ::basegfx::B2DPolyPolygonVector::const_iterator aEnd=rPolyPolygons.end();
while( aCurr != aEnd )
- renderPolyPolygon(*aCurr++);
+ {
+ // renderPolyPolygon(*aCurr++);
+ const ::basegfx::B2DPolyPolygon& rPolyPoly= *aCurr++;
+ ::basegfx::B2DPolyPolygon aPolyPoly(rPolyPoly);
+ if( aPolyPoly.areControlPointsUsed() )
+ aPolyPoly = rPolyPoly.getDefaultAdaptiveSubdivision();
+
+ for( sal_uInt32 i=0; i<aPolyPoly.count(); i++ )
+ {
+
+
+ const ::basegfx::B2DPolygon& rPolygon( aPolyPoly.getB2DPolygon(i) );
+
+ const sal_uInt32 nPts=rPolygon.count();
+ const sal_uInt32 nExtPts=nPts + int(rPolygon.isClosed());
+ GLfloat vertices[nExtPts*2];
+ for( sal_uInt32 j=0; j<nExtPts; j++ )
+ {
+ const ::basegfx::B2DPoint& rPt( rPolygon.getB2DPoint( j % nPts ) );
+ vertices[j*2] = rPt.getX();
+ vertices[j*2+1] = rPt.getY();
+ }
+ pRenderHelper->renderVertexConstColor(vertices, color, GL_LINE_STRIP);
+ }
+ }
return true;
}
@@ -271,11 +296,11 @@ namespace oglcanvas
const rendering::ARGBColor& rColor,
const geometry::IntegerSize2D& rPixelSize,
const uno::Sequence<sal_Int8>& rPixelData,
- sal_uInt32 nPixelCrc32,
- RenderHelper& mRenderHelper)
+ sal_uInt32 nPixelCrc32)
{
- mRenderHelper.SetModelAndMVP(setupState(rTransform, eSrcBlend, eDstBlend));
+ RenderHelper* pRenderHelper = rHelper.getDeviceHelper()->getRenderHelper();
+ pRenderHelper->SetModelAndMVP(setupState(rTransform, eSrcBlend, eDstBlend));
const unsigned int nTexId=rHelper.getDeviceHelper()->getTextureCache().getTexture(
rPixelSize, rPixelData.getConstArray(), nPixelCrc32);
@@ -303,7 +328,7 @@ namespace oglcanvas
0, 1,
1, 0,
1, 1 };
- mRenderHelper.renderVertexUVTex(vertices, uvCoordinates, color, GL_TRIANGLE_STRIP );
+ pRenderHelper->renderVertexUVTex(vertices, uvCoordinates, color, GL_TRIANGLE_STRIP );
glBindTexture(GL_TEXTURE_2D, 0);
@@ -389,7 +414,6 @@ namespace oglcanvas
mpDeviceHelper( NULL ),
mpRecordedActions()
{
- mRenderHelper.SetVP(1600, 900);//is this right?
}
CanvasHelper::~CanvasHelper()
@@ -436,7 +460,7 @@ namespace oglcanvas
setupGraphicsState( rAct, viewState, renderState );
rAct.maFunction = ::boost::bind(&lcl_drawPoint,
_1,_2,_3,_4,_5,
- aPoint, boost::ref(mRenderHelper));
+ aPoint);
}
}
@@ -453,8 +477,7 @@ namespace oglcanvas
setupGraphicsState( rAct, viewState, renderState );
rAct.maFunction = ::boost::bind(&lcl_drawLine,
_1,_2,_3,_4,_5,
- aStartPoint,aEndPoint,
- boost::ref(mRenderHelper));
+ aStartPoint,aEndPoint);
}
}
@@ -477,7 +500,7 @@ namespace oglcanvas
geometry::RealPoint2D(
aBezierSegment.Px,
aBezierSegment.Py),
- aEndPoint, boost::ref(mRenderHelper));
+ aEndPoint);
}
}
@@ -499,7 +522,7 @@ namespace oglcanvas
::basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(xPolyPolygon));
rAct.maPolyPolys.back().makeUnique(); // own copy, for thread safety
- rAct.maFunction = &lcl_drawPolyPolygon;
+ // rAct.maFunction = &lcl_drawPolyPolygon;
}
// TODO(P1): Provide caching here.
@@ -526,7 +549,7 @@ namespace oglcanvas
rAct.maPolyPolys.back().makeUnique(); // own copy, for thread safety
// TODO(F3): fallback to drawPolyPolygon currently
- rAct.maFunction = &lcl_drawPolyPolygon;
+ // rAct.maFunction = &lcl_drawPolyPolygon;
}
// TODO(P1): Provide caching here.
@@ -881,8 +904,7 @@ namespace oglcanvas
aSize, aARGBBytes,
rtl_crc32(0,
aARGBBytes.getConstArray(),
- aARGBBytes.getLength()),
- boost::ref(mRenderHelper));
+ aARGBBytes.getLength()));
}
// TODO(F1): handle non-integer case
}
diff --git a/canvas/source/opengl/ogl_canvashelper.hxx b/canvas/source/opengl/ogl_canvashelper.hxx
index da2f7ab..71b7f2c 100644
--- a/canvas/source/opengl/ogl_canvashelper.hxx
+++ b/canvas/source/opengl/ogl_canvashelper.hxx
@@ -231,8 +231,6 @@ namespace oglcanvas
copied (used e.g. for CanvasBitmap)
*/
RecordVectorT mpRecordedActions;
-
- RenderHelper mRenderHelper;
};
}
diff --git a/canvas/source/opengl/ogl_renderHelper.cxx b/canvas/source/opengl/ogl_renderHelper.cxx
index 27cf96a..36a1306 100644
--- a/canvas/source/opengl/ogl_renderHelper.cxx
+++ b/canvas/source/opengl/ogl_renderHelper.cxx
@@ -5,17 +5,17 @@ namespace oglcanvas
{
RenderHelper::RenderHelper()
: m_iWidth(1600) //Why this dimensions?
- , m_iHeight(900)
+ , m_iHeight(900) //Whole window, see spritedevicehelper
, m_Model(glm::mat4(1.0f))
{
- InitOpenGL();
}
void RenderHelper::InitOpenGL()
{
+ GLenum err = glewInit();
//Load Shaders //
m_texManProgID = OpenGLHelper::LoadShaders("textManipulatingVertexShader", "textFragmentShader");
m_simpleProgID = OpenGLHelper::LoadShaders("simpleVertexShader", "textFragmentShader");
- m_texProgID = OpenGLHelper::LoadShaders("texVertrexShader", "constantFragmentShader");
+ m_texProgID = OpenGLHelper::LoadShaders("texVertexShader", "constantFragmentShader");
// Get a handle for uniforms
m_manTexUnf = glGetUniformLocation(m_texManProgID, "TextTex");
m_simpleTexUnf = glGetUniformLocation(m_simpleProgID, "TextTex");
diff --git a/canvas/source/opengl/ogl_renderHelper.hxx b/canvas/source/opengl/ogl_renderHelper.hxx
index a7e7a54..7c717a6 100644
--- a/canvas/source/opengl/ogl_renderHelper.hxx
+++ b/canvas/source/opengl/ogl_renderHelper.hxx
@@ -19,13 +19,12 @@ namespace oglcanvas
void SetVP(int width, int height);
void SetModelAndMVP(glm::mat4 mat);
void dispose();
+ void InitOpenGL();
private:
RenderHelper& operator = (const RenderHelper& other);
RenderHelper(const RenderHelper& other);
- void InitOpenGL();
-
GLuint m_vertexBuffer;
GLuint m_uvBuffer;
diff --git a/canvas/source/opengl/ogl_spritedevicehelper.cxx b/canvas/source/opengl/ogl_spritedevicehelper.cxx
index 70c9507..5d8ed44 100644
--- a/canvas/source/opengl/ogl_spritedevicehelper.cxx
+++ b/canvas/source/opengl/ogl_spritedevicehelper.cxx
@@ -108,6 +108,8 @@ namespace oglcanvas
maContext.init(&rWindow);
// init window context
initContext();
+ mRenderHelper.InitOpenGL();
+ mRenderHelper.SetVP(1600, 900);//is this right?
mnLinearMultiColorGradientProgram =
OpenGLHelper::LoadShaders("dummyVertexShader", "linearMultiColorGradientFragmentShader");
@@ -149,6 +151,7 @@ namespace oglcanvas
glDeleteProgram( mnLinearTwoColorGradientProgram );
glDeleteProgram( mnLinearMultiColorGradientProgram );
}
+ mRenderHelper.dispose();
}
geometry::RealSize2D SpriteDeviceHelper::getPhysicalResolution()
@@ -594,6 +597,11 @@ namespace oglcanvas
{
return *mpTextureCache;
}
+
+ RenderHelper* SpriteDeviceHelper::getRenderHelper()
+ {
+ return & mRenderHelper;
+ }
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/canvas/source/opengl/ogl_spritedevicehelper.hxx b/canvas/source/opengl/ogl_spritedevicehelper.hxx
index e9ecdc2..8bda43b 100644
--- a/canvas/source/opengl/ogl_spritedevicehelper.hxx
+++ b/canvas/source/opengl/ogl_spritedevicehelper.hxx
@@ -19,6 +19,7 @@
#include <boost/shared_ptr.hpp>
#include "ogl_buffercontext.hxx"
+#include "ogl_renderHelper.hxx"
#include <glm/glm.hpp>
#include <set>
@@ -116,8 +117,13 @@ namespace oglcanvas
/// Get instance of internal texture cache
TextureCache& getTextureCache() const;
+ ///Get instance of internal RenderHelper;
+ RenderHelper* getRenderHelper();
+
bool activateWindowContext();
+
+
private:
void resize( const ::basegfx::B2IVector& rNewSize );
@@ -147,6 +153,7 @@ namespace oglcanvas
unsigned int mnRectangularMultiColorGradientProgram;
OpenGLContext maContext;
+ RenderHelper mRenderHelper;
};
}
commit 565aef93a02aa444573ca9c26b55e1056c6c2f7f
Author: Michael Jaumann <meta_dev at yahoo.com>
Date: Fri Nov 7 09:48:02 2014 +0000
take the correct max function in shader
Change-Id: Ib0f4de5e75120b86a107e885e672066d582240b0
diff --git a/canvas/opengl/rectangularMultiColorGradientFragmentShader.glsl b/canvas/opengl/rectangularMultiColorGradientFragmentShader.glsl
index ea17565..331e57a 100644
--- a/canvas/opengl/rectangularMultiColorGradientFragmentShader.glsl
+++ b/canvas/opengl/rectangularMultiColorGradientFragmentShader.glsl
@@ -15,7 +15,7 @@ uniform sampler1D t_stopArray1d;
uniform mat3x2 m_transform;
varying vec2 v_textureCoords2d;
-int max(int x, int y)
+int maxInt(int x, int y)
{
if(x > y)
return x;
@@ -28,13 +28,13 @@ int findBucket(float t)
while( nMinBucket < i_nColors &&
texture1D(t_stopArray1d, nMinBucket).s < t )
++nMinBucket;
- return max(nMinBucket-1,0);
+ return maxInt(nMinBucket-1,0);
}
void main(void)
{
vec2 v = abs( vec2(m_transform * vec3(v_textureCoords2d,1)) );
- float fAlpha = 1 - max(v.x, v.y);
+ float fAlpha = 1.0 - max(v.x, v.y);
int nMinBucket=findBucket( fAlpha );
More information about the Libreoffice-commits
mailing list