[Libreoffice-commits] core.git: 13 commits - include/vcl vcl/inc vcl/opengl vcl/source vcl/unx vcl/win vcl/workben

Markus Mohrhard markus.mohrhard at collabora.co.uk
Wed Nov 12 23:04:05 PST 2014


 include/vcl/outdev.hxx             |    4 
 include/vcl/region.hxx             |    6 -
 vcl/inc/generic/genpspgraphics.h   |    3 
 vcl/inc/headless/svpgdi.hxx        |    3 
 vcl/inc/opengl/contextprovider.hxx |   28 ++++++
 vcl/inc/opengl/salbmp.hxx          |    2 
 vcl/inc/openglgdiimpl.hxx          |   10 ++
 vcl/inc/quartz/salgdi.h            |    3 
 vcl/inc/salgdi.hxx                 |    3 
 vcl/inc/salgdiimpl.hxx             |    3 
 vcl/inc/unx/salgdi.h               |   10 +-
 vcl/inc/win/salgdi.h               |    3 
 vcl/opengl/gdiimpl.cxx             |  159 +++++++++++++++++++++++++------------
 vcl/opengl/salbmp.cxx              |   64 +++++++++++---
 vcl/opengl/scale.cxx               |   15 ++-
 vcl/opengl/x11/gdiimpl.cxx         |    6 -
 vcl/source/gdi/region.cxx          |   17 +++
 vcl/source/opengl/OpenGLHelper.cxx |    1 
 vcl/source/outdev/outdev.cxx       |   13 ++-
 vcl/source/window/paint.cxx        |    7 +
 vcl/unx/generic/gdi/gdiimpl.hxx    |    3 
 vcl/unx/generic/gdi/salgdi.cxx     |   18 +++-
 vcl/win/source/gdi/gdiimpl.hxx     |    3 
 vcl/win/source/gdi/salgdi.cxx      |    9 +-
 vcl/workben/vcldemo.cxx            |   23 +++--
 25 files changed, 309 insertions(+), 107 deletions(-)

New commits:
commit 19274cdb71983daf684abe623dbad61d3ca3cb6a
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date:   Thu Nov 13 06:16:03 2014 +0100

    Revert "loplugin:unreffun"
    
    This reverts commit 3e90cc12731eaf149dce83237bfccb88ffbd26a9.

diff --git a/vcl/workben/vcldemo.cxx b/vcl/workben/vcldemo.cxx
index 79e2fbc..177cd51 100644
--- a/vcl/workben/vcldemo.cxx
+++ b/vcl/workben/vcldemo.cxx
@@ -552,6 +552,17 @@ public:
         }
     };
 
+    struct FetchDrawBitmap : public RegionRenderer
+    {
+        virtual void RenderRegion(OutputDevice &rDev, Rectangle r,
+                                  const RenderContext &) SAL_OVERRIDE
+        {
+            Bitmap aBitmap(rDev.GetBitmap(Point(0,0),rDev.GetOutputSizePixel()));
+            aBitmap.Scale(r.GetSize(), BMP_SCALE_BESTQUALITY);
+            rDev.DrawBitmap(r.TopLeft(), aBitmap);
+        }
+    };
+
     void drawToDevice(OutputDevice &rDev, bool bVdev)
     {
         RenderContext aCtx;
commit 17bc7a4cb9eb22d59aae7d7646bf436df9e3fd8b
Author: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
Date:   Wed Nov 12 18:13:27 2014 -0500

    vcldemo: Add some values to the gradient arrays
    
    Change-Id: I6c51bce7503866f39e72957752303e4d28145afb

diff --git a/vcl/workben/vcldemo.cxx b/vcl/workben/vcldemo.cxx
index 5aeadc5..79e2fbc 100644
--- a/vcl/workben/vcldemo.cxx
+++ b/vcl/workben/vcldemo.cxx
@@ -356,20 +356,20 @@ public:
                 sal_uInt32 nStartCols[] = {
                     COL_RED, COL_RED, COL_RED, COL_GREEN, COL_GREEN,
                     COL_BLUE, COL_BLUE, COL_BLUE, COL_CYAN, COL_CYAN,
-                    COL_GRAY, COL_GRAY, COL_LIGHTGRAY, COL_LIGHTBLUE, COL_LIGHTCYAN,
-                    COL_WHITE, COL_WHITE, COL_BLACK, COL_BLACK
+                    COL_BLACK, COL_LIGHTGRAY, COL_WHITE, COL_BLUE, COL_CYAN,
+                    COL_WHITE, COL_WHITE, COL_WHITE, COL_BLACK, COL_BLACK
                 };
                 sal_uInt32 nEndCols[] = {
-                    COL_WHITE, COL_WHITE, COL_BLACK, COL_BLACK,
+                    COL_WHITE, COL_WHITE, COL_WHITE, COL_BLACK, COL_BLACK,
                     COL_RED, COL_RED, COL_RED, COL_GREEN, COL_GREEN,
                     COL_GRAY, COL_GRAY, COL_LIGHTGRAY, COL_LIGHTBLUE, COL_LIGHTCYAN,
                     COL_BLUE, COL_BLUE, COL_BLUE, COL_CYAN, COL_CYAN
                 };
                 GradientStyle eStyles[] = {
                     GradientStyle_LINEAR, GradientStyle_AXIAL, GradientStyle_RADIAL, GradientStyle_ELLIPTICAL, GradientStyle_SQUARE,
-                    GradientStyle_RECT, GradientStyle_FORCE_EQUAL_SIZE, GradientStyle_LINEAR, GradientStyle_RADIAL,
+                    GradientStyle_RECT, GradientStyle_FORCE_EQUAL_SIZE, GradientStyle_LINEAR, GradientStyle_RADIAL, GradientStyle_LINEAR,
                     GradientStyle_LINEAR, GradientStyle_AXIAL, GradientStyle_RADIAL, GradientStyle_ELLIPTICAL, GradientStyle_SQUARE,
-                    GradientStyle_RECT, GradientStyle_FORCE_EQUAL_SIZE, GradientStyle_LINEAR, GradientStyle_RADIAL
+                    GradientStyle_RECT, GradientStyle_FORCE_EQUAL_SIZE, GradientStyle_LINEAR, GradientStyle_RADIAL, GradientStyle_LINEAR
                 };
                 sal_uInt16 nAngles[] = {
                     0, 0, 0, 0, 0,
commit 1b3dcdbecbbcd5f5f1b838366bbfe194c4188c36
Author: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
Date:   Wed Nov 12 18:12:00 2014 -0500

    vcl: Fix several coordinates calculations
    
    Change-Id: I15878b4d91081a7ac880713ad278893aaad4a844

diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx
index 8396ffe..027d9ac 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -447,7 +447,7 @@ void OpenGLSalGraphicsImpl::DrawPoint( long nX, long nY )
     GLfloat pPoint[2];
 
     pPoint[0] = 2 * nX / GetWidth() - 1.0f;
-    pPoint[1] = 2 * (GetHeight() - nY) / GetHeight() - 1.0f;
+    pPoint[1] = 1.0f - 2 * nY / GetHeight();
 
     glEnableVertexAttribArray( GL_ATTRIB_POS );
     glVertexAttribPointer( GL_ATTRIB_POS, 2, GL_FLOAT, GL_FALSE, 0, pPoint );
@@ -462,9 +462,9 @@ void OpenGLSalGraphicsImpl::DrawLine( long nX1, long nY1, long nX2, long nY2 )
     GLfloat pPoints[4];
 
     pPoints[0] = (2 * nX1) / GetWidth() - 1.0;
-    pPoints[1] = (2 * (GetHeight() - nY1)) / GetHeight() - 1.0;
+    pPoints[1] = 1.0f - 2 * nY1 / GetHeight();
     pPoints[2] = (2 * nX2) / GetWidth() - 1.0;;
-    pPoints[3] = (2 * (GetHeight() - nY2)) / GetHeight() - 1.0;
+    pPoints[3] = 1.0f - 2 * nY2 / GetHeight();
 
     glEnableVertexAttribArray( GL_ATTRIB_POS );
     glVertexAttribPointer( GL_ATTRIB_POS, 2, GL_FLOAT, GL_FALSE, 0, pPoints );
@@ -504,7 +504,7 @@ void OpenGLSalGraphicsImpl::DrawConvexPolygon( sal_uInt32 nPoints, const SalPoin
     for( i = 0, j = 0; i < nPoints; i++, j += 2 )
     {
         aVertices[j] = (2 * pPtAry[i].mnX) / GetWidth() - 1.0;
-        aVertices[j+1] = (2 * pPtAry[i].mnY) / GetHeight() - 1.0;
+        aVertices[j+1] = 1.0 - (2 * pPtAry[i].mnY / GetHeight());
     }
 
     glEnableVertexAttribArray( GL_ATTRIB_POS );
@@ -525,7 +525,7 @@ void OpenGLSalGraphicsImpl::DrawConvexPolygon( const Polygon& rPolygon )
     {
         const Point& rPt = rPolygon.GetPoint( i );
         aVertices[j] = (2 * rPt.X()) / GetWidth() - 1.0;
-        aVertices[j+1] = (2 * (GetHeight() - rPt.Y())) / GetHeight() - 1.0;
+        aVertices[j+1] = 1.0 - (2 * rPt.Y() / GetHeight());
     }
 
     glEnableVertexAttribArray( GL_ATTRIB_POS );
@@ -539,9 +539,9 @@ void OpenGLSalGraphicsImpl::DrawConvexPolygon( const Polygon& rPolygon )
 void OpenGLSalGraphicsImpl::DrawRect( long nX, long nY, long nWidth, long nHeight )
 {
     long nX1( nX );
-    long nY1( GetHeight() - nY );
+    long nY1( nY );
     long nX2( nX + nWidth );
-    long nY2( GetHeight() - nY - nHeight );
+    long nY2( nY + nHeight );
     const SalPoint aPoints[] = { { nX1, nY2 }, { nX1, nY1 },
                                  { nX2, nY1 }, { nX2, nY2 }};
 
@@ -551,9 +551,9 @@ void OpenGLSalGraphicsImpl::DrawRect( long nX, long nY, long nWidth, long nHeigh
 void OpenGLSalGraphicsImpl::DrawRect( const Rectangle& rRect )
 {
     long nX1( rRect.Left() );
-    long nY1( GetHeight() - rRect.Top() );
+    long nY1( rRect.Top() );
     long nX2( rRect.Right() );
-    long nY2( GetHeight() - rRect.Bottom() );
+    long nY2( rRect.Bottom() );
     const SalPoint aPoints[] = { { nX1, nY2 }, { nX1, nY1 },
                                  { nX2, nY1 }, { nX2, nY2 }};
 
commit afd759a583e9dcbbbdda0697b57f97f8235d2741
Author: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
Date:   Wed Nov 12 18:11:34 2014 -0500

    vcl: Use stencil mask to clip gradient shape
    
    Change-Id: I5dc17a20ab65f0b0bad4741a7d1ec76a0e028e23

diff --git a/vcl/inc/openglgdiimpl.hxx b/vcl/inc/openglgdiimpl.hxx
index 82bb919..167fe60 100644
--- a/vcl/inc/openglgdiimpl.hxx
+++ b/vcl/inc/openglgdiimpl.hxx
@@ -74,6 +74,8 @@ protected:
     GLuint mnRadialGradientEndColorUniform;
     GLuint mnRadialGradientCenterUniform;
 
+    void ImplSetClipBit( const vcl::Region& rClip, GLuint nMask );
+
     bool CreateSolidProgram( void );
     bool CreateTextureProgram( void );
     bool CreateMaskedTextureProgram( void );
diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx
index f1206c3..8396ffe 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -102,7 +102,10 @@ void OpenGLSalGraphicsImpl::PreDraw()
     if( mbUseScissor )
         glEnable( GL_SCISSOR_TEST );
     if( mbUseStencil )
+    {
+        glStencilFunc( GL_EQUAL, 1, 0x1 );
         glEnable( GL_STENCIL_TEST );
+    }
 
     CHECK_GL_ERROR();
 }
@@ -125,6 +128,24 @@ void OpenGLSalGraphicsImpl::freeResources()
     // TODO Delete shaders, programs and textures if not shared
 }
 
+void OpenGLSalGraphicsImpl::ImplSetClipBit( const vcl::Region& rClip, GLuint nMask )
+{
+    glEnable( GL_STENCIL_TEST );
+    glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
+    glStencilMask( nMask );
+    glStencilFunc( GL_NEVER, nMask, 0xFF );
+    glStencilOp( GL_REPLACE, GL_KEEP, GL_KEEP );
+
+    glClear( GL_STENCIL_BUFFER_BIT );
+    BeginSolid( MAKE_SALCOLOR( 0xFF, 0xFF, 0xFF ) );
+    DrawPolyPolygon( rClip.GetAsB2DPolyPolygon() );
+    EndSolid();
+
+    glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
+    glStencilMask( 0x00 );
+    glDisable( GL_STENCIL_TEST );
+}
+
 bool OpenGLSalGraphicsImpl::setClipRegion( const vcl::Region& rClip )
 {
     SAL_INFO( "vcl.opengl", "::setClipRegion " << rClip );
@@ -150,22 +171,7 @@ bool OpenGLSalGraphicsImpl::setClipRegion( const vcl::Region& rClip )
         mbUseScissor = false;
         maContext.makeCurrent();
         glViewport( 0, 0, GetWidth(), GetHeight() );
-
-        glEnable( GL_STENCIL_TEST );
-        glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
-        glStencilMask( 0xFF );
-        glStencilFunc( GL_NEVER, 1, 0xFF );
-        glStencilOp( GL_REPLACE, GL_KEEP, GL_KEEP );
-
-        glClear( GL_STENCIL_BUFFER_BIT );
-        BeginSolid( SALCOLOR_NONE );
-        DrawPolyPolygon( rClip.GetAsB2DPolyPolygon() );
-        EndSolid();
-
-        glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
-        glStencilMask( 0x00 );
-        glStencilFunc( GL_EQUAL, 1, 0xFF );
-        glDisable( GL_STENCIL_TEST );
+        ImplSetClipBit( rClip, 0x01 );
     }
 
     return true;
@@ -1333,42 +1339,54 @@ bool OpenGLSalGraphicsImpl::drawGradient(const tools::PolyPolygon& rPolyPoly,
     if( aBoundRect.IsEmpty() )
         return true;
 
+    if( rGradient.GetStyle() != GradientStyle_LINEAR &&
+        rGradient.GetStyle() != GradientStyle_RADIAL )
+        return false;
+
     aBoundRect.Left()--;
     aBoundRect.Top()--;
     aBoundRect.Right()++;
     aBoundRect.Bottom()++;
+    //TODO: lfrb: some missing transformation with the polygon in outdev
+
+    PreDraw();
+
+    ImplSetClipBit( vcl::Region( rPolyPoly ), 0x02 );
+    if( mbUseStencil )
+    {
+        glEnable( GL_STENCIL_TEST );
+        glStencilFunc( GL_EQUAL, 3, 0xFF );
+    }
+    else
+    {
+        glEnable( GL_STENCIL_TEST );
+        glStencilFunc( GL_EQUAL, 2, 0xFF );
+    }
 
     // if border >= 100%, draw solid rectangle with start color
     if( rGradient.GetBorder() >= 100.0 )
     {
         Color aCol = rGradient.GetStartColor();
         long nF = rGradient.GetStartIntensity();
-        PreDraw();
         BeginSolid( MAKE_SALCOLOR( aCol.GetRed() * nF / 100,
                                    aCol.GetGreen() * nF / 100,
                                    aCol.GetBlue() * nF / 100 ) );
         DrawRect( aBoundRect );
-        EndSolid();
-        PostDraw();
-        return true;
     }
-
-    //TODO: lfrb: some missing transformation with the polygon in outdev
-    if( rGradient.GetStyle() == GradientStyle_LINEAR )
+    else if( rGradient.GetStyle() == GradientStyle_LINEAR )
     {
-        PreDraw();
         DrawLinearGradient( rGradient, aBoundRect );
-        PostDraw();
-        return true;
     }
     else if( rGradient.GetStyle() == GradientStyle_RADIAL )
     {
-        PreDraw();
         DrawRadialGradient( rGradient, aBoundRect );
-        PostDraw();
-        return true;
     }
-    return false;
+
+    if( !mbUseStencil )
+        glDisable( GL_STENCIL_TEST );
+    PostDraw();
+
+    return true;
 }
 
 void OpenGLSalGraphicsImpl::beginPaint()
commit 6ff6d0b00dee5f9afbd4b4f0747183a3c8ba7939
Author: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
Date:   Wed Nov 12 15:55:23 2014 -0500

    vcl: Use glScissor for rectangular clip regions
    
    Change-Id: I62bf28d854d889242a49146cfe87c3dd6be89c32

diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx
index 408896b..f1206c3 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -135,7 +135,7 @@ bool OpenGLSalGraphicsImpl::setClipRegion( const vcl::Region& rClip )
         return true;
     }
 
-    if( false ) //rClip.IsRectangle() )
+    if( rClip.IsRectangle() )
     {
         Rectangle aRect( rClip.GetBoundRect() );
 
commit 0127e37a83bc3734045c084fe8e3eb61998afc9e
Author: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
Date:   Wed Nov 12 15:37:36 2014 -0500

    vcl: Fix gradient programs attribute binding
    
    Change-Id: I4210f09759824bf9415350262fd07534c9b3a317

diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx
index 252d303..408896b 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -341,8 +341,8 @@ bool OpenGLSalGraphicsImpl::CreateLinearGradientProgram( void )
     if( mnLinearGradientProgram == 0 )
         return false;
 
-    glBindAttribLocation( mnTextureProgram, GL_ATTRIB_POS, "position" );
-    glBindAttribLocation( mnTextureProgram, GL_ATTRIB_TEX, "tex_coord_in" );
+    glBindAttribLocation( mnLinearGradientProgram, GL_ATTRIB_POS, "position" );
+    glBindAttribLocation( mnLinearGradientProgram, GL_ATTRIB_TEX, "tex_coord_in" );
     mnLinearGradientStartColorUniform = glGetUniformLocation( mnLinearGradientProgram, "start_color" );
     mnLinearGradientEndColorUniform = glGetUniformLocation( mnLinearGradientProgram, "end_color" );
 
@@ -356,8 +356,8 @@ bool OpenGLSalGraphicsImpl::CreateRadialGradientProgram( void )
     if( mnRadialGradientProgram == 0 )
         return false;
 
-    glBindAttribLocation( mnTextureProgram, GL_ATTRIB_POS, "position" );
-    glBindAttribLocation( mnTextureProgram, GL_ATTRIB_TEX, "tex_coord_in" );
+    glBindAttribLocation( mnRadialGradientProgram, GL_ATTRIB_POS, "position" );
+    glBindAttribLocation( mnRadialGradientProgram, GL_ATTRIB_TEX, "tex_coord_in" );
     mnRadialGradientStartColorUniform = glGetUniformLocation( mnRadialGradientProgram, "start_color" );
     mnRadialGradientEndColorUniform = glGetUniformLocation( mnRadialGradientProgram, "end_color" );
     mnRadialGradientCenterUniform = glGetUniformLocation( mnRadialGradientProgram, "center" );
commit a6fee2ca4c3bd502df755be64d2b62c1a4d2c1bb
Author: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
Date:   Wed Nov 12 15:37:11 2014 -0500

    vcl: Use scissor or stencil for clipping in OpenGL backend
    
    Change-Id: Ib6620572391999d5f8124a1a8695909d6c48643d

diff --git a/include/vcl/region.hxx b/include/vcl/region.hxx
index 362fa45..b182d36 100644
--- a/include/vcl/region.hxx
+++ b/include/vcl/region.hxx
@@ -102,6 +102,8 @@ public:
     void SetEmpty();
     void SetNull();
 
+    bool IsRectangle() const;
+
     Rectangle GetBoundRect() const;
     bool HasPolyPolygonOrB2DPolyPolygon() const { return (getB2DPolyPolygon() || getPolyPolygon()); }
     void GetRegionRectangles(RectangleVector& rTarget) const;
@@ -144,9 +146,7 @@ inline std::basic_ostream<charT, traits> & operator <<(
                       << *rRegion.getB2DPolyPolygon()
                       << ")";
     if (rRegion.getPolyPolygon())
-        return stream << "PolyPolygon("
-                      << *rRegion.getPolyPolygon()
-                      << ")";
+        return stream << "unimplemented";
     if (rRegion.getRegionBand())
     {   // inlined because RegionBand is private to vcl
         stream << "RegionBand(";
diff --git a/vcl/inc/openglgdiimpl.hxx b/vcl/inc/openglgdiimpl.hxx
index 3d1c585..82bb919 100644
--- a/vcl/inc/openglgdiimpl.hxx
+++ b/vcl/inc/openglgdiimpl.hxx
@@ -40,6 +40,10 @@ protected:
     SalVirtualDevice* mpVDev;
     int mnPainting;
 
+    // clipping
+    bool mbUseScissor;
+    bool mbUseStencil;
+
     bool mbOffscreen;
     GLuint mnFramebufferId;
     OpenGLTextureSharedPtr mpOffscreenTex;
diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx
index 669b190..252d303 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -61,6 +61,8 @@
 OpenGLSalGraphicsImpl::OpenGLSalGraphicsImpl()
     : mpFrame(NULL)
     , mnPainting(0)
+    , mbUseScissor(false)
+    , mbUseStencil(false)
     , mbOffscreen(false)
     , mnFramebufferId(0)
     , mpOffscreenTex(nullptr)
@@ -97,6 +99,10 @@ void OpenGLSalGraphicsImpl::PreDraw()
     if( mbOffscreen )
         glBindFramebuffer( GL_FRAMEBUFFER, mnFramebufferId );
     glViewport( 0, 0, GetWidth(), GetHeight() );
+    if( mbUseScissor )
+        glEnable( GL_SCISSOR_TEST );
+    if( mbUseStencil )
+        glEnable( GL_STENCIL_TEST );
 
     CHECK_GL_ERROR();
 }
@@ -105,8 +111,12 @@ void OpenGLSalGraphicsImpl::PostDraw()
 {
     if( mbOffscreen )
         glBindFramebuffer( GL_FRAMEBUFFER, 0 );
-    if( mnPainting == 0 )
+    else if( mnPainting == 0 )
         glFlush();
+    if( mbUseScissor )
+        glDisable( GL_SCISSOR_TEST );
+    if( mbUseStencil )
+        glDisable( GL_STENCIL_TEST );
     CHECK_GL_ERROR();
 }
 
@@ -117,28 +127,46 @@ void OpenGLSalGraphicsImpl::freeResources()
 
 bool OpenGLSalGraphicsImpl::setClipRegion( const vcl::Region& rClip )
 {
-    const basegfx::B2DPolyPolygon aClip( rClip.GetAsB2DPolyPolygon() );
+    SAL_INFO( "vcl.opengl", "::setClipRegion " << rClip );
 
-    SAL_INFO( "vcl.opengl", "::setClipRegion" );
+    if( rClip.IsEmpty() )
+    {
+        ResetClipRegion();
+        return true;
+    }
 
-    /*maContext.makeCurrent();
-    glViewport( 0, 0, GetWidth(), GetHeight() );
+    if( false ) //rClip.IsRectangle() )
+    {
+        Rectangle aRect( rClip.GetBoundRect() );
 
-    glEnable( GL_STENCIL_TEST );
+        mbUseStencil = false;
+        mbUseScissor = true;
+        maContext.makeCurrent();
+        glScissor( aRect.Left(), GetHeight() - aRect.Top(), aRect.GetWidth(), aRect.GetHeight() );
+    }
+    else
+    {
+        mbUseStencil = true;
+        mbUseScissor = false;
+        maContext.makeCurrent();
+        glViewport( 0, 0, GetWidth(), GetHeight() );
 
-    glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
-    glStencilMask( 0xFF );
-    glStencilFunc( GL_NEVER, 1, 0xFF );
-    glStencilOp( GL_REPLACE, GL_KEEP, GL_KEEP );
+        glEnable( GL_STENCIL_TEST );
+        glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
+        glStencilMask( 0xFF );
+        glStencilFunc( GL_NEVER, 1, 0xFF );
+        glStencilOp( GL_REPLACE, GL_KEEP, GL_KEEP );
 
-    glClear( GL_STENCIL_BUFFER_BIT );
-    BeginSolid( SALCOLOR_NONE );
-    DrawPolyPolygon( aClip );
-    EndSolid();
+        glClear( GL_STENCIL_BUFFER_BIT );
+        BeginSolid( SALCOLOR_NONE );
+        DrawPolyPolygon( rClip.GetAsB2DPolyPolygon() );
+        EndSolid();
 
-    glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
-    glStencilMask( 0x00 );
-    glStencilFunc( GL_EQUAL, 1, 0xFF );*/
+        glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
+        glStencilMask( 0x00 );
+        glStencilFunc( GL_EQUAL, 1, 0xFF );
+        glDisable( GL_STENCIL_TEST );
+    }
 
     return true;
 }
@@ -147,10 +175,8 @@ bool OpenGLSalGraphicsImpl::setClipRegion( const vcl::Region& rClip )
 void OpenGLSalGraphicsImpl::ResetClipRegion()
 {
     SAL_INFO( "vcl.opengl", "::ResetClipRegion" );
-    maContext.makeCurrent();
-    glDisable(GL_STENCIL_TEST);
-
-    CHECK_GL_ERROR();
+    mbUseScissor = false;
+    mbUseStencil = false;
 }
 
 // get the depth of the device
diff --git a/vcl/source/gdi/region.cxx b/vcl/source/gdi/region.cxx
index 3f56d0e..6fb78b0 100644
--- a/vcl/source/gdi/region.cxx
+++ b/vcl/source/gdi/region.cxx
@@ -1434,6 +1434,23 @@ bool vcl::Region::IsOver( const Rectangle& rRect ) const
     return !aRegion.IsEmpty();
 }
 
+bool vcl::Region::IsRectangle() const
+{
+    if( IsEmpty() || IsNull() )
+        return false;
+
+    if( getB2DPolyPolygon() )
+        return basegfx::tools::isRectangle( *getB2DPolyPolygon() );
+
+    if( getPolyPolygon() )
+        return getPolyPolygon()->IsRect();
+
+    if( getRegionBand() )
+        return (getRegionBand()->getRectangleCount() == 1);
+
+    return false;
+}
+
 void vcl::Region::SetNull()
 {
     // reset all content
commit c4e494bc62faa810c1b373f2e6ba7142c2b1c88d
Author: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
Date:   Wed Nov 12 14:55:33 2014 -0500

    vcldemo: Draw mini-view of the whole window in the last rectangle
    
    Change-Id: I74e8807e6a4f50b99fdc761bbdbef6e43405a3ed

diff --git a/vcl/workben/vcldemo.cxx b/vcl/workben/vcldemo.cxx
index 442ac47..5aeadc5 100644
--- a/vcl/workben/vcldemo.cxx
+++ b/vcl/workben/vcldemo.cxx
@@ -659,7 +659,7 @@ void DemoWin::InitRenderers()
     maRenderers.push_back(new DrawPolyPolygons());
     maRenderers.push_back(new DrawToVirtualDevice());
     maRenderers.push_back(new DrawIcons());
-    maRenderers.push_back(new DrawBitmap());
+    maRenderers.push_back(new FetchDrawBitmap());
 }
 
 class DemoApp : public Application
commit 1aef60fb3fbd5d9ce6521fd861207e6af7bcc5fb
Author: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
Date:   Wed Nov 12 13:16:29 2014 -0500

    vcl: Add support for GPU scaling when no rendering is involved
    
    Change-Id: Id5aa4c1e843d286026a7bcd1297670db467dcbbc

diff --git a/vcl/inc/opengl/contextprovider.hxx b/vcl/inc/opengl/contextprovider.hxx
new file mode 100644
index 0000000..47eb98c
--- /dev/null
+++ b/vcl/inc/opengl/contextprovider.hxx
@@ -0,0 +1,28 @@
+/* -*- 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/.
+ */
+
+#ifndef INCLUDED_VCL_INC_OPENGL_CONTEXTPROVIDER_HXX
+#define INCLUDED_VCL_INC_OPENGL_CONTEXTPROVIDER_HXX
+
+#include "vclpluginapi.h"
+
+#include <vcl/opengl/OpenGLContext.hxx>
+
+class VCLPLUG_GEN_PUBLIC OpenGLContextProvider
+{
+public:
+    virtual ~OpenGLContextProvider() {};
+
+    /* Get the OpenGL context provided by this instance */
+    virtual OpenGLContext* GetOpenGLContext() const = 0;
+};
+
+#endif // INCLUDED_VCL_INC_OPENGL_CONTEXTPROVIDER_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/inc/unx/salgdi.h b/vcl/inc/unx/salgdi.h
index e3d8a0c..f693ed1 100644
--- a/vcl/inc/unx/salgdi.h
+++ b/vcl/inc/unx/salgdi.h
@@ -32,6 +32,8 @@
 #include "sallayout.hxx"
 #include "vclpluginapi.h"
 
+#include "opengl/contextprovider.hxx"
+
 #include <boost/scoped_ptr.hpp>
 
 #include <deque>
@@ -60,7 +62,7 @@ namespace basegfx {
     class B2DTrapezoid;
 }
 
-class VCLPLUG_GEN_PUBLIC X11SalGraphics : public SalGraphics
+class VCLPLUG_GEN_PUBLIC X11SalGraphics : public SalGraphics, public OpenGLContextProvider
 {
     friend class ServerFontLayout;
     friend class X11SalGraphicsImpl;
@@ -297,6 +299,9 @@ public:
                                 unsigned int w, unsigned int h,
                                 int dest_x, int dest_y );
     static void releaseGlyphPeer();
+
+public:
+    virtual OpenGLContext* GetOpenGLContext() const SAL_OVERRIDE;
 };
 
 inline const SalDisplay *X11SalGraphics::GetDisplay() const
diff --git a/vcl/opengl/salbmp.cxx b/vcl/opengl/salbmp.cxx
index ad794b1..686a785 100644
--- a/vcl/opengl/salbmp.cxx
+++ b/vcl/opengl/salbmp.cxx
@@ -22,9 +22,12 @@
 #include <vcl/opengl/OpenGLHelper.hxx>
 
 #include "vcl/bitmap.hxx"
+#include "vcl/outdev.hxx"
 #include "vcl/salbtype.hxx"
+#include "svdata.hxx"
 #include "salgdi.hxx"
 
+#include "opengl/contextprovider.hxx"
 #include "opengl/salbmp.hxx"
 
 static bool isValidBitCount( sal_uInt16 nBitCount )
@@ -420,31 +423,44 @@ GLuint OpenGLSalBitmap::CreateTexture()
 
 bool OpenGLSalBitmap::ReadTexture()
 {
-    SalTwoRect aPosAry;
-    GLuint nFramebufferId, nRenderbufferDepthId, nRenderbufferColorId;
+    GLuint nFramebufferId;
     sal_uInt8* pData = maUserBuffer.get();
+    GLenum nFormat = GL_RGBA;
+    GLenum nType = GL_UNSIGNED_BYTE;
 
-    SAL_INFO( "vcl.opengl", "::ReadTexture" );
+    SAL_INFO( "vcl.opengl", "::ReadTexture " << mnWidth << "x" << mnHeight );
 
-    // TODO Check mnTexWidth and mnTexHeight
+    if( pData == NULL )
+        return false;
+
+    if( mnBits == 16 || mnBits == 24 || mnBits == 32 )
+    {
+        // no conversion needed for truecolor
+        pData = maUserBuffer.get();
+
+        switch( mnBits )
+        {
+        case 16:    nFormat = GL_RGB;
+                    nType = GL_UNSIGNED_SHORT_5_6_5;
+                    break;
+        case 24:    nFormat = GL_RGB;
+                    nType = GL_UNSIGNED_BYTE;
+                    break;
+        case 32:    nFormat = GL_RGBA;
+                    nType = GL_UNSIGNED_BYTE;
+                    break;
+        }
+    }
 
     mpContext->makeCurrent();
-    OpenGLHelper::createFramebuffer( mnWidth, mnHeight, nFramebufferId,
-        nRenderbufferDepthId, nRenderbufferColorId, true );
+    glGenFramebuffers( 1, &nFramebufferId );
     glBindFramebuffer( GL_FRAMEBUFFER, nFramebufferId );
 
-    aPosAry.mnSrcX = aPosAry.mnDestX = 0;
-    aPosAry.mnSrcY = aPosAry.mnDestY = 0;
-    aPosAry.mnSrcWidth = aPosAry.mnDestWidth = mnWidth;
-    aPosAry.mnSrcHeight = aPosAry.mnDestHeight = mnHeight;
-
-    //DrawTexture( mnTexture, aPosAry );
-    glReadPixels( 0, 0, mnWidth, mnHeight, GL_RGBA, GL_UNSIGNED_BYTE, pData );
+    glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mpTexture->Id(), 0 );
+    glReadPixels( 0, 0, mnWidth, mnHeight, nFormat, nType, pData );
 
     glBindFramebuffer( GL_FRAMEBUFFER, 0 );
     glDeleteFramebuffers( 1, &nFramebufferId );
-    glDeleteRenderbuffers( 1, &nRenderbufferDepthId );
-    glDeleteRenderbuffers( 1, &nRenderbufferColorId );
 
     CHECK_GL_ERROR();
     return true;
@@ -465,6 +481,22 @@ BitmapBuffer* OpenGLSalBitmap::AcquireBuffer( bool /*bReadOnly*/ )
             return NULL;
     }
 
+    if( !maPendingOps.empty() )
+    {
+        OpenGLContextProvider *pProvider;
+        pProvider = dynamic_cast< OpenGLContextProvider* >( ImplGetDefaultWindow()->GetGraphics() );
+        if( pProvider == NULL )
+        {
+            SAL_WARN( "vcl.opengl", "Couldn't get default OpenGL context provider" );
+            return NULL;
+        }
+        mpContext = pProvider->GetOpenGLContext();
+        mpContext->makeCurrent();
+        SAL_INFO( "vcl.opengl", "** Creating texture and reading it back immediatly" );
+        if( !CreateTexture() || !AllocateUserData() || !ReadTexture() )
+            return NULL;
+    }
+
     BitmapBuffer* pBuffer = new BitmapBuffer;
     pBuffer->mnWidth = mnWidth;
     pBuffer->mnHeight = mnHeight;
diff --git a/vcl/unx/generic/gdi/salgdi.cxx b/vcl/unx/generic/gdi/salgdi.cxx
index 62e8989..2723db4 100644
--- a/vcl/unx/generic/gdi/salgdi.cxx
+++ b/vcl/unx/generic/gdi/salgdi.cxx
@@ -167,6 +167,15 @@ void X11SalGraphics::DeInit()
     SetDrawable( None, m_nXScreen );
 }
 
+OpenGLContext* X11SalGraphics::GetOpenGLContext() const
+{
+    OpenGLSalGraphicsImpl *pImpl;
+    pImpl = dynamic_cast<OpenGLSalGraphicsImpl*>(mpImpl.get());
+    if( pImpl )
+        return &pImpl->GetOpenGLContext();
+    return NULL;
+}
+
 void X11SalGraphics::SetClipRegion( GC pGC, Region pXReg ) const
 {
     Display *pDisplay = GetXDisplay();
commit 9ac5aa94665da9c6b9188716345e79ade00dd0cc
Author: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
Date:   Wed Nov 12 12:53:09 2014 -0500

    vcl: Use new size when scaling with filter in OpenGL backend
    
    Change-Id: Ib5d12b0e57b537bbd1798121e80cd517d9c8f751

diff --git a/vcl/inc/opengl/salbmp.hxx b/vcl/inc/opengl/salbmp.hxx
index 77ac90b..c1f0cdb 100644
--- a/vcl/inc/opengl/salbmp.hxx
+++ b/vcl/inc/opengl/salbmp.hxx
@@ -106,7 +106,7 @@ private:
     GLuint          mnConvKernelSizeUniform;
     GLuint          mnConvOffsetsUniform;
 
-    bool ImplScaleFilter( GLenum nFilter );
+    bool ImplScaleFilter( const double& rScaleX, const double& rScaleY, GLenum nFilter );
     void ImplCreateKernel( const double& fScale, const Kernel& rKernel, GLfloat*& pWeights, sal_uInt32& aKernelSize );
     bool ImplScaleConvolution( const double& rScaleX, const double& rScaleY, const Kernel& aKernel );
 
diff --git a/vcl/opengl/scale.cxx b/vcl/opengl/scale.cxx
index da73786..d1b85a5 100644
--- a/vcl/opengl/scale.cxx
+++ b/vcl/opengl/scale.cxx
@@ -81,12 +81,17 @@ GLuint OpenGLSalBitmap::ImplGetConvolutionProgram()
     return mnConvProgram;
 }
 
-bool OpenGLSalBitmap::ImplScaleFilter( GLenum nFilter )
+bool OpenGLSalBitmap::ImplScaleFilter(
+    const double& rScaleX,
+    const double& rScaleY,
+    GLenum        nFilter )
 {
     OpenGLTexture* pNewTex;
     GLuint nProgram;
     GLuint nFramebufferId;
     GLenum nOldFilter;
+    int nNewWidth( mnWidth * rScaleX );
+    int nNewHeight( mnHeight * rScaleY );
 
     nProgram = ImplGetTextureProgram();
     if( nProgram == 0 )
@@ -97,7 +102,7 @@ bool OpenGLSalBitmap::ImplScaleFilter( GLenum nFilter )
     glUseProgram( nProgram );
     glUniform1i( mnTexSamplerUniform, 0 );
 
-    pNewTex = new OpenGLTexture( mnWidth, mnHeight );
+    pNewTex = new OpenGLTexture( nNewWidth, nNewHeight );
     glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, pNewTex->Id(), 0 );
 
     mpTexture->Bind();
@@ -111,6 +116,8 @@ bool OpenGLSalBitmap::ImplScaleFilter( GLenum nFilter )
     glBindFramebuffer( GL_FRAMEBUFFER, 0 );
     glDeleteFramebuffers( 1, &nFramebufferId );
 
+    mnWidth = nNewWidth;
+    mnHeight = nNewHeight;
     mpTexture.reset( pNewTex );
 
     CHECK_GL_ERROR();
@@ -241,11 +248,11 @@ bool OpenGLSalBitmap::ImplScale( const double& rScaleX, const double& rScaleY, s
 
     if( nScaleFlag == BMP_SCALE_FAST )
     {
-        return ImplScaleFilter( GL_NEAREST );
+        return ImplScaleFilter( rScaleX, rScaleY, GL_NEAREST );
     }
     if( nScaleFlag == BMP_SCALE_BILINEAR )
     {
-        return ImplScaleFilter( GL_LINEAR );
+        return ImplScaleFilter( rScaleX, rScaleY, GL_LINEAR );
     }
     else if( nScaleFlag == BMP_SCALE_SUPER )
     {
commit dc189f79e844c7208220c0903309852a09c8b1c1
Author: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
Date:   Wed Nov 12 12:51:03 2014 -0500

    vcl: Fix memory free bugs
    
    Change-Id: Ic8c507014f0b02c7a0baa40f3f48070301604ca4

diff --git a/vcl/opengl/salbmp.cxx b/vcl/opengl/salbmp.cxx
index 18d713d..ad794b1 100644
--- a/vcl/opengl/salbmp.cxx
+++ b/vcl/opengl/salbmp.cxx
@@ -403,7 +403,7 @@ GLuint OpenGLSalBitmap::CreateTexture()
     SAL_INFO( "vcl.opengl", "Created texture " << mpTexture->Id() );
 
     if( bAllocated )
-        delete pData;
+        delete[] pData;
 
     while( !maPendingOps.empty() )
     {
diff --git a/vcl/opengl/x11/gdiimpl.cxx b/vcl/opengl/x11/gdiimpl.cxx
index 13b7049..184abab 100644
--- a/vcl/opengl/x11/gdiimpl.cxx
+++ b/vcl/opengl/x11/gdiimpl.cxx
@@ -86,7 +86,7 @@ X11Pixmap* X11OpenGLSalGraphicsImpl::GetPixmapFromScreen( const Rectangle& rRect
     XVisualInfo aVisualInfo;
     X11Pixmap* pPixmap;
     XImage* pImage;
-    sal_uInt8* pData;
+    char* pData;
 
     SAL_INFO( "vcl.opengl", "GetPixmapFromScreen" );
     // TODO: lfrb: Use context depth
@@ -100,12 +100,12 @@ X11Pixmap* X11OpenGLSalGraphicsImpl::GetPixmapFromScreen( const Rectangle& rRect
     glXWaitX();
 
     // TODO: lfrb: What if offscreen?
-    pData = new sal_uInt8[rRect.GetWidth() * rRect.GetHeight() * 4];
+    pData = (char*) malloc( rRect.GetWidth() * rRect.GetHeight() * 4 );
     glPixelStorei( GL_PACK_ALIGNMENT, 1 );
     glReadPixels( rRect.Left(), GetHeight() - rRect.Top(), rRect.GetWidth(), rRect.GetHeight(),
                   GL_RGBA, GL_UNSIGNED_BYTE, pData );
 
-    pImage = XCreateImage( pDisplay, aVisualInfo.visual, 24, ZPixmap, 0, (char*) pData,
+    pImage = XCreateImage( pDisplay, aVisualInfo.visual, 24, ZPixmap, 0, pData,
                            rRect.GetWidth(), rRect.GetHeight(), 8, 0 );
     XInitImage( pImage );
     GC aGC = XCreateGC( pDisplay, pPixmap->GetPixmap(), 0, NULL );
commit f3981e86d66e5d57e266961586a5b94ffd290fa9
Author: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
Date:   Wed Nov 12 12:46:22 2014 -0500

    vcl: Fix the masked texture program attributes binding
    
    Change-Id: Ie7440881f35eaf348aef35beea5a6d407d16a342

diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx
index 2a6dcfc..669b190 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -285,8 +285,8 @@ bool OpenGLSalGraphicsImpl::CreateMaskedTextureProgram( void )
     if( mnMaskedTextureProgram == 0 )
         return false;
 
-    glBindAttribLocation( mnTextureProgram, GL_ATTRIB_POS, "position" );
-    glBindAttribLocation( mnTextureProgram, GL_ATTRIB_TEX, "tex_coord_in" );
+    glBindAttribLocation( mnMaskedTextureProgram, GL_ATTRIB_POS, "position" );
+    glBindAttribLocation( mnMaskedTextureProgram, GL_ATTRIB_TEX, "tex_coord_in" );
     mnMaskedSamplerUniform = glGetUniformLocation( mnMaskedTextureProgram, "sampler" );
     mnMaskSamplerUniform = glGetUniformLocation( mnMaskedTextureProgram, "mask" );
 
commit f433825259731e6fd0bc666f4d22b2f31dc99fa9
Author: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
Date:   Wed Nov 12 12:45:36 2014 -0500

    vcl: Use single-buffer rendering and only flush when necessary
    
    Change-Id: I832dd6f3647fbb423975fa928a5ec32447225e85

diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx
index a59b642..d80d394 100644
--- a/include/vcl/outdev.hxx
+++ b/include/vcl/outdev.hxx
@@ -501,7 +501,9 @@ public:
                                     const Point& rSrcPt,  const Size& rSrcSize,
                                     sal_uInt16 nFlags = 0 );
 
-    virtual bool                SwapBuffers();
+    // Call before and after a paint operation to reduce flushing
+    virtual void                BeginPaint();
+    virtual void                EndPaint();
 
 protected:
 
diff --git a/vcl/inc/generic/genpspgraphics.h b/vcl/inc/generic/genpspgraphics.h
index fb7169a..882e475 100644
--- a/vcl/inc/generic/genpspgraphics.h
+++ b/vcl/inc/generic/genpspgraphics.h
@@ -193,7 +193,8 @@ public:
     virtual SystemGraphicsData GetGraphicsData() const SAL_OVERRIDE;
     virtual SystemFontData  GetSysFontData( int nFallbacklevel ) const SAL_OVERRIDE;
 
-    virtual bool SwapBuffers() SAL_OVERRIDE { return false; };
+    virtual void BeginPaint() SAL_OVERRIDE { };
+    virtual void EndPaint() SAL_OVERRIDE { };
 };
 
 #endif // INCLUDED_VCL_INC_GENERIC_GENPSPGRAPHICS_H
diff --git a/vcl/inc/headless/svpgdi.hxx b/vcl/inc/headless/svpgdi.hxx
index cd5622f..9f2604f 100644
--- a/vcl/inc/headless/svpgdi.hxx
+++ b/vcl/inc/headless/svpgdi.hxx
@@ -243,7 +243,8 @@ public:
     virtual SystemGraphicsData GetGraphicsData() const SAL_OVERRIDE;
     virtual SystemFontData  GetSysFontData( int nFallbacklevel ) const SAL_OVERRIDE;
 
-    virtual bool            SwapBuffers() SAL_OVERRIDE { return false; };
+    virtual void            BeginPaint() SAL_OVERRIDE { };
+    virtual void            EndPaint() SAL_OVERRIDE { };
 
 #ifdef IOS
     void                SetVirDevGraphics( CGLayerRef xLayer, CGContextRef xContext, int = 0 );
diff --git a/vcl/inc/openglgdiimpl.hxx b/vcl/inc/openglgdiimpl.hxx
index f80c969..3d1c585 100644
--- a/vcl/inc/openglgdiimpl.hxx
+++ b/vcl/inc/openglgdiimpl.hxx
@@ -38,6 +38,7 @@ protected:
     OpenGLContext maContext;
     SalFrame* mpFrame;
     SalVirtualDevice* mpVDev;
+    int mnPainting;
 
     bool mbOffscreen;
     GLuint mnFramebufferId;
@@ -285,7 +286,8 @@ public:
 
     virtual bool drawGradient(const tools::PolyPolygon& rPolygon, const Gradient& rGradient) SAL_OVERRIDE;
 
-    virtual bool swapBuffers() SAL_OVERRIDE;
+    virtual void beginPaint() SAL_OVERRIDE;
+    virtual void endPaint() SAL_OVERRIDE;
 private:
 };
 
diff --git a/vcl/inc/quartz/salgdi.h b/vcl/inc/quartz/salgdi.h
index caab577..6cc4526 100644
--- a/vcl/inc/quartz/salgdi.h
+++ b/vcl/inc/quartz/salgdi.h
@@ -394,7 +394,8 @@ public:
                             GetGraphicsData() const SAL_OVERRIDE;
     virtual SystemFontData  GetSysFontData( int /* nFallbacklevel */ ) const SAL_OVERRIDE;
 
-    virtual bool            SwapBuffers() SAL_OVERRIDE { return false; };
+    virtual void            BeginPaint() SAL_OVERRIDE { };
+    virtual void            EndPaint() SAL_OVERRIDE { };
 
 private:
     // differences between VCL, Quartz and kHiThemeOrientation coordinate systems
diff --git a/vcl/inc/salgdi.hxx b/vcl/inc/salgdi.hxx
index a3917bb..2453450 100644
--- a/vcl/inc/salgdi.hxx
+++ b/vcl/inc/salgdi.hxx
@@ -412,7 +412,8 @@ public:
                                     sal_uInt8 nTransparency,
                                     const OutputDevice *pOutDev );
 
-    virtual bool                SwapBuffers() = 0;
+    virtual void                BeginPaint() = 0;
+    virtual void                EndPaint() = 0;
 
     virtual SystemGraphicsData  GetGraphicsData() const = 0;
 
diff --git a/vcl/inc/salgdiimpl.hxx b/vcl/inc/salgdiimpl.hxx
index 4b4b735..09ea28f 100644
--- a/vcl/inc/salgdiimpl.hxx
+++ b/vcl/inc/salgdiimpl.hxx
@@ -207,7 +207,8 @@ public:
 
     virtual bool drawGradient(const tools::PolyPolygon& rPolygon, const Gradient& rGradient) = 0;
 
-    virtual bool swapBuffers() = 0;
+    virtual void beginPaint() = 0;
+    virtual void endPaint() = 0;
 };
 
 #endif
diff --git a/vcl/inc/unx/salgdi.h b/vcl/inc/unx/salgdi.h
index 2546689..e3d8a0c 100644
--- a/vcl/inc/unx/salgdi.h
+++ b/vcl/inc/unx/salgdi.h
@@ -268,7 +268,8 @@ public:
     virtual SystemGraphicsData GetGraphicsData() const SAL_OVERRIDE;
     virtual SystemFontData     GetSysFontData( int nFallbackLevel ) const SAL_OVERRIDE;
 
-    virtual bool               SwapBuffers() SAL_OVERRIDE;
+    virtual void               BeginPaint() SAL_OVERRIDE;
+    virtual void               EndPaint() SAL_OVERRIDE;
 
     // create a pixmap from a screen region
     X11Pixmap* GetPixmapFromScreen( const Rectangle& rRect );
diff --git a/vcl/inc/win/salgdi.h b/vcl/inc/win/salgdi.h
index f09af28..69ea4cf 100644
--- a/vcl/inc/win/salgdi.h
+++ b/vcl/inc/win/salgdi.h
@@ -397,7 +397,8 @@ public:
     virtual SystemGraphicsData GetGraphicsData() const;
     virtual SystemFontData     GetSysFontData( int nFallbacklevel ) const;
 
-    virtual bool               SwapBuffers() SAL_OVERRIDE;
+    virtual void               BeginPaint() SAL_OVERRIDE;
+    virtual void               EndPaint() SAL_OVERRIDE;
 
     /// Update settings based on the platform values
     static void updateSettingsNative( AllSettings& rSettings );
diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx
index 1098b58..2a6dcfc 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -60,6 +60,7 @@
 
 OpenGLSalGraphicsImpl::OpenGLSalGraphicsImpl()
     : mpFrame(NULL)
+    , mnPainting(0)
     , mbOffscreen(false)
     , mnFramebufferId(0)
     , mpOffscreenTex(nullptr)
@@ -104,7 +105,8 @@ void OpenGLSalGraphicsImpl::PostDraw()
 {
     if( mbOffscreen )
         glBindFramebuffer( GL_FRAMEBUFFER, 0 );
-
+    if( mnPainting == 0 )
+        glFlush();
     CHECK_GL_ERROR();
 }
 
@@ -1343,10 +1345,21 @@ bool OpenGLSalGraphicsImpl::drawGradient(const tools::PolyPolygon& rPolyPoly,
     return false;
 }
 
-bool OpenGLSalGraphicsImpl::swapBuffers()
+void OpenGLSalGraphicsImpl::beginPaint()
 {
-    maContext.swapBuffers();
-    return true;
+    mnPainting++;
+    SAL_INFO( "vcl.opengl", "BEGIN PAINT " << this );
+}
+
+void OpenGLSalGraphicsImpl::endPaint()
+{
+    mnPainting--;
+    SAL_INFO( "vcl.opengl", "END PAINT " << this );
+    if( mnPainting == 0 )
+    {
+        maContext.makeCurrent();
+        glFlush();
+    }
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/opengl/OpenGLHelper.cxx b/vcl/source/opengl/OpenGLHelper.cxx
index 1fadd50..3ad99db 100644
--- a/vcl/source/opengl/OpenGLHelper.cxx
+++ b/vcl/source/opengl/OpenGLHelper.cxx
@@ -389,7 +389,6 @@ bool OpenGLHelper::GetVisualInfo(Display* pDisplay, int nScreen, XVisualInfo& rV
                       GLX_GREEN_SIZE, 8,
                       GLX_BLUE_SIZE, 8,
                       GLX_DEPTH_SIZE, 24,
-                      GLX_DOUBLEBUFFER,
                       None };
 
     pVI = glXChooseVisual( pDisplay, nScreen, aAttrib );
diff --git a/vcl/source/outdev/outdev.cxx b/vcl/source/outdev/outdev.cxx
index 5295fd4..af7d643 100644
--- a/vcl/source/outdev/outdev.cxx
+++ b/vcl/source/outdev/outdev.cxx
@@ -782,11 +782,16 @@ bool OutputDevice::DrawEPS( const Point& rPoint, const Size& rSize,
     return bDrawn;
 }
 
-bool OutputDevice::SwapBuffers()
+void OutputDevice::BeginPaint()
 {
-    if( !mpGraphics && !AcquireGraphics() )
-        return false;
-    return mpGraphics->SwapBuffers();
+    if( mpGraphics || AcquireGraphics() )
+        mpGraphics->BeginPaint();
+}
+
+void OutputDevice::EndPaint()
+{
+    if( mpGraphics || AcquireGraphics() )
+        mpGraphics->EndPaint();
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/window/paint.cxx b/vcl/source/window/paint.cxx
index b3576db..4cdaf36 100644
--- a/vcl/source/window/paint.cxx
+++ b/vcl/source/window/paint.cxx
@@ -120,8 +120,10 @@ void PaintHelper::DoPaint(const vcl::Region* pRegion)
     pWindowImpl->mnPaintFlags = 0;
     if ( !pWindowImpl->maInvalidateRegion.IsEmpty() )
     {
+        m_pWindow->BeginPaint();
         m_pWindow->PushPaintHelper(this);
         m_pWindow->Paint(m_aPaintRect);
+        m_pWindow->EndPaint();
     }
 }
 
@@ -277,9 +279,10 @@ void Window::ImplCallOverlapPaint()
     {
         // - RTL - notify ImplCallPaint to check for re-mirroring (CHECKRTL)
         //         because we were called from the Sal layer
-        ImplCallPaint( NULL, mpWindowImpl->mnPaintFlags /*| IMPL_PAINT_CHECKRTL */);
         OutputDevice *pOutDev = GetOutDev();
-        pOutDev->SwapBuffers();
+        pOutDev->BeginPaint();
+        ImplCallPaint( NULL, mpWindowImpl->mnPaintFlags /*| IMPL_PAINT_CHECKRTL */);
+        pOutDev->EndPaint();
     }
 }
 
diff --git a/vcl/unx/generic/gdi/gdiimpl.hxx b/vcl/unx/generic/gdi/gdiimpl.hxx
index 5b0062c..fed9bc6 100644
--- a/vcl/unx/generic/gdi/gdiimpl.hxx
+++ b/vcl/unx/generic/gdi/gdiimpl.hxx
@@ -267,7 +267,8 @@ public:
 
     virtual bool drawGradient(const tools::PolyPolygon& rPolygon, const Gradient& rGradient) SAL_OVERRIDE;
 
-    virtual bool swapBuffers() SAL_OVERRIDE { return false; }
+    virtual void beginPaint() SAL_OVERRIDE { }
+    virtual void endPaint() SAL_OVERRIDE { }
 
 public:
     // implementation of X11GraphicsImpl
diff --git a/vcl/unx/generic/gdi/salgdi.cxx b/vcl/unx/generic/gdi/salgdi.cxx
index 9609ec8..62e8989 100644
--- a/vcl/unx/generic/gdi/salgdi.cxx
+++ b/vcl/unx/generic/gdi/salgdi.cxx
@@ -471,9 +471,14 @@ bool X11SalGraphics::drawGradient(const tools::PolyPolygon& rPoly, const Gradien
     return mpImpl->drawGradient(rPoly, rGradient);
 }
 
-bool X11SalGraphics::SwapBuffers()
+void X11SalGraphics::BeginPaint()
 {
-    return mpImpl->swapBuffers();
+    return mpImpl->beginPaint();
+}
+
+void X11SalGraphics::EndPaint()
+{
+    return mpImpl->endPaint();
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/win/source/gdi/gdiimpl.hxx b/vcl/win/source/gdi/gdiimpl.hxx
index 0159f7c..b21f138 100644
--- a/vcl/win/source/gdi/gdiimpl.hxx
+++ b/vcl/win/source/gdi/gdiimpl.hxx
@@ -217,7 +217,8 @@ public:
     virtual bool drawGradient(const tools::PolyPolygon& rPolygon,
             const Gradient& rGradient) SAL_OVERRIDE;
 
-    virtual bool swapBuffers() SAL_OVERRIDE { return false; }
+    virtual void beginPaint() SAL_OVERRIDE { }
+    virtual void endPaint() SAL_OVERRIDE { }
 };
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/win/source/gdi/salgdi.cxx b/vcl/win/source/gdi/salgdi.cxx
index 4543489..6be65a2 100644
--- a/vcl/win/source/gdi/salgdi.cxx
+++ b/vcl/win/source/gdi/salgdi.cxx
@@ -1027,9 +1027,14 @@ SystemGraphicsData WinSalGraphics::GetGraphicsData() const
     return aRes;
 }
 
-bool WinSalGraphics::SwapBuffers()
+void WinSalGraphics::BeginPaint()
 {
-    return mpImpl->swapBuffers();
+    return mpImpl->beginPaint();
+}
+
+void WinSalGraphics::EndPaint()
+{
+    return mpImpl->endPaint();
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list