QskGradientDirection::contais added

This commit is contained in:
Uwe Rathmann 2023-01-23 10:59:34 +01:00
parent fff0389262
commit ad09186229
3 changed files with 67 additions and 2 deletions

View File

@ -4,6 +4,7 @@
*****************************************************************************/
#include "QskGradientDirection.h"
#include <qrect.h>
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

View File

@ -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;

View File

@ -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
*/