Embed SVG data in glabels file.

This commit is contained in:
Jim Evins
2017-03-18 17:14:11 -04:00
parent e2a3b68ffc
commit 153467ddfe
9 changed files with 167 additions and 31 deletions
+29 -1
View File
@@ -47,7 +47,11 @@ namespace glabels
} }
else else
{ {
// TODO handle SVG files QByteArray svg = imageObject->svg();
if ( !svg.isEmpty() )
{
addSvg( filenameNode.data(), svg );
}
} }
} }
} }
@@ -79,4 +83,28 @@ namespace glabels
} }
bool DataCache::hasSvg( const QString& name ) const
{
return mSvgMap.contains( name );
}
QByteArray DataCache::getSvg( const QString& name ) const
{
return mSvgMap[ name ];
}
void DataCache::addSvg( const QString& name, const QByteArray& svg )
{
mSvgMap[ name ] = svg;
}
QList<QString> DataCache::svgNames() const
{
return mSvgMap.keys();
}
} }
+7
View File
@@ -39,9 +39,16 @@ namespace glabels
QImage getImage( const QString& name ) const; QImage getImage( const QString& name ) const;
void addImage( const QString& name, const QImage& image ); void addImage( const QString& name, const QImage& image );
QList<QString> imageNames() const; QList<QString> imageNames() const;
bool hasSvg( const QString& name ) const;
QByteArray getSvg( const QString& name ) const;
void addSvg( const QString& name, const QByteArray& svg );
QList<QString> svgNames() const;
private: private:
QMap<QString,QImage> mImageMap; QMap<QString,QImage> mImageMap;
QMap<QString,QByteArray> mSvgMap;
}; };
+71 -25
View File
@@ -42,7 +42,7 @@ namespace glabels
/// ///
/// Constructor /// Constructor
/// ///
LabelModelImageObject::LabelModelImageObject() : mImage(0), mSvg(0) LabelModelImageObject::LabelModelImageObject() : mImage(0), mSvgRenderer(0)
{ {
mOutline = new Outline( this ); mOutline = new Outline( this );
@@ -138,10 +138,12 @@ namespace glabels
if ( mImage ) if ( mImage )
{ {
delete mImage; delete mImage;
mImage = 0;
} }
if ( mSvg ) if ( mSvgRenderer )
{ {
delete mSvg; delete mSvgRenderer;
mSvgRenderer = 0;
} }
mImage = new QImage(value); mImage = new QImage(value);
@@ -163,10 +165,12 @@ namespace glabels
if ( mImage ) if ( mImage )
{ {
delete mImage; delete mImage;
mImage = 0;
} }
if ( mSvg ) if ( mSvgRenderer )
{ {
delete mSvg; delete mSvgRenderer;
mSvgRenderer = 0;
} }
mImage = new QImage(value); mImage = new QImage(value);
@@ -177,6 +181,42 @@ namespace glabels
} }
///
/// Image svg Property Getter
///
QByteArray LabelModelImageObject::svg() const
{
return mSvg;
}
///
/// Image svgSource Property Setter
///
void LabelModelImageObject::setSvg( const QString& name, const QByteArray& value )
{
if ( !value.isEmpty() )
{
if ( mImage )
{
delete mImage;
mImage = 0;
}
if ( mSvgRenderer )
{
delete mSvgRenderer;
mSvgRenderer = 0;
}
mSvg = value;
mSvgRenderer = new QSvgRenderer( mSvg );
mFilenameNode = TextNode( false, name );
emit changed();
}
}
/// ///
/// naturalSize Property Getter (assumes 72 DPI, i.e. 1pixel == 1pt) /// naturalSize Property Getter (assumes 72 DPI, i.e. 1pixel == 1pt)
/// ///
@@ -190,9 +230,9 @@ namespace glabels
size.setW( Distance::pt( qsize.width() ) ); size.setW( Distance::pt( qsize.width() ) );
size.setH( Distance::pt( qsize.height() ) ); size.setH( Distance::pt( qsize.height() ) );
} }
else if ( mSvg ) else if ( mSvgRenderer )
{ {
QSize qsize = mSvg->defaultSize(); QSize qsize = mSvgRenderer->defaultSize();
size.setW( Distance::pt( qsize.width() ) ); size.setW( Distance::pt( qsize.width() ) );
size.setH( Distance::pt( qsize.height() ) ); size.setH( Distance::pt( qsize.height() ) );
} }
@@ -237,7 +277,7 @@ namespace glabels
{ {
QRectF destRect( 0, 0, mW.pt(), mH.pt() ); QRectF destRect( 0, 0, mW.pt(), mH.pt() );
if ( inEditor && (mFilenameNode.isField() || (!mImage && !mSvg) ) ) if ( inEditor && (mFilenameNode.isField() || (!mImage && !mSvgRenderer) ) )
{ {
painter->save(); painter->save();
painter->setRenderHint( QPainter::SmoothPixmapTransform, false ); painter->setRenderHint( QPainter::SmoothPixmapTransform, false );
@@ -248,9 +288,9 @@ namespace glabels
{ {
painter->drawImage( destRect, *mImage ); painter->drawImage( destRect, *mImage );
} }
else if ( mSvg ) else if ( mSvgRenderer )
{ {
mSvg->render( painter, destRect ); mSvgRenderer->render( painter, destRect );
} }
else if ( mFilenameNode.isField() ) else if ( mFilenameNode.isField() )
{ {
@@ -281,10 +321,10 @@ namespace glabels
delete mImage; delete mImage;
mImage = 0; mImage = 0;
} }
if ( mSvg ) if ( mSvgRenderer )
{ {
delete mSvg; delete mSvgRenderer;
mSvg = 0; mSvgRenderer = 0;
} }
if ( !mFilenameNode.isField() ) if ( !mFilenameNode.isField() )
@@ -296,23 +336,29 @@ namespace glabels
{ {
if ( (fileInfo.suffix() == "svg") || (fileInfo.suffix() == "SVG") ) if ( (fileInfo.suffix() == "svg") || (fileInfo.suffix() == "SVG") )
{ {
mSvg = new QSvgRenderer( filename ); QFile file( filename );
if ( !mSvg->isValid() ) if ( file.open( QFile::ReadOnly ) )
{ {
mSvg = 0; mSvg = file.readAll();
} file.close();
else mSvgRenderer = new QSvgRenderer( mSvg );
{ if ( !mSvgRenderer->isValid() )
// 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; mSvgRenderer = 0;
} }
else else
{ {
mW = mH/aspectRatio; // Adjust size based on aspect ratio of SVG image
QRectF rect = mSvgRenderer->viewBoxF();
double aspectRatio = rect.height() / rect.width();
if ( mH > mW*aspectRatio )
{
mH = mW*aspectRatio;
}
else
{
mW = mH/aspectRatio;
}
} }
} }
} }
+8 -1
View File
@@ -69,6 +69,12 @@ namespace glabels
virtual void setImage( const QImage& value ); virtual void setImage( const QImage& value );
virtual void setImage( const QString& name, const QImage& value ); virtual void setImage( const QString& name, const QImage& value );
//
// Image Property: svg
//
virtual QByteArray svg() const;
virtual void setSvg( const QString& name, const QByteArray& value );
// //
// Property: naturalSize // Property: naturalSize
// //
@@ -102,7 +108,8 @@ namespace glabels
protected: protected:
TextNode mFilenameNode; TextNode mFilenameNode;
QImage* mImage; QImage* mImage;
QSvgRenderer* mSvg; QSvgRenderer* mSvgRenderer;
QByteArray mSvg;
static QImage* smDefaultImage; static QImage* smDefaultImage;
+20
View File
@@ -630,6 +630,26 @@ namespace glabels
} }
///
/// Virtual SVG Property Default Getter
/// (Overridden by concrete class)
///
QByteArray LabelModelObject::svg() const
{
return QByteArray();
}
///
/// Virtual SVG Property Default Setter
/// (Overridden by concrete class)
///
void LabelModelObject::setSvg( const QString& name, const QByteArray& value )
{
// empty
}
/// ///
/// Virtual Line Width Property Default Getter /// Virtual Line Width Property Default Getter
/// (Overridden by concrete class) /// (Overridden by concrete class)
+7
View File
@@ -262,6 +262,13 @@ namespace glabels
virtual void setImage( const QString& name, const QImage& value ); virtual void setImage( const QString& name, const QImage& value );
//
// Virtual Image Property: svg
//
virtual QByteArray svg() const;
virtual void setSvg( const QString& name, const QByteArray& value );
/////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////
// Shape Properties Virtual Interface // Shape Properties Virtual Interface
/////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////
+15 -2
View File
@@ -448,6 +448,11 @@ namespace glabels
{ {
createPngFileNode( node, name, data.getImage( name ) ); createPngFileNode( node, name, data.getImage( name ) );
} }
foreach ( QString name, data.svgNames() )
{
createSvgFileNode( node, name, data.getSvg( name ) );
}
} }
@@ -473,9 +478,17 @@ namespace glabels
void void
XmlLabelCreator::createSvgFileNode( QDomElement &parent, const LabelModel* label, const QString& name ) XmlLabelCreator::createSvgFileNode( QDomElement &parent, const QString& name, const QByteArray& svg )
{ {
// TODO QDomDocument doc = parent.ownerDocument();
QDomElement node = doc.createElement( "File" );
parent.appendChild( node );
XmlUtil::setStringAttr( node, "name", name );
XmlUtil::setStringAttr( node, "mimetype", "image/svg+xml" );
XmlUtil::setStringAttr( node, "encoding", "cdata" );
node.appendChild( doc.createCDATASection( QString( svg ) ) );
} }
} }
+1 -1
View File
@@ -72,7 +72,7 @@ namespace glabels
static void createMergeNode( QDomElement &parent, const LabelModel* label ); static void createMergeNode( QDomElement &parent, const LabelModel* label );
static void createDataNode( QDomElement &parent, const QList<LabelModelObject*>& objects ); static void createDataNode( QDomElement &parent, const QList<LabelModelObject*>& objects );
static void createPngFileNode( QDomElement &parent, const QString& name, const QImage& image ); static void createPngFileNode( QDomElement &parent, const QString& name, const QImage& image );
static void createSvgFileNode( QDomElement &parent, const LabelModel* label, const QString& name ); static void createSvgFileNode( QDomElement &parent, const QString& name, const QByteArray& svg );
}; };
+9 -1
View File
@@ -441,8 +441,13 @@ namespace glabels
{ {
object->setImage( filename, data.getImage( filename ) ); object->setImage( filename, data.getImage( filename ) );
} }
else if ( data.hasSvg( filename ) )
{
object->setSvg( filename, data.getSvg( filename ) );
}
else else
{ {
qWarning() << "Embedded file" << filename << "missing. Trying actual file.";
object->setFilenameNode( TextNode( false, filename ) ); object->setFilenameNode( TextNode( false, filename ) );
} }
} }
@@ -668,7 +673,10 @@ namespace glabels
data.addImage( name, image ); data.addImage( name, image );
} }
else if ( mimetype == "image/svg+xml" )
{
data.addSvg( name, node.text().toUtf8() );
}
} }
} }