From 54c397d937c8a475052e54cbd6e4ebc835fb1c18 Mon Sep 17 00:00:00 2001 From: Hugo Pereira Da Costa Date: Sat, 21 Nov 2015 19:19:49 +0100 Subject: [PATCH 1/6] Properly mask out the inner part of the shadows (that overlaps with e.g. menus), to prevent artifacts when translucency is enabled. BUG: 355695 --- kstyle/breezehelper.h | 8 ++++---- kstyle/breezeshadowhelper.cpp | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/kstyle/breezehelper.h b/kstyle/breezehelper.h index 9640965b..cdc224bd 100644 --- a/kstyle/breezehelper.h +++ b/kstyle/breezehelper.h @@ -314,15 +314,15 @@ namespace Breeze //@} + //* frame radius + qreal frameRadius( qreal bias = 0 ) const + { return qMax( qreal( Metrics::Frame_FrameRadius ) - 0.5 + bias, 0.0 ); } + protected: //* initialize void init( void ); - //* frame radius - qreal frameRadius( qreal bias = 0 ) const - { return qMax( qreal( Metrics::Frame_FrameRadius ) - 0.5 + bias, 0.0 ); } - //* return rectangle for widgets shadow, offset depending on light source QRectF shadowRect( const QRectF& ) const; diff --git a/kstyle/breezeshadowhelper.cpp b/kstyle/breezeshadowhelper.cpp index 2fa1d01b..138581fa 100644 --- a/kstyle/breezeshadowhelper.cpp +++ b/kstyle/breezeshadowhelper.cpp @@ -153,6 +153,8 @@ namespace Breeze // metrics const int shadowSize = StyleConfigData::shadowSize()*12/16; + const int shadowOffset = qMax( shadowSize/2, Metrics::Shadow_Overlap*2 ); + // const int size( shadowSize - Metrics::Shadow_Overlap ); const int shadowStrength = StyleConfigData::shadowStrength(); // pixmap @@ -181,8 +183,21 @@ namespace Breeze // fill QPainter p(&pixmap); + p.setRenderHint( QPainter::Antialiasing, true ); p.setCompositionMode(QPainter::CompositionMode_Source); p.fillRect( pixmap.rect(), radialGradient); + + p.setPen( Qt::NoPen ); + p.setBrush( Qt::black ); + + QRectF innerRect( + shadowSize - shadowOffset - Metrics::Shadow_Overlap, shadowSize - shadowOffset - Metrics::Shadow_Overlap, + shadowOffset + 2*Metrics::Shadow_Overlap,shadowOffset + 2*Metrics::Shadow_Overlap ); + + p.setCompositionMode(QPainter::CompositionMode_DestinationOut ); + + const qreal radius( _helper.frameRadius() ); + p.drawRoundedRect( innerRect, radius, radius ); p.end(); // create tiles from pixmap From 2fdd1423bc29634e8920fb1479f5144ed2d3db31 Mon Sep 17 00:00:00 2001 From: Hugo Pereira Da Costa Date: Sun, 22 Nov 2015 15:24:18 +0100 Subject: [PATCH 2/6] Use similar code for rendering the decoration shadow and menu shadows. Fixes tile and stretch issues. BUG: 355647 --- kdecoration/breezedecoration.cpp | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/kdecoration/breezedecoration.cpp b/kdecoration/breezedecoration.cpp index 5beb30eb..b38f9b77 100644 --- a/kdecoration/breezedecoration.cpp +++ b/kdecoration/breezedecoration.cpp @@ -636,30 +636,28 @@ namespace Breeze // fill QPainter painter(&image); + painter.setRenderHint( QPainter::Antialiasing, true ); painter.setCompositionMode(QPainter::CompositionMode_Source); painter.fillRect( image.rect(), radialGradient); - // contrast pixel - painter.setBrush( Qt::NoBrush ); + QRectF innerRect = QRectF( + g_shadowSize - shadowOffset - Metrics::Shadow_Overlap, g_shadowSize - shadowOffset - Metrics::Shadow_Overlap, + shadowOffset + 2*Metrics::Shadow_Overlap,shadowOffset + 2*Metrics::Shadow_Overlap ) + .adjusted( -0.5, -0.5, 0.5, 0.5 ); + painter.setPen( gradientStopColor( g_shadowColor, g_shadowStrength ) ); - painter.setRenderHints(QPainter::Antialiasing ); - painter.drawRoundedRect( QRect( g_shadowSize-shadowOffset, g_shadowSize-shadowOffset, shadowOffset, shadowOffset ), 3, 3 ); + painter.setBrush( Qt::NoBrush ); + painter.drawRoundedRect( innerRect, 2.5, 2.5 ); painter.end(); - g_sShadow = QSharedPointer::create(); g_sShadow->setPadding( QMargins( - g_shadowSize-shadowOffset, - g_shadowSize-shadowOffset, - g_shadowSize, - g_shadowSize ) ); - - g_sShadow->setInnerShadowRect(QRect( - g_shadowSize-shadowOffset+Metrics::Shadow_Overlap, - g_shadowSize-shadowOffset+Metrics::Shadow_Overlap, - shadowOffset - 2*Metrics::Shadow_Overlap, - shadowOffset - 2*Metrics::Shadow_Overlap ) ); + g_shadowSize - shadowOffset - Metrics::Shadow_Overlap, + g_shadowSize - shadowOffset - Metrics::Shadow_Overlap, + g_shadowSize - Metrics::Shadow_Overlap, + g_shadowSize - Metrics::Shadow_Overlap ) ); + g_sShadow->setInnerShadowRect(QRect( g_shadowSize, g_shadowSize, 1, 1) ); // assign image g_sShadow->setShadow(image); From d9369b5e4276b60f35ef8c033ca247a6843d0f93 Mon Sep 17 00:00:00 2001 From: Hugo Pereira Da Costa Date: Sun, 22 Nov 2015 15:52:56 +0100 Subject: [PATCH 3/6] Takeout inner part of the shadow to avoid artifacts for semi-transparent windows, and adjust metrics. --- kdecoration/breeze.h | 2 +- kdecoration/breezedecoration.cpp | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/kdecoration/breeze.h b/kdecoration/breeze.h index 645331ec..24f4bd4b 100644 --- a/kdecoration/breeze.h +++ b/kdecoration/breeze.h @@ -47,7 +47,7 @@ namespace Breeze TitleBar_ButtonSpacing = 2, // shadow dimensions (pixels) - Shadow_Overlap = 2, + Shadow_Overlap = 3, }; diff --git a/kdecoration/breezedecoration.cpp b/kdecoration/breezedecoration.cpp index b38f9b77..156c92ac 100644 --- a/kdecoration/breezedecoration.cpp +++ b/kdecoration/breezedecoration.cpp @@ -640,14 +640,21 @@ namespace Breeze painter.setCompositionMode(QPainter::CompositionMode_Source); painter.fillRect( image.rect(), radialGradient); + // contrast pixel QRectF innerRect = QRectF( g_shadowSize - shadowOffset - Metrics::Shadow_Overlap, g_shadowSize - shadowOffset - Metrics::Shadow_Overlap, - shadowOffset + 2*Metrics::Shadow_Overlap,shadowOffset + 2*Metrics::Shadow_Overlap ) - .adjusted( -0.5, -0.5, 0.5, 0.5 ); + shadowOffset + 2*Metrics::Shadow_Overlap,shadowOffset + 2*Metrics::Shadow_Overlap ); painter.setPen( gradientStopColor( g_shadowColor, g_shadowStrength ) ); painter.setBrush( Qt::NoBrush ); painter.drawRoundedRect( innerRect, 2.5, 2.5 ); + + // mask out inner rect + painter.setPen( Qt::NoPen ); + painter.setBrush( Qt::black ); + painter.setCompositionMode(QPainter::CompositionMode_DestinationOut ); + painter.drawRoundedRect( innerRect, 2.5, 2.5 ); + painter.end(); g_sShadow = QSharedPointer::create(); From 509388e007f255fffcd1222c39956bf41f5d64e6 Mon Sep 17 00:00:00 2001 From: Hugo Pereira Da Costa Date: Sun, 22 Nov 2015 16:08:41 +0100 Subject: [PATCH 4/6] reduce strength of the contrast pixel --- kdecoration/breezedecoration.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kdecoration/breezedecoration.cpp b/kdecoration/breezedecoration.cpp index 156c92ac..3243ee61 100644 --- a/kdecoration/breezedecoration.cpp +++ b/kdecoration/breezedecoration.cpp @@ -645,7 +645,7 @@ namespace Breeze g_shadowSize - shadowOffset - Metrics::Shadow_Overlap, g_shadowSize - shadowOffset - Metrics::Shadow_Overlap, shadowOffset + 2*Metrics::Shadow_Overlap,shadowOffset + 2*Metrics::Shadow_Overlap ); - painter.setPen( gradientStopColor( g_shadowColor, g_shadowStrength ) ); + painter.setPen( gradientStopColor( g_shadowColor, g_shadowStrength*0.5 ) ); painter.setBrush( Qt::NoBrush ); painter.drawRoundedRect( innerRect, 2.5, 2.5 ); From a80434f6777eb92d659245c7ea691988c2c8f489 Mon Sep 17 00:00:00 2001 From: Hugo Pereira Da Costa Date: Sun, 22 Nov 2015 16:30:50 +0100 Subject: [PATCH 5/6] removed incorrect composition mode --- kdecoration/breezedecoration.cpp | 1 - kstyle/breezeshadowhelper.cpp | 2 -- 2 files changed, 3 deletions(-) diff --git a/kdecoration/breezedecoration.cpp b/kdecoration/breezedecoration.cpp index 3243ee61..c12b39fb 100644 --- a/kdecoration/breezedecoration.cpp +++ b/kdecoration/breezedecoration.cpp @@ -637,7 +637,6 @@ namespace Breeze // fill QPainter painter(&image); painter.setRenderHint( QPainter::Antialiasing, true ); - painter.setCompositionMode(QPainter::CompositionMode_Source); painter.fillRect( image.rect(), radialGradient); // contrast pixel diff --git a/kstyle/breezeshadowhelper.cpp b/kstyle/breezeshadowhelper.cpp index 138581fa..6318185f 100644 --- a/kstyle/breezeshadowhelper.cpp +++ b/kstyle/breezeshadowhelper.cpp @@ -154,7 +154,6 @@ namespace Breeze // metrics const int shadowSize = StyleConfigData::shadowSize()*12/16; const int shadowOffset = qMax( shadowSize/2, Metrics::Shadow_Overlap*2 ); - // const int size( shadowSize - Metrics::Shadow_Overlap ); const int shadowStrength = StyleConfigData::shadowStrength(); // pixmap @@ -184,7 +183,6 @@ namespace Breeze // fill QPainter p(&pixmap); p.setRenderHint( QPainter::Antialiasing, true ); - p.setCompositionMode(QPainter::CompositionMode_Source); p.fillRect( pixmap.rect(), radialGradient); p.setPen( Qt::NoPen ); From 41d01b47c67a46b247da6a7532f15624a34e6351 Mon Sep 17 00:00:00 2001 From: Hugo Pereira Da Costa Date: Mon, 23 Nov 2015 08:47:39 +0100 Subject: [PATCH 6/6] Increased radius for mask. --- kdecoration/breezedecoration.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kdecoration/breezedecoration.cpp b/kdecoration/breezedecoration.cpp index c12b39fb..e23aa767 100644 --- a/kdecoration/breezedecoration.cpp +++ b/kdecoration/breezedecoration.cpp @@ -652,7 +652,7 @@ namespace Breeze painter.setPen( Qt::NoPen ); painter.setBrush( Qt::black ); painter.setCompositionMode(QPainter::CompositionMode_DestinationOut ); - painter.drawRoundedRect( innerRect, 2.5, 2.5 ); + painter.drawRoundedRect( innerRect, 3.0, 3.0 ); painter.end();