Changeset 846 for trunk/src/plugins/imageformats/svg
- Timestamp:
- May 5, 2011, 5:36:53 AM (14 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk
- Property svn:mergeinfo changed
/branches/vendor/nokia/qt/4.7.2 (added) merged: 845 /branches/vendor/nokia/qt/current merged: 844 /branches/vendor/nokia/qt/4.6.3 removed
- Property svn:mergeinfo changed
-
trunk/src/plugins/imageformats/svg/main.cpp
r651 r846 1 1 /**************************************************************************** 2 2 ** 3 ** Copyright (C) 201 0Nokia Corporation and/or its subsidiary(-ies).3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). 4 4 ** All rights reserved. 5 5 ** Contact: Nokia Corporation (qt-info@nokia.com) … … 63 63 QStringList QSvgPlugin::keys() const 64 64 { 65 return QStringList() << QLatin1String("svg") ;65 return QStringList() << QLatin1String("svg") << QLatin1String("svgz"); 66 66 } 67 67 68 68 QImageIOPlugin::Capabilities QSvgPlugin::capabilities(QIODevice *device, const QByteArray &format) const 69 69 { 70 //### canRead disabled for now because it's hard to detect 71 // whether the file is actually svg without parsing it 72 //if (device->isReadable() && QSvgIOHandler::canRead(device)) 73 74 if (format == "svg") 70 if (format == "svg" || format == "svgz") 75 71 return Capabilities(CanRead); 76 else 77 return 0; 78 79 80 if (!device->isOpen()) 72 if (!format.isEmpty()) 81 73 return 0; 82 74 83 75 Capabilities cap; 84 if (device->isReadable() )76 if (device->isReadable() && QSvgIOHandler::canRead(device)) 85 77 cap |= CanRead; 86 78 return cap; -
trunk/src/plugins/imageformats/svg/qsvgiohandler.cpp
r651 r846 1 1 /**************************************************************************** 2 2 ** 3 ** Copyright (C) 201 0Nokia Corporation and/or its subsidiary(-ies).3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). 4 4 ** All rights reserved. 5 5 ** Contact: Nokia Corporation (qt-info@nokia.com) … … 49 49 #include "qpainter.h" 50 50 #include "qvariant.h" 51 #include "qbuffer.h" 51 52 #include "qdebug.h" 52 53 … … 56 57 { 57 58 public: 58 QSvgIOHandlerPrivate( )59 : r(new QSvgRenderer()), loaded(false)59 QSvgIOHandlerPrivate(QSvgIOHandler *qq) 60 : q(qq), loaded(false), readDone(false), backColor(Qt::transparent) 60 61 {} 61 ~QSvgIOHandlerPrivate()62 {63 delete r;64 }65 62 66 63 bool load(QIODevice *device); 67 static bool findSvgTag(QIODevice *device); 68 69 QSvgRenderer *r; 70 QSize defaultSize; 71 QSize currentSize; 72 bool loaded; 64 65 QSvgIOHandler *q; 66 QSvgRenderer r; 67 QXmlStreamReader xmlReader; 68 QSize defaultSize; 69 QRect clipRect; 70 QSize scaledSize; 71 QRect scaledClipRect; 72 bool loaded; 73 bool readDone; 74 QColor backColor; 73 75 }; 74 76 77 75 78 bool QSvgIOHandlerPrivate::load(QIODevice *device) 76 79 { 77 80 if (loaded) 78 81 return true; 79 80 if (r->load(device->readAll())) { 81 defaultSize = QSize(r->viewBox().width(), r->viewBox().height()); 82 if (currentSize.isEmpty()) 83 currentSize = defaultSize; 84 } 85 loaded = r->isValid(); 82 if (q->format().isEmpty()) 83 q->canRead(); 84 85 // # The SVG renderer doesn't handle trailing, unrelated data, so we must 86 // assume that all available data in the device is to be read. 87 bool res = false; 88 QBuffer *buf = qobject_cast<QBuffer *>(device); 89 if (buf) { 90 const QByteArray &ba = buf->data(); 91 res = r.load(QByteArray::fromRawData(ba.constData() + buf->pos(), ba.size() - buf->pos())); 92 buf->seek(ba.size()); 93 } else if (q->format() == "svgz") { 94 res = r.load(device->readAll()); 95 } else { 96 xmlReader.setDevice(device); 97 res = r.load(&xmlReader); 98 } 99 100 if (res) { 101 defaultSize = QSize(r.viewBox().width(), r.viewBox().height()); 102 loaded = true; 103 } 86 104 87 105 return loaded; 88 106 } 89 107 90 bool QSvgIOHandlerPrivate::findSvgTag(QIODevice *device) 91 { 92 qint64 pos = device->pos(); 93 device->seek(0); 94 char buffer[256]; 95 const char svg_tag[] = "<svg"; 96 97 while (1) { 98 int size = device->read(buffer, 256); 99 for (int i=0; i<size - 5; ++i) { 100 if (!memcmp(buffer + i, svg_tag, 4)) { 101 if (buffer[i+4] == ' ' || buffer[i+4] == '\t' 102 || buffer[i+4] == '\n' || buffer[i+4] == '\r') 103 { 104 device->seek(pos); 105 return true; 106 } 108 109 QSvgIOHandler::QSvgIOHandler() 110 : d(new QSvgIOHandlerPrivate(this)) 111 { 112 113 } 114 115 116 QSvgIOHandler::~QSvgIOHandler() 117 { 118 delete d; 119 } 120 121 122 bool QSvgIOHandler::canRead() const 123 { 124 if (!device()) 125 return false; 126 if (d->loaded && !d->readDone) 127 return true; // Will happen if we have been asked for the size 128 129 QByteArray buf = device()->peek(8); 130 if (buf.startsWith("\x1f\x8b")) { 131 setFormat("svgz"); 132 return true; 133 } else if (buf.contains("<?xml") || buf.contains("<svg")) { 134 setFormat("svg"); 135 return true; 136 } 137 return false; 138 } 139 140 141 QByteArray QSvgIOHandler::name() const 142 { 143 return "svg"; 144 } 145 146 147 bool QSvgIOHandler::read(QImage *image) 148 { 149 if (!d->readDone && d->load(device())) { 150 bool xform = (d->clipRect.isValid() || d->scaledSize.isValid() || d->scaledClipRect.isValid()); 151 QSize finalSize = d->defaultSize; 152 QRectF bounds; 153 if (xform && !d->defaultSize.isEmpty()) { 154 bounds = QRectF(QPointF(0,0), QSizeF(d->defaultSize)); 155 QPoint tr1, tr2; 156 QSizeF sc(1, 1); 157 if (d->clipRect.isValid()) { 158 tr1 = -d->clipRect.topLeft(); 159 finalSize = d->clipRect.size(); 107 160 } 161 if (d->scaledSize.isValid()) { 162 sc = QSizeF(qreal(d->scaledSize.width()) / finalSize.width(), 163 qreal(d->scaledSize.height()) / finalSize.height()); 164 finalSize = d->scaledSize; 165 } 166 if (d->scaledClipRect.isValid()) { 167 tr2 = -d->scaledClipRect.topLeft(); 168 finalSize = d->scaledClipRect.size(); 169 } 170 QTransform t; 171 t.translate(tr2.x(), tr2.y()); 172 t.scale(sc.width(), sc.height()); 173 t.translate(tr1.x(), tr1.y()); 174 bounds = t.mapRect(bounds); 108 175 } 109 if (device->atEnd()) 110 break; 111 device->seek(device->pos()-4); 112 } 113 device->seek(pos); 114 return false; 115 } 116 117 QSvgIOHandler::QSvgIOHandler() 118 : d(new QSvgIOHandlerPrivate()) 119 { 120 121 } 122 123 124 QSvgIOHandler::~QSvgIOHandler() 125 { 126 delete d; 127 } 128 129 130 bool QSvgIOHandler::canRead() const 131 { 132 return QSvgIOHandlerPrivate::findSvgTag(device()); 133 } 134 135 136 QByteArray QSvgIOHandler::name() const 137 { 138 return "svg"; 139 } 140 141 142 bool QSvgIOHandler::read(QImage *image) 143 { 144 if (d->load(device())) { 145 *image = QImage(d->currentSize, QImage::Format_ARGB32_Premultiplied); 146 if (!d->currentSize.isEmpty()) { 147 image->fill(0x00000000); 176 *image = QImage(finalSize, QImage::Format_ARGB32_Premultiplied); 177 if (!finalSize.isEmpty()) { 178 image->fill(d->backColor.rgba()); 148 179 QPainter p(image); 149 d->r ->render(&p);180 d->r.render(&p, bounds); 150 181 p.end(); 151 182 } 183 d->readDone = true; 152 184 return true; 153 185 } … … 167 199 return d->defaultSize; 168 200 break; 201 case ClipRect: 202 return d->clipRect; 203 break; 169 204 case ScaledSize: 170 return d->currentSize; 205 return d->scaledSize; 206 break; 207 case ScaledClipRect: 208 return d->scaledClipRect; 209 break; 210 case BackgroundColor: 211 return d->backColor; 171 212 break; 172 213 default: … … 180 221 { 181 222 switch(option) { 182 case Size: 183 d->defaultSize = value.toSize(); 184 d->currentSize = value.toSize(); 223 case ClipRect: 224 d->clipRect = value.toRect(); 185 225 break; 186 226 case ScaledSize: 187 d->currentSize = value.toSize(); 227 d->scaledSize = value.toSize(); 228 break; 229 case ScaledClipRect: 230 d->scaledClipRect = value.toRect(); 231 break; 232 case BackgroundColor: 233 d->backColor = value.value<QColor>(); 188 234 break; 189 235 default: … … 199 245 case ImageFormat: 200 246 case Size: 247 case ClipRect: 201 248 case ScaledSize: 249 case ScaledClipRect: 250 case BackgroundColor: 202 251 return true; 203 252 default: … … 207 256 } 208 257 258 209 259 bool QSvgIOHandler::canRead(QIODevice *device) 210 260 { 211 return QSvgIOHandlerPrivate::findSvgTag(device); 261 QByteArray buf = device->peek(8); 262 return buf.startsWith("\x1f\x8b") || buf.contains("<?xml") || buf.contains("<svg"); 212 263 } 213 264 -
trunk/src/plugins/imageformats/svg/qsvgiohandler.h
r651 r846 1 1 /**************************************************************************** 2 2 ** 3 ** Copyright (C) 201 0Nokia Corporation and/or its subsidiary(-ies).3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). 4 4 ** All rights reserved. 5 5 ** Contact: Nokia Corporation (qt-info@nokia.com)
Note:
See TracChangeset
for help on using the changeset viewer.