2022-10-07 14:36:14 +02:00
|
|
|
/******************************************************************************
|
|
|
|
* QSkinny - Copyright (C) 2016 Uwe Rathmann
|
|
|
|
* This file may be used under the terms of the 3-clause BSD License
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
/*
|
|
|
|
These definitions will be somehow adjusted and merged with QskGradient
|
|
|
|
and moved to the lib then.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <QskControl.h>
|
|
|
|
#include <QskGradientStop.h>
|
|
|
|
#include <qbrush.h>
|
|
|
|
#include <qpoint.h>
|
|
|
|
|
|
|
|
class LinearGradient;
|
|
|
|
class RadialGradient;
|
|
|
|
class ConicGradient;
|
|
|
|
|
|
|
|
class Gradient
|
|
|
|
{
|
|
|
|
public:
|
2022-10-07 16:17:52 +02:00
|
|
|
Gradient() noexcept = default;
|
|
|
|
Gradient( const Gradient& ) noexcept;
|
|
|
|
|
|
|
|
Gradient& operator=( const Gradient& ) noexcept;
|
2022-10-07 14:36:14 +02:00
|
|
|
|
|
|
|
bool operator==( const Gradient& ) const noexcept;
|
|
|
|
bool operator!=( const Gradient& ) const noexcept;
|
|
|
|
|
2022-10-07 19:01:07 +02:00
|
|
|
QGradient::Type type() const noexcept;
|
2022-10-07 14:36:14 +02:00
|
|
|
|
2022-10-07 19:01:07 +02:00
|
|
|
bool isValid() const noexcept;
|
2022-10-07 14:36:14 +02:00
|
|
|
|
|
|
|
bool isMonochrome() const;
|
|
|
|
bool isVisible() const;
|
|
|
|
|
2022-10-13 19:39:57 +02:00
|
|
|
void setStops( const QskGradientStops& );
|
|
|
|
const QskGradientStops& stops() const noexcept;
|
2022-10-07 14:36:14 +02:00
|
|
|
|
|
|
|
void setStops( QGradient::Preset );
|
|
|
|
void setStops( const QGradientStops& );
|
|
|
|
void setStops( const QColor&, const QColor& );
|
|
|
|
QGradientStops qtStops() const;
|
|
|
|
|
|
|
|
void setSpread( QGradient::Spread );
|
2022-10-07 19:01:07 +02:00
|
|
|
QGradient::Spread spread() const noexcept;
|
2022-10-07 14:36:14 +02:00
|
|
|
|
|
|
|
LinearGradient& asLinearGradient();
|
|
|
|
const LinearGradient& asLinearGradient() const;
|
|
|
|
|
|
|
|
RadialGradient& asRadialGradient();
|
|
|
|
const RadialGradient& asRadialGradient() const;
|
|
|
|
|
|
|
|
ConicGradient& asConicGradient();
|
|
|
|
const ConicGradient& asConicGradient() const;
|
|
|
|
|
|
|
|
private:
|
|
|
|
friend class LinearGradient;
|
|
|
|
friend class RadialGradient;
|
|
|
|
friend class ConicGradient;
|
|
|
|
|
2022-10-07 16:17:52 +02:00
|
|
|
Gradient( QGradient::Type ) noexcept;
|
2022-10-13 19:39:57 +02:00
|
|
|
Gradient( QGradient::Type, qreal, qreal, qreal, qreal ) noexcept;
|
2022-10-07 14:36:14 +02:00
|
|
|
|
2022-10-13 19:39:57 +02:00
|
|
|
QskGradientStops m_stops;
|
2022-10-07 14:36:14 +02:00
|
|
|
|
|
|
|
/*
|
2022-10-13 19:39:57 +02:00
|
|
|
Linear: x1, y1, x2, y2
|
|
|
|
Radial: centerX, centerY, radius, n/a
|
|
|
|
Conic: centerX, centerY, startAngle, spanAngle
|
2022-10-07 14:36:14 +02:00
|
|
|
*/
|
2022-10-13 19:39:57 +02:00
|
|
|
qreal m_values[4] = {};
|
2022-10-07 14:36:14 +02:00
|
|
|
|
|
|
|
QGradient::Type m_type = QGradient::NoGradient;
|
|
|
|
QGradient::Spread m_spread = QGradient::PadSpread;
|
|
|
|
};
|
|
|
|
|
2022-10-13 19:39:57 +02:00
|
|
|
#ifndef QT_NO_DEBUG_STREAM
|
|
|
|
|
|
|
|
class QDebug;
|
|
|
|
QDebug operator<<( QDebug, const QskGradient& );
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2022-10-07 14:36:14 +02:00
|
|
|
class LinearGradient : public Gradient
|
|
|
|
{
|
|
|
|
public:
|
2022-10-07 16:17:52 +02:00
|
|
|
LinearGradient() noexcept;
|
|
|
|
LinearGradient( const QPointF&, const QPointF& ) noexcept;
|
|
|
|
LinearGradient( qreal x1, qreal y1, qreal x2, qreal y2 ) noexcept;
|
2022-10-07 14:36:14 +02:00
|
|
|
|
|
|
|
void setStart(const QPointF& start) noexcept;
|
|
|
|
void setStart( qreal x, qreal y ) noexcept;
|
|
|
|
|
|
|
|
void setStop(const QPointF& start) noexcept;
|
|
|
|
void setStop( qreal x, qreal y ) noexcept;
|
|
|
|
|
2022-10-07 19:01:07 +02:00
|
|
|
QPointF start() const noexcept;
|
|
|
|
QPointF stop() const noexcept;
|
2022-10-07 14:36:14 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
class RadialGradient : public Gradient
|
|
|
|
{
|
|
|
|
public:
|
2022-10-07 16:17:52 +02:00
|
|
|
RadialGradient() noexcept;
|
2022-10-07 14:36:14 +02:00
|
|
|
|
2022-10-07 16:17:52 +02:00
|
|
|
RadialGradient( const QPointF& center, qreal radius ) noexcept;
|
|
|
|
RadialGradient( qreal cx, qreal cy, qreal radius ) noexcept;
|
2022-10-07 14:36:14 +02:00
|
|
|
|
2022-10-07 19:01:07 +02:00
|
|
|
QPointF center() const noexcept;
|
2022-10-07 14:36:14 +02:00
|
|
|
void setCenter(const QPointF& center) noexcept;
|
|
|
|
void setCenter(qreal x, qreal y) noexcept;
|
|
|
|
|
2022-10-13 19:39:57 +02:00
|
|
|
qreal radius() const noexcept;
|
|
|
|
void setRadius( qreal radius ) noexcept;
|
2022-10-07 14:36:14 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
class ConicGradient : public Gradient
|
|
|
|
{
|
|
|
|
public:
|
2022-10-07 16:17:52 +02:00
|
|
|
ConicGradient() noexcept;
|
2022-10-13 19:39:57 +02:00
|
|
|
|
|
|
|
ConicGradient( const QPointF&,
|
|
|
|
qreal startAngle = 0.0, qreal spanAngle = 360.0 ) noexcept;
|
|
|
|
|
|
|
|
ConicGradient( qreal cx, qreal cy,
|
|
|
|
qreal startAngle = 0.0, qreal spanAngle = 360.0 ) noexcept;
|
2022-10-07 14:36:14 +02:00
|
|
|
|
2022-10-07 19:01:07 +02:00
|
|
|
QPointF center() const noexcept;
|
2022-10-07 14:36:14 +02:00
|
|
|
void setCenter(const QPointF& center) noexcept;
|
|
|
|
void setCenter(qreal x, qreal y) noexcept;
|
|
|
|
|
2022-10-13 19:39:57 +02:00
|
|
|
qreal startAngle() const noexcept;
|
|
|
|
void setStartAngle( qreal ) noexcept;
|
|
|
|
|
|
|
|
qreal spanAngle() const noexcept;
|
|
|
|
void setSpanAngle( qreal ) noexcept;
|
2022-10-07 14:36:14 +02:00
|
|
|
};
|
|
|
|
|
2022-10-07 16:17:52 +02:00
|
|
|
inline Gradient::Gradient( QGradient::Type type ) noexcept
|
2022-10-07 14:36:14 +02:00
|
|
|
: m_type( type )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2022-10-07 16:17:52 +02:00
|
|
|
inline Gradient::Gradient( QGradient::Type type,
|
2022-10-13 19:39:57 +02:00
|
|
|
qreal v1, qreal v2, qreal v3, qreal v4 ) noexcept
|
|
|
|
: m_values{ v1, v2, v3, v4 }
|
2022-10-07 14:36:14 +02:00
|
|
|
, m_type( type )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
inline bool Gradient::operator!=( const Gradient& other ) const noexcept
|
|
|
|
{
|
|
|
|
return !( *this == other );
|
|
|
|
}
|
|
|
|
|
2022-10-07 19:01:07 +02:00
|
|
|
inline QGradient::Type Gradient::type() const noexcept
|
2022-10-07 14:36:14 +02:00
|
|
|
{
|
|
|
|
return m_type;
|
|
|
|
}
|
|
|
|
|
2022-10-07 19:01:07 +02:00
|
|
|
inline bool Gradient::isValid() const noexcept
|
2022-10-07 14:36:14 +02:00
|
|
|
{
|
|
|
|
return m_type != QGradient::NoGradient;
|
|
|
|
}
|
|
|
|
|
2022-10-13 19:39:57 +02:00
|
|
|
inline const QskGradientStops& Gradient::stops() const noexcept
|
2022-10-07 14:36:14 +02:00
|
|
|
{
|
|
|
|
return m_stops;
|
|
|
|
}
|
|
|
|
|
2022-10-07 19:01:07 +02:00
|
|
|
inline QGradient::Spread Gradient::spread() const noexcept
|
2022-10-07 14:36:14 +02:00
|
|
|
{
|
|
|
|
return m_spread;
|
|
|
|
}
|
|
|
|
|
2022-10-07 16:17:52 +02:00
|
|
|
inline LinearGradient::LinearGradient() noexcept
|
2022-10-07 14:36:14 +02:00
|
|
|
: Gradient( QGradient::LinearGradient, 0.0, 0.0, 1.0, 1.0 )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2022-10-07 16:17:52 +02:00
|
|
|
inline LinearGradient::LinearGradient(
|
2022-10-07 14:36:14 +02:00
|
|
|
const QPointF& start, const QPointF& stop ) noexcept
|
|
|
|
: LinearGradient( start.x(), start.y(), stop.x(), stop.y() )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2022-10-07 16:17:52 +02:00
|
|
|
inline LinearGradient::LinearGradient(
|
2022-10-07 14:36:14 +02:00
|
|
|
qreal x1, qreal y1, qreal x2, qreal y2 ) noexcept
|
|
|
|
: Gradient( QGradient::LinearGradient, x1, y1, x2, y2 )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2022-10-07 19:01:07 +02:00
|
|
|
inline QPointF LinearGradient::start() const noexcept
|
2022-10-07 14:36:14 +02:00
|
|
|
{
|
|
|
|
return QPointF( m_values[0], m_values[1] );
|
|
|
|
}
|
|
|
|
|
2022-10-07 19:01:07 +02:00
|
|
|
inline QPointF LinearGradient::stop() const noexcept
|
2022-10-07 14:36:14 +02:00
|
|
|
{
|
|
|
|
return QPointF( m_values[2], m_values[3] );
|
|
|
|
}
|
|
|
|
|
2022-10-07 16:17:52 +02:00
|
|
|
inline RadialGradient::RadialGradient() noexcept
|
2022-10-13 19:39:57 +02:00
|
|
|
: Gradient( QGradient::RadialGradient, 0.5, 0.5, 0.5, 0.0 )
|
2022-10-07 14:36:14 +02:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2022-10-07 16:17:52 +02:00
|
|
|
inline RadialGradient::RadialGradient(
|
2022-10-07 14:36:14 +02:00
|
|
|
const QPointF& center, qreal radius ) noexcept
|
|
|
|
: RadialGradient( center.x(), center.y(), radius )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2022-10-07 16:17:52 +02:00
|
|
|
inline RadialGradient::RadialGradient(
|
2022-10-07 14:36:14 +02:00
|
|
|
qreal cx, qreal cy, qreal radius ) noexcept
|
2022-10-13 19:39:57 +02:00
|
|
|
: Gradient( QGradient::RadialGradient, cx, cy, radius, 0.0 )
|
2022-10-07 14:36:14 +02:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2022-10-07 19:01:07 +02:00
|
|
|
inline QPointF RadialGradient::center() const noexcept
|
2022-10-07 14:36:14 +02:00
|
|
|
{
|
|
|
|
return QPointF( m_values[0], m_values[1] );
|
|
|
|
}
|
|
|
|
|
2022-10-13 19:39:57 +02:00
|
|
|
inline qreal RadialGradient::radius() const noexcept
|
2022-10-07 14:36:14 +02:00
|
|
|
{
|
|
|
|
return m_values[2];
|
|
|
|
}
|
|
|
|
|
2022-10-07 16:17:52 +02:00
|
|
|
inline ConicGradient::ConicGradient() noexcept
|
2022-10-13 19:39:57 +02:00
|
|
|
: Gradient( QGradient::ConicalGradient, 0.0, 0.0, 0.0, 0.0 )
|
2022-10-07 14:36:14 +02:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2022-10-07 16:17:52 +02:00
|
|
|
inline ConicGradient::ConicGradient(
|
2022-10-13 19:39:57 +02:00
|
|
|
const QPointF& center, qreal startAngle, qreal spanAngle ) noexcept
|
|
|
|
: ConicGradient( center.x(), center.y(), startAngle, spanAngle )
|
2022-10-07 14:36:14 +02:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2022-10-07 16:17:52 +02:00
|
|
|
inline ConicGradient::ConicGradient(
|
2022-10-13 19:39:57 +02:00
|
|
|
qreal cx, qreal cy, qreal startAngle, qreal spanAngle ) noexcept
|
|
|
|
: Gradient( QGradient::ConicalGradient, cx, cy, startAngle, spanAngle )
|
2022-10-07 14:36:14 +02:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2022-10-07 19:01:07 +02:00
|
|
|
inline QPointF ConicGradient::center() const noexcept
|
2022-10-07 14:36:14 +02:00
|
|
|
{
|
|
|
|
return QPointF( m_values[0], m_values[1] );
|
|
|
|
}
|
|
|
|
|
2022-10-13 19:39:57 +02:00
|
|
|
inline qreal ConicGradient::startAngle() const noexcept
|
2022-10-07 14:36:14 +02:00
|
|
|
{
|
|
|
|
return m_values[2];
|
|
|
|
}
|
2022-10-13 19:39:57 +02:00
|
|
|
|
|
|
|
inline qreal ConicGradient::spanAngle() const noexcept
|
|
|
|
{
|
|
|
|
return m_values[3];
|
|
|
|
}
|