[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