[Libreoffice-commits] core.git: vcl/opengl

Tomaž Vajngerl tomaz.vajngerl at collabora.co.uk
Thu Aug 4 09:54:53 UTC 2016


 vcl/opengl/gdiimpl.cxx |   93 ++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 69 insertions(+), 24 deletions(-)

New commits:
commit 24d19042644f5a49c8ae148a5021a98bee860066
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date:   Thu Aug 4 16:21:47 2016 +0900

    tdf#101008 fix XOR rendering
    
    Change-Id: Ied73966633e5ffd56faccea7ec1408bd83642b58
    Reviewed-on: https://gerrit.libreoffice.org/27862
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Tomaž Vajngerl <quikee at gmail.com>

diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx
index 9ab939a..10e2764 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -228,6 +228,10 @@ void OpenGLSalGraphicsImpl::InitializePreDrawState(XOROption eOpt)
         CHECK_GL_ERROR();
 
         glLogicOp(GL_XOR);
+        CHECK_GL_ERROR();
+
+        glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE);
+        CHECK_GL_ERROR();
     }
 }
 
@@ -237,6 +241,8 @@ void OpenGLSalGraphicsImpl::PostDraw()
     {
         glDisable(GL_COLOR_LOGIC_OP);
         CHECK_GL_ERROR();
+        glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+        CHECK_GL_ERROR();
     }
 
     if( mpProgram )
@@ -464,17 +470,43 @@ void OpenGLSalGraphicsImpl::SetFillColor( SalColor nSalColor )
 // enable/disable XOR drawing
 void OpenGLSalGraphicsImpl::SetXORMode( bool bSet )
 {
-    mbXORMode = bSet;
+    if (mbXORMode != bSet)
+    {
+        FlushDeferredDrawing();
+        mbXORMode = bSet;
+    }
 }
 
-// set line color for raster operations
-void OpenGLSalGraphicsImpl::SetROPLineColor( SalROPColor /*nROPColor*/ )
+void OpenGLSalGraphicsImpl::SetROPLineColor(SalROPColor nROPColor)
 {
+    switch (nROPColor)
+    {
+        case SalROPColor::N0:
+            mnLineColor = MAKE_SALCOLOR(0, 0, 0);
+            break;
+        case SalROPColor::N1:
+            mnLineColor = MAKE_SALCOLOR(0xff, 0xff, 0xff);
+            break;
+        case SalROPColor::Invert:
+            mnLineColor = MAKE_SALCOLOR(0xff, 0xff, 0xff);
+            break;
+    }
 }
 
-// set fill color for raster operations
-void OpenGLSalGraphicsImpl::SetROPFillColor( SalROPColor /*nROPColor*/ )
+void OpenGLSalGraphicsImpl::SetROPFillColor(SalROPColor nROPColor)
 {
+    switch (nROPColor)
+    {
+        case SalROPColor::N0:
+            mnFillColor = MAKE_SALCOLOR(0, 0, 0);
+            break;
+        case SalROPColor::N1:
+            mnFillColor = MAKE_SALCOLOR(0xff, 0xff, 0xff);
+            break;
+        case SalROPColor::Invert:
+            mnFillColor = MAKE_SALCOLOR(0xff, 0xff, 0xff);
+            break;
+    }
 }
 
 bool OpenGLSalGraphicsImpl::CheckOffscreenTexture()
@@ -1917,15 +1949,21 @@ bool OpenGLSalGraphicsImpl::drawGradient(const tools::PolyPolygon& rPolyPoly,
 {
     Rectangle aBoundRect( rPolyPoly.GetBoundRect() );
 
-    VCL_GL_INFO( "::drawGradient" );
+    VCL_GL_INFO("::drawGradient " << rPolyPoly.GetBoundRect());
 
-    if( aBoundRect.IsEmpty() )
+    if (aBoundRect.IsEmpty())
+    {
+        VCL_GL_INFO("::drawGradient nothing to draw");
         return true;
+    }
 
-    if( rGradient.GetStyle() != GradientStyle_LINEAR &&
+    if (rGradient.GetStyle() != GradientStyle_LINEAR &&
         rGradient.GetStyle() != GradientStyle_AXIAL &&
         rGradient.GetStyle() != GradientStyle_RADIAL )
+    {
+        VCL_GL_INFO("::drawGradient unsupported gradient type");
         return false;
+    }
 
     aBoundRect.Left()--;
     aBoundRect.Top()--;
@@ -1939,14 +1977,14 @@ bool OpenGLSalGraphicsImpl::drawGradient(const tools::PolyPolygon& rPolyPoly,
     ImplSetClipBit( vcl::Region( rPolyPoly ), 0x02 );
     if( mbUseStencil )
     {
-        glEnable( GL_STENCIL_TEST );
+        mpContext->state()->stencil().enable();
         CHECK_GL_ERROR();
         glStencilFunc( GL_EQUAL, 3, 0xFF );
         CHECK_GL_ERROR();
     }
     else
     {
-        glEnable( GL_STENCIL_TEST );
+        mpContext->state()->stencil().enable();
         CHECK_GL_ERROR();
         glStencilFunc( GL_EQUAL, 2, 0xFF );
         CHECK_GL_ERROR();
@@ -1954,32 +1992,39 @@ bool OpenGLSalGraphicsImpl::drawGradient(const tools::PolyPolygon& rPolyPoly,
 #endif
 
     // if border >= 100%, draw solid rectangle with start color
-    if( rGradient.GetBorder() >= 100.0 )
+    if (rGradient.GetBorder() >= 100.0)
     {
-        Color aCol = rGradient.GetStartColor();
-        long nF = rGradient.GetStartIntensity();
-        if( UseSolid( MAKE_SALCOLOR( aCol.GetRed() * nF / 100,
-                                     aCol.GetGreen() * nF / 100,
-                                     aCol.GetBlue() * nF / 100 ) ) )
-            DrawRect( aBoundRect );
+        VCL_GL_INFO("::drawGradient -> DrawRect (no gradient)");
+
+        Color aColor = rGradient.GetStartColor();
+        long nIntensity = rGradient.GetStartIntensity();
+        if (UseSolid(MAKE_SALCOLOR(aColor.GetRed()  * nIntensity / 100.0,
+                                   aColor.GetGreen()* nIntensity / 100.0,
+                                   aColor.GetBlue() * nIntensity / 100.0)))
+        {
+            DrawRect(aBoundRect);
+        }
     }
-    else if( rGradient.GetStyle() == GradientStyle_LINEAR )
+    else if (rGradient.GetStyle() == GradientStyle_LINEAR)
     {
-        DrawLinearGradient( rGradient, aBoundRect );
+        VCL_GL_INFO("::drawGradient -> DrawLinearGradient");
+        DrawLinearGradient(rGradient, aBoundRect);
     }
-    else if( rGradient.GetStyle() == GradientStyle_AXIAL )
+    else if (rGradient.GetStyle() == GradientStyle_AXIAL)
     {
-        DrawAxialGradient( rGradient, aBoundRect );
+        VCL_GL_INFO("::drawGradient -> DrawAxialGradient");
+        DrawAxialGradient(rGradient, aBoundRect);
     }
-    else if( rGradient.GetStyle() == GradientStyle_RADIAL )
+    else if (rGradient.GetStyle() == GradientStyle_RADIAL)
     {
-        DrawRadialGradient( rGradient, aBoundRect );
+        VCL_GL_INFO("::drawGradient -> DrawRadialGradient");
+        DrawRadialGradient(rGradient, aBoundRect);
     }
 
 #if FIXME_BROKEN_STENCIL_FOR_GRADIENTS
     if( !mbUseStencil )
     {
-        glDisable( GL_STENCIL_TEST );
+        mpContext->state()->stencil().disable();
         CHECK_GL_ERROR();
     }
 #endif


More information about the Libreoffice-commits mailing list