vcl/Package_opengl.mk | 1 vcl/headless/svpbmp.cxx | 5 ++++ vcl/inc/headless/svpbmp.hxx | 2 + vcl/inc/impbmp.hxx | 1 vcl/inc/opengl/program.hxx | 2 + vcl/inc/opengl/salbmp.hxx | 1 vcl/inc/quartz/salbmp.h | 1 vcl/inc/salbmp.hxx | 1 vcl/inc/unx/salbmp.h | 1 vcl/inc/win/salbmp.h | 3 +- vcl/opengl/program.cxx | 19 ++++++++++++++++++ vcl/opengl/replaceColorFragmentShader.glsl | 25 ++++++++++++++++++++++++ vcl/opengl/salbmp.cxx | 30 +++++++++++++++++++++++++++++ vcl/opengl/texture.cxx | 22 +++++++++------------ vcl/quartz/salbmp.cxx | 5 ++++ vcl/source/gdi/bitmap.cxx | 18 +++++++++++++++++ vcl/source/gdi/impbmp.cxx | 5 ++++ vcl/unx/generic/gdi/salbmp.cxx | 5 ++++ vcl/win/source/gdi/salbmp.cxx | 5 ++++ 19 files changed, 139 insertions(+), 13 deletions(-)
New commits: commit e133fe5a26ce5e77272acc0afe51f3d333532a6b 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 4371180fe700f4b9cc1b82a0fbceb480ec4557a6 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 4b2b26f..3c8ad50 100644 --- a/vcl/inc/opengl/program.hxx +++ b/vcl/inc/opengl/program.hxx @@ -48,9 +48,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 c9542c7..5b88ed1 100644 --- a/vcl/opengl/program.cxx +++ b/vcl/opengl/program.cxx @@ -127,6 +127,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 ); @@ -171,6 +177,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 9c38e7d15f562035bc1e070042db077eea3aa6be 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 9ece5a3..6b1fa04 100644 --- a/vcl/inc/quartz/salbmp.h +++ b/vcl/inc/quartz/salbmp.h @@ -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; 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 56f3b85..089f7d8 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 80ae37e..fab5f13 100644 --- a/vcl/quartz/salbmp.cxx +++ b/vcl/quartz/salbmp.cxx @@ -982,4 +982,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 ccd914d..e9e5fd6 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 b8d9a7d..818cdee 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 5cb0943..15ab284 100644 --- a/vcl/win/source/gdi/salbmp.cxx +++ b/vcl/win/source/gdi/salbmp.cxx @@ -1091,4 +1091,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: */
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits