Embed SVG data in glabels file.
This commit is contained in:
+29
-1
@@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,8 +40,15 @@ namespace glabels
|
|||||||
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;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
///////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////
|
||||||
|
|||||||
@@ -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 ) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 );
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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() );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user