From 1b85d3053eb97046f56c12fc902c58cbc16a92ba Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Wed, 4 Jan 2023 16:15:22 +0100 Subject: [PATCH] QskBoxRenderer fixes --- src/nodes/QskBoxRenderer.cpp | 37 +++++++++++++++++------- src/nodes/QskBoxRenderer.h | 56 +++++------------------------------- 2 files changed, 34 insertions(+), 59 deletions(-) diff --git a/src/nodes/QskBoxRenderer.cpp b/src/nodes/QskBoxRenderer.cpp index 355d4f44..aeb243b0 100644 --- a/src/nodes/QskBoxRenderer.cpp +++ b/src/nodes/QskBoxRenderer.cpp @@ -74,25 +74,42 @@ bool QskBoxRenderer::isGradientSupported( // rectangles are fully supported return true; } + + const auto dir = gradient.linearDirection(); + + if ( dir.isTilted() ) + { + return ( dir.x1() == 0.0 && dir.x2() == 0.0 ) + && ( dir.y1() == 1.0 && dir.y2() == 1.0 ); + } else { - /* - For rounded rectangles we currently support - only the most common use cases. TODO ... - */ + // different radii at oppsoite corners are not implemented TODO ... - const auto dir = gradient.linearDirection(); - if ( dir.isTilted() ) + const auto r1 = shape.radius( Qt::TopLeftCorner ); + const auto r2 = shape.radius( Qt::TopRightCorner ); + const auto r3 = shape.radius( Qt::BottomLeftCorner ); + const auto r4 = shape.radius( Qt::BottomRightCorner ); + + if ( dir.isHorizontal() ) { - return ( dir.x1() == 0.0 && dir.x2() == 0.0 ) - && ( dir.y1() == 1.0 && dir.y2() == 1.0 ); + if ( dir.x1() == 0.0 && dir.x2() == 1.0 ) + { + return ( r1.width() == r3.width() ) + && ( r2.width() == r4.width() ); + } } else { - return ( dir.x1() == 0.0 && dir.x2() == 1.0 ) - || ( dir.y1() == 0.0 && dir.y2() == 1.0 ); + if ( dir.y1() == 0.0 && dir.y2() == 1.0 ) + { + return ( r1.height() == r2.height() ) + && ( r3.height() == r4.height() ); + } } } + + return false; } default: diff --git a/src/nodes/QskBoxRenderer.h b/src/nodes/QskBoxRenderer.h index d626aadd..f8dd3c1a 100644 --- a/src/nodes/QskBoxRenderer.h +++ b/src/nodes/QskBoxRenderer.h @@ -6,7 +6,7 @@ #ifndef QSK_BOX_RENDERER_H #define QSK_BOX_RENDERER_H -#include "QskVertex.h" +#include "QskGlobal.h" class QskBoxBorderMetrics; class QskBoxBorderColors; @@ -16,61 +16,19 @@ class QskGradient; class QSGGeometry; class QRectF; -class QSK_EXPORT QskBoxRenderer +namespace QskBoxRenderer { - public: - static void renderBorder( const QRectF&, + QSK_EXPORT void renderBorder( const QRectF&, const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, QSGGeometry& ); - static void renderFill( const QRectF&, + QSK_EXPORT void renderFill( const QRectF&, const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, QSGGeometry& ); - static void renderBox( const QRectF&, + QSK_EXPORT void renderBox( const QRectF&, const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, const QskBoxBorderColors&, const QskGradient&, QSGGeometry& ); - static bool isGradientSupported( const QskBoxShapeMetrics&, const QskGradient& ); - - class Metrics - { - public: - Metrics( const QRectF&, const QskBoxShapeMetrics&, const QskBoxBorderMetrics& ); - - QskVertex::Quad outerQuad; - QskVertex::Quad innerQuad; -#if 1 - QskVertex::Quad centerQuad; // to be removed -#endif - - struct Corner - { - bool isCropped; - qreal centerX, centerY; - qreal radiusX, radiusY; - qreal radiusInnerX, radiusInnerY; - - int stepCount; - - } corner[ 4 ]; - - bool isBorderRegular; - bool isRadiusRegular; - bool isTotallyCropped; - }; - - private: - static void renderRectellipseFill( const QRectF&, - const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, QSGGeometry& ); - - static void renderRectellipseBorder( const QRectF&, - const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, QSGGeometry& ); - - static void renderRectellipse( const QRectF&, - const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, - const QskBoxBorderColors&, const QskGradient&, QSGGeometry& ); - - static void renderDiagonalFill( const Metrics&, const QskGradient&, - int lineCount, QskVertex::ColoredLine* ); -}; + QSK_EXPORT bool isGradientSupported( const QskBoxShapeMetrics&, const QskGradient& ); +} #endif