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.me...@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 <c...@libreoffice.org> Reviewed-by: Michael Meeks <michael.me...@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.me...@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 <c...@libreoffice.org> Reviewed-by: Michael Meeks <michael.me...@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()); } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits