void QgsSvgCache::cachePicture( QgsSvgCacheEntry *entry, bool forceVectorOutput ) { if ( !entry ) { return; } delete entry->picture; entry->picture = 0; //correct QPictures dpi correction QPicture* picture = new QPicture(); QRectF rect; QSvgRenderer r( entry->svgContent ); double hwRatio = 1.0; if ( r.viewBoxF().width() > 0 ) { hwRatio = r.viewBoxF().height() / r.viewBoxF().width(); } bool drawOnScreen = qgsDoubleNear( entry->rasterScaleFactor, 1.0, 0.1 ); if ( drawOnScreen && forceVectorOutput ) //forceVectorOutput always true in case of composer draw / composer preview { // fix to ensure rotated symbols scale with composer page (i.e. not map item) zoom double wSize = entry->size; double hSize = wSize * hwRatio; QSizeF s( r.viewBoxF().size() ); s.scale( wSize, hSize, Qt::KeepAspectRatio ); rect = QRectF( -s.width() / 2.0, -s.height() / 2.0, s.width(), s.height() ); } else { // output for print or image saving @ specific dpi double scaledSize = entry->size / 25.4 / ( entry->rasterScaleFactor * entry->widthScaleFactor ); double wSize = scaledSize * picture->logicalDpiX(); double hSize = scaledSize * picture->logicalDpiY() * r.viewBoxF().height() / r.viewBoxF().width(); rect = QRectF( QPointF( -wSize / 2.0, -hSize / 2.0 ), QSizeF( wSize, hSize ) ); } QPainter p( picture ); r.render( &p, rect ); entry->picture = picture; mTotalSize += entry->picture->size(); }
void QgsSvgCache::cachePicture( QgsSvgCacheEntry *entry ) { if ( !entry ) { return; } delete entry->picture; entry->picture = 0; //correct QPictures dpi correction QPicture* picture = new QPicture(); double pictureSize = entry->size / 25.4 / ( entry->rasterScaleFactor * entry->widthScaleFactor ) * picture->logicalDpiX(); QRectF rect( QPointF( -pictureSize / 2.0, -pictureSize / 2.0 ), QSizeF( pictureSize, pictureSize ) ); QSvgRenderer renderer( entry->svgContent ); QPainter painter( picture ); renderer.render( &painter, rect ); entry->picture = picture; mTotalSize += entry->picture->size(); }