diff --git a/src/common/QskGradient.cpp b/src/common/QskGradient.cpp index 1c695b04..3202b02f 100644 --- a/src/common/QskGradient.cpp +++ b/src/common/QskGradient.cpp @@ -75,6 +75,66 @@ QskGradient::QskGradient( const QVector< QskGradientStop >& stops ) setStops( stops ); } +QskGradient::QskGradient( const QGradient* qGradient ) +{ + if ( qGradient == nullptr ) + return; + + switch( qGradient->type() ) + { + case QGradient::LinearGradient: + { + m_type = Linear; + + const auto g = static_cast< const QLinearGradient* >( qGradient ); + + m_values[0] = g->start().x(); + m_values[1] = g->start().y(); + m_values[2] = g->finalStop().x(); + m_values[3] = g->finalStop().y(); + + break; + } + case QGradient::RadialGradient: + { + m_type = Radial; + + const auto g = static_cast< const QRadialGradient* >( qGradient ); + + if ( ( g->center() != g->focalPoint() ) || ( g->radius() != g->focalRadius() ) ) + qWarning() << "QskGradient: extended radial gradients are not supported."; + + m_values[0] = g->focalPoint().x(); + m_values[1] = g->focalPoint().y(); + m_values[2] = g->focalRadius(); + m_values[3] = 0.0; + + break; + } + case QGradient::ConicalGradient: + { + m_type = Conic; + + const auto g = static_cast< const QConicalGradient* >( qGradient ); + + m_values[0] = g->center().x(); + m_values[1] = g->center().y(); + m_values[2] = g->angle(); + m_values[3] = 360.0; + + break; + } + default: + { + m_type = Stops; + break; + } + } + + m_spread = static_cast< Spread >( qGradient->spread() ); + m_stops = qskBuildGradientStops( qGradient->stops() ); +} + QskGradient::QskGradient( const QskGradient& other ) noexcept : m_stops( other.m_stops ) , m_values{ other.m_values[0], other.m_values[1], @@ -533,6 +593,54 @@ void QskGradient::resetDirection() m_values[0] = m_values[1] = m_values[2] = m_values[3] = 0.0; } +QGradient* QskGradient::toQGradient() const +{ + QGradient* qGradient = nullptr; + + switch( m_type ) + { + case Linear: + { + qGradient = new QLinearGradient( + m_values[0], m_values[1], m_values[2], m_values[3] ); + + break; + } + + case Radial: + { + qGradient = new QRadialGradient( + m_values[0], m_values[1], m_values[2] ); + + break; + } + + case Conic: + { + if ( m_values[4] != 360.0 ) + { + qWarning() << + "QskGradient: spanAngle got lost, when converting to QConicalGradient"; + } + + qGradient = new QConicalGradient( + m_values[0], m_values[1], m_values[2] ); + + break; + } + + default: + { + qGradient = new QGradient(); + } + } + + qGradient->setSpread( static_cast< QGradient::Spread >( m_spread ) ); + qGradient->setStops( qskToQGradientStops( m_stops ) ); + + return qGradient; +} + #ifndef QT_NO_DEBUG_STREAM #include diff --git a/src/common/QskGradient.h b/src/common/QskGradient.h index bcac4b55..ae5700f1 100644 --- a/src/common/QskGradient.h +++ b/src/common/QskGradient.h @@ -16,6 +16,7 @@ class QskRadialDirection; class QskConicDirection; class QVariant; +class QGradient; class QSK_EXPORT QskGradient { @@ -65,6 +66,8 @@ class QSK_EXPORT QskGradient QskGradient( QGradient::Preset ); QskGradient( const QskGradientStops& ); + QskGradient( const QGradient* ); + QskGradient( const QskGradient& ) noexcept; ~QskGradient(); @@ -140,6 +143,8 @@ class QSK_EXPORT QskGradient int stepCount() const noexcept; + QGradient* toQGradient() const; + private: void updateStatusBits() const;