From ad091862295fc532d69ea8216b2149b81653a80f Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Mon, 23 Jan 2023 10:59:34 +0100 Subject: [PATCH] QskGradientDirection::contais added --- src/common/QskGradientDirection.cpp | 61 +++++++++++++++++++++++++++++ src/common/QskGradientDirection.h | 2 + src/nodes/QskBoxNode.cpp | 6 ++- 3 files changed, 67 insertions(+), 2 deletions(-) diff --git a/src/common/QskGradientDirection.cpp b/src/common/QskGradientDirection.cpp index cab879c4..82434d5c 100644 --- a/src/common/QskGradientDirection.cpp +++ b/src/common/QskGradientDirection.cpp @@ -4,6 +4,7 @@ *****************************************************************************/ #include "QskGradientDirection.h" +#include static void qskRegisterGradientDirection() { @@ -115,6 +116,66 @@ void QskLinearDirection::setInterval( Qt::Orientation orientation, qreal from, q } } +static inline bool qskIntersectsTop( + qreal vx, qreal vy, qreal m, const QRectF& rect ) +{ + const auto cx = vx - ( vy - rect.top() ) / m; + return cx > rect.left() && cx < rect.right(); +} + +static inline bool qskIntersectsBottom( + qreal vx, qreal vy, qreal m, const QRectF& rect ) +{ + const auto cx = vx - ( vy - rect.bottom() ) / m; + return cx > rect.left() && cx < rect.right(); +} + +static inline bool qskIntersectsLeft( + qreal vx, qreal vy, qreal m, const QRectF& rect ) +{ + const qreal cy = vy - ( vx - rect.left() ) * m; + return ( cy > rect.top() && cy < rect.bottom() ); +} + +static inline bool qskIntersectsRight( + qreal vx, qreal vy, qreal m, const QRectF& rect ) +{ + const qreal cy = vy - ( vx - rect.right() ) * m; + return ( cy > rect.top() && cy < rect.bottom() ); +} + +bool QskLinearDirection::contains( const QRectF& rect ) const +{ + if ( m_y1 == m_y2 ) + { + return ( m_x1 <= rect.left() && m_x2 >= rect.right() ) + || ( m_x1 >= rect.right() && m_x2 <= rect.left() ); + } + + + if ( m_x1 == m_x2 ) + { + return ( m_y1 <= rect.top() && m_y2 >= rect.bottom() ) + || ( m_y1 >= rect.bottom() && m_y2 <= rect.top() ); + } + + // are the normal vectors intersecting ? + + const auto m = ( m_x2 - m_x1 ) / ( m_y1 - m_y2 ); // slope of the normal vectors + + const bool intersecting = + qskIntersectsLeft( m_x1, m_y1, m, rect ) || + qskIntersectsRight( m_x1, m_y1, m, rect ) || + qskIntersectsTop( m_x1, m_y1, m, rect ) || + qskIntersectsBottom( m_x1, m_y1, m, rect ) || + qskIntersectsLeft( m_x2, m_y2, m, rect ) || + qskIntersectsRight( m_x2, m_y2, m, rect ) || + qskIntersectsTop( m_x2, m_y2, m, rect ) || + qskIntersectsBottom( m_x2, m_y2, m, rect ); + + return !intersecting; +} + // -- QskConicDirection void QskConicDirection::setCenter( const QPointF& center ) noexcept diff --git a/src/common/QskGradientDirection.h b/src/common/QskGradientDirection.h index ff89b4bd..78e9408b 100644 --- a/src/common/QskGradientDirection.h +++ b/src/common/QskGradientDirection.h @@ -68,6 +68,8 @@ class QSK_EXPORT QskLinearDirection constexpr qreal y2() const noexcept; void setY2( qreal ) noexcept; + bool contains( const QRectF& ) const; + private: qreal m_x1 = 0.0; qreal m_y1 = 0.0; diff --git a/src/nodes/QskBoxNode.cpp b/src/nodes/QskBoxNode.cpp index 66cc4fa4..d2caccc1 100644 --- a/src/nodes/QskBoxNode.cpp +++ b/src/nodes/QskBoxNode.cpp @@ -78,8 +78,10 @@ void QskBoxNode::updateNode( const QRectF& rect, } /* - QskBoxRectangleNode supports vertical/horizontal/diagonal gradients only. - If our gradient doesn't fall into this category we use a QskBoxFillNode. + QskBoxRectangleNode supports vertical/horizontal and many tilted + linear gradients. If our gradient doesn't fall into this category + we use a QskBoxFillNode. + However the border is always done with a QskBoxRectangleNode */