Added SVG support to image objects.

This commit is contained in:
Jim Evins
2017-01-01 23:06:03 -05:00
parent 719604ca40
commit 4cc5882ec3
5 changed files with 82 additions and 16 deletions
+1
View File
@@ -29,6 +29,7 @@ endif ()
find_package(Qt5Widgets 5.4 REQUIRED) find_package(Qt5Widgets 5.4 REQUIRED)
find_package(Qt5PrintSupport 5.4 REQUIRED) find_package(Qt5PrintSupport 5.4 REQUIRED)
find_package(Qt5Xml 5.4 REQUIRED) find_package(Qt5Xml 5.4 REQUIRED)
find_package(Qt5Svg 5.4 REQUIRED)
find_package(ZLIB 1.2 REQUIRED) find_package(ZLIB 1.2 REQUIRED)
+2
View File
@@ -144,6 +144,7 @@ target_link_libraries (glabels-qt
${Qt5Widgets_LIBRARIES} ${Qt5Widgets_LIBRARIES}
${Qt5PrintSupport_LIBRARIES} ${Qt5PrintSupport_LIBRARIES}
${Qt5Xml_LIBRARIES} ${Qt5Xml_LIBRARIES}
${Qt5Svg_LIBRARIES}
${ZLIB_LIBRARIES} ${ZLIB_LIBRARIES}
) )
@@ -157,6 +158,7 @@ include_directories (
${Qt5Widgets_INCLUDE_DIRS} ${Qt5Widgets_INCLUDE_DIRS}
${Qt5PrintSupport_INCLUDE_DIRS} ${Qt5PrintSupport_INCLUDE_DIRS}
${Qt5Xml_INCLUDE_DIRS} ${Qt5Xml_INCLUDE_DIRS}
${Qt5Svg_INCLUDE_DIRS}
) )
link_directories ( link_directories (
+60 -14
View File
@@ -23,6 +23,8 @@
#include <QBrush> #include <QBrush>
#include <QPen> #include <QPen>
#include <QImage> #include <QImage>
#include <QFileInfo>
#include <QtDebug>
namespace namespace
@@ -39,7 +41,7 @@ QImage* LabelModelImageObject::smDefaultImage = 0;
/// ///
/// Constructor /// Constructor
/// ///
LabelModelImageObject::LabelModelImageObject() : mImage(0) LabelModelImageObject::LabelModelImageObject() : mImage(0), mSvg(0)
{ {
mOutline = new Outline( this ); mOutline = new Outline( this );
@@ -152,7 +154,7 @@ void LabelModelImageObject::drawObject( QPainter* painter, bool inEditor, merge:
{ {
QRectF destRect( 0, 0, mW.pt(), mH.pt() ); QRectF destRect( 0, 0, mW.pt(), mH.pt() );
if ( inEditor && (mFilenameNode.isField() || !mImage ) ) if ( inEditor && (mFilenameNode.isField() || (!mImage && !mSvg) ) )
{ {
painter->save(); painter->save();
painter->setRenderHint( QPainter::SmoothPixmapTransform, false ); painter->setRenderHint( QPainter::SmoothPixmapTransform, false );
@@ -163,8 +165,13 @@ void LabelModelImageObject::drawObject( QPainter* painter, bool inEditor, merge:
{ {
painter->drawImage( destRect, *mImage ); painter->drawImage( destRect, *mImage );
} }
else if ( mSvg )
{
mSvg->render( painter, destRect );
}
else if ( mFilenameNode.isField() ) else if ( mFilenameNode.isField() )
{ {
// TODO
} }
} }
@@ -190,37 +197,76 @@ void LabelModelImageObject::loadImage()
{ {
delete mImage; delete mImage;
} }
if ( mSvg )
{
delete mSvg;
}
if ( mFilenameNode.isField() ) if ( mFilenameNode.isField() )
{ {
mImage = 0; mImage = 0;
mSvg = 0;
} }
else else
{ {
QString filename = mFilenameNode.data(); QString filename = mFilenameNode.data();
mImage = new QImage( filename ); QFileInfo fileInfo( filename );
if ( mImage->isNull() )
if ( fileInfo.isReadable() )
{ {
mImage = 0; if ( (fileInfo.suffix() == "svg") || (fileInfo.suffix() == "SVG") )
}
else
{
double imageW = mImage->width();
double imageH = mImage->height();
double aspectRatio = imageH / imageW;
if ( mH > mW*aspectRatio )
{ {
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 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 QImage* LabelModelImageObject::createShadowImage( const QColor& color ) const
{ {
int r = color.red(); int r = color.red();
+3
View File
@@ -23,6 +23,8 @@
#include "LabelModelObject.h" #include "LabelModelObject.h"
#include <QSvgRenderer>
/// ///
/// Label Model Image Object /// Label Model Image Object
@@ -84,6 +86,7 @@ protected:
protected: protected:
TextNode mFilenameNode; TextNode mFilenameNode;
QImage* mImage; QImage* mImage;
QSvgRenderer* mSvg;
static QImage* smDefaultImage; static QImage* smDefaultImage;
+16 -2
View File
@@ -490,11 +490,25 @@ void ObjectEditor::onFillControlsChanged()
void ObjectEditor::onImageFileButtonClicked() 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 = QString filename =
QFileDialog::getOpenFileName( this->window(), QFileDialog::getOpenFileName( this->window(),
tr("gLabels - Select image file"), tr("gLabels - Select image file"),
".", ".", filters );
tr("Image Files (*.png *.jpg *.bmp);;All files (*)") );
if ( !filename.isEmpty() ) if ( !filename.isEmpty() )
{ {
mUndoRedoModel->checkpoint( tr("Set image") ); mUndoRedoModel->checkpoint( tr("Set image") );