[Libreoffice-commits] core.git: Branch 'feature/opengl-vcl2' - 3 commits - vcl/headless vcl/inc vcl/opengl vcl/Package_opengl.mk vcl/quartz vcl/source vcl/unx vcl/win
Louis-Francis Ratté-Boulianne
lfrb at collabora.com
Tue Dec 2 13:43:11 PST 2014
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 <lfrb at 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 <lfrb at 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 <lfrb at 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: */
More information about the Libreoffice-commits
mailing list