diff --git a/CMakeLists.txt b/CMakeLists.txt index 2fb9117..f693a6c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,6 +29,7 @@ endif () find_package(Qt5Widgets 5.4 REQUIRED) find_package(Qt5PrintSupport 5.4 REQUIRED) find_package(Qt5Xml 5.4 REQUIRED) +find_package(Qt5Svg 5.4 REQUIRED) find_package(ZLIB 1.2 REQUIRED) diff --git a/glabels/CMakeLists.txt b/glabels/CMakeLists.txt index a5dcca2..9db507a 100644 --- a/glabels/CMakeLists.txt +++ b/glabels/CMakeLists.txt @@ -144,6 +144,7 @@ target_link_libraries (glabels-qt ${Qt5Widgets_LIBRARIES} ${Qt5PrintSupport_LIBRARIES} ${Qt5Xml_LIBRARIES} + ${Qt5Svg_LIBRARIES} ${ZLIB_LIBRARIES} ) @@ -157,6 +158,7 @@ include_directories ( ${Qt5Widgets_INCLUDE_DIRS} ${Qt5PrintSupport_INCLUDE_DIRS} ${Qt5Xml_INCLUDE_DIRS} + ${Qt5Svg_INCLUDE_DIRS} ) link_directories ( diff --git a/glabels/LabelModelImageObject.cpp b/glabels/LabelModelImageObject.cpp index 69078fd..7338cf2 100644 --- a/glabels/LabelModelImageObject.cpp +++ b/glabels/LabelModelImageObject.cpp @@ -23,6 +23,8 @@ #include #include #include +#include +#include namespace @@ -39,7 +41,7 @@ QImage* LabelModelImageObject::smDefaultImage = 0; /// /// Constructor /// -LabelModelImageObject::LabelModelImageObject() : mImage(0) +LabelModelImageObject::LabelModelImageObject() : mImage(0), mSvg(0) { mOutline = new Outline( this ); @@ -152,7 +154,7 @@ void LabelModelImageObject::drawObject( QPainter* painter, bool inEditor, merge: { QRectF destRect( 0, 0, mW.pt(), mH.pt() ); - if ( inEditor && (mFilenameNode.isField() || !mImage ) ) + if ( inEditor && (mFilenameNode.isField() || (!mImage && !mSvg) ) ) { painter->save(); painter->setRenderHint( QPainter::SmoothPixmapTransform, false ); @@ -163,8 +165,13 @@ void LabelModelImageObject::drawObject( QPainter* painter, bool inEditor, merge: { painter->drawImage( destRect, *mImage ); } + else if ( mSvg ) + { + mSvg->render( painter, destRect ); + } else if ( mFilenameNode.isField() ) { + // TODO } } @@ -190,37 +197,76 @@ void LabelModelImageObject::loadImage() { delete mImage; } + if ( mSvg ) + { + delete mSvg; + } if ( mFilenameNode.isField() ) { mImage = 0; + mSvg = 0; } else { QString filename = mFilenameNode.data(); - mImage = new QImage( filename ); - if ( mImage->isNull() ) + QFileInfo fileInfo( filename ); + + if ( fileInfo.isReadable() ) { - mImage = 0; - } - else - { - double imageW = mImage->width(); - double imageH = mImage->height(); - double aspectRatio = imageH / imageW; - if ( mH > mW*aspectRatio ) + if ( (fileInfo.suffix() == "svg") || (fileInfo.suffix() == "SVG") ) { - mH = mW*aspectRatio; + mSvg = new QSvgRenderer( filename ); + if ( !mSvg->isValid() ) + { + mSvg = 0; + } + else + { + // Adjust size based on aspect ratio of SVG image + QRectF rect = mSvg->viewBoxF(); + double aspectRatio = rect.height() / rect.width(); + if ( mH > mW*aspectRatio ) + { + mH = mW*aspectRatio; + } + else + { + mW = mH/aspectRatio; + } + } } else { - mW = mH/aspectRatio; + mImage = new QImage( filename ); + if ( mImage->isNull() ) + { + mImage = 0; + } + else + { + // Adjust size based on aspect ratio of image + double imageW = mImage->width(); + double imageH = mImage->height(); + double aspectRatio = imageH / imageW; + if ( mH > mW*aspectRatio ) + { + mH = mW*aspectRatio; + } + else + { + mW = mH/aspectRatio; + } + } } } } } +/// +/// Create shadow image +/// QImage* LabelModelImageObject::createShadowImage( const QColor& color ) const { int r = color.red(); diff --git a/glabels/LabelModelImageObject.h b/glabels/LabelModelImageObject.h index a1d8df4..a6610af 100644 --- a/glabels/LabelModelImageObject.h +++ b/glabels/LabelModelImageObject.h @@ -23,6 +23,8 @@ #include "LabelModelObject.h" +#include + /// /// Label Model Image Object @@ -84,6 +86,7 @@ protected: protected: TextNode mFilenameNode; QImage* mImage; + QSvgRenderer* mSvg; static QImage* smDefaultImage; diff --git a/glabels/ObjectEditor.cpp b/glabels/ObjectEditor.cpp index 787425e..239f4dc 100644 --- a/glabels/ObjectEditor.cpp +++ b/glabels/ObjectEditor.cpp @@ -490,11 +490,25 @@ void ObjectEditor::onFillControlsChanged() void ObjectEditor::onImageFileButtonClicked() { + QString filters = + tr("Image files (*.png *.jpg *.jpeg *.gif *.bmp *.pbm *.pgm *.ppm *.xbm *.xpm *.svg)") + ";;" + + tr("All files (*)") + ";;" + + tr("PNG - Portable Network Graphics (*.png)") + ";;" + + tr("BMP - Windows Bitmap (*.bmp)") + ";;" + + tr("GIF - Graphics Interchange Format (*.gif)") + ";;" + + tr("JPEG - Joint Photographic Experts Group (*.jpg *.jpeg)") + ";;" + + tr("PBM - Portable Bitmap (*.pbm)") + ";;" + + tr("PGM - Portable Graymap (*.pgm)") + ";;" + + tr("PPM - Portable Pixmap (*.ppm)") + ";;" + + tr("SVG - Scalable Vector Graphics (*.svg)") + ";;" + + tr("XBM - X11 Bitmap (*.xbm)") + ";;" + + tr("XPM - X11 Pixmap (*.xpm)"); + QString filename = QFileDialog::getOpenFileName( this->window(), tr("gLabels - Select image file"), - ".", - tr("Image Files (*.png *.jpg *.bmp);;All files (*)") ); + ".", filters ); + if ( !filename.isEmpty() ) { mUndoRedoModel->checkpoint( tr("Set image") );