[Libreoffice-commits] core.git: 2 commits - svx/source vcl/inc vcl/opengl vcl/workben

Michael Meeks michael.meeks at collabora.com
Sat Jan 9 01:33:54 PST 2016


 svx/source/sdr/overlay/overlayselection.cxx |    9 --
 vcl/inc/openglgdiimpl.hxx                   |    7 +
 vcl/opengl/gdiimpl.cxx                      |   45 ++++++++----
 vcl/workben/vcldemo.cxx                     |  102 ++++++++++++++++++----------
 4 files changed, 103 insertions(+), 60 deletions(-)

New commits:
commit c71de1458cebcd45b65cef3a182bf1092dc8ad80
Author: Michael Meeks <michael.meeks at collabora.com>
Date:   Fri Jan 8 22:33:11 2016 +0000

    tdf#96919 - vcl opengl: implement missing XOR mode.
    
    Also revert "tdf#96257: Silly work-around to produce same result ..."
        from commit ec8bc265050d86a749140c353360a78cce4e3fce.
    
    XOR rendering (it turns out) behaves oddly, and not for all operations.
    
    Change-Id: Ie07d988bbf7fed10fb5625ac547a01a306b05319
    Reviewed-on: https://gerrit.libreoffice.org/21282
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Michael Meeks <michael.meeks at collabora.com>

diff --git a/svx/source/sdr/overlay/overlayselection.cxx b/svx/source/sdr/overlay/overlayselection.cxx
index 941df12..bab9366 100644
--- a/svx/source/sdr/overlay/overlayselection.cxx
+++ b/svx/source/sdr/overlay/overlayselection.cxx
@@ -107,16 +107,7 @@ namespace sdr
                 if(bInvert)
                 {
                     // force color to white for invert to get a full invert
-#ifdef WNT
-                    // tdf#96257: For likely separate reasons, neither the non-OpenGL nor the OpenGL
-                    // code path produces what we actually want here (a line drawn in 'invert' mode
-                    // if white is used, as happens on X11). In the non-OpenGL case we get a black
-                    // line, in the OpenGL case a white one. So let's use grey and at least get the
-                    // same on both.
-                    aRGBColor = basegfx::BColor(0.5, 0.5, 0.5);
-#else
                     aRGBColor = basegfx::BColor(1.0, 1.0, 1.0);
-#endif
                 }
 
                 for(sal_uInt32 a(0);a < nCount; a++)
diff --git a/vcl/inc/openglgdiimpl.hxx b/vcl/inc/openglgdiimpl.hxx
index 4883d0f..df2e914 100644
--- a/vcl/inc/openglgdiimpl.hxx
+++ b/vcl/inc/openglgdiimpl.hxx
@@ -80,6 +80,8 @@ protected:
     bool mbUseScissor;
     bool mbUseStencil;
 
+    bool mbXORMode;
+
     /**
      * All rendering happens to this off-screen texture. For
      * non-virtual devices, ie. windows - we will blit it and
@@ -152,8 +154,11 @@ public:
      */
     bool IsOffscreen() const { return mpProvider == nullptr || mpProvider->IsOffScreen(); }
 
+    /// Oddly not all operations obey the XOR option.
+    enum XOROption { IGNORE_XOR, IMPLEMENT_XOR };
+
     // operations to do before painting
-    void PreDraw();
+    void PreDraw(XOROption eOpt = IGNORE_XOR);
 
     // operations to do after painting
     void PostDraw();
diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx
index 791bf09..e00352f 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -68,6 +68,7 @@ OpenGLSalGraphicsImpl::OpenGLSalGraphicsImpl(SalGraphics& rParent, SalGeometryPr
     , mpFlush(new OpenGLFlushIdle(this))
     , mbUseScissor(false)
     , mbUseStencil(false)
+    , mbXORMode(false)
     , mnLineColor(SALCOLOR_NONE)
     , mnFillColor(SALCOLOR_NONE)
 #ifdef DBG_UTIL
@@ -176,7 +177,7 @@ void OpenGLSalGraphicsImpl::DeInit()
     mpContext.clear();
 }
 
-void OpenGLSalGraphicsImpl::PreDraw()
+void OpenGLSalGraphicsImpl::PreDraw(XOROption eOpt)
 {
     OpenGLZone::enter();
 
@@ -196,13 +197,27 @@ void OpenGLSalGraphicsImpl::PreDraw()
 
     glViewport( 0, 0, GetWidth(), GetHeight() );
     CHECK_GL_ERROR();
-    ImplInitClipRegion();
 
+    ImplInitClipRegion();
     CHECK_GL_ERROR();
+
+    if (eOpt == IMPLEMENT_XOR && mbXORMode)
+    {
+        glEnable(GL_COLOR_LOGIC_OP);
+        CHECK_GL_ERROR();
+
+        glLogicOp(GL_XOR);
+    }
 }
 
 void OpenGLSalGraphicsImpl::PostDraw()
 {
+    if (mbXORMode)
+    {
+        glDisable(GL_COLOR_LOGIC_OP);
+        CHECK_GL_ERROR();
+    }
+
     if( mbUseScissor )
     {
         glDisable( GL_SCISSOR_TEST );
@@ -404,8 +419,9 @@ void OpenGLSalGraphicsImpl::SetFillColor( SalColor nSalColor )
 }
 
 // enable/disable XOR drawing
-void OpenGLSalGraphicsImpl::SetXORMode( bool /*bSet*/, bool /*bInvertOnly*/ )
+void OpenGLSalGraphicsImpl::SetXORMode( bool bSet, bool )
 {
+    mbXORMode = bSet;
 }
 
 // set line color for raster operations
@@ -503,6 +519,7 @@ bool OpenGLSalGraphicsImpl::UseSolid( SalColor nColor, sal_uInt8 nTransparency )
 #endif
     mProgramSolidColor = nColor;
     mProgramSolidTransparency = nTransparency / 100.0;
+
     return true;
 }
 
@@ -1331,7 +1348,7 @@ void OpenGLSalGraphicsImpl::drawPixel( long nX, long nY )
     VCL_GL_INFO( "::drawPixel" );
     if( mnLineColor != SALCOLOR_NONE )
     {
-        PreDraw();
+        PreDraw( XOROption::IMPLEMENT_XOR );
         if( UseSolid( mnLineColor ) )
             DrawPoint( nX, nY );
         PostDraw();
@@ -1343,7 +1360,7 @@ void OpenGLSalGraphicsImpl::drawPixel( long nX, long nY, SalColor nSalColor )
     VCL_GL_INFO( "::drawPixel" );
     if( nSalColor != SALCOLOR_NONE )
     {
-        PreDraw();
+        PreDraw( XOROption::IMPLEMENT_XOR );
         if( UseSolid( nSalColor ) )
             DrawPoint( nX, nY );
         PostDraw();
@@ -1355,7 +1372,7 @@ void OpenGLSalGraphicsImpl::drawLine( long nX1, long nY1, long nX2, long nY2 )
     VCL_GL_INFO( "::drawLine" );
     if( mnLineColor != SALCOLOR_NONE )
     {
-        PreDraw();
+        PreDraw( XOROption::IMPLEMENT_XOR );
         if( UseSolidAA( mnLineColor ) )
             DrawLineAA( nX1, nY1, nX2, nY2 );
         PostDraw();
@@ -1365,7 +1382,7 @@ void OpenGLSalGraphicsImpl::drawLine( long nX1, long nY1, long nX2, long nY2 )
 void OpenGLSalGraphicsImpl::drawRect( long nX, long nY, long nWidth, long nHeight )
 {
     VCL_GL_INFO( "::drawRect" );
-    PreDraw();
+    PreDraw( XOROption::IMPLEMENT_XOR );
 
     if( UseSolid( mnFillColor ) )
         DrawRect( nX, nY, nWidth, nHeight );
@@ -1403,7 +1420,7 @@ void OpenGLSalGraphicsImpl::drawPolyLine( sal_uInt32 nPoints, const SalPoint* pP
 
     if( mnLineColor != SALCOLOR_NONE && nPoints > 1 )
     {
-        PreDraw();
+        PreDraw( XOROption::IMPLEMENT_XOR );
         if( UseSolidAA( mnLineColor ) )
             DrawLinesAA( nPoints, pPtAry, false );
         PostDraw();
@@ -1427,7 +1444,7 @@ void OpenGLSalGraphicsImpl::drawPolygon( sal_uInt32 nPoints, const SalPoint* pPt
         return;
     }
 
-    PreDraw();
+    PreDraw( XOROption::IMPLEMENT_XOR );
 
     if( UseSolid( mnFillColor ) )
         DrawPolygon( nPoints, pPtAry );
@@ -1444,7 +1461,7 @@ void OpenGLSalGraphicsImpl::drawPolyPolygon( sal_uInt32 nPoly, const sal_uInt32*
     if( nPoly <= 0 )
         return;
 
-    PreDraw();
+    PreDraw( XOROption::IMPLEMENT_XOR );
 
     if( UseSolid( mnFillColor ) )
     {
@@ -1481,7 +1498,7 @@ bool OpenGLSalGraphicsImpl::drawPolyPolygon( const basegfx::B2DPolyPolygon& rPol
     if( rPolyPolygon.count() <= 0 )
         return true;
 
-    PreDraw();
+    PreDraw( XOROption::IMPLEMENT_XOR );
 
     if( UseSolid( mnFillColor, fTransparency ) )
         DrawPolyPolygon( rPolyPolygon );
@@ -1555,7 +1572,7 @@ bool OpenGLSalGraphicsImpl::drawPolyLine(
         aPolygon.transform(basegfx::tools::createScaleB2DHomMatrix(1.0, rLineWidth.getY() / rLineWidth.getX()));
     }
 
-    PreDraw();
+    PreDraw( XOROption::IMPLEMENT_XOR );
     if( UseSolid( mnLineColor, fTransparency ) )
     {
         for( sal_uInt32 i = 0; i < aAreaPolyPoly.count(); i++ )
@@ -1722,7 +1739,7 @@ SalColor OpenGLSalGraphicsImpl::getPixel( long nX, long nY )
 {
     char pixel[3] = { 0, 0, 0 };
 
-    PreDraw();
+    PreDraw( XOROption::IMPLEMENT_XOR );
     nY = GetHeight() - nY - 1;
     glReadPixels( nX, nY, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixel);
     CHECK_GL_ERROR();
@@ -1920,7 +1937,7 @@ bool OpenGLSalGraphicsImpl::drawGradient(const tools::PolyPolygon& rPolyPoly,
     aBoundRect.Right()++;
     aBoundRect.Bottom()++;
 
-    PreDraw();
+    PreDraw( XOROption::IMPLEMENT_XOR );
 
 #define FIXME_BROKEN_STENCIL_FOR_GRADIENTS 0
 #if FIXME_BROKEN_STENCIL_FOR_GRADIENTS
diff --git a/vcl/workben/vcldemo.cxx b/vcl/workben/vcldemo.cxx
index 20a28ab..40a37fd 100644
--- a/vcl/workben/vcldemo.cxx
+++ b/vcl/workben/vcldemo.cxx
@@ -1014,7 +1014,9 @@ public:
                 "cmd/lc_marks.png",
                 "cmd/lc_fieldnames.png",
                 "cmd/lc_hyperlinkdialog.png",
-              };
+                "cmd/lc_basicshapes.rectangle.png",
+                "cmd/lc_basicshapes.round-rectangle.png"
+            };
             for (size_t i = 0; i < SAL_N_ELEMENTS(pNames); i++)
             {
                 maIconNames.push_back(OUString::createFromAscii(pNames[i]));
commit 2a5afa8394d4ef928c56c0b62e76984b1b87e8c8
Author: Michael Meeks <michael.meeks at collabora.com>
Date:   Fri Jan 8 20:32:32 2016 +0000

    tdf#96919 - vcldemo - implement XOR rendering test.
    
    Change-Id: Iecd8d1d1fafc9d80b40ab2069248678697dddb6c
    Reviewed-on: https://gerrit.libreoffice.org/21274
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Michael Meeks <michael.meeks at collabora.com>

diff --git a/vcl/workben/vcldemo.cxx b/vcl/workben/vcldemo.cxx
index 4175135..20a28ab 100644
--- a/vcl/workben/vcldemo.cxx
+++ b/vcl/workben/vcldemo.cxx
@@ -903,7 +903,7 @@ public:
         };
 
         static void SizeAndRender(OutputDevice &rDev, const Rectangle& r, RenderType eType,
-                           const RenderContext &rCtx)
+                                  const RenderContext &rCtx)
         {
             ScopedVclPtr<VirtualDevice> pNested;
 
@@ -958,6 +958,29 @@ public:
         }
     };
 
+    struct DrawXOR : public RegionRenderer
+    {
+        RENDER_DETAILS(xor,KEY_X,1)
+
+        virtual void RenderRegion(OutputDevice &rDev, Rectangle r,
+                                  const RenderContext &rCtx) override
+        {
+            // avoid infinite recursion
+            if (rCtx.mbVDev)
+                return;
+
+            rDev.Push();
+
+            AntialiasingFlags nFlags = rDev.GetAntialiasing();
+            rDev.SetAntialiasing(nFlags & ~AntialiasingFlags::EnableB2dDraw);
+            rDev.SetRasterOp( ROP_XOR );
+
+            rCtx.mpDemoRenderer->drawThumbs(rDev, r, true);
+
+            rDev.Pop();
+        }
+    };
+
     struct DrawIcons : public RegionRenderer
     {
         RENDER_DETAILS(icons,KEY_I,1)
@@ -1207,10 +1230,44 @@ public:
         }
     };
 
+    void drawThumbs(vcl::RenderContext& rDev, Rectangle aRect, bool bVDev)
+    {
+        RenderContext aCtx;
+        aCtx.meStyle = RENDER_THUMB;
+        aCtx.mbVDev = bVDev;
+        aCtx.mpDemoRenderer = this;
+        aCtx.maSize = aRect.GetSize();
+        std::vector<Rectangle> aRegions(partition(aRect, mnSegmentsX, mnSegmentsY));
+        DemoRenderer::clearRects(rDev, aRegions);
+        for (size_t i = 0; i < maRenderers.size(); i++)
+        {
+            RegionRenderer * r = maRenderers[i];
+
+            rDev.SetClipRegion( vcl::Region( aRegions[i] ) );
+
+            // profiling?
+            if (getIterCount() > 0)
+            {
+                if (!bVDev)
+                {
+                    double nStartTime = getTimeNow();
+                    for (int j = 0; j < r->getTestRepeatCount() * THUMB_REPEAT_FACTOR; j++)
+                        r->RenderRegion(rDev, aRegions[i], aCtx);
+                    addTime(i, (getTimeNow() - nStartTime) / THUMB_REPEAT_FACTOR);
+                } else
+                    for (int j = 0; j < r->getTestRepeatCount(); j++)
+                        r->RenderRegion(rDev, aRegions[i], aCtx);
+            }
+            else
+                r->RenderRegion(rDev, aRegions[i], aCtx);
+
+            rDev.SetClipRegion();
+        }
+    }
+
     void drawToDevice(vcl::RenderContext& rDev, Size aSize, bool bVDev)
     {
         RenderContext aCtx;
-        double mnStartTime;
         aCtx.mbVDev = bVDev;
         aCtx.mpDemoRenderer = this;
         aCtx.maSize = aSize;
@@ -1226,45 +1283,15 @@ public:
             // profiling?
             if (getIterCount() > 0)
             {
-                mnStartTime = getTimeNow();
+                double nStartTime = getTimeNow();
                 for (int i = 0; i < r->getTestRepeatCount(); i++)
                     r->RenderRegion(rDev, aWholeWin, aCtx);
-                addTime(mnSelectedRenderer, getTimeNow() - mnStartTime);
+                addTime(mnSelectedRenderer, getTimeNow() - nStartTime);
             } else
                 r->RenderRegion(rDev, aWholeWin, aCtx);
         }
         else
-        {
-            aCtx.meStyle = RENDER_THUMB;
-            std::vector<Rectangle> aRegions(partition(aSize, mnSegmentsX, mnSegmentsY));
-            DemoRenderer::clearRects(rDev, aRegions);
-            for (size_t i = 0; i < maRenderers.size(); i++)
-            {
-                RegionRenderer * r = maRenderers[i];
-
-                rDev.SetClipRegion( vcl::Region( aRegions[i] ) );
-
-                // profiling?
-                if (getIterCount() > 0)
-                {
-                    if (!bVDev)
-                    {
-                        mnStartTime = getTimeNow();
-                        for (int j = 0; j < r->getTestRepeatCount() * THUMB_REPEAT_FACTOR; j++)
-                            r->RenderRegion(rDev, aRegions[i], aCtx);
-                        addTime(i, (getTimeNow() - mnStartTime) / THUMB_REPEAT_FACTOR);
-                    } else
-                        for (int j = 0; j < r->getTestRepeatCount(); j++)
-                            r->RenderRegion(rDev, aRegions[i], aCtx);
-                }
-                else
-                {
-                    r->RenderRegion(rDev, aRegions[i], aCtx);
-                }
-
-                rDev.SetClipRegion();
-            }
-        }
+            drawThumbs(rDev, aWholeWin, bVDev);
     }
     std::vector<VclPtr<vcl::Window> > maInvalidates;
     void addInvalidate(vcl::Window *pWindow) { maInvalidates.push_back(pWindow); };
@@ -1399,6 +1426,7 @@ void DemoRenderer::InitRenderers()
     maRenderers.push_back(new DrawPolyPolygons());
     maRenderers.push_back(new DrawClipped());
     maRenderers.push_back(new DrawToVirtualDevice());
+    maRenderers.push_back(new DrawXOR());
     maRenderers.push_back(new DrawIcons());
     maRenderers.push_back(new FetchDrawBitmap());
 }


More information about the Libreoffice-commits mailing list