basegfx/source/polygon/b2dpolypolygoncutter.cxx | 2 vcl/inc/impbmp.hxx | 7 vcl/inc/openglgdiimpl.hxx | 3 vcl/opengl/gdiimpl.cxx | 246 ++++++++++++++++++------ vcl/opengl/maskedTextureFragmentShader.glsl | 9 vcl/opengl/salbmp.cxx | 4 vcl/opengl/solidFragmentShader.glsl | 2 vcl/source/gdi/bitmap.cxx | 3 vcl/source/gdi/impbmp.cxx | 7 vcl/source/opengl/OpenGLContext.cxx | 8 vcl/source/outdev/bitmap.cxx | 3 vcl/source/outdev/polygon.cxx | 2 vcl/win/source/gdi/gdiimpl.cxx | 4 vcl/win/source/gdi/gdiimpl.hxx | 2 vcl/workben/vcldemo.cxx | 2 15 files changed, 225 insertions(+), 79 deletions(-)
New commits: commit d22fe8b313ef3bb0af7231632ee5543b84109d87 Author: Markus Mohrhard <[email protected]> Date: Sun Nov 9 08:50:41 2014 +0100 remove that method also in the windows backend Change-Id: I578d842614fdc227459a3aaf889e062499b8bdbf diff --git a/vcl/win/source/gdi/gdiimpl.cxx b/vcl/win/source/gdi/gdiimpl.cxx index de9b6e3..453033f 100644 --- a/vcl/win/source/gdi/gdiimpl.cxx +++ b/vcl/win/source/gdi/gdiimpl.cxx @@ -294,10 +294,6 @@ WinSalGraphicsImpl::~WinSalGraphicsImpl() } -void WinSalGraphicsImpl::Init(SalFrame* /*pFrame*/) -{ -} - void WinSalGraphicsImpl::freeResources() { } diff --git a/vcl/win/source/gdi/gdiimpl.hxx b/vcl/win/source/gdi/gdiimpl.hxx index ebef9ea..2a0780f 100644 --- a/vcl/win/source/gdi/gdiimpl.hxx +++ b/vcl/win/source/gdi/gdiimpl.hxx @@ -52,8 +52,6 @@ public: virtual ~WinSalGraphicsImpl(); - virtual void Init(SalFrame* pFrame) SAL_OVERRIDE; - virtual void freeResources() SAL_OVERRIDE; virtual bool setClipRegion( const vcl::Region& ) SAL_OVERRIDE; commit 198c656097aacc48f41aa3d1011d499cbedefc8c Author: Markus Mohrhard <[email protected]> Date: Sun Nov 9 08:43:44 2014 +0100 fix windows compile errors in OpenGLContext Change-Id: Ic1a072d340d9115a6fc110bc9f71532739985d48 diff --git a/vcl/source/opengl/OpenGLContext.cxx b/vcl/source/opengl/OpenGLContext.cxx index 5508dfd..1062a87 100644 --- a/vcl/source/opengl/OpenGLContext.cxx +++ b/vcl/source/opengl/OpenGLContext.cxx @@ -42,9 +42,11 @@ OpenGLContext::OpenGLContext(): mbInitialized(false), mbRequestLegacyContext(false), mbUseDoubleBufferedRendering(true), - mbRequestVirtualDevice(false), - mbPixmap(false) + mbRequestVirtualDevice(false) { +#if defined( UNX ) && !defined MACOSX && !defined IOS && !defined ANDROID + mbPixmap = false; +#endif } OpenGLContext::~OpenGLContext() @@ -803,6 +805,8 @@ bool OpenGLContext::ImplInit() return false; } + RECT clientRect; + GetClientRect(WindowFromDC(m_aGLWin.hDC), &clientRect); m_aGLWin.Width = clientRect.right - clientRect.left; m_aGLWin.Height = clientRect.bottom - clientRect.top; commit 5c3ac0d843d92d014353c90ed51f54d82b68d49d Author: Louis-Francis Ratté-Boulianne <[email protected]> Date: Sat Nov 8 23:05:32 2014 -0500 vcl: Re-enable features in vcldemo Change-Id: If2a17b2c5609b7529d9aa5091ced280dd5ac4176 diff --git a/vcl/workben/vcldemo.cxx b/vcl/workben/vcldemo.cxx index cae3fb0b..daa877f 100644 --- a/vcl/workben/vcldemo.cxx +++ b/vcl/workben/vcldemo.cxx @@ -25,10 +25,10 @@ #include <vcl/virdev.hxx> #include <vcl/graphicfilter.hxx> -#if 0 # define FIXME_ALPHA_WORKING # define FIXME_ROUNDED_RECT_WORKING # define FIXME_DRAW_TRANSPARENT_WORKING +#if 0 #endif using namespace css; commit 10dbdbf948884dc6f6ac9559d456642b50a6d2b9 Author: Louis-Francis Ratté-Boulianne <[email protected]> Date: Sat Nov 8 23:04:46 2014 -0500 vcl: Add support for styled lines rendering with OpenGL Change-Id: Id6117e79d3aec6524598f068500249c9cd286ece diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx index d0b1afb..7094727 100644 --- a/vcl/opengl/gdiimpl.cxx +++ b/vcl/opengl/gdiimpl.cxx @@ -22,9 +22,12 @@ #include <vcl/gradient.hxx> #include <salframe.hxx> #include "salvd.hxx" +#include <basegfx/matrix/b2dhommatrixtools.hxx> +#include <basegfx/polygon/b2dlinegeometry.hxx> #include <basegfx/polygon/b2dpolygontools.hxx> #include <basegfx/polygon/b2dpolygontriangulator.hxx> #include <basegfx/polygon/b2dpolypolygoncutter.hxx> +#include <basegfx/polygon/b2dtrapezoid.hxx> #include <vcl/opengl/OpenGLHelper.hxx> #include "opengl/salbmp.hxx" @@ -648,13 +651,84 @@ bool OpenGLSalGraphicsImpl::drawPolyPolygon( const ::basegfx::B2DPolyPolygon& rP } bool OpenGLSalGraphicsImpl::drawPolyLine( - const ::basegfx::B2DPolygon&, - double /*fTransparency*/, - const ::basegfx::B2DVector& /*rLineWidths*/, - basegfx::B2DLineJoin, - com::sun::star::drawing::LineCap) -{ - return false; + const ::basegfx::B2DPolygon& rPolygon, + double fTransparency, + const ::basegfx::B2DVector& rLineWidth, + basegfx::B2DLineJoin eLineJoin, + com::sun::star::drawing::LineCap eLineCap) +{ + SAL_INFO( "vcl.opengl", "::drawPolyLine trans " << fTransparency ); + if( mnLineColor == SALCOLOR_NONE ) + return true; + + const bool bIsHairline = (rLineWidth.getX() == rLineWidth.getY()) && (rLineWidth.getX() <= 1.2); + + // #i101491# + if( !bIsHairline && (rPolygon.count() > 1000) ) + { + // the used basegfx::tools::createAreaGeometry is simply too + // expensive with very big polygons; fallback to caller (who + // should use ImplLineConverter normally) + // AW: ImplLineConverter had to be removed since it does not even + // know LineJoins, so the fallback will now prepare the line geometry + // the same way. + return false; + } + + // #i11575#desc5#b adjust B2D tesselation result to raster positions + basegfx::B2DPolygon aPolygon = rPolygon; + const double fHalfWidth = 0.5 * rLineWidth.getX(); + + // #i122456# This is probably thought to happen to align hairlines to pixel positions, so + // it should be a 0.5 translation, not more. It will definitely go wrong with fat lines + aPolygon.transform( basegfx::tools::createTranslateB2DHomMatrix(0.5, 0.5) ); + + // shortcut for hairline drawing to improve performance + //bool bDrawnOk = true; + if( bIsHairline ) + { + // hairlines can benefit from a simplified tesselation + // e.g. for hairlines the linejoin style can be ignored + /*basegfx::B2DTrapezoidVector aB2DTrapVector; + basegfx::tools::createLineTrapezoidFromB2DPolygon( aB2DTrapVector, aPolygon, rLineWidth.getX() ); + + // draw tesselation result + const int nTrapCount = aB2DTrapVector.size(); + if( nTrapCount > 0 ) + bDrawnOk = drawFilledTrapezoids( &aB2DTrapVector[0], nTrapCount, fTransparency ); + + return bDrawnOk;*/ + } + + // get the area polygon for the line polygon + if( (rLineWidth.getX() != rLineWidth.getY()) + && !basegfx::fTools::equalZero( rLineWidth.getY() ) ) + { + // prepare for createAreaGeometry() with anisotropic linewidth + aPolygon.transform( basegfx::tools::createScaleB2DHomMatrix(1.0, rLineWidth.getX() / rLineWidth.getY())); + } + + // create the area-polygon for the line + const basegfx::B2DPolyPolygon aAreaPolyPoly( basegfx::tools::createAreaGeometry(aPolygon, fHalfWidth, eLineJoin, eLineCap) ); + + if( (rLineWidth.getX() != rLineWidth.getY()) + && !basegfx::fTools::equalZero( rLineWidth.getX() ) ) + { + // postprocess createAreaGeometry() for anisotropic linewidth + aPolygon.transform(basegfx::tools::createScaleB2DHomMatrix(1.0, rLineWidth.getY() / rLineWidth.getX())); + } + + maContext.makeCurrent(); + glViewport( 0, 0, GetWidth(), GetHeight() ); + BeginSolid( mnLineColor, fTransparency ); + for( sal_uInt32 i = 0; i < aAreaPolyPoly.count(); i++ ) + { + const ::basegfx::B2DPolyPolygon aOnePoly( aAreaPolyPoly.getB2DPolygon( i ) ); + DrawPolyPolygon( aOnePoly ); + } + EndSolid(); + + return true; } bool OpenGLSalGraphicsImpl::drawPolyLineBezier( commit 659ed2b09c3d6ac566d4136366615ee155684d9c Author: Louis-Francis Ratté-Boulianne <[email protected]> Date: Sat Nov 8 23:03:37 2014 -0500 vcl: Fix rendering of polypolygons and self-intersecting polygons with OpenGL Change-Id: I04ed5999360eb43e2a8e2c82a3ecd9b958b16fe0 diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx index 0e30f6a..d0b1afb 100644 --- a/vcl/opengl/gdiimpl.cxx +++ b/vcl/opengl/gdiimpl.cxx @@ -24,6 +24,7 @@ #include "salvd.hxx" #include <basegfx/polygon/b2dpolygontools.hxx> #include <basegfx/polygon/b2dpolygontriangulator.hxx> +#include <basegfx/polygon/b2dpolypolygoncutter.hxx> #include <vcl/opengl/OpenGLHelper.hxx> #include "opengl/salbmp.hxx" @@ -354,54 +355,39 @@ void OpenGLSalGraphicsImpl::DrawPolygon( sal_uInt32 nPoints, const SalPoint* pPt if( ::basegfx::tools::isConvex( aPolygon ) ) { if( nPoints > 2L ) - { DrawConvexPolygon( nPoints, pPtAry ); - } } else { - const ::basegfx::B2DPolygon& aResult( - ::basegfx::triangulator::triangulate( aPolygon ) ); - std::vector<GLfloat> aVertices(aResult.count() * 2); - sal_uInt32 j( 0 ); - - float nHeight = GetHeight(); - float nWidth = GetWidth(); - for( sal_uInt32 i = 0; i < aResult.count(); i++ ) - { - const ::basegfx::B2DPoint& rPt( aResult.getB2DPoint(i) ); - aVertices[j++] = 2 * rPt.getX() / nWidth - 1.0f; - aVertices[j++] = 1.0f - 2 * rPt.getY() / nHeight; - } - - glEnableVertexAttribArray( GL_ATTRIB_POS ); - glVertexAttribPointer( GL_ATTRIB_POS, 2, GL_FLOAT, GL_FALSE, 0, &aVertices[0] ); - glDrawArrays( GL_TRIANGLES, 0, aResult.count() ); - glDisableVertexAttribArray( GL_ATTRIB_POS ); + const ::basegfx::B2DPolyPolygon aPolyPolygon( aPolygon ); + DrawPolyPolygon( aPolyPolygon ); } } -void OpenGLSalGraphicsImpl::DrawPolyPolygon( const basegfx::B2DPolyPolygon& pPolyPolygon ) +void OpenGLSalGraphicsImpl::DrawPolyPolygon( const basegfx::B2DPolyPolygon& rPolyPolygon ) { sal_uInt32 i, j; - ::std::vector< GLushort > pVertices; + ::std::vector< GLfloat > pVertices; + GLfloat nWidth = GetWidth(); + GLfloat nHeight = GetHeight(); + const ::basegfx::B2DPolyPolygon& aSimplePolyPolygon = ::basegfx::tools::solveCrossovers( rPolyPolygon ); - for( i = 0; i < pPolyPolygon.count(); i++ ) + for( i = 0; i < aSimplePolyPolygon.count(); i++ ) { - const basegfx::B2DPolygon& pPolygon( pPolyPolygon.getB2DPolygon( i ) ); + const basegfx::B2DPolygon& rPolygon( aSimplePolyPolygon.getB2DPolygon( i ) ); const ::basegfx::B2DPolygon& aResult( - ::basegfx::triangulator::triangulate( pPolygon ) ); + ::basegfx::triangulator::triangulate( rPolygon ) ); for( j = 0; j < aResult.count(); j++ ) { const ::basegfx::B2DPoint& rPt( aResult.getB2DPoint( j ) ); - pVertices.push_back( rPt.getX() ); - pVertices.push_back( rPt.getY() ); + pVertices.push_back( 2 * rPt.getX() / nWidth - 1.0f ); + pVertices.push_back( 1.0f - 2 * rPt.getY() / nHeight ); } } glEnableVertexAttribArray( GL_ATTRIB_POS ); - glVertexAttribPointer( GL_ATTRIB_POS, 2, GL_UNSIGNED_SHORT, GL_FALSE, 0, pVertices.data() ); + glVertexAttribPointer( GL_ATTRIB_POS, 2, GL_FLOAT, GL_FALSE, 0, pVertices.data() ); glDrawArrays( GL_TRIANGLES, 0, pVertices.size() / 2 ); glDisableVertexAttribArray( GL_ATTRIB_POS ); } commit 172777b1390c7ef209dea60f3de9fde07bf71135 Author: Louis-Francis Ratté-Boulianne <[email protected]> Date: Sat Nov 8 23:01:27 2014 -0500 vcl: Add support for alpha mask rendering with OpenGL Change-Id: I755c2132f143d5ebd69e53bb4d9ae45121ada22a diff --git a/vcl/inc/openglgdiimpl.hxx b/vcl/inc/openglgdiimpl.hxx index 9368a10..34c2607 100644 --- a/vcl/inc/openglgdiimpl.hxx +++ b/vcl/inc/openglgdiimpl.hxx @@ -76,7 +76,7 @@ protected: void DrawPolyPolygon( const basegfx::B2DPolyPolygon& rPolyPolygon ); void DrawTextureRect( const Size& rSize, const SalTwoRect& rPosAry ); void DrawTexture( GLuint nTexture, const Size& rSize, const SalTwoRect& rPosAry ); - void DrawTextureWithMask( GLuint nTexture, GLuint nMask, const SalTwoRect& rPosAry ); + void DrawTextureWithMask( GLuint nTexture, GLuint nMask, const Size& rSize, const SalTwoRect& rPosAry ); void DrawMask( GLuint nMask, SalColor nMaskColor, const SalTwoRect& rPosAry ); protected: diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx index 74f7252..0e30f6a 100644 --- a/vcl/opengl/gdiimpl.cxx +++ b/vcl/opengl/gdiimpl.cxx @@ -444,7 +444,7 @@ void OpenGLSalGraphicsImpl::DrawTexture( GLuint nTexture, const Size& rSize, con glUseProgram( 0 ); } -void OpenGLSalGraphicsImpl::DrawTextureWithMask( GLuint nTexture, GLuint nMask, const SalTwoRect& /*pPosAry*/ ) +void OpenGLSalGraphicsImpl::DrawTextureWithMask( GLuint nTexture, GLuint nMask, const Size& rSize, const SalTwoRect& pPosAry ) { if( mnMaskedTextureProgram == 0 ) { @@ -460,7 +460,10 @@ void OpenGLSalGraphicsImpl::DrawTextureWithMask( GLuint nTexture, GLuint nMask, glActiveTexture( GL_TEXTURE1 ); glBindTexture( GL_TEXTURE_2D, nMask ); - //DrawTextureRect( pPosAry ); + glEnable( GL_BLEND ); + glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); + DrawTextureRect( rSize, pPosAry ); + glDisable( GL_BLEND ); glActiveTexture( GL_TEXTURE1 ); glBindTexture( GL_TEXTURE_2D, 0 ); @@ -758,9 +761,10 @@ void OpenGLSalGraphicsImpl::drawBitmap( const GLuint nTexture( rBitmap.GetTexture( maContext ) ); const GLuint nMask( rMask.GetTexture( maContext ) ); - SAL_INFO( "vcl.opengl", "::drawBitmap" ); + SAL_INFO( "vcl.opengl", "::drawBitmap with MASK" ); maContext.makeCurrent(); - DrawTextureWithMask( nTexture, nMask, rPosAry ); + glViewport( 0, 0, GetWidth(), GetHeight() ); + DrawTextureWithMask( nTexture, nMask, rBitmap.GetSize(), rPosAry ); } void OpenGLSalGraphicsImpl::drawMask( @@ -881,8 +885,10 @@ bool OpenGLSalGraphicsImpl::drawAlphaBitmap( const GLuint nTexture( rBitmap.GetTexture( maContext ) ); const GLuint nAlpha( rAlpha.GetTexture( maContext ) ); + SAL_INFO( "vcl.opengl", "::drawAlphaBitmap" ); maContext.makeCurrent(); - DrawTextureWithMask( nTexture, nAlpha, rPosAry ); + glViewport( 0, 0, GetWidth(), GetHeight() ); + DrawTextureWithMask( nTexture, nAlpha, rBitmap.GetSize(), rPosAry ); return true; } diff --git a/vcl/opengl/maskedTextureFragmentShader.glsl b/vcl/opengl/maskedTextureFragmentShader.glsl index 8f8148a..badf91e 100644 --- a/vcl/opengl/maskedTextureFragmentShader.glsl +++ b/vcl/opengl/maskedTextureFragmentShader.glsl @@ -13,10 +13,11 @@ uniform sampler2D sampler; uniform sampler2D mask; void main() { - vec4 texel0, texel1; - texel0 = texture2D(sampler, tex_coord); - texel1 = texture2D(mask, tex_coord); - gl_FragColor = texel0 * texel1.a; + vec4 texel0, texel1; + texel0 = texture2D(sampler, tex_coord); + texel1 = texture2D(mask, tex_coord); + gl_FragColor = texel0; + gl_FragColor.a = texel1.r; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit ac5e9539ec1af6d0540000ba8ec797e68019072e Author: Louis-Francis Ratté-Boulianne <[email protected]> Date: Sat Nov 8 23:00:16 2014 -0500 vcl: Fix some viewport issues when rendering with OpenGL Change-Id: I99a76baeac07c1d9ec44ed492caa1d3416eb43ac diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx index a9a6884..74f7252 100644 --- a/vcl/opengl/gdiimpl.cxx +++ b/vcl/opengl/gdiimpl.cxx @@ -498,6 +498,7 @@ void OpenGLSalGraphicsImpl::drawPixel( long nX, long nY ) if( mnLineColor != SALCOLOR_NONE ) { maContext.makeCurrent(); + glViewport( 0, 0, GetWidth(), GetHeight() ); BeginSolid( mnLineColor ); DrawPoint( nX, nY ); EndSolid(); @@ -510,6 +511,7 @@ void OpenGLSalGraphicsImpl::drawPixel( long nX, long nY, SalColor nSalColor ) if( nSalColor != SALCOLOR_NONE ) { maContext.makeCurrent(); + glViewport( 0, 0, GetWidth(), GetHeight() ); BeginSolid( nSalColor ); DrawPoint( nX, nY ); EndSolid(); @@ -522,6 +524,7 @@ void OpenGLSalGraphicsImpl::drawLine( long nX1, long nY1, long nX2, long nY2 ) if( mnLineColor != SALCOLOR_NONE ) { maContext.makeCurrent(); + glViewport( 0, 0, GetWidth(), GetHeight() ); BeginSolid( mnLineColor ); DrawLine( nX1, nY1, nX2, nY2 ); EndSolid(); @@ -560,6 +563,7 @@ void OpenGLSalGraphicsImpl::drawPolyLine( sal_uInt32 nPoints, const SalPoint* pP { SAL_INFO( "vcl.opengl", "::drawPolyLine" ); maContext.makeCurrent(); + glViewport( 0, 0, GetWidth(), GetHeight() ); if( mnLineColor != SALCOLOR_NONE && nPoints > 1 ) { @@ -587,6 +591,7 @@ void OpenGLSalGraphicsImpl::drawPolygon( sal_uInt32 nPoints, const SalPoint* pPt } maContext.makeCurrent(); + glViewport( 0, 0, GetWidth(), GetHeight() ); if( mnFillColor != SALCOLOR_NONE ) { @@ -610,6 +615,7 @@ void OpenGLSalGraphicsImpl::drawPolyPolygon( sal_uInt32 nPoly, const sal_uInt32* return; maContext.makeCurrent(); + glViewport( 0, 0, GetWidth(), GetHeight() ); if( mnFillColor != SALCOLOR_NONE ) { @@ -767,6 +773,7 @@ void OpenGLSalGraphicsImpl::drawMask( SAL_INFO( "vcl.opengl", "::drawMask" ); maContext.makeCurrent(); + glViewport( 0, 0, GetWidth(), GetHeight() ); DrawMask( nTexture, nMaskColor, rPosAry ); } @@ -788,6 +795,7 @@ SalColor OpenGLSalGraphicsImpl::getPixel( long nX, long nY ) char pixel[3]; maContext.makeCurrent(); + glViewport( 0, 0, GetWidth(), GetHeight() ); glReadPixels( nX, nY, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixel); return MAKE_SALCOLOR( pixel[0], pixel[1], pixel[2] ); } @@ -803,6 +811,7 @@ void OpenGLSalGraphicsImpl::invert( // * SAL_INVERT_TRACKFRAME (dash-line rectangle?) maContext.makeCurrent(); + glViewport( 0, 0, GetWidth(), GetHeight() ); if( nFlags & SAL_INVERT_TRACKFRAME ) { @@ -823,6 +832,7 @@ void OpenGLSalGraphicsImpl::invert( void OpenGLSalGraphicsImpl::invert( sal_uInt32 nPoints, const SalPoint* pPtAry, SalInvert nFlags ) { maContext.makeCurrent(); + glViewport( 0, 0, GetWidth(), GetHeight() ); if( nFlags & SAL_INVERT_TRACKFRAME ) { commit 45b14cdf3d57f0e813aefd75fe3455a1536b310c Author: Louis-Francis Ratté-Boulianne <[email protected]> Date: Sat Nov 8 22:59:09 2014 -0500 vcl: Fix pixel drawing with OpenGL Change-Id: If23255d2a78445d2c28ada00778c95e28cbd0683 diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx index 27347a8..a9a6884 100644 --- a/vcl/opengl/gdiimpl.cxx +++ b/vcl/opengl/gdiimpl.cxx @@ -268,10 +268,10 @@ void OpenGLSalGraphicsImpl::EndInvert( void ) void OpenGLSalGraphicsImpl::DrawPoint( long nX, long nY ) { - GLushort pPoint[2]; + GLfloat pPoint[2]; - pPoint[0] = nX; - pPoint[1] = GetHeight() - nY; + pPoint[0] = 2 * nX / GetWidth() - 1.0f; + pPoint[1] = 2 * (GetHeight() - nY) / GetHeight() - 1.0f; glEnableVertexAttribArray( GL_ATTRIB_POS ); glVertexAttribPointer( GL_ATTRIB_POS, 2, GL_UNSIGNED_SHORT, GL_FALSE, 0, pPoint ); commit 5a6c596f14fc760e68125b453c5772f82eef18d8 Author: Louis-Francis Ratté-Boulianne <[email protected]> Date: Sat Nov 8 22:55:58 2014 -0500 vcl: Disable clipping in OpenGL for now because it's broken with VDev Change-Id: Ia1e5de6674e642f428da58164001e8619cd99530 diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx index 55b6a93..27347a8 100644 --- a/vcl/opengl/gdiimpl.cxx +++ b/vcl/opengl/gdiimpl.cxx @@ -60,25 +60,38 @@ bool OpenGLSalGraphicsImpl::setClipRegion( const vcl::Region& rClip ) { const basegfx::B2DPolyPolygon aClip( rClip.GetAsB2DPolyPolygon() ); - /*glEnable(GL_STENCIL_TEST); + SAL_INFO( "vcl.opengl", "::setClipRegion" ); + + /*maContext.makeCurrent(); + glViewport( 0, 0, GetWidth(), GetHeight() ); + + glEnable( GL_STENCIL_TEST ); glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE ); - glDepthMask( GL_FALSE ); glStencilMask( 0xFF ); glStencilFunc( GL_NEVER, 1, 0xFF ); glStencilOp( GL_REPLACE, GL_KEEP, GL_KEEP ); glClear( GL_STENCIL_BUFFER_BIT ); + BeginSolid( SALCOLOR_NONE ); DrawPolyPolygon( aClip ); + EndSolid(); - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - glDepthMask( GL_TRUE ); + glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE ); glStencilMask( 0x00 ); - glStencilFunc(GL_EQUAL, 1, 0xFF);*/ + glStencilFunc( GL_EQUAL, 1, 0xFF );*/ return true; } +// set the clip region to empty +void OpenGLSalGraphicsImpl::ResetClipRegion() +{ + SAL_INFO( "vcl.opengl", "::ResetClipRegion" ); + maContext.makeCurrent(); + glDisable(GL_STENCIL_TEST); +} + // get the depth of the device sal_uInt16 OpenGLSalGraphicsImpl::GetBitCount() const { @@ -91,12 +104,6 @@ long OpenGLSalGraphicsImpl::GetGraphicsWidth() const return GetWidth(); } -// set the clip region to empty -void OpenGLSalGraphicsImpl::ResetClipRegion() -{ - glDisable(GL_STENCIL_TEST); -} - // set the line color to transparent (= don't draw lines) void OpenGLSalGraphicsImpl::SetLineColor() { commit f9d52bddefbee6d8bd35912c24049e4b13aedde3 Author: Louis-Francis Ratté-Boulianne <[email protected]> Date: Sat Nov 8 22:55:06 2014 -0500 vcl: Add support for transparent polygon drawing with OpenGL Change-Id: Iaa7cdcf4742d8148507c69c222bff417b9f9426c diff --git a/vcl/inc/openglgdiimpl.hxx b/vcl/inc/openglgdiimpl.hxx index b05a520..9368a10 100644 --- a/vcl/inc/openglgdiimpl.hxx +++ b/vcl/inc/openglgdiimpl.hxx @@ -61,6 +61,7 @@ protected: bool CreateMaskProgram( void ); void BeginSolid( SalColor nColor, sal_uInt8 nTransparency ); + void BeginSolid( SalColor nColor, double fTransparency ); void BeginSolid( SalColor nColor ); void EndSolid( void ); void BeginInvert( void ); diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx index 9288260..55b6a93 100644 --- a/vcl/opengl/gdiimpl.cxx +++ b/vcl/opengl/gdiimpl.cxx @@ -40,6 +40,13 @@ ((float) SALCOLOR_BLUE( nColor )) / 255, \ (100 - nTransparency) * (1.0 / 100) ) +#define glUniformColorf(nUniform, nColor, fTransparency) \ + glUniform4f( nUniform, \ + ((float) SALCOLOR_RED( nColor )) / 255, \ + ((float) SALCOLOR_GREEN( nColor )) / 255, \ + ((float) SALCOLOR_BLUE( nColor )) / 255, \ + (1.0f - fTransparency) ) + OpenGLSalGraphicsImpl::~OpenGLSalGraphicsImpl() { } @@ -202,18 +209,41 @@ void OpenGLSalGraphicsImpl::BeginSolid( SalColor nColor, sal_uInt8 nTransparency return; } + if( nTransparency > 0 ) + { + glEnable( GL_BLEND ); + glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); + } glUseProgram( mnSolidProgram ); glUniformColor( mnColorUniform, nColor, nTransparency ); } +void OpenGLSalGraphicsImpl::BeginSolid( SalColor nColor, double fTransparency ) +{ + if( mnSolidProgram == 0 ) + { + if( !CreateSolidProgram() ) + return; + } + + if( fTransparency > 0.0f ) + { + glEnable( GL_BLEND ); + glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); + } + glUseProgram( mnSolidProgram ); + glUniformColorf( mnColorUniform, nColor, fTransparency ); +} + void OpenGLSalGraphicsImpl::BeginSolid( SalColor nColor ) { - BeginSolid( nColor, 0 ); + BeginSolid( nColor, 0.0f ); } void OpenGLSalGraphicsImpl::EndSolid( void ) { glUseProgram( 0 ); + glDisable( GL_BLEND ); } void OpenGLSalGraphicsImpl::BeginInvert( void ) @@ -592,9 +622,27 @@ void OpenGLSalGraphicsImpl::drawPolyPolygon( sal_uInt32 nPoly, const sal_uInt32* } } -bool OpenGLSalGraphicsImpl::drawPolyPolygon( const ::basegfx::B2DPolyPolygon&, double /*fTransparency*/ ) +bool OpenGLSalGraphicsImpl::drawPolyPolygon( const ::basegfx::B2DPolyPolygon& rPolyPolygon, double fTransparency ) { - return false; + SAL_INFO( "vcl.opengl", "::drawPolyPolygon trans " << fTransparency ); + if( rPolyPolygon.count() <= 0 ) + return true; + + maContext.makeCurrent(); + glViewport( 0, 0, GetWidth(), GetHeight() ); + + if( mnFillColor != SALCOLOR_NONE ) + { + BeginSolid( mnFillColor, fTransparency ); + for( sal_uInt32 i = 0; i < rPolyPolygon.count(); i++ ) + { + const ::basegfx::B2DPolyPolygon aOnePoly( rPolyPolygon.getB2DPolygon( i ) ); + DrawPolyPolygon( aOnePoly ); + } + EndSolid(); + } + + return true; } bool OpenGLSalGraphicsImpl::drawPolyLine( @@ -843,6 +891,7 @@ bool OpenGLSalGraphicsImpl::drawAlphaRect( long nWidth, long nHeight, sal_uInt8 nTransparency ) { + SAL_INFO( "vcl.opengl", "::drawAlphaRect" ); if( mnFillColor != SALCOLOR_NONE && nTransparency < 100 ) { BeginSolid( mnFillColor, nTransparency ); diff --git a/vcl/opengl/solidFragmentShader.glsl b/vcl/opengl/solidFragmentShader.glsl index 94d0de0..af75336 100644 --- a/vcl/opengl/solidFragmentShader.glsl +++ b/vcl/opengl/solidFragmentShader.glsl @@ -11,7 +11,7 @@ uniform vec4 color; void main() { - gl_FragColor = color; + gl_FragColor = color; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/outdev/polygon.cxx b/vcl/source/outdev/polygon.cxx index 39c2b68..03fa168 100644 --- a/vcl/source/outdev/polygon.cxx +++ b/vcl/source/outdev/polygon.cxx @@ -231,7 +231,7 @@ void OutputDevice::DrawPolygon( const Polygon& rPoly ) // Caution: This method is nearly the same as // OutputDevice::DrawTransparent( const basegfx::B2DPolyPolygon& rB2DPolyPoly, double fTransparency), -// so when changes are made here do not forget to make change sthere, too +// so when changes are made here do not forget to make changes there, too void OutputDevice::DrawPolyPolygon( const basegfx::B2DPolyPolygon& rB2DPolyPoly ) { commit 1e2bde00345eee9dded48ede7775f73edf8729af Author: Markus Mohrhard <[email protected]> Date: Sun Nov 9 03:10:44 2014 +0100 one more case of these insane memory alloc/release cycles Change-Id: I57bfbc46e77785a770226868a8750a74f380ddb4 diff --git a/vcl/source/gdi/bitmap.cxx b/vcl/source/gdi/bitmap.cxx index 5f6477a..ccd914d 100644 --- a/vcl/source/gdi/bitmap.cxx +++ b/vcl/source/gdi/bitmap.cxx @@ -60,8 +60,7 @@ Bitmap::Bitmap( const Bitmap& rBitmap ) : Bitmap::Bitmap( SalBitmap* pSalBitmap ) { - mpImpBmp = new ImpBitmap(); - mpImpBmp->ImplSetSalBitmap( pSalBitmap ); + mpImpBmp = new ImpBitmap(pSalBitmap); maPrefMapMode = MapMode( MAP_PIXEL ); maPrefSize = mpImpBmp->ImplGetSize(); } commit 07440431186d05c0e96017997cf0df6be2623645 Author: Markus Mohrhard <[email protected]> Date: Sun Nov 9 03:06:35 2014 +0100 prevent insane memory allocation We release the memory in the next call again. Change-Id: I9cd974f2c1b2381d0a895bea52a8654143862971 diff --git a/vcl/inc/impbmp.hxx b/vcl/inc/impbmp.hxx index f6663c5..bbe8064 100644 --- a/vcl/inc/impbmp.hxx +++ b/vcl/inc/impbmp.hxx @@ -38,6 +38,13 @@ private: public: ImpBitmap(); + /** + * takes ownership + * same as Sequence: + * pBmp = new ImpBitmap; + * pBmp->ImplSetSalBitmap(pBitmap); + */ + ImpBitmap(SalBitmap* pBitmap); ~ImpBitmap(); void ImplSetSalBitmap( SalBitmap* pSalBitmap ); diff --git a/vcl/source/gdi/impbmp.cxx b/vcl/source/gdi/impbmp.cxx index 1ee75d4..633cff2 100644 --- a/vcl/source/gdi/impbmp.cxx +++ b/vcl/source/gdi/impbmp.cxx @@ -31,6 +31,13 @@ ImpBitmap::ImpBitmap() : { } +ImpBitmap::ImpBitmap(SalBitmap* pBitmap) : + mnRefCount ( 1 ), + mnChecksum ( 0 ), + mpSalBitmap ( pBitmap ) +{ +} + ImpBitmap::~ImpBitmap() { delete mpSalBitmap; diff --git a/vcl/source/outdev/bitmap.cxx b/vcl/source/outdev/bitmap.cxx index a191b8b..20e6367 100644 --- a/vcl/source/outdev/bitmap.cxx +++ b/vcl/source/outdev/bitmap.cxx @@ -457,8 +457,7 @@ Bitmap OutputDevice::GetBitmap( const Point& rSrcPt, const Size& rSize ) const if( pSalBmp ) { - ImpBitmap* pImpBmp = new ImpBitmap; - pImpBmp->ImplSetSalBitmap( pSalBmp ); + ImpBitmap* pImpBmp = new ImpBitmap(pSalBmp); aBmp.ImplSetImpBitmap( pImpBmp ); } } commit 6ef1ece2cdf5390d37877414f913a63ca994cb48 Author: Markus Mohrhard <[email protected]> Date: Sun Nov 9 02:49:12 2014 +0100 don't delete texture before we were able to read it back Change-Id: Id59983add682ea3f0e6e9e440b1700817bbc6867 diff --git a/vcl/opengl/salbmp.cxx b/vcl/opengl/salbmp.cxx index 40be728..564426c 100644 --- a/vcl/opengl/salbmp.cxx +++ b/vcl/opengl/salbmp.cxx @@ -167,7 +167,6 @@ void OpenGLSalBitmap::Destroy() bool OpenGLSalBitmap::AllocateUserData() { - Destroy(); SAL_INFO( "vcl.opengl", "OpenGLSalBitmap::AllocateUserData" ); if( mnWidth && mnHeight ) commit e94421aae7fa75e53159096f1143ccc00d90e3d8 Author: Louis-Francis Ratté-Boulianne <[email protected]> Date: Sat Nov 8 20:13:28 2014 -0500 vcl: Fix getBitmap operation Change-Id: Id78065081bbde97738afd0f4da09b502afe468f4 diff --git a/vcl/opengl/salbmp.cxx b/vcl/opengl/salbmp.cxx index 0736773..40be728 100644 --- a/vcl/opengl/salbmp.cxx +++ b/vcl/opengl/salbmp.cxx @@ -71,6 +71,7 @@ bool OpenGLSalBitmap::Create( OpenGLContext& rContext, long nX, long nY, long nW maPalette = aEmptyPalette; mpTexture.reset( new OpenGLTexture( nX, nY, nWidth, nHeight ) ); + mbDirtyTexture = false; return true; } @@ -107,6 +108,7 @@ bool OpenGLSalBitmap::Create( const SalBitmap& rSalBmp, sal_uInt16 nNewBitCount if( isValidBitCount( nNewBitCount ) ) { + // TODO: lfrb: What about the pending operations?! mnBits = nNewBitCount; mnBytesPerRow = rSourceBitmap.mnBytesPerRow; mnWidth = rSourceBitmap.mnWidth; @@ -116,6 +118,7 @@ bool OpenGLSalBitmap::Create( const SalBitmap& rSalBmp, sal_uInt16 nNewBitCount maPalette = rSourceBitmap.maPalette; mpContext = rSourceBitmap.mpContext; mpTexture = rSourceBitmap.mpTexture; + mbDirtyTexture = false; maUserBuffer = rSourceBitmap.maUserBuffer; // TODO Copy buffer data if the bitcount and palette are the same commit c77257fc200f82b21fe61dd644ad655351116921 Author: Louis-Francis Ratté-Boulianne <[email protected]> Date: Sat Nov 8 19:32:14 2014 -0500 basegfx: Solve crossovers even if there is only one polygon in the polypolygon Change-Id: If4fcb8a2c6ac40a4d694522ce4ed020bcb4466b8 diff --git a/basegfx/source/polygon/b2dpolypolygoncutter.cxx b/basegfx/source/polygon/b2dpolypolygoncutter.cxx index aaad335..d9eea58 100644 --- a/basegfx/source/polygon/b2dpolypolygoncutter.cxx +++ b/basegfx/source/polygon/b2dpolypolygoncutter.cxx @@ -688,7 +688,7 @@ namespace basegfx B2DPolyPolygon solveCrossovers(const B2DPolyPolygon& rCandidate) { - if(rCandidate.count() > 1L) + if(rCandidate.count() > 0L) { solver aSolver(rCandidate); return aSolver.getB2DPolyPolygon();
_______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
