vcl/inc/openglgdiimpl.hxx | 5 ++++- vcl/opengl/gdiimpl.cxx | 34 ++++++++++++++++++++++++---------- vcl/opengl/texture.cxx | 15 ++++++++++++--- 3 files changed, 40 insertions(+), 14 deletions(-)
New commits: commit f80c2dd03d9d18c06ea0a9763ca59aeb1d2ed0e5 Author: Tomaz Vajngerl <tomaz.vajng...@collabora.com> Date: Wed Apr 6 07:14:43 2016 +0200 opengl: use GL_BGRA as default backend format on WNT Change-Id: Iccc4270b2df87c0c44c133732b6cf05448dfe7d3 diff --git a/vcl/opengl/texture.cxx b/vcl/opengl/texture.cxx index 1f270bc..0a83661 100644 --- a/vcl/opengl/texture.cxx +++ b/vcl/opengl/texture.cxx @@ -30,6 +30,15 @@ #include "opengl/texture.hxx" #include "opengl/zone.hxx" +namespace +{ +#ifdef WNT +const GLenum constDefaultBackendFormat = GL_RGBA; +#else +const GLenum constDefaultBackendFormat = GL_BGRA; +#endif +} // end anonymous namespace + // texture with allocated size ImplOpenGLTexture::ImplOpenGLTexture( int nWidth, int nHeight, bool bAllocate ) : mnRefCount( 1 ), @@ -55,7 +64,7 @@ ImplOpenGLTexture::ImplOpenGLTexture( int nWidth, int nHeight, bool bAllocate ) CHECK_GL_ERROR(); if( bAllocate ) { - glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, nWidth, nHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr ); + glTexImage2D( GL_TEXTURE_2D, 0, constDefaultBackendFormat, nWidth, nHeight, 0, constDefaultBackendFormat, GL_UNSIGNED_BYTE, nullptr ); CHECK_GL_ERROR(); } glBindTexture( GL_TEXTURE_2D, 0 ); @@ -91,7 +100,7 @@ ImplOpenGLTexture::ImplOpenGLTexture( int nX, int nY, int nWidth, int nHeight ) CHECK_GL_ERROR(); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); CHECK_GL_ERROR(); - glCopyTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, nX, nY, nWidth, nHeight, 0 ); + glCopyTexImage2D( GL_TEXTURE_2D, 0, constDefaultBackendFormat, nX, nY, nWidth, nHeight, 0 ); CHECK_GL_ERROR(); glBindTexture( GL_TEXTURE_2D, 0 ); CHECK_GL_ERROR(); @@ -128,7 +137,7 @@ ImplOpenGLTexture::ImplOpenGLTexture( int nWidth, int nHeight, int nFormat, int CHECK_GL_ERROR(); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); CHECK_GL_ERROR(); - glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, mnWidth, mnHeight, 0, nFormat, nType, pData ); + glTexImage2D( GL_TEXTURE_2D, 0, constDefaultBackendFormat, mnWidth, mnHeight, 0, nFormat, nType, pData ); CHECK_GL_ERROR(); glBindTexture( GL_TEXTURE_2D, 0 ); CHECK_GL_ERROR(); commit c71c18a8e9ea45b1dafe4c2218c69e0928be9bc5 Author: Tomaz Vajngerl <tomaz.vajng...@collabora.com> Date: Wed Apr 6 07:13:37 2016 +0200 opengl: fix wrong clipping when drawing text Change-Id: Icc953510f7111f630764486e1ca159c965b534e8 diff --git a/vcl/inc/openglgdiimpl.hxx b/vcl/inc/openglgdiimpl.hxx index dc0cdc2..6dfa73c 100644 --- a/vcl/inc/openglgdiimpl.hxx +++ b/vcl/inc/openglgdiimpl.hxx @@ -148,7 +148,7 @@ public: void DrawAxialGradient( const Gradient& rGradient, const Rectangle& rRect ); void DrawRadialGradient( const Gradient& rGradient, const Rectangle& rRect ); void DeferredTextDraw(OpenGLTexture& rTexture, const SalColor nMaskColor, const SalTwoRect& rPosAry); - void FlushDeferredDrawing(bool bInDraw = false); + void FlushDeferredDrawing(); public: // get the width of the device @@ -169,6 +169,9 @@ public: // operations to do before painting void PreDraw(XOROption eOpt = IGNORE_XOR); + // initialize pre-draw state + void InitializePreDrawState(XOROption eOpt = IGNORE_XOR); + // operations to do after painting void PostDraw(); diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx index dae26d6..c403d1f 100644 --- a/vcl/opengl/gdiimpl.cxx +++ b/vcl/opengl/gdiimpl.cxx @@ -185,6 +185,13 @@ void OpenGLSalGraphicsImpl::DeInit() void OpenGLSalGraphicsImpl::PreDraw(XOROption eOpt) { + FlushDeferredDrawing(); + + InitializePreDrawState(eOpt); +} + +void OpenGLSalGraphicsImpl::InitializePreDrawState(XOROption eOpt) +{ OpenGLZone::enter(); mnDrawCount++; @@ -204,8 +211,6 @@ void OpenGLSalGraphicsImpl::PreDraw(XOROption eOpt) glViewport( 0, 0, GetWidth(), GetHeight() ); CHECK_GL_ERROR(); - FlushDeferredDrawing(true); - ImplInitClipRegion(); CHECK_GL_ERROR(); @@ -266,6 +271,7 @@ void OpenGLSalGraphicsImpl::freeResources() { VCL_GL_INFO( "freeResources" ); mpContext->makeCurrent(); + FlushDeferredDrawing(); mpContext->ReleaseFramebuffer( maOffscreenTex ); } ReleaseContext(); @@ -355,12 +361,16 @@ const vcl::Region& OpenGLSalGraphicsImpl::getClipRegion() const bool OpenGLSalGraphicsImpl::setClipRegion( const vcl::Region& rClip ) { - VCL_GL_INFO( "::setClipRegion " << rClip ); if (maClipRegion == rClip) + { + VCL_GL_INFO("::setClipRegion (no change) " << rClip); return true; + } FlushDeferredDrawing(); + VCL_GL_INFO( "::setClipRegion " << rClip ); + maClipRegion = rClip; mbUseStencil = false; @@ -376,12 +386,16 @@ bool OpenGLSalGraphicsImpl::setClipRegion( const vcl::Region& rClip ) // set the clip region to empty void OpenGLSalGraphicsImpl::ResetClipRegion() { - VCL_GL_INFO( "::ResetClipRegion" ); if (maClipRegion.IsEmpty()) + { + VCL_GL_INFO("::ResetClipRegion (no change) "); return; + } FlushDeferredDrawing(); + VCL_GL_INFO("::ResetClipRegion"); + maClipRegion.SetEmpty(); mbUseScissor = false; mbUseStencil = false; @@ -1574,13 +1588,12 @@ void OpenGLSalGraphicsImpl::DeferredTextDraw(OpenGLTexture& rTexture, SalColor a mpAccumulatedTextures->insert(rTexture, aMaskColor, rPosAry); } -void OpenGLSalGraphicsImpl::FlushDeferredDrawing(bool bIsInDraw) +void OpenGLSalGraphicsImpl::FlushDeferredDrawing() { if (mpAccumulatedTextures->empty()) return; - if (!bIsInDraw) - PreDraw(); + InitializePreDrawState(); VCL_GL_INFO("FlushDeferredDrawing"); @@ -1592,7 +1605,6 @@ void OpenGLSalGraphicsImpl::FlushDeferredDrawing(bool bIsInDraw) static sal_uInt8 b = 0xFF; static std::unordered_map<GLuint, Color> aColorForTextureMap; - for (auto& rPair : mpAccumulatedTextures->getAccumulatedTexturesMap()) { OpenGLTexture& rTexture = rPair.second->maTexture; @@ -1625,7 +1637,9 @@ void OpenGLSalGraphicsImpl::FlushDeferredDrawing(bool bIsInDraw) if( !UseProgram( "textureVertexShader", "maskFragmentShader" ) ) return; + mpProgram->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + for (auto& rPair : mpAccumulatedTextures->getAccumulatedTexturesMap()) { OpenGLTexture& rTexture = rPair.second->maTexture; @@ -1642,8 +1656,8 @@ void OpenGLSalGraphicsImpl::FlushDeferredDrawing(bool bIsInDraw) } mpProgram->Clean(); mpAccumulatedTextures->clear(); - if (!bIsInDraw) - PostDraw(); + + PostDraw(); } void OpenGLSalGraphicsImpl::DrawLinearGradient( const Gradient& rGradient, const Rectangle& rRect ) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits