diff --git a/designsystems/fluent2/icons/icon2qvg.sh b/designsystems/fluent2/icons/icon2qvg.sh new file mode 100755 index 00000000..c562ca17 --- /dev/null +++ b/designsystems/fluent2/icons/icon2qvg.sh @@ -0,0 +1,15 @@ +#! /bin/sh + +if [ $# -eq 0 ]; then + echo "Usage $0 file ..." + exit 1 +fi + +for file in $* +do + base=`basename -s .svg $file` + echo "${base}.svg -> qvg/${base}.qvg" + svg2qvg ${base}.svg qvg/${base}.qvg +done + +exit $status diff --git a/designsystems/fluent2/icons/qvg/checkmark.qvg b/designsystems/fluent2/icons/qvg/checkmark.qvg index dc894a09..07216854 100644 Binary files a/designsystems/fluent2/icons/qvg/checkmark.qvg and b/designsystems/fluent2/icons/qvg/checkmark.qvg differ diff --git a/designsystems/fluent2/icons/qvg/combo-box-arrow-closed.qvg b/designsystems/fluent2/icons/qvg/combo-box-arrow-closed.qvg index 2585b892..72e1f95f 100644 Binary files a/designsystems/fluent2/icons/qvg/combo-box-arrow-closed.qvg and b/designsystems/fluent2/icons/qvg/combo-box-arrow-closed.qvg differ diff --git a/designsystems/fluent2/icons/qvg/combo-box-arrow-open.qvg b/designsystems/fluent2/icons/qvg/combo-box-arrow-open.qvg index 6ddcf6c0..e2a8dd51 100644 Binary files a/designsystems/fluent2/icons/qvg/combo-box-arrow-open.qvg and b/designsystems/fluent2/icons/qvg/combo-box-arrow-open.qvg differ diff --git a/designsystems/fluent2/icons/qvg/segmented-button-check.qvg b/designsystems/fluent2/icons/qvg/segmented-button-check.qvg index fa0e1ce2..c3d2df1a 100644 Binary files a/designsystems/fluent2/icons/qvg/segmented-button-check.qvg and b/designsystems/fluent2/icons/qvg/segmented-button-check.qvg differ diff --git a/designsystems/fluent2/icons/qvg/spin-box-arrow-down.qvg b/designsystems/fluent2/icons/qvg/spin-box-arrow-down.qvg index 2825e1fb..7536d52c 100644 Binary files a/designsystems/fluent2/icons/qvg/spin-box-arrow-down.qvg and b/designsystems/fluent2/icons/qvg/spin-box-arrow-down.qvg differ diff --git a/designsystems/fluent2/icons/qvg/spin-box-arrow-up.qvg b/designsystems/fluent2/icons/qvg/spin-box-arrow-up.qvg index 3ae75f32..08c62e59 100644 Binary files a/designsystems/fluent2/icons/qvg/spin-box-arrow-up.qvg and b/designsystems/fluent2/icons/qvg/spin-box-arrow-up.qvg differ diff --git a/designsystems/fusion/QskFusionSkin.cpp b/designsystems/fusion/QskFusionSkin.cpp index 73ec47f9..d637fdfd 100644 --- a/designsystems/fusion/QskFusionSkin.cpp +++ b/designsystems/fusion/QskFusionSkin.cpp @@ -145,13 +145,21 @@ namespace if ( strcmp( name, "checkMark" ) == 0 ) { + graphic.setViewBox( QRectF( 0.0, 0.0, 14.0, 14.0 ) ); + QPainterPath path; - path.moveTo( 0.11, 0.47 ); - path.lineTo( 0.5, 1.0); - path.lineTo( 1.0, 0.0 ); + path.moveTo( 3.5, 7.0 ); + path.lineTo( 6.5, 14.0 ); + path.lineTo( 11.0, 1.0 ); + + QPen pen( Qt::black, 2.8 ); + pen.setCapStyle( Qt::FlatCap ); + pen.setJoinStyle( Qt::BevelJoin ); QPainter painter( &graphic ); - painter.setPen( QPen( Qt::black, 0.25 ) ); + painter.setRenderHint( QPainter::Antialiasing ); + + painter.setPen( pen ); painter.drawPath( path ); } @@ -209,19 +217,12 @@ void Editor::setupCheckBox() } } - setGraphicRole( Q::Indicator, QskFusionSkin::GraphicNormal ); + setGraphicRole( Q::Indicator, QskFusionSkin::GraphicIndicator ); setGraphicRole( Q::Indicator | Q::Disabled, QskFusionSkin::GraphicDisabled ); setGraphicRole( Q::Indicator | Q::Error, QskFusionSkin::GraphicError ); -#if 0 - // aligning/scaling of the symbols needs to be fixed in the skinlet TODO .. - - setPadding( Q::Box, 4_dp ); + setPadding( Q::Box, 3_dp ); const auto checkMark = symbol( "checkMark" ); -#else - setPadding( Q::Box, 2_dp ); - const auto checkMark = QskStandardSymbol::graphic( QskStandardSymbol::CheckMark ); -#endif for ( auto state : { QskAspect::NoState, Q::Disabled } ) { @@ -277,6 +278,7 @@ void Editor::setupComboBox() setGraphicRole( Q::Icon | Q::Disabled, QskFusionSkin::GraphicDisabled ); setStrutSize( Q::StatusIndicator, 10_dp, 10_dp ); + setGraphicRole( Q::StatusIndicator, QskFusionSkin::GraphicIndicator ); setGraphicRole( Q::StatusIndicator | Q::Disabled, QskFusionSkin::GraphicDisabled ); setAlignment( Q::StatusIndicator, Qt::AlignRight | Qt::AlignVCenter ); @@ -1339,6 +1341,13 @@ void QskFusionSkin::initHints() setGraphicColor( GraphicError, palette.error ); setGraphicColor( GraphicHighlighted, palette.active( P::HighlightedText ) ); + { + auto rgb = palette.darker( P::Active, P::Text, 120 ); + rgb = QskRgb::toTransparent( rgb, 180 ); + + setGraphicColor( GraphicIndicator, rgb ); + } + Editor editor( palette, &hintTable() ); editor.setup(); } diff --git a/designsystems/fusion/QskFusionSkin.h b/designsystems/fusion/QskFusionSkin.h index c3feb9e7..3ec1f178 100644 --- a/designsystems/fusion/QskFusionSkin.h +++ b/designsystems/fusion/QskFusionSkin.h @@ -24,7 +24,8 @@ class QSK_FUSION_EXPORT QskFusionSkin : public QskSkin GraphicNormal, GraphicDisabled, GraphicHighlighted, - GraphicError + GraphicError, + GraphicIndicator }; protected: diff --git a/designsystems/material3/icons/icon2qvg.sh b/designsystems/material3/icons/icon2qvg.sh new file mode 100755 index 00000000..c562ca17 --- /dev/null +++ b/designsystems/material3/icons/icon2qvg.sh @@ -0,0 +1,15 @@ +#! /bin/sh + +if [ $# -eq 0 ]; then + echo "Usage $0 file ..." + exit 1 +fi + +for file in $* +do + base=`basename -s .svg $file` + echo "${base}.svg -> qvg/${base}.qvg" + svg2qvg ${base}.svg qvg/${base}.qvg +done + +exit $status diff --git a/designsystems/material3/icons/qvg/add.qvg b/designsystems/material3/icons/qvg/add.qvg index f347bbd2..fbb711f9 100644 Binary files a/designsystems/material3/icons/qvg/add.qvg and b/designsystems/material3/icons/qvg/add.qvg differ diff --git a/designsystems/material3/icons/qvg/arrow_drop_down.qvg b/designsystems/material3/icons/qvg/arrow_drop_down.qvg index e8de8a68..9ab42f6d 100644 Binary files a/designsystems/material3/icons/qvg/arrow_drop_down.qvg and b/designsystems/material3/icons/qvg/arrow_drop_down.qvg differ diff --git a/designsystems/material3/icons/qvg/arrow_drop_up.qvg b/designsystems/material3/icons/qvg/arrow_drop_up.qvg index 792f219a..34e4ed77 100644 Binary files a/designsystems/material3/icons/qvg/arrow_drop_up.qvg and b/designsystems/material3/icons/qvg/arrow_drop_up.qvg differ diff --git a/designsystems/material3/icons/qvg/check.qvg b/designsystems/material3/icons/qvg/check.qvg index 882d62f5..fad6dbcc 100644 Binary files a/designsystems/material3/icons/qvg/check.qvg and b/designsystems/material3/icons/qvg/check.qvg differ diff --git a/designsystems/material3/icons/qvg/check_small.qvg b/designsystems/material3/icons/qvg/check_small.qvg index ea738b86..5f84fa5f 100644 Binary files a/designsystems/material3/icons/qvg/check_small.qvg and b/designsystems/material3/icons/qvg/check_small.qvg differ diff --git a/designsystems/material3/icons/qvg/combo-box-arrow-closed.qvg b/designsystems/material3/icons/qvg/combo-box-arrow-closed.qvg index 2585b892..72e1f95f 100644 Binary files a/designsystems/material3/icons/qvg/combo-box-arrow-closed.qvg and b/designsystems/material3/icons/qvg/combo-box-arrow-closed.qvg differ diff --git a/designsystems/material3/icons/qvg/combo-box-arrow-open.qvg b/designsystems/material3/icons/qvg/combo-box-arrow-open.qvg index 6ddcf6c0..e2a8dd51 100644 Binary files a/designsystems/material3/icons/qvg/combo-box-arrow-open.qvg and b/designsystems/material3/icons/qvg/combo-box-arrow-open.qvg differ diff --git a/designsystems/material3/icons/qvg/remove.qvg b/designsystems/material3/icons/qvg/remove.qvg index ecc0bc2a..6f0efadd 100644 Binary files a/designsystems/material3/icons/qvg/remove.qvg and b/designsystems/material3/icons/qvg/remove.qvg differ diff --git a/designsystems/material3/icons/qvg/segmented-button-check.qvg b/designsystems/material3/icons/qvg/segmented-button-check.qvg index fa0e1ce2..c3d2df1a 100644 Binary files a/designsystems/material3/icons/qvg/segmented-button-check.qvg and b/designsystems/material3/icons/qvg/segmented-button-check.qvg differ diff --git a/examples/gallery/icons/icon2qvg.sh b/examples/gallery/icons/icon2qvg.sh new file mode 100755 index 00000000..c562ca17 --- /dev/null +++ b/examples/gallery/icons/icon2qvg.sh @@ -0,0 +1,15 @@ +#! /bin/sh + +if [ $# -eq 0 ]; then + echo "Usage $0 file ..." + exit 1 +fi + +for file in $* +do + base=`basename -s .svg $file` + echo "${base}.svg -> qvg/${base}.qvg" + svg2qvg ${base}.svg qvg/${base}.qvg +done + +exit $status diff --git a/examples/gallery/icons/qvg/airport_shuttle.qvg b/examples/gallery/icons/qvg/airport_shuttle.qvg index fe2cb660..a2df7d1a 100644 Binary files a/examples/gallery/icons/qvg/airport_shuttle.qvg and b/examples/gallery/icons/qvg/airport_shuttle.qvg differ diff --git a/examples/gallery/icons/qvg/flight.qvg b/examples/gallery/icons/qvg/flight.qvg index c4d0cd47..d776378b 100644 Binary files a/examples/gallery/icons/qvg/flight.qvg and b/examples/gallery/icons/qvg/flight.qvg differ diff --git a/examples/gallery/icons/qvg/local_pizza.qvg b/examples/gallery/icons/qvg/local_pizza.qvg index 84289057..e2fc29d0 100644 Binary files a/examples/gallery/icons/qvg/local_pizza.qvg and b/examples/gallery/icons/qvg/local_pizza.qvg differ diff --git a/examples/gallery/icons/qvg/plus.qvg b/examples/gallery/icons/qvg/plus.qvg index ce9688d9..73e18e1a 100644 Binary files a/examples/gallery/icons/qvg/plus.qvg and b/examples/gallery/icons/qvg/plus.qvg differ diff --git a/examples/gallery/icons/qvg/sports_soccer.qvg b/examples/gallery/icons/qvg/sports_soccer.qvg index cbf98807..f7094360 100644 Binary files a/examples/gallery/icons/qvg/sports_soccer.qvg and b/examples/gallery/icons/qvg/sports_soccer.qvg differ diff --git a/examples/iotdashboard/images/icon2qvg.sh b/examples/iotdashboard/images/icon2qvg.sh new file mode 100755 index 00000000..c562ca17 --- /dev/null +++ b/examples/iotdashboard/images/icon2qvg.sh @@ -0,0 +1,15 @@ +#! /bin/sh + +if [ $# -eq 0 ]; then + echo "Usage $0 file ..." + exit 1 +fi + +for file in $* +do + base=`basename -s .svg $file` + echo "${base}.svg -> qvg/${base}.qvg" + svg2qvg ${base}.svg qvg/${base}.qvg +done + +exit $status diff --git a/examples/iotdashboard/images/qvg/ac.qvg b/examples/iotdashboard/images/qvg/ac.qvg index 56ba5116..1daace16 100644 Binary files a/examples/iotdashboard/images/qvg/ac.qvg and b/examples/iotdashboard/images/qvg/ac.qvg differ diff --git a/examples/iotdashboard/images/qvg/dashboard.qvg b/examples/iotdashboard/images/qvg/dashboard.qvg index 85ae5e05..c1c4e66c 100644 Binary files a/examples/iotdashboard/images/qvg/dashboard.qvg and b/examples/iotdashboard/images/qvg/dashboard.qvg differ diff --git a/examples/iotdashboard/images/qvg/devices.qvg b/examples/iotdashboard/images/qvg/devices.qvg index aefe5935..211beb98 100644 Binary files a/examples/iotdashboard/images/qvg/devices.qvg and b/examples/iotdashboard/images/qvg/devices.qvg differ diff --git a/examples/iotdashboard/images/qvg/down.qvg b/examples/iotdashboard/images/qvg/down.qvg index 71e37f4e..7a8552c3 100644 Binary files a/examples/iotdashboard/images/qvg/down.qvg and b/examples/iotdashboard/images/qvg/down.qvg differ diff --git a/examples/iotdashboard/images/qvg/humidity.qvg b/examples/iotdashboard/images/qvg/humidity.qvg index f71f332c..36b6b36f 100644 Binary files a/examples/iotdashboard/images/qvg/humidity.qvg and b/examples/iotdashboard/images/qvg/humidity.qvg differ diff --git a/examples/iotdashboard/images/qvg/indoor-temperature.qvg b/examples/iotdashboard/images/qvg/indoor-temperature.qvg index 34d9e6d5..6050e4b8 100644 Binary files a/examples/iotdashboard/images/qvg/indoor-temperature.qvg and b/examples/iotdashboard/images/qvg/indoor-temperature.qvg differ diff --git a/examples/iotdashboard/images/qvg/lamps.qvg b/examples/iotdashboard/images/qvg/lamps.qvg index 42adabc6..0230c4fd 100644 Binary files a/examples/iotdashboard/images/qvg/lamps.qvg and b/examples/iotdashboard/images/qvg/lamps.qvg differ diff --git a/examples/iotdashboard/images/qvg/logout.qvg b/examples/iotdashboard/images/qvg/logout.qvg index 9213e3c3..b241e980 100644 Binary files a/examples/iotdashboard/images/qvg/logout.qvg and b/examples/iotdashboard/images/qvg/logout.qvg differ diff --git a/examples/iotdashboard/images/qvg/main-icon.qvg b/examples/iotdashboard/images/qvg/main-icon.qvg index 067c743a..d9a1a08a 100644 Binary files a/examples/iotdashboard/images/qvg/main-icon.qvg and b/examples/iotdashboard/images/qvg/main-icon.qvg differ diff --git a/examples/iotdashboard/images/qvg/members.qvg b/examples/iotdashboard/images/qvg/members.qvg index b6170fdc..76b34637 100644 Binary files a/examples/iotdashboard/images/qvg/members.qvg and b/examples/iotdashboard/images/qvg/members.qvg differ diff --git a/examples/iotdashboard/images/qvg/music-system.qvg b/examples/iotdashboard/images/qvg/music-system.qvg index 365c6090..f1aed287 100644 Binary files a/examples/iotdashboard/images/qvg/music-system.qvg and b/examples/iotdashboard/images/qvg/music-system.qvg differ diff --git a/examples/iotdashboard/images/qvg/rooms.qvg b/examples/iotdashboard/images/qvg/rooms.qvg index d0bb7001..59cc7a82 100644 Binary files a/examples/iotdashboard/images/qvg/rooms.qvg and b/examples/iotdashboard/images/qvg/rooms.qvg differ diff --git a/examples/iotdashboard/images/qvg/router.qvg b/examples/iotdashboard/images/qvg/router.qvg index 5d413904..58db7763 100644 Binary files a/examples/iotdashboard/images/qvg/router.qvg and b/examples/iotdashboard/images/qvg/router.qvg differ diff --git a/examples/iotdashboard/images/qvg/statistics.qvg b/examples/iotdashboard/images/qvg/statistics.qvg index c43fb548..7f827176 100644 Binary files a/examples/iotdashboard/images/qvg/statistics.qvg and b/examples/iotdashboard/images/qvg/statistics.qvg differ diff --git a/examples/iotdashboard/images/qvg/storage.qvg b/examples/iotdashboard/images/qvg/storage.qvg index 1313ee76..1a043c97 100644 Binary files a/examples/iotdashboard/images/qvg/storage.qvg and b/examples/iotdashboard/images/qvg/storage.qvg differ diff --git a/examples/iotdashboard/images/qvg/up.qvg b/examples/iotdashboard/images/qvg/up.qvg index 58c142f6..b28fc66e 100644 Binary files a/examples/iotdashboard/images/qvg/up.qvg and b/examples/iotdashboard/images/qvg/up.qvg differ diff --git a/examples/qvgviewer/qvg/Tux.qvg b/examples/qvgviewer/qvg/Tux.qvg index f94effbf..dc5a231d 100644 Binary files a/examples/qvgviewer/qvg/Tux.qvg and b/examples/qvgviewer/qvg/Tux.qvg differ diff --git a/src/graphic/QskGraphic.cpp b/src/graphic/QskGraphic.cpp index 791e79ae..29127cf7 100644 --- a/src/graphic/QskGraphic.cpp +++ b/src/graphic/QskGraphic.cpp @@ -339,7 +339,7 @@ class QskGraphic::PrivateData : public QSharedData PrivateData( const PrivateData& other ) : QSharedData( other ) - , defaultSize( other.defaultSize ) + , viewBox( other.viewBox ) , commands( other.commands ) , pathInfos( other.pathInfos ) , boundingRect( other.boundingRect ) @@ -354,7 +354,18 @@ class QskGraphic::PrivateData : public QSharedData { return ( modificationId == other.modificationId ) && ( renderHints == other.renderHints ) && - ( defaultSize == other.defaultSize ); + ( viewBox == other.viewBox ); + } + + void resetCommands() + { + commands.clear(); + pathInfos.clear(); + + commandTypes = 0; + boundingRect = pointRect = { 0.0, 0.0, -1.0, -1.0 }; + + modificationId = 0; } inline void addCommand( const QskPainterCommand& command ) @@ -365,7 +376,7 @@ class QskGraphic::PrivateData : public QSharedData modificationId = nextId.fetchAndAddRelaxed( 1 ); } - QSizeF defaultSize; + QRectF viewBox = { 0.0, 0.0, -1.0, -1.0 }; QVector< QskPainterCommand > commands; QVector< QskGraphicPrivate::PathInfo > pathInfos; @@ -492,16 +503,9 @@ int QskGraphic::metric( PaintDeviceMetric deviceMetric ) const void QskGraphic::reset() { - m_data->commands.clear(); - m_data->pathInfos.clear(); + m_data->resetCommands(); - m_data->commandTypes = 0; - - m_data->boundingRect = QRectF( 0.0, 0.0, -1.0, -1.0 ); - m_data->pointRect = QRectF( 0.0, 0.0, -1.0, -1.0 ); - m_data->defaultSize = QSizeF(); - - m_data->modificationId = 0; + m_data->viewBox = { 0.0, 0.0, -1.0, -1.0 }; delete m_paintEngine; m_paintEngine = nullptr; @@ -580,18 +584,20 @@ QSize QskGraphic::sizeMetrics() const return QSize( qCeil( sz.width() ), qCeil( sz.height() ) ); } -void QskGraphic::setDefaultSize( const QSizeF& size ) +void QskGraphic::setViewBox( const QRectF& rect ) { - const double w = qMax( qreal( 0.0 ), size.width() ); - const double h = qMax( qreal( 0.0 ), size.height() ); + m_data->viewBox = rect; +} - m_data->defaultSize = QSizeF( w, h ); +QRectF QskGraphic::viewBox() const +{ + return m_data->viewBox; } QSizeF QskGraphic::defaultSize() const { - if ( !m_data->defaultSize.isEmpty() ) - return m_data->defaultSize; + if ( !m_data->viewBox.isEmpty() ) + return m_data->viewBox.size(); return boundingRect().size(); } @@ -670,30 +676,42 @@ void QskGraphic::render( QPainter* painter, const QRectF& rect, if ( isEmpty() || rect.isEmpty() ) return; + const bool scalePens = !( m_data->renderHints & RenderPensUnscaled ); + qreal sx = 1.0; qreal sy = 1.0; - if ( m_data->pointRect.width() > 0.0 ) - sx = rect.width() / m_data->pointRect.width(); + QRectF boundingBox = m_data->viewBox; - if ( m_data->pointRect.height() > 0.0 ) - sy = rect.height() / m_data->pointRect.height(); - - const bool scalePens = !( m_data->renderHints & RenderPensUnscaled ); - - for ( const auto& info : std::as_const( m_data->pathInfos ) ) + if ( !boundingBox.isEmpty() ) { - const qreal ssx = info.scaleFactorX( m_data->pointRect, - rect, m_data->boundingRect, scalePens ); + sx = rect.width() / boundingBox.width(); + sy = rect.height() / boundingBox.height(); + } + else + { + boundingBox = m_data->boundingRect; - if ( ssx > 0.0 ) - sx = qMin( sx, ssx ); + if ( m_data->pointRect.width() > 0.0 ) + sx = rect.width() / m_data->pointRect.width(); - const qreal ssy = info.scaleFactorY( m_data->pointRect, - rect, m_data->boundingRect, scalePens ); + if ( m_data->pointRect.height() > 0.0 ) + sy = rect.height() / m_data->pointRect.height(); - if ( ssy > 0.0 ) - sy = qMin( sy, ssy ); + for ( const auto& info : std::as_const( m_data->pathInfos ) ) + { + const qreal ssx = info.scaleFactorX( m_data->pointRect, + rect, m_data->boundingRect, scalePens ); + + if ( ssx > 0.0 ) + sx = qMin( sx, ssx ); + + const qreal ssy = info.scaleFactorY( m_data->pointRect, + rect, m_data->boundingRect, scalePens ); + + if ( ssy > 0.0 ) + sy = qMin( sy, ssy ); + } } if ( aspectRatioMode == Qt::KeepAspectRatio ) @@ -705,15 +723,17 @@ void QskGraphic::render( QPainter* painter, const QRectF& rect, sx = sy = qMax( sx, sy ); } - const auto& br = m_data->boundingRect; - const auto rc = rect.center(); - QTransform tr; - tr.translate( - rc.x() - 0.5 * sx * br.width(), - rc.y() - 0.5 * sy * br.height() ); - tr.scale( sx, sy ); - tr.translate( -br.x(), -br.y() ); + + { + const auto rc = rect.center(); + + tr.translate( + rc.x() - 0.5 * sx * boundingBox.width(), + rc.y() - 0.5 * sy * boundingBox.height() ); + tr.scale( sx, sy ); + tr.translate( -boundingBox.x(), -boundingBox.y() ); + } const auto transform = painter->transform(); @@ -986,7 +1006,7 @@ const QVector< QskPainterCommand >& QskGraphic::commands() const void QskGraphic::setCommands( const QVector< QskPainterCommand >& commands ) { - reset(); + m_data->resetCommands(); const int numCommands = commands.size(); if ( numCommands <= 0 ) @@ -1019,9 +1039,7 @@ quint64 QskGraphic::modificationId() const QskHashValue QskGraphic::hash( QskHashValue seed ) const { auto hash = qHash( m_data->renderHints, seed ); - - hash = qHash( m_data->defaultSize.width(), hash ); - hash = qHash( m_data->defaultSize.height(), hash ); + hash = qHashBits( &m_data->viewBox, sizeof( QRectF ), hash ); return qHash( m_data->modificationId, hash ); } diff --git a/src/graphic/QskGraphic.h b/src/graphic/QskGraphic.h index bd678397..d9e8c5a0 100644 --- a/src/graphic/QskGraphic.h +++ b/src/graphic/QskGraphic.h @@ -29,6 +29,7 @@ class QSK_EXPORT QskGraphic : public QPaintDevice Q_GADGET Q_PROPERTY( qreal aspectRatio READ aspectRatio ) + Q_PROPERTY( QRectF viewBox READ viewBox WRITE setViewBox ) Q_PROPERTY( QRectF boundingRect READ boundingRect ) Q_PROPERTY( QRectF controlPointRect READ controlPointRect ) Q_PROPERTY( QSizeF defaultSize READ defaultSize ) @@ -106,9 +107,11 @@ class QSK_EXPORT QskGraphic : public QPaintDevice const QVector< QskPainterCommand >& commands() const; void setCommands( const QVector< QskPainterCommand >& ); - void setDefaultSize( const QSizeF& ); QSizeF defaultSize() const; + void setViewBox( const QRectF& ); + QRectF viewBox() const; + qreal aspectRatio() const; qreal heightForWidth( qreal width ) const; diff --git a/src/graphic/QskGraphicIO.cpp b/src/graphic/QskGraphicIO.cpp index b7bf699f..b654d6f9 100644 --- a/src/graphic/QskGraphicIO.cpp +++ b/src/graphic/QskGraphicIO.cpp @@ -241,6 +241,9 @@ QskGraphic QskGraphicIO::read( QIODevice* dev ) return QskGraphic(); } + QRectF viewBox; + stream >> viewBox; + quint32 numCommands; stream >> numCommands; @@ -280,6 +283,7 @@ QskGraphic QskGraphicIO::read( QIODevice* dev ) } QskGraphic graphic; + graphic.setViewBox( viewBox ); graphic.setCommands( commands ); return graphic; @@ -315,6 +319,8 @@ bool QskGraphicIO::write( const QskGraphic& graphic, QIODevice* dev ) stream.setByteOrder( QDataStream::BigEndian ); stream.writeRawData( qskMagicNumber, 4 ); + stream << graphic.viewBox(); + const auto numCommands = graphic.commands().size(); const QskPainterCommand* cmds = graphic.commands().constData(); diff --git a/tools/svg2qvg/main.cpp b/tools/svg2qvg/main.cpp index d5ffcf82..e4afa0dc 100644 --- a/tools/svg2qvg/main.cpp +++ b/tools/svg2qvg/main.cpp @@ -57,6 +57,21 @@ int main( int argc, char* argv[] ) QskGraphic graphic; + { + /* + QSvgRenderer::viewBoxF() returns a bounding box when no viewBox + has been defined. So we clear the viewBox and compare the result with + the initial value - assuming, that there was a viewBox when they differ. + + */ + const auto viewBox = renderer.viewBoxF(); + renderer.setViewBox( QRectF() ); + + if ( viewBox != renderer.viewBoxF() ) + graphic.setViewBox( viewBox ); + } + + QPainter painter( &graphic ); renderer.render( &painter ); painter.end();