include/vcl/opengl/OpenGLContext.hxx | 2 - vcl/Package_opengl.mk | 1 vcl/headless/svpbmp.cxx | 10 ++++++++ vcl/inc/headless/svpbmp.hxx | 3 ++ vcl/inc/impbmp.hxx | 2 + vcl/inc/opengl/program.hxx | 2 + vcl/inc/opengl/salbmp.hxx | 2 + vcl/inc/opengl/win/gdiimpl.hxx | 1 vcl/inc/opengl/x11/gdiimpl.hxx | 1 vcl/inc/openglgdiimpl.hxx | 6 ++-- vcl/inc/quartz/salbmp.h | 2 + vcl/inc/salbmp.hxx | 3 ++ vcl/inc/unx/salbmp.h | 2 + vcl/inc/win/salbmp.h | 4 ++- vcl/opengl/gdiimpl.cxx | 21 +++++++++-------- vcl/opengl/program.cxx | 19 +++++++++++++++ vcl/opengl/replaceColorFragmentShader.glsl | 23 +++++++++++++++++++ vcl/opengl/salbmp.cxx | 35 +++++++++++++++++++++++++++++ vcl/opengl/texture.cxx | 22 ++++++++---------- vcl/opengl/win/gdiimpl.cxx | 11 +-------- vcl/opengl/x11/gdiimpl.cxx | 10 -------- vcl/quartz/salbmp.cxx | 10 ++++++++ vcl/source/app/svdata.cxx | 8 ++++++ vcl/source/app/svmain.cxx | 6 ++++ vcl/source/gdi/bitmap.cxx | 18 ++++++++++++++ vcl/source/gdi/impbmp.cxx | 10 ++++++++ vcl/source/opengl/OpenGLContext.cxx | 11 --------- vcl/unx/generic/gdi/salbmp.cxx | 10 ++++++++ vcl/win/source/gdi/salbmp.cxx | 10 ++++++++ 29 files changed, 205 insertions(+), 60 deletions(-)
New commits: commit 9629322f73411ac23e6242da76d8dedb66e6dab2 Author: Louis-Francis Ratté-Boulianne <l...@collabora.com> Date: Tue Dec 2 17:18:26 2014 -0500 vcl: Fix color-replacement fragment shader Change-Id: I82a0a45961ea3f0ceca7dab67c8736b5e1205bb0 diff --git a/vcl/opengl/replaceColorFragmentShader.glsl b/vcl/opengl/replaceColorFragmentShader.glsl index 7c5b4c5..6e845f0 100644 --- a/vcl/opengl/replaceColorFragmentShader.glsl +++ b/vcl/opengl/replaceColorFragmentShader.glsl @@ -18,8 +18,6 @@ void main() { vec4 diff = clamp(abs(texel - search_color) - epsilon, 0.0, 1.0); float bump = max(0.0, 1.0 - ceil(diff.x + diff.y + diff.z)); gl_FragColor = texel + bump * (replace_color - search_color); - gl_FragColor.r = 1.0; - gl_FragColor.g = 0.0; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit fa83f036a18341c79da0ae6cf3b60a7ce53544c1 Author: Louis-Francis Ratté-Boulianne <l...@collabora.com> Date: Tue Dec 2 16:42:32 2014 -0500 vcl: Acquire framebuffer from current context when reading back texture Change-Id: I410ac2d10ec2e498d9d8444e5584bfb14727c90b diff --git a/vcl/opengl/texture.cxx b/vcl/opengl/texture.cxx index cc5be78..e4bc532 100644 --- a/vcl/opengl/texture.cxx +++ b/vcl/opengl/texture.cxx @@ -18,10 +18,14 @@ */ #include <sal/config.h> +#include <vcl/opengl/OpenGLContext.hxx> #include <vcl/opengl/OpenGLHelper.hxx> +#include "svdata.hxx" + #include "vcl/salbtype.hxx" +#include "opengl/framebuffer.hxx" #include "opengl/texture.hxx" // texture with allocated size @@ -299,21 +303,15 @@ void OpenGLTexture::Read( GLenum nFormat, GLenum nType, sal_uInt8* pData ) } else { - GLuint nFramebufferId; - glGenFramebuffers( 1, &nFramebufferId ); - glBindFramebuffer( GL_FRAMEBUFFER, nFramebufferId ); - CHECK_GL_ERROR(); + // Retrieve current context + ImplSVData* pSVData = ImplGetSVData(); + OpenGLContext* pContext = pSVData->maGDIData.mpLastContext; + OpenGLFramebuffer* pFramebuffer; - glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, Id(), 0 ); - CHECK_GL_ERROR(); + pFramebuffer = pContext->AcquireFramebuffer( *this ); glReadPixels( maRect.Left(), mpImpl->mnHeight - maRect.Top(), GetWidth(), GetHeight(), nFormat, nType, pData ); + pContext->ReleaseFramebuffer( pFramebuffer ); CHECK_GL_ERROR(); - - glBindFramebuffer( GL_FRAMEBUFFER, 0 ); - glDeleteFramebuffers( 1, &nFramebufferId ); - - int bpp = (nFormat == GL_RGB) ? 3 : 4; - memset( pData, 255, GetWidth() * GetHeight() * bpp ); } Unbind(); commit edbdaf07d9b7a9304294c8ed650ed85f81b52e14 Author: Louis-Francis Ratté-Boulianne <l...@collabora.com> Date: Tue Dec 2 16:41:02 2014 -0500 vcl: Implement bitmap color replacement operation in OpenGL backend Change-Id: Ia86b67e92985eeb4fb2a5f6cd74c65fab2ac5566 diff --git a/vcl/Package_opengl.mk b/vcl/Package_opengl.mk index 98ff78b..0aa324f 100644 --- a/vcl/Package_opengl.mk +++ b/vcl/Package_opengl.mk @@ -19,6 +19,7 @@ $(eval $(call gb_Package_add_files,vcl_opengl_shader,$(LIBO_ETC_FOLDER)/opengl,\ maskFragmentShader.glsl \ maskedTextureFragmentShader.glsl \ radialGradientFragmentShader.glsl \ + replaceColorFragmentShader.glsl \ solidFragmentShader.glsl \ textureFragmentShader.glsl \ textureVertexShader.glsl \ diff --git a/vcl/inc/opengl/program.hxx b/vcl/inc/opengl/program.hxx index 49d3175..996bc61 100644 --- a/vcl/inc/opengl/program.hxx +++ b/vcl/inc/opengl/program.hxx @@ -51,9 +51,11 @@ public: void SetTextureCoord( const GLvoid* pData ); void SetAlphaCoord( const GLvoid* pData ); + void SetUniform1f( const OString& rName, GLfloat v1 ); void SetUniform2f( const OString& rName, GLfloat v1, GLfloat v2 ); void SetUniform1fv( const OString& rName, GLsizei nCount, GLfloat* aValues ); void SetUniform2fv( const OString& rName, GLsizei nCount, GLfloat* aValues ); + void SetColor( const OString& rName, const Color& rColor ); void SetColor( const OString& rName, SalColor nColor, sal_uInt8 nTransparency ); void SetColorf( const OString& rName, SalColor nColor, double fTransparency ); void SetColorWithIntensity( const OString& rName, const Color& rColor, long nFactor ); diff --git a/vcl/opengl/program.cxx b/vcl/opengl/program.cxx index 320b06f..8b92c4b 100644 --- a/vcl/opengl/program.cxx +++ b/vcl/opengl/program.cxx @@ -126,6 +126,12 @@ GLuint OpenGLProgram::GetUniformLocation( const OString& rName ) return it->second; } +void OpenGLProgram::SetUniform1f( const OString& rName, GLfloat v1 ) +{ + GLuint nUniform = GetUniformLocation( rName ); + glUniform1f( nUniform, v1 ); +} + void OpenGLProgram::SetUniform2f( const OString& rName, GLfloat v1, GLfloat v2 ) { GLuint nUniform = GetUniformLocation( rName ); @@ -170,6 +176,19 @@ void OpenGLProgram::SetColorf( const OString& rName, SalColor nColor, double fTr SetBlendMode( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); } +void OpenGLProgram::SetColor( const OString& rName, const Color& rColor ) +{ + GLuint nUniform = GetUniformLocation( rName ); + glUniform4f( nUniform, + ((float) rColor.GetRed()) / 255, + ((float) rColor.GetGreen()) / 255, + ((float) rColor.GetBlue()) / 255, + 1.0f - ((float) rColor.GetTransparency()) / 255 ); + + if( rColor.GetTransparency() > 0 ) + SetBlendMode( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); +} + void OpenGLProgram::SetColorWithIntensity( const OString& rName, const Color& rColor, long nFactor ) { GLuint nUniform = GetUniformLocation( rName ); diff --git a/vcl/opengl/replaceColorFragmentShader.glsl b/vcl/opengl/replaceColorFragmentShader.glsl new file mode 100644 index 0000000..7c5b4c5 --- /dev/null +++ b/vcl/opengl/replaceColorFragmentShader.glsl @@ -0,0 +1,25 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +varying vec2 tex_coord; +uniform sampler2D sampler; +uniform vec4 search_color; +uniform vec4 replace_color; +uniform float epsilon; + +void main() { + vec4 texel = texture2D(sampler, tex_coord); + vec4 diff = clamp(abs(texel - search_color) - epsilon, 0.0, 1.0); + float bump = max(0.0, 1.0 - ceil(diff.x + diff.y + diff.z)); + gl_FragColor = texel + bump * (replace_color - search_color); + gl_FragColor.r = 1.0; + gl_FragColor.g = 0.0; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/opengl/salbmp.cxx b/vcl/opengl/salbmp.cxx index 078e050..94c0c87 100644 --- a/vcl/opengl/salbmp.cxx +++ b/vcl/opengl/salbmp.cxx @@ -27,6 +27,7 @@ #include "svdata.hxx" #include "salgdi.hxx" +#include "opengl/program.hxx" #include "opengl/salbmp.hxx" static bool isValidBitCount( sal_uInt16 nBitCount ) @@ -579,9 +580,33 @@ bool OpenGLSalBitmap::Erase( const ::Color& /*rFillColor*/ ) return false; } -bool OpenGLSalBitmap::Replace( const Color& /*rSearchColor*/, const Color& /*rReplaceColor*/, sal_uLong /*nTol*/ ) +bool OpenGLSalBitmap::Replace( const Color& rSearchColor, const Color& rReplaceColor, sal_uLong nTol ) { - return false; + OpenGLFramebuffer* pFramebuffer; + OpenGLProgram* pProgram; + + GetTexture(); + makeCurrent(); + pProgram = mpContext->UseProgram( "textureVertexShader", + "replaceColorFragmentShader" ); + if( !pProgram ) + return false; + + OpenGLTexture aNewTex = OpenGLTexture( mnWidth, mnHeight ); + pFramebuffer = mpContext->AcquireFramebuffer( aNewTex ); + + pProgram->SetTexture( "sampler", maTexture ); + pProgram->SetColor( "search_color", rSearchColor ); + pProgram->SetColor( "replace_color", rReplaceColor ); + pProgram->SetUniform1f( "epsilon", nTol / 255.0f ); + pProgram->DrawTexture( maTexture ); + pProgram->Clean(); + + mpContext->ReleaseFramebuffer( pFramebuffer ); + maTexture = aNewTex; + + CHECK_GL_ERROR(); + return true; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit cf3ba3561522cba179ab602b257df902d6d5d110 Author: Louis-Francis Ratté-Boulianne <l...@collabora.com> Date: Tue Dec 2 14:19:33 2014 -0500 vcl: Add dummy Replace to SalBitmap implementations Change-Id: I2f8b11a3f7cb8872a1d8f6eeeae8ce3f30223496 diff --git a/vcl/headless/svpbmp.cxx b/vcl/headless/svpbmp.cxx index e4080da..014b0e9 100644 --- a/vcl/headless/svpbmp.cxx +++ b/vcl/headless/svpbmp.cxx @@ -354,6 +354,11 @@ bool SvpSalBitmap::Scale( const double& /*rScaleX*/, const double& /*rScaleY*/, return false; } +bool SvpSalBitmap::Replace( const ::Color& /*rSearchColor*/, const ::Color& /*rReplaceColor*/, sal_uLong /*nTol*/ ) +{ + return false; +} + sal_uInt32 SvpSalBitmap::getBitCountFromScanlineFormat( basebmp::Format nFormat ) { sal_uInt32 nBitCount = 1; diff --git a/vcl/inc/headless/svpbmp.hxx b/vcl/inc/headless/svpbmp.hxx index eda1be4..61672fc 100644 --- a/vcl/inc/headless/svpbmp.hxx +++ b/vcl/inc/headless/svpbmp.hxx @@ -21,6 +21,7 @@ #define INCLUDED_VCL_INC_HEADLESS_SVPBMP_HXX #include "sal/config.h" +#include "tools/solar.h" #include "basebmp/bitmapdevice.hxx" @@ -61,6 +62,7 @@ public: virtual bool Crop( const Rectangle& rRectPixel ) SAL_OVERRIDE; virtual bool Erase( const Color& rFillColor ) SAL_OVERRIDE; virtual bool Scale( const double& rScaleX, const double& rScaleY, sal_uInt32 nScaleFlag ) SAL_OVERRIDE; + virtual bool Replace( const Color& rSearchColor, const Color& rReplaceColor, sal_uLong nTol ) SAL_OVERRIDE; static sal_uInt32 getBitCountFromScanlineFormat( basebmp::Format nFormat ); }; diff --git a/vcl/inc/impbmp.hxx b/vcl/inc/impbmp.hxx index 3b2abea..de70989 100644 --- a/vcl/inc/impbmp.hxx +++ b/vcl/inc/impbmp.hxx @@ -71,6 +71,7 @@ public: bool ImplCrop( const Rectangle& rRectPixel ); bool ImplErase( const Color& rFillColor ); bool ImplScale( const double& rScaleX, const double& rScaleY, sal_uInt32 nScaleFlag ); + bool ImplReplace( const Color& rSearchColor, const Color& rReplaceColor, sal_uLong nTol ); }; #endif // INCLUDED_VCL_INC_IMPBMP_HXX diff --git a/vcl/inc/opengl/salbmp.hxx b/vcl/inc/opengl/salbmp.hxx index c25dfa8..2a30764 100644 --- a/vcl/inc/opengl/salbmp.hxx +++ b/vcl/inc/opengl/salbmp.hxx @@ -82,6 +82,7 @@ public: bool Crop( const Rectangle& rRectPixel ) SAL_OVERRIDE; bool Erase( const Color& rFillColor ) SAL_OVERRIDE; bool Scale( const double& rScaleX, const double& rScaleY, sal_uInt32 nScaleFlag ) SAL_OVERRIDE; + bool Replace( const Color& rSearchColor, const Color& rReplaceColor, sal_uLong nTol ) SAL_OVERRIDE; public: diff --git a/vcl/inc/quartz/salbmp.h b/vcl/inc/quartz/salbmp.h index 107cb39..b871ffb 100644 --- a/vcl/inc/quartz/salbmp.h +++ b/vcl/inc/quartz/salbmp.h @@ -78,6 +78,7 @@ public: bool Crop( const Rectangle& rRectPixel ) SAL_OVERRIDE; bool Erase( const Color& rFillColor ) SAL_OVERRIDE; bool Scale( const double& rScaleX, const double& rScaleY, sal_uInt32 nScaleFlag ) SAL_OVERRIDE; + bool Replace( const Color& rSearchColor, const Color& rReplaceColor, sal_uLong nTol ) SAL_OVERRIDE; private: // quartz helper diff --git a/vcl/inc/salbmp.hxx b/vcl/inc/salbmp.hxx index 12e7954..9760bc6 100644 --- a/vcl/inc/salbmp.hxx +++ b/vcl/inc/salbmp.hxx @@ -59,6 +59,7 @@ public: virtual bool Crop( const Rectangle& rRectPixel ) = 0; virtual bool Erase( const Color& rFillColor ) = 0; virtual bool Scale( const double& rScaleX, const double& rScaleY, sal_uInt32 nScaleFlag ) = 0; + virtual bool Replace( const Color& rSearchColor, const Color& rReplaceColor, sal_uLong nTol ) = 0; }; #endif diff --git a/vcl/inc/unx/salbmp.h b/vcl/inc/unx/salbmp.h index 0dfbb2f..0b5cbc7 100644 --- a/vcl/inc/unx/salbmp.h +++ b/vcl/inc/unx/salbmp.h @@ -149,6 +149,7 @@ public: virtual bool Crop( const Rectangle& rRectPixel ) SAL_OVERRIDE; virtual bool Erase( const Color& rFillColor ) SAL_OVERRIDE; virtual bool Scale( const double& rScaleX, const double& rScaleY, sal_uInt32 nScaleFlag ) SAL_OVERRIDE; + virtual bool Replace( const Color& rSearchColor, const Color& rReplaceColor, sal_uLong nTol ) SAL_OVERRIDE; }; // - ImplSalDDB - diff --git a/vcl/inc/win/salbmp.h b/vcl/inc/win/salbmp.h index 7329449..12fd4ca 100644 --- a/vcl/inc/win/salbmp.h +++ b/vcl/inc/win/salbmp.h @@ -99,7 +99,8 @@ public: virtual bool Crop( const Rectangle& rRectPixel ) SAL_OVERRIDE; virtual bool Erase( const Color& rFillColor ) SAL_OVERRIDE; - virtual bool Scale( const double& rScaleX, const double& rScaleY, sal_uInt32 nScaleFlag ); + virtual bool Scale( const double& rScaleX, const double& rScaleY, sal_uInt32 nScaleFlag ) SAL_OVERRIDE; + virtual bool Replace( const Color& rSearchColor, const Color& rReplaceColor, sal_uLong nTol ) SAL_OVERRIDE; }; #endif // INCLUDED_VCL_INC_WIN_SALBMP_H diff --git a/vcl/opengl/salbmp.cxx b/vcl/opengl/salbmp.cxx index 9fde118..078e050 100644 --- a/vcl/opengl/salbmp.cxx +++ b/vcl/opengl/salbmp.cxx @@ -579,4 +579,9 @@ bool OpenGLSalBitmap::Erase( const ::Color& /*rFillColor*/ ) return false; } +bool OpenGLSalBitmap::Replace( const Color& /*rSearchColor*/, const Color& /*rReplaceColor*/, sal_uLong /*nTol*/ ) +{ + return false; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/quartz/salbmp.cxx b/vcl/quartz/salbmp.cxx index e77f9d4..d3fc899 100644 --- a/vcl/quartz/salbmp.cxx +++ b/vcl/quartz/salbmp.cxx @@ -978,4 +978,9 @@ bool QuartzSalBitmap::Scale( const double& /*rScaleX*/, const double& /*rScaleY* return false; } +bool QuartzSalBitmap::Replace( const Color& /*rSearchColor*/, const Color& /*rReplaceColor*/, sal_uLong /*nTol*/ ) +{ + return false; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/gdi/bitmap.cxx b/vcl/source/gdi/bitmap.cxx index 69a6ecf..9915125 100644 --- a/vcl/source/gdi/bitmap.cxx +++ b/vcl/source/gdi/bitmap.cxx @@ -1583,6 +1583,24 @@ bool Bitmap::Replace( const AlphaMask& rAlpha, const Color& rMergeColor ) bool Bitmap::Replace( const Color& rSearchColor, const Color& rReplaceColor, sal_uLong nTol ) { + if( mpImpBmp ) + { + // implementation specific replace + ImpBitmap* pImpBmp = new ImpBitmap; + + if( pImpBmp->ImplCreate( *mpImpBmp ) && pImpBmp->ImplReplace( rSearchColor, rReplaceColor, nTol ) ) + { + ImplSetImpBitmap( pImpBmp ); + maPrefMapMode = MapMode( MAP_PIXEL ); + maPrefSize = pImpBmp->ImplGetSize(); + return true; + } + else + { + delete pImpBmp; + } + } + // Bitmaps with 1 bit color depth can cause problems // if they have other entries than black/white in their palette if( 1 == GetBitCount() ) diff --git a/vcl/source/gdi/impbmp.cxx b/vcl/source/gdi/impbmp.cxx index bcb5b75..5a47845 100644 --- a/vcl/source/gdi/impbmp.cxx +++ b/vcl/source/gdi/impbmp.cxx @@ -108,4 +108,9 @@ bool ImpBitmap::ImplScale( const double& rScaleX, const double& rScaleY, sal_uIn return mpSalBitmap->Scale( rScaleX, rScaleY, nScaleFlag ); } +bool ImpBitmap::ImplReplace( const Color& rSearchColor, const Color& rReplaceColor, sal_uLong nTol ) +{ + return mpSalBitmap->Replace( rSearchColor, rReplaceColor, nTol ); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/generic/gdi/salbmp.cxx b/vcl/unx/generic/gdi/salbmp.cxx index a08aa7d..3495ede 100644 --- a/vcl/unx/generic/gdi/salbmp.cxx +++ b/vcl/unx/generic/gdi/salbmp.cxx @@ -875,6 +875,11 @@ bool X11SalBitmap::Scale( const double& /*rScaleX*/, const double& /*rScaleY*/, return false; } +bool X11SalBitmap::Replace( const Color& /*rSearchColor*/, const Color& /*rReplaceColor*/, sal_uLong /*nTol*/ ) +{ + return false; +} + // - ImplSalDDB - ImplSalDDB::ImplSalDDB( XImage* pImage, Drawable aDrawable, diff --git a/vcl/win/source/gdi/salbmp.cxx b/vcl/win/source/gdi/salbmp.cxx index 9af94ee..b32067d 100644 --- a/vcl/win/source/gdi/salbmp.cxx +++ b/vcl/win/source/gdi/salbmp.cxx @@ -1077,4 +1077,9 @@ bool WinSalBitmap::Scale( const double& /*rScaleX*/, const double& /*rScaleY*/, return false; } +bool WinSalBitmap::Replace( const Color& /*rSearchColor*/, const Color& /*rReplaceColor*/, sal_uLong /*nTol*/ ) +{ + return false; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit 58824d6f551bd505af89d8086576fed2cdf95867 Author: Matúš Kukan <matus.ku...@collabora.com> Date: Mon Nov 24 22:18:56 2014 +0100 Add dummy Erase to SalBitmap implementations Change-Id: I5790deb9ab5af6f8678c964af5321264d3bce733 diff --git a/vcl/headless/svpbmp.cxx b/vcl/headless/svpbmp.cxx index d5a1e79..e4080da 100644 --- a/vcl/headless/svpbmp.cxx +++ b/vcl/headless/svpbmp.cxx @@ -344,6 +344,11 @@ bool SvpSalBitmap::Crop( const Rectangle& /*rRectPixel*/ ) return false; } +bool SvpSalBitmap::Erase( const ::Color& /*rFillColor*/ ) +{ + return false; +} + bool SvpSalBitmap::Scale( const double& /*rScaleX*/, const double& /*rScaleY*/, sal_uInt32 /*nScaleFlag*/ ) { return false; diff --git a/vcl/inc/headless/svpbmp.hxx b/vcl/inc/headless/svpbmp.hxx index 0de0d78..eda1be4 100644 --- a/vcl/inc/headless/svpbmp.hxx +++ b/vcl/inc/headless/svpbmp.hxx @@ -59,6 +59,7 @@ public: virtual bool GetSystemData( BitmapSystemData& rData ) SAL_OVERRIDE; virtual bool Crop( const Rectangle& rRectPixel ) SAL_OVERRIDE; + virtual bool Erase( const Color& rFillColor ) SAL_OVERRIDE; virtual bool Scale( const double& rScaleX, const double& rScaleY, sal_uInt32 nScaleFlag ) SAL_OVERRIDE; static sal_uInt32 getBitCountFromScanlineFormat( basebmp::Format nFormat ); diff --git a/vcl/inc/impbmp.hxx b/vcl/inc/impbmp.hxx index 8f373c5..3b2abea 100644 --- a/vcl/inc/impbmp.hxx +++ b/vcl/inc/impbmp.hxx @@ -69,6 +69,7 @@ public: inline sal_uLong ImplGetChecksum() const { return mnChecksum; } bool ImplCrop( const Rectangle& rRectPixel ); + bool ImplErase( const Color& rFillColor ); bool ImplScale( const double& rScaleX, const double& rScaleY, sal_uInt32 nScaleFlag ); }; diff --git a/vcl/inc/opengl/salbmp.hxx b/vcl/inc/opengl/salbmp.hxx index 6938a22..c25dfa8 100644 --- a/vcl/inc/opengl/salbmp.hxx +++ b/vcl/inc/opengl/salbmp.hxx @@ -80,6 +80,7 @@ public: bool GetSystemData( BitmapSystemData& rData ) SAL_OVERRIDE; bool Crop( const Rectangle& rRectPixel ) SAL_OVERRIDE; + bool Erase( const Color& rFillColor ) SAL_OVERRIDE; bool Scale( const double& rScaleX, const double& rScaleY, sal_uInt32 nScaleFlag ) SAL_OVERRIDE; public: diff --git a/vcl/inc/quartz/salbmp.h b/vcl/inc/quartz/salbmp.h index 7a012bb..107cb39 100644 --- a/vcl/inc/quartz/salbmp.h +++ b/vcl/inc/quartz/salbmp.h @@ -76,6 +76,7 @@ public: bool GetSystemData( BitmapSystemData& rData ) SAL_OVERRIDE; bool Crop( const Rectangle& rRectPixel ) SAL_OVERRIDE; + bool Erase( const Color& rFillColor ) SAL_OVERRIDE; bool Scale( const double& rScaleX, const double& rScaleY, sal_uInt32 nScaleFlag ) SAL_OVERRIDE; private: diff --git a/vcl/inc/salbmp.hxx b/vcl/inc/salbmp.hxx index 5eb977d..12e7954 100644 --- a/vcl/inc/salbmp.hxx +++ b/vcl/inc/salbmp.hxx @@ -26,6 +26,7 @@ #include <com/sun/star/rendering/XBitmapCanvas.hpp> struct BitmapBuffer; +class Color; class SalGraphics; class BitmapPalette; struct BitmapSystemData; @@ -56,6 +57,7 @@ public: virtual bool GetSystemData( BitmapSystemData& rData ) = 0; virtual bool Crop( const Rectangle& rRectPixel ) = 0; + virtual bool Erase( const Color& rFillColor ) = 0; virtual bool Scale( const double& rScaleX, const double& rScaleY, sal_uInt32 nScaleFlag ) = 0; }; diff --git a/vcl/inc/unx/salbmp.h b/vcl/inc/unx/salbmp.h index df6e8bd..0dfbb2f 100644 --- a/vcl/inc/unx/salbmp.h +++ b/vcl/inc/unx/salbmp.h @@ -147,6 +147,7 @@ public: virtual bool GetSystemData( BitmapSystemData& rData ) SAL_OVERRIDE; virtual bool Crop( const Rectangle& rRectPixel ) SAL_OVERRIDE; + virtual bool Erase( const Color& rFillColor ) SAL_OVERRIDE; virtual bool Scale( const double& rScaleX, const double& rScaleY, sal_uInt32 nScaleFlag ) SAL_OVERRIDE; }; diff --git a/vcl/inc/win/salbmp.h b/vcl/inc/win/salbmp.h index b74ba73..7329449 100644 --- a/vcl/inc/win/salbmp.h +++ b/vcl/inc/win/salbmp.h @@ -98,6 +98,7 @@ public: virtual bool GetSystemData( BitmapSystemData& rData ); virtual bool Crop( const Rectangle& rRectPixel ) SAL_OVERRIDE; + virtual bool Erase( const Color& rFillColor ) SAL_OVERRIDE; virtual bool Scale( const double& rScaleX, const double& rScaleY, sal_uInt32 nScaleFlag ); }; diff --git a/vcl/opengl/salbmp.cxx b/vcl/opengl/salbmp.cxx index db2bb1c..9fde118 100644 --- a/vcl/opengl/salbmp.cxx +++ b/vcl/opengl/salbmp.cxx @@ -574,4 +574,9 @@ bool OpenGLSalBitmap::Crop( const Rectangle& /*rRectPixel*/ ) return false; } +bool OpenGLSalBitmap::Erase( const ::Color& /*rFillColor*/ ) +{ + return false; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/quartz/salbmp.cxx b/vcl/quartz/salbmp.cxx index c3245b6..e77f9d4 100644 --- a/vcl/quartz/salbmp.cxx +++ b/vcl/quartz/salbmp.cxx @@ -968,6 +968,11 @@ bool QuartzSalBitmap::Crop( const Rectangle& /*rRectPixel*/ ) return false; } +bool QuartzSalBitmap::Erase( const ::Color& /*rFillColor*/ ) +{ + return false; +} + bool QuartzSalBitmap::Scale( const double& /*rScaleX*/, const double& /*rScaleY*/, sal_uInt32 /*nScaleFlag*/ ) { return false; diff --git a/vcl/source/gdi/impbmp.cxx b/vcl/source/gdi/impbmp.cxx index b402d5b..bcb5b75 100644 --- a/vcl/source/gdi/impbmp.cxx +++ b/vcl/source/gdi/impbmp.cxx @@ -98,6 +98,11 @@ bool ImpBitmap::ImplCrop( const Rectangle& rRectPixel ) return mpSalBitmap->Crop( rRectPixel ); } +bool ImpBitmap::ImplErase( const ::Color& rFillColor ) +{ + return mpSalBitmap->Erase( rFillColor ); +} + bool ImpBitmap::ImplScale( const double& rScaleX, const double& rScaleY, sal_uInt32 nScaleFlag ) { return mpSalBitmap->Scale( rScaleX, rScaleY, nScaleFlag ); diff --git a/vcl/unx/generic/gdi/salbmp.cxx b/vcl/unx/generic/gdi/salbmp.cxx index 5d442f1..a08aa7d 100644 --- a/vcl/unx/generic/gdi/salbmp.cxx +++ b/vcl/unx/generic/gdi/salbmp.cxx @@ -865,6 +865,11 @@ bool X11SalBitmap::Crop( const Rectangle& /*rRectPixel*/ ) return false; } +bool X11SalBitmap::Erase( const ::Color& /*rFillColor*/ ) +{ + return false; +} + bool X11SalBitmap::Scale( const double& /*rScaleX*/, const double& /*rScaleY*/, sal_uInt32 /*nScaleFlag*/ ) { return false; diff --git a/vcl/win/source/gdi/salbmp.cxx b/vcl/win/source/gdi/salbmp.cxx index fd02f54..9af94ee 100644 --- a/vcl/win/source/gdi/salbmp.cxx +++ b/vcl/win/source/gdi/salbmp.cxx @@ -1067,6 +1067,11 @@ bool WinSalBitmap::Crop( const Rectangle& /*rRectPixel*/ ) return false; } +bool WinSalBitmap::Erase( const ::Color& /*rFillColor*/ ) +{ + return false; +} + bool WinSalBitmap::Scale( const double& /*rScaleX*/, const double& /*rScaleY*/, sal_uInt32 /*nScaleFlag*/ ) { return false; commit db172a460894f9bfad27eacf9ec69235358bcf6c Author: Louis-Francis Ratté-Boulianne <l...@collabora.com> Date: Tue Dec 2 10:29:00 2014 -0500 vcl: Add reference on default window's context so it doesn't get destroyed Change-Id: Ifce8903ce75b1d2ff6acfd717c689f8893d80802 diff --git a/vcl/source/app/svdata.cxx b/vcl/source/app/svdata.cxx index dea1429..59b2d23 100644 --- a/vcl/source/app/svdata.cxx +++ b/vcl/source/app/svdata.cxx @@ -39,6 +39,7 @@ #include "vcl/dockwin.hxx" #include "salinst.hxx" #include "salframe.hxx" +#include "salgdi.hxx" #include "svdata.hxx" #include "window.h" #include "salimestatus.hxx" @@ -49,6 +50,8 @@ #include "officecfg/Office/Common.hxx" +#include "vcl/opengl/OpenGLContext.hxx" + #include <stdio.h> using namespace com::sun::star::uno; @@ -129,6 +132,11 @@ vcl::Window* ImplGetDefaultWindow() DBG_WARNING( "ImplGetDefaultWindow(): No AppWindow" ); pSVData->mpDefaultWin = new WorkWindow( 0, WB_DEFAULTWIN ); pSVData->mpDefaultWin->SetText( OUString( "VCL ImplGetDefaultWindow" ) ); + + // Add a reference to the default context so it never gets deleted + OpenGLContext* pContext = pSVData->mpDefaultWin->GetGraphics()->GetOpenGLContext(); + if( pContext ) + pContext->AddRef(); } Application::GetSolarMutex().release(); } diff --git a/vcl/source/app/svmain.cxx b/vcl/source/app/svmain.cxx index c43fc57..c1456ad 100644 --- a/vcl/source/app/svmain.cxx +++ b/vcl/source/app/svmain.cxx @@ -65,12 +65,15 @@ #include "outfont.hxx" #include "PhysicalFontCollection.hxx" #include "print.h" +#include "salgdi.hxx" #include "salsys.hxx" #include "saltimer.hxx" #include "salimestatus.hxx" #include "impimagetree.hxx" #include "xconnection.hxx" +#include "vcl/opengl/OpenGLContext.hxx" + #include "osl/process.h" #include "com/sun/star/lang/XMultiServiceFactory.hpp" #include "com/sun/star/lang/XComponent.hpp" @@ -442,6 +445,9 @@ void DeInitVCL() } if ( pSVData->mpDefaultWin ) { + OpenGLContext* pContext = pSVData->mpDefaultWin->GetGraphics()->GetOpenGLContext(); + if( pContext ) + pContext->DeRef(); delete pSVData->mpDefaultWin; pSVData->mpDefaultWin = NULL; } commit 53193345e049be67415569415e19588b33c8cecd Author: Louis-Francis Ratté-Boulianne <l...@collabora.com> Date: Tue Dec 2 09:08:57 2014 -0500 vcl: Release the OpenGL context for offscreen rendering after each operation Change-Id: If253a4c0a1f64b1cc54e0079d4455abf39620ac0 diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx index e836e82..f4fb17d 100644 --- a/vcl/opengl/gdiimpl.cxx +++ b/vcl/opengl/gdiimpl.cxx @@ -161,6 +161,11 @@ void OpenGLSalGraphicsImpl::PostDraw() mpFramebuffer = NULL; CHECK_GL_ERROR(); + + // release the context as there is no guarantee the underlying window + // will still be valid for the next draw operation + if( mbOffscreen ) + ReleaseContext(); } void OpenGLSalGraphicsImpl::freeResources() commit 0a04ceca6cbebd76655c5ec6d31168da7672be20 Author: Louis-Francis Ratté-Boulianne <l...@collabora.com> Date: Tue Dec 2 09:05:19 2014 -0500 vcl: Don't create new contexts for Virtual Devices on Windows Change-Id: I561a8142f986aca89e796ce2c4a0902fae41f9e6 diff --git a/include/vcl/opengl/OpenGLContext.hxx b/include/vcl/opengl/OpenGLContext.hxx index 9c39ec2..20731a6 100644 --- a/include/vcl/opengl/OpenGLContext.hxx +++ b/include/vcl/opengl/OpenGLContext.hxx @@ -238,8 +238,6 @@ public: return mbInitialized; } - void resetToReInitialize(); - bool supportMultiSampling() const; static SystemWindowData generateWinData(vcl::Window* pParent, bool bRequestLegacyContext); diff --git a/vcl/inc/opengl/win/gdiimpl.hxx b/vcl/inc/opengl/win/gdiimpl.hxx index 30ade23..03007c9 100644 --- a/vcl/inc/opengl/win/gdiimpl.hxx +++ b/vcl/inc/opengl/win/gdiimpl.hxx @@ -30,7 +30,6 @@ public: protected: virtual OpenGLContext* CreateWinContext() SAL_OVERRIDE; virtual bool UseContext( OpenGLContext* pContext ) SAL_OVERRIDE; - virtual OpenGLContext* CreatePixmapContext() SAL_OVERRIDE; public: virtual void copyBits( const SalTwoRect& rPosAry, SalGraphics* pSrcGraphics ) SAL_OVERRIDE; diff --git a/vcl/inc/opengl/x11/gdiimpl.hxx b/vcl/inc/opengl/x11/gdiimpl.hxx index d6ef010..feb3961 100644 --- a/vcl/inc/opengl/x11/gdiimpl.hxx +++ b/vcl/inc/opengl/x11/gdiimpl.hxx @@ -27,7 +27,6 @@ public: protected: virtual OpenGLContext* CreateWinContext() SAL_OVERRIDE; - virtual OpenGLContext* CreatePixmapContext() SAL_OVERRIDE; virtual bool UseContext( OpenGLContext* pContext ) SAL_OVERRIDE; public: diff --git a/vcl/inc/openglgdiimpl.hxx b/vcl/inc/openglgdiimpl.hxx index d328ab7..03d1c23 100644 --- a/vcl/inc/openglgdiimpl.hxx +++ b/vcl/inc/openglgdiimpl.hxx @@ -110,12 +110,12 @@ protected: bool AcquireContext(); bool ReleaseContext(); + // retrieve the default context for offscreen rendering + virtual OpenGLContext* GetDefaultContext(); + // create a new context for window rendering virtual OpenGLContext* CreateWinContext() = 0; - // create a new context for offscreen rendering - virtual OpenGLContext* CreatePixmapContext() = 0; - // check whether the given context can be used by this instance virtual bool UseContext( OpenGLContext* pContext ) = 0; diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx index 970957c..e836e82 100644 --- a/vcl/opengl/gdiimpl.cxx +++ b/vcl/opengl/gdiimpl.cxx @@ -61,6 +61,11 @@ OpenGLContext* OpenGLSalGraphicsImpl::GetOpenGLContext() return mpContext; } +OpenGLContext* OpenGLSalGraphicsImpl::GetDefaultContext() +{ + return ImplGetDefaultWindow()->GetGraphics()->GetOpenGLContext(); +} + bool OpenGLSalGraphicsImpl::AcquireContext( ) { ImplSVData* pSVData = ImplGetSVData(); @@ -81,7 +86,7 @@ bool OpenGLSalGraphicsImpl::AcquireContext( ) if( pContext ) pContext->AddRef(); else - pContext = mbOffscreen ? CreatePixmapContext() : CreateWinContext(); + pContext = mbOffscreen ? GetDefaultContext() : CreateWinContext(); mpContext = pContext; return (mpContext != NULL); @@ -112,15 +117,6 @@ void OpenGLSalGraphicsImpl::Init() maOffscreenTex.GetHeight() != GetHeight() ) { maOffscreenTex = OpenGLTexture(); -#if defined(WNT) - // URGH ... VirtualDevice may have destroyed the underlying resource - // our context is associated with - FIXME: can we do better here ? - if (mpContext) - { - mpContext->resetToReInitialize(); - ReleaseContext(); - } -#endif } } diff --git a/vcl/opengl/win/gdiimpl.cxx b/vcl/opengl/win/gdiimpl.cxx index 939d4e0..a56ea30 100644 --- a/vcl/opengl/win/gdiimpl.cxx +++ b/vcl/opengl/win/gdiimpl.cxx @@ -38,16 +38,9 @@ bool WinOpenGLSalGraphicsImpl::UseContext( OpenGLContext* pContext ) { if( !pContext || !pContext->isInitialized() ) return false; + if( IsOffscreen() ) + return true; return ( pContext->getOpenGLWindow().hWnd == mrParent.mhWnd ); } -OpenGLContext* WinOpenGLSalGraphicsImpl::CreatePixmapContext() -{ - OpenGLContext* pContext = new OpenGLContext(); - pContext->requestVirtualDevice(); - pContext->requestSingleBufferedRendering(); - pContext->init( mrParent.mhLocalDC, mrParent.mhWnd ); - return pContext; -} - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/opengl/x11/gdiimpl.cxx b/vcl/opengl/x11/gdiimpl.cxx index e5070d7..d0d890b 100644 --- a/vcl/opengl/x11/gdiimpl.cxx +++ b/vcl/opengl/x11/gdiimpl.cxx @@ -56,16 +56,6 @@ OpenGLContext* X11OpenGLSalGraphicsImpl::CreateWinContext() return pContext; } -OpenGLContext* X11OpenGLSalGraphicsImpl::CreatePixmapContext() -{ - X11OpenGLSalVirtualDevice* pVDev = dynamic_cast<X11OpenGLSalVirtualDevice*>(mrParent.m_pVDev); - - if( pVDev == NULL ) - return NULL; - - return ImplGetDefaultWindow()->GetGraphics()->GetOpenGLContext(); -} - bool X11OpenGLSalGraphicsImpl::UseContext( OpenGLContext* pContext ) { X11WindowProvider *pProvider = dynamic_cast<X11WindowProvider*>(mrParent.m_pFrame); diff --git a/vcl/source/opengl/OpenGLContext.cxx b/vcl/source/opengl/OpenGLContext.cxx index 1de58cf..13823f3 100644 --- a/vcl/source/opengl/OpenGLContext.cxx +++ b/vcl/source/opengl/OpenGLContext.cxx @@ -633,17 +633,6 @@ bool OpenGLContext::init(SystemChildWindow* pChildWindow) return ImplInit(); } -#if defined( WNT ) -// FIXME share resetToReInitialize() across platforms... -void OpenGLContext::resetToReInitialize() -{ - if( !mbInitialized ) - return; - resetCurrent(); - mbInitialized = false; -} -#endif - #if defined( UNX ) && !defined MACOSX && !defined IOS && !defined ANDROID bool OpenGLContext::init(Display* dpy, Window win, int screen) {
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits