diff --git a/glabels/DataCache.cpp b/glabels/DataCache.cpp index efb8dfc..63dc0f1 100644 --- a/glabels/DataCache.cpp +++ b/glabels/DataCache.cpp @@ -47,7 +47,11 @@ namespace glabels } 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 DataCache::svgNames() const + { + return mSvgMap.keys(); + } + + } diff --git a/glabels/DataCache.h b/glabels/DataCache.h index 68a5d01..63fd685 100644 --- a/glabels/DataCache.h +++ b/glabels/DataCache.h @@ -39,9 +39,16 @@ namespace glabels QImage getImage( const QString& name ) const; void addImage( const QString& name, const QImage& image ); QList imageNames() const; + + bool hasSvg( const QString& name ) const; + QByteArray getSvg( const QString& name ) const; + void addSvg( const QString& name, const QByteArray& svg ); + QList svgNames() const; + private: QMap mImageMap; + QMap mSvgMap; }; diff --git a/glabels/LabelModelImageObject.cpp b/glabels/LabelModelImageObject.cpp index c9e55d0..0bb4cbc 100644 --- a/glabels/LabelModelImageObject.cpp +++ b/glabels/LabelModelImageObject.cpp @@ -42,7 +42,7 @@ namespace glabels /// /// Constructor /// - LabelModelImageObject::LabelModelImageObject() : mImage(0), mSvg(0) + LabelModelImageObject::LabelModelImageObject() : mImage(0), mSvgRenderer(0) { mOutline = new Outline( this ); @@ -138,10 +138,12 @@ namespace glabels if ( mImage ) { delete mImage; + mImage = 0; } - if ( mSvg ) + if ( mSvgRenderer ) { - delete mSvg; + delete mSvgRenderer; + mSvgRenderer = 0; } mImage = new QImage(value); @@ -163,10 +165,12 @@ namespace glabels if ( mImage ) { delete mImage; + mImage = 0; } - if ( mSvg ) + if ( mSvgRenderer ) { - delete mSvg; + delete mSvgRenderer; + mSvgRenderer = 0; } 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) /// @@ -190,9 +230,9 @@ namespace glabels size.setW( Distance::pt( qsize.width() ) ); 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.setH( Distance::pt( qsize.height() ) ); } @@ -237,7 +277,7 @@ namespace glabels { QRectF destRect( 0, 0, mW.pt(), mH.pt() ); - if ( inEditor && (mFilenameNode.isField() || (!mImage && !mSvg) ) ) + if ( inEditor && (mFilenameNode.isField() || (!mImage && !mSvgRenderer) ) ) { painter->save(); painter->setRenderHint( QPainter::SmoothPixmapTransform, false ); @@ -248,9 +288,9 @@ namespace glabels { painter->drawImage( destRect, *mImage ); } - else if ( mSvg ) + else if ( mSvgRenderer ) { - mSvg->render( painter, destRect ); + mSvgRenderer->render( painter, destRect ); } else if ( mFilenameNode.isField() ) { @@ -281,10 +321,10 @@ namespace glabels delete mImage; mImage = 0; } - if ( mSvg ) + if ( mSvgRenderer ) { - delete mSvg; - mSvg = 0; + delete mSvgRenderer; + mSvgRenderer = 0; } if ( !mFilenameNode.isField() ) @@ -296,23 +336,29 @@ namespace glabels { if ( (fileInfo.suffix() == "svg") || (fileInfo.suffix() == "SVG") ) { - mSvg = new QSvgRenderer( filename ); - if ( !mSvg->isValid() ) + QFile file( filename ); + if ( file.open( QFile::ReadOnly ) ) { - 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 ) + mSvg = file.readAll(); + file.close(); + mSvgRenderer = new QSvgRenderer( mSvg ); + if ( !mSvgRenderer->isValid() ) { - mH = mW*aspectRatio; + mSvgRenderer = 0; } 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; + } } } } diff --git a/glabels/LabelModelImageObject.h b/glabels/LabelModelImageObject.h index 41f1d38..4927cfe 100644 --- a/glabels/LabelModelImageObject.h +++ b/glabels/LabelModelImageObject.h @@ -69,6 +69,12 @@ namespace glabels virtual void setImage( 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 // @@ -102,7 +108,8 @@ namespace glabels protected: TextNode mFilenameNode; QImage* mImage; - QSvgRenderer* mSvg; + QSvgRenderer* mSvgRenderer; + QByteArray mSvg; static QImage* smDefaultImage; diff --git a/glabels/LabelModelObject.cpp b/glabels/LabelModelObject.cpp index 1b73208..0232988 100644 --- a/glabels/LabelModelObject.cpp +++ b/glabels/LabelModelObject.cpp @@ -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 /// (Overridden by concrete class) diff --git a/glabels/LabelModelObject.h b/glabels/LabelModelObject.h index 1e3bd61..da0fd51 100644 --- a/glabels/LabelModelObject.h +++ b/glabels/LabelModelObject.h @@ -262,6 +262,13 @@ namespace glabels 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 /////////////////////////////////////////////////////////////// diff --git a/glabels/XmlLabelCreator.cpp b/glabels/XmlLabelCreator.cpp index 9404418..cab2da5 100644 --- a/glabels/XmlLabelCreator.cpp +++ b/glabels/XmlLabelCreator.cpp @@ -448,6 +448,11 @@ namespace glabels { createPngFileNode( node, name, data.getImage( name ) ); } + + foreach ( QString name, data.svgNames() ) + { + createSvgFileNode( node, name, data.getSvg( name ) ); + } } @@ -473,9 +478,17 @@ namespace glabels 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 ) ) ); } } diff --git a/glabels/XmlLabelCreator.h b/glabels/XmlLabelCreator.h index 0f462f3..cb135b7 100644 --- a/glabels/XmlLabelCreator.h +++ b/glabels/XmlLabelCreator.h @@ -72,7 +72,7 @@ namespace glabels static void createMergeNode( QDomElement &parent, const LabelModel* label ); static void createDataNode( QDomElement &parent, const QList& objects ); 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 ); }; diff --git a/glabels/XmlLabelParser.cpp b/glabels/XmlLabelParser.cpp index eb0075e..2d79bc3 100644 --- a/glabels/XmlLabelParser.cpp +++ b/glabels/XmlLabelParser.cpp @@ -441,8 +441,13 @@ namespace glabels { object->setImage( filename, data.getImage( filename ) ); } + else if ( data.hasSvg( filename ) ) + { + object->setSvg( filename, data.getSvg( filename ) ); + } else { + qWarning() << "Embedded file" << filename << "missing. Trying actual file."; object->setFilenameNode( TextNode( false, filename ) ); } } @@ -668,7 +673,10 @@ namespace glabels data.addImage( name, image ); } - + else if ( mimetype == "image/svg+xml" ) + { + data.addSvg( name, node.text().toUtf8() ); + } } }