qimagereader.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/gui/image/qimagereader.cpp
Switch to Source codePreprocessed file
LineSourceCount
1-
2-
3-
4-
5-
6-
7-
8-
9-
10-
11-
12-
13namespace { namespace Q_QGS_loader { typedef QFactoryLoader Type; QBasicAtomicInt guard = { QtGlobalStatic::Uninitialized }; __attribute__((visibility("hidden"))) inline Type *innerFunction() { struct HolderBase { ~HolderBase() noexcept { if (guard.load() == QtGlobalStatic::Initialized) guard.store(QtGlobalStatic::Destroyed); } }; static struct Holder : public HolderBase { Type value; Holder() noexcept(noexcept(Type ("org.qt-project.Qt.QImageIOHandlerFactoryInterface", QLatin1String("/imageformats")))) : value ("org.qt-project.Qt.QImageIOHandlerFactoryInterface", QLatin1String("/imageformats")) { guard.store(QtGlobalStatic::Initialized); } } holder; return &holder.value; } } } static QGlobalStatic<QFactoryLoader, Q_QGS_loader::innerFunction, Q_QGS_loader::guard> loader;-
14-
15-
16-
17enum _qt_BuiltInFormatType {-
18-
19 _qt_PngFormat,-
20 _qt_BmpFormat,-
21-
22-
23 _qt_PpmFormat,-
24 _qt_PgmFormat,-
25 _qt_PbmFormat,-
26-
27-
28 _qt_XbmFormat,-
29-
30-
31 _qt_XpmFormat,-
32-
33 _qt_NumFormats,-
34 _qt_NoFormat = -1-
35};-
36-
37struct _qt_BuiltInFormatStruct-
38{-
39 const char *extension;-
40 const char *mimeType;-
41};-
42-
43static const _qt_BuiltInFormatStruct _qt_BuiltInFormats[] = {-
44-
45 {"png", "image/png"},-
46 {"bmp", "image/bmp"},-
47-
48-
49 {"ppm", "image/x-portable-pixmap"},-
50 {"pgm", "image/x-portable-graymap"},-
51 {"pbm", "image/x-portable-bitmap"},-
52-
53-
54 {"xbm", "image/x-xbitmap"},-
55-
56-
57 {"xpm", "image/x-xpixmap"},-
58-
59 {"", ""}-
60};-
61-
62static QImageIOHandler *createReadHandlerHelper(QIODevice *device,-
63 const QByteArray &format,-
64 bool autoDetectImageFormat,-
65 bool ignoresFormatAndExtension)-
66{-
67 if (!autoDetectImageFormat
!autoDetectImageFormatDescription
TRUEnever evaluated
FALSEnever evaluated
&& format.isEmpty()
format.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
68 return
never executed: return 0;
0;
never executed: return 0;
0
69-
70 QByteArray form = format.toLower();-
71 QImageIOHandler *handler = 0;-
72 QByteArray suffix;-
73-
74-
75 static QMutex mutex;-
76 QMutexLocker locker(&mutex);-
77-
78 typedef QMultiMap<int, QString> PluginKeyMap;-
79-
80-
81 QFactoryLoader *l = loader();-
82 const PluginKeyMap keyMap = l->keyMap();-
83-
84-
85-
86-
87-
88-
89 int suffixPluginIndex = -1;-
90-
91-
92 if (device
deviceDescription
TRUEnever evaluated
FALSEnever evaluated
&& format.isEmpty()
format.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
&& autoDetectImageFormat
autoDetectImageFormatDescription
TRUEnever evaluated
FALSEnever evaluated
&& !ignoresFormatAndExtension
!ignoresFormatAndExtensionDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
93-
94-
95-
96 if (QFile *file = qobject_cast<QFile *>(device)
QFile *file = ...ile *>(device)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
97-
98-
99-
100 if (!(suffix = QFileInfo(file->fileName()).suffix().toLower().toLatin1()).isEmpty()
!(suffix = QFi...1()).isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
101-
102 const int index = keyMap.key(QString::fromLatin1(suffix), -1);-
103 if (index != -1
index != -1Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
104-
105-
106-
107-
108 suffixPluginIndex = index;-
109 }
never executed: end of block
0
110-
111 }
never executed: end of block
0
112 }
never executed: end of block
0
113 }
never executed: end of block
0
114-
115 QByteArray testFormat = !form.isEmpty()
!form.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
? form : suffix;
0
116-
117 if (ignoresFormatAndExtension
ignoresFormatAndExtensionDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
118 testFormat = QByteArray();
never executed: testFormat = QByteArray();
0
119-
120-
121 if (suffixPluginIndex != -1
suffixPluginIndex != -1Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
122-
123-
124 const qint64 pos = device
deviceDescription
TRUEnever evaluated
FALSEnever evaluated
? device->pos() : 0;
0
125 const int index = keyMap.key(QString::fromLatin1(suffix), -1);-
126 if (index != -1
index != -1Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
127 QImageIOPlugin *plugin = qobject_cast<QImageIOPlugin *>(l->instance(index));-
128 if (plugin
pluginDescription
TRUEnever evaluated
FALSEnever evaluated
&& plugin->capabilities(device, testFormat) & QImageIOPlugin::CanRead
plugin->capabi...lugin::CanReadDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
129 handler = plugin->create(device, testFormat);-
130-
131-
132-
133-
134 }
never executed: end of block
0
135 }
never executed: end of block
0
136 if (device
deviceDescription
TRUEnever evaluated
FALSEnever evaluated
&& !device->isSequential()
!device->isSequential()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
137 device->seek(pos);
never executed: device->seek(pos);
0
138 }
never executed: end of block
0
139-
140 if (!handler
!handlerDescription
TRUEnever evaluated
FALSEnever evaluated
&& !testFormat.isEmpty()
!testFormat.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
&& !ignoresFormatAndExtension
!ignoresFormatAndExtensionDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
141-
142-
143 const qint64 pos = device
deviceDescription
TRUEnever evaluated
FALSEnever evaluated
? device->pos() : 0;
0
144-
145 if (autoDetectImageFormat
autoDetectImageFormatDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
146 const int keyCount = keyMap.size();-
147 for (int i = 0; i < keyCount
i < keyCountDescription
TRUEnever evaluated
FALSEnever evaluated
; ++i) {
0
148 if (i != suffixPluginIndex
i != suffixPluginIndexDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
149 QImageIOPlugin *plugin = qobject_cast<QImageIOPlugin *>(l->instance(i));-
150 if (plugin
pluginDescription
TRUEnever evaluated
FALSEnever evaluated
&& plugin->capabilities(device, testFormat) & QImageIOPlugin::CanRead
plugin->capabi...lugin::CanReadDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
151-
152-
153-
154 handler = plugin->create(device, testFormat);-
155 break;
never executed: break;
0
156 }-
157 }
never executed: end of block
0
158 }
never executed: end of block
0
159 }
never executed: end of block
else {
0
160 const int testIndex = keyMap.key(QLatin1String(testFormat), -1);-
161 if (testIndex != -1
testIndex != -1Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
162 QImageIOPlugin *plugin = qobject_cast<QImageIOPlugin *>(l->instance(testIndex));-
163 if (plugin
pluginDescription
TRUEnever evaluated
FALSEnever evaluated
&& plugin->capabilities(device, testFormat) & QImageIOPlugin::CanRead
plugin->capabi...lugin::CanReadDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
164-
165-
166-
167 handler = plugin->create(device, testFormat);-
168 }
never executed: end of block
0
169 }
never executed: end of block
0
170 }
never executed: end of block
0
171 if (device
deviceDescription
TRUEnever evaluated
FALSEnever evaluated
&& !device->isSequential()
!device->isSequential()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
172 device->seek(pos);
never executed: device->seek(pos);
0
173 }
never executed: end of block
0
174-
175-
176-
177-
178-
179 if (!handler
!handlerDescription
TRUEnever evaluated
FALSEnever evaluated
&& !testFormat.isEmpty()
!testFormat.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
180 if (false) {
dead code: { }
-
181-
182 }
dead code: { }
else if (testFormat == "png"
testFormat == "png"Description
TRUEnever evaluated
FALSEnever evaluated
) {
-
183 handler = new QPngHandler;-
184 }
never executed: end of block
else if (testFormat == "bmp"
testFormat == "bmp"Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
185 handler = new QBmpHandler;-
186 }
never executed: end of block
else if (testFormat == "dib"
testFormat == "dib"Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
187 handler = new QBmpHandler(QBmpHandler::DibFormat);-
188-
189-
190 }
never executed: end of block
else if (testFormat == "xpm"
testFormat == "xpm"Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
191 handler = new QXpmHandler;-
192-
193-
194 }
never executed: end of block
else if (testFormat == "xbm"
testFormat == "xbm"Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
195 handler = new QXbmHandler;-
196 handler->setOption(QImageIOHandler::SubType, testFormat);-
197-
198-
199 }
never executed: end of block
else if (testFormat == "pbm"
testFormat == "pbm"Description
TRUEnever evaluated
FALSEnever evaluated
|| testFormat == "pbmraw"
testFormat == "pbmraw"Description
TRUEnever evaluated
FALSEnever evaluated
|| testFormat == "pgm"
testFormat == "pgm"Description
TRUEnever evaluated
FALSEnever evaluated
0
200 || testFormat == "pgmraw"
testFormat == "pgmraw"Description
TRUEnever evaluated
FALSEnever evaluated
|| testFormat == "ppm"
testFormat == "ppm"Description
TRUEnever evaluated
FALSEnever evaluated
|| testFormat == "ppmraw"
testFormat == "ppmraw"Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
201 handler = new QPpmHandler;-
202 handler->setOption(QImageIOHandler::SubType, testFormat);-
203-
204 }
never executed: end of block
0
205-
206-
207-
208-
209-
210 }
never executed: end of block
0
211-
212-
213 if (!handler
!handlerDescription
TRUEnever evaluated
FALSEnever evaluated
&& (autoDetectImageFormat
autoDetectImageFormatDescription
TRUEnever evaluated
FALSEnever evaluated
|| ignoresFormatAndExtension
ignoresFormatAndExtensionDescription
TRUEnever evaluated
FALSEnever evaluated
)) {
0
214-
215 const qint64 pos = device
deviceDescription
TRUEnever evaluated
FALSEnever evaluated
? device->pos() : 0;
0
216 const int keyCount = keyMap.size();-
217 for (int i = 0; i < keyCount
i < keyCountDescription
TRUEnever evaluated
FALSEnever evaluated
; ++i) {
0
218 if (i != suffixPluginIndex
i != suffixPluginIndexDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
219 QImageIOPlugin *plugin = qobject_cast<QImageIOPlugin *>(l->instance(i));-
220 if (plugin
pluginDescription
TRUEnever evaluated
FALSEnever evaluated
&& plugin->capabilities(device, QByteArray()) & QImageIOPlugin::CanRead
plugin->capabi...lugin::CanReadDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
221 handler = plugin->create(device, testFormat);-
222-
223-
224-
225 break;
never executed: break;
0
226 }-
227 }
never executed: end of block
0
228 }
never executed: end of block
0
229 if (device
deviceDescription
TRUEnever evaluated
FALSEnever evaluated
&& !device->isSequential()
!device->isSequential()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
230 device->seek(pos);
never executed: device->seek(pos);
0
231 }
never executed: end of block
0
232-
233-
234 if (!handler
!handlerDescription
TRUEnever evaluated
FALSEnever evaluated
&& (autoDetectImageFormat
autoDetectImageFormatDescription
TRUEnever evaluated
FALSEnever evaluated
|| ignoresFormatAndExtension
ignoresFormatAndExtensionDescription
TRUEnever evaluated
FALSEnever evaluated
)) {
0
235-
236-
237 int currentFormat = 0;-
238 if (!suffix.isEmpty()
!suffix.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
239-
240-
241 for (int i = 0; i < _qt_NumFormats
i < _qt_NumFormatsDescription
TRUEnever evaluated
FALSEnever evaluated
; ++i) {
0
242 if (_qt_BuiltInFormats[i].extension == suffix
_qt_BuiltInFor...sion == suffixDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
243 currentFormat = i;-
244 break;
never executed: break;
0
245 }-
246 }
never executed: end of block
0
247 }
never executed: end of block
0
248-
249 QByteArray subType;-
250 int numFormats = _qt_NumFormats;-
251 while (device
deviceDescription
TRUEnever evaluated
FALSEnever evaluated
&& numFormats >= 0
numFormats >= 0Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
252 const qint64 pos = device->pos();-
253 switch (currentFormat) {-
254-
255 case
never executed: case _qt_PngFormat:
_qt_PngFormat:
never executed: case _qt_PngFormat:
0
256 if (QPngHandler::canRead(device)
QPngHandler::canRead(device)Description
TRUEnever evaluated
FALSEnever evaluated
)
0
257 handler = new QPngHandler;
never executed: handler = new QPngHandler;
0
258 break;
never executed: break;
0
259 case
never executed: case _qt_BmpFormat:
_qt_BmpFormat:
never executed: case _qt_BmpFormat:
0
260 if (QBmpHandler::canRead(device)
QBmpHandler::canRead(device)Description
TRUEnever evaluated
FALSEnever evaluated
)
0
261 handler = new QBmpHandler;
never executed: handler = new QBmpHandler;
0
262 break;
never executed: break;
0
263-
264-
265 case
never executed: case _qt_XpmFormat:
_qt_XpmFormat:
never executed: case _qt_XpmFormat:
0
266 if (QXpmHandler::canRead(device)
QXpmHandler::canRead(device)Description
TRUEnever evaluated
FALSEnever evaluated
)
0
267 handler = new QXpmHandler;
never executed: handler = new QXpmHandler;
0
268 break;
never executed: break;
0
269-
270-
271 case
never executed: case _qt_PbmFormat:
_qt_PbmFormat:
never executed: case _qt_PbmFormat:
0
272 case
never executed: case _qt_PgmFormat:
_qt_PgmFormat:
never executed: case _qt_PgmFormat:
0
273 case
never executed: case _qt_PpmFormat:
_qt_PpmFormat:
never executed: case _qt_PpmFormat:
0
274 if (QPpmHandler::canRead(device, &subType)
QPpmHandler::c...ice, &subType)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
275 handler = new QPpmHandler;-
276 handler->setOption(QImageIOHandler::SubType, subType);-
277 }
never executed: end of block
0
278 break;
never executed: break;
0
279-
280-
281 case
never executed: case _qt_XbmFormat:
_qt_XbmFormat:
never executed: case _qt_XbmFormat:
0
282 if (QXbmHandler::canRead(device)
QXbmHandler::canRead(device)Description
TRUEnever evaluated
FALSEnever evaluated
)
0
283 handler = new QXbmHandler;
never executed: handler = new QXbmHandler;
0
284 break;
never executed: break;
0
285-
286 default
never executed: default:
:
never executed: default:
0
287 break;
never executed: break;
0
288 }-
289 if (!device->isSequential()
!device->isSequential()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
290 device->seek(pos);
never executed: device->seek(pos);
0
291-
292 if (handler
handlerDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
293-
294-
295-
296-
297 break;
never executed: break;
0
298 }-
299-
300 --numFormats;-
301 ++currentFormat;-
302 currentFormat %= _qt_NumFormats;-
303 }
never executed: end of block
0
304 }
never executed: end of block
0
305-
306 if (!handler
!handlerDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
307-
308-
309-
310-
311 return
never executed: return 0;
0;
never executed: return 0;
0
312 }-
313-
314 handler->setDevice(device);-
315 if (!form.isEmpty()
!form.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
316 handler->setFormat(form);
never executed: handler->setFormat(form);
0
317 return
never executed: return handler;
handler;
never executed: return handler;
0
318}-
319-
320class QImageReaderPrivate-
321{-
322public:-
323 QImageReaderPrivate(QImageReader *qq);-
324 ~QImageReaderPrivate();-
325-
326-
327 QByteArray format;-
328 bool autoDetectImageFormat;-
329 bool ignoresFormatAndExtension;-
330 QIODevice *device;-
331 bool deleteDevice;-
332 QImageIOHandler *handler;-
333 bool initHandler();-
334-
335-
336 QRect clipRect;-
337 QSize scaledSize;-
338 QRect scaledClipRect;-
339 int quality;-
340 QMap<QString, QString> text;-
341 void getText();-
342 enum {-
343 UsePluginDefault,-
344 ApplyTransform,-
345 DoNotApplyTransform-
346 } autoTransform;-
347-
348-
349 QImageReader::ImageReaderError imageReaderError;-
350 QString errorString;-
351-
352 QImageReader *q;-
353};-
354-
355-
356-
357-
358QImageReaderPrivate::QImageReaderPrivate(QImageReader *qq)-
359 : autoDetectImageFormat(true), ignoresFormatAndExtension(false)-
360{-
361 device = 0;-
362 deleteDevice = false;-
363 handler = 0;-
364 quality = -1;-
365 imageReaderError = QImageReader::UnknownError;-
366 autoTransform = UsePluginDefault;-
367-
368 q = qq;-
369}-
370-
371-
372-
373-
374QImageReaderPrivate::~QImageReaderPrivate()-
375{-
376 if (deleteDevice)-
377 delete device;-
378 delete handler;-
379}-
380-
381-
382-
383-
384bool QImageReaderPrivate::initHandler()-
385{-
386-
387 if (!device || (!deleteDevice && !device->isOpen() && !device->open(QIODevice::ReadOnly))) {-
388 imageReaderError = QImageReader::DeviceError;-
389 errorString = QImageReader::tr("Invalid device");-
390 return false;-
391 }-
392-
393-
394 if (deleteDevice && !device->isOpen() && !device->open(QIODevice::ReadOnly) && autoDetectImageFormat) {-
395 QList<QByteArray> extensions = QImageReader::supportedImageFormats();-
396 if (!format.isEmpty()) {-
397-
398 int currentFormatIndex = extensions.indexOf(format.toLower());-
399 if (currentFormatIndex > 0)-
400 extensions.swap(0, currentFormatIndex);-
401 }-
402-
403 int currentExtension = 0;-
404-
405 QFile *file = static_cast<QFile *>(device);-
406 QString fileName = file->fileName();-
407-
408 do {-
409 file->setFileName(fileName + QLatin1Char('.')-
410 + QString::fromLatin1(extensions.at(currentExtension++).constData()));-
411 file->open(QIODevice::ReadOnly);-
412 } while (!file->isOpen() && currentExtension < extensions.size());-
413-
414 if (!device->isOpen()) {-
415 imageReaderError = QImageReader::FileNotFoundError;-
416 errorString = QImageReader::tr("File not found");-
417 file->setFileName(fileName);-
418 return false;-
419 }-
420 }-
421-
422-
423 if (!handler && (handler = createReadHandlerHelper(device, format, autoDetectImageFormat, ignoresFormatAndExtension)) == 0) {-
424 imageReaderError = QImageReader::UnsupportedFormatError;-
425 errorString = QImageReader::tr("Unsupported image format");-
426 return false;-
427 }-
428 return true;-
429}-
430-
431-
432-
433-
434void QImageReaderPrivate::getText()-
435{-
436 if (!text.isEmpty() || (!handler && !initHandler()) || !handler->supportsOption(QImageIOHandler::Description))-
437 return;-
438 for (QForeachContainer<typename QtPrivate::remove_reference<decltype(handler->option(QImageIOHandler::Description).toString().split( QLatin1String("\n\n")))>::type> _container_((handler->option(QImageIOHandler::Description).toString().split( QLatin1String("\n\n")))); _container_.control && _container_.i != _container_.e; ++_container_.i, _container_.control ^= 1) for (const QString &pair = *_container_.i; _container_.control; _container_.control = 0)-
439 {-
440 int index = pair.indexOf(QLatin1Char(':'));-
441 if (index >= 0 && pair.indexOf(QLatin1Char(' ')) < index) {-
442 text.insert(QLatin1String("Description"), pair.simplified());-
443 } else {-
444 QString key = pair.left(index);-
445 text.insert(key, pair.mid(index + 2).simplified());-
446 }-
447 }-
448}-
449-
450-
451-
452-
453-
454QImageReader::QImageReader()-
455 : d(new QImageReaderPrivate(this))-
456{-
457}-
458-
459-
460-
461-
462-
463QImageReader::QImageReader(QIODevice *device, const QByteArray &format)-
464 : d(new QImageReaderPrivate(this))-
465{-
466 d->device = device;-
467 d->format = format;-
468}-
469-
470-
471-
472-
473-
474-
475-
476QImageReader::QImageReader(const QString &fileName, const QByteArray &format)-
477 : d(new QImageReaderPrivate(this))-
478{-
479 QFile *file = new QFile(fileName);-
480 d->device = file;-
481 d->deleteDevice = true;-
482 d->format = format;-
483}-
484-
485-
486-
487-
488QImageReader::~QImageReader()-
489{-
490 delete d;-
491}-
492void QImageReader::setFormat(const QByteArray &format)-
493{-
494 d->format = format;-
495}-
496QByteArray QImageReader::format() const-
497{-
498 if (d->format.isEmpty()) {-
499 if (!d->initHandler())-
500 return QByteArray();-
501 return d->handler->canRead() ? d->handler->format() : QByteArray();-
502 }-
503-
504 return d->format;-
505}-
506void QImageReader::setAutoDetectImageFormat(bool enabled)-
507{-
508 d->autoDetectImageFormat = enabled;-
509}-
510-
511-
512-
513-
514-
515-
516-
517bool QImageReader::autoDetectImageFormat() const-
518{-
519 return d->autoDetectImageFormat;-
520}-
521void QImageReader::setDecideFormatFromContent(bool ignored)-
522{-
523 d->ignoresFormatAndExtension = ignored;-
524}-
525bool QImageReader::decideFormatFromContent() const-
526{-
527 return d->ignoresFormatAndExtension;-
528}-
529void QImageReader::setDevice(QIODevice *device)-
530{-
531 if (d->device && d->deleteDevice)-
532 delete d->device;-
533 d->device = device;-
534 d->deleteDevice = false;-
535 delete d->handler;-
536 d->handler = 0;-
537 d->text.clear();-
538}-
539-
540-
541-
542-
543-
544QIODevice *QImageReader::device() const-
545{-
546 return d->device;-
547}-
548void QImageReader::setFileName(const QString &fileName)-
549{-
550 setDevice(new QFile(fileName));-
551 d->deleteDevice = true;-
552}-
553QString QImageReader::fileName() const-
554{-
555 QFile *file = qobject_cast<QFile *>(d->device);-
556 return file ? file->fileName() : QString();-
557}-
558void QImageReader::setQuality(int quality)-
559{-
560 d->quality = quality;-
561}-
562int QImageReader::quality() const-
563{-
564 return d->quality;-
565}-
566QSize QImageReader::size() const-
567{-
568 if (!d->initHandler())-
569 return QSize();-
570-
571 if (d->handler->supportsOption(QImageIOHandler::Size))-
572 return d->handler->option(QImageIOHandler::Size).toSize();-
573-
574 return QSize();-
575}-
576QImage::Format QImageReader::imageFormat() const-
577{-
578 if (!d->initHandler())-
579 return QImage::Format_Invalid;-
580-
581 if (d->handler->supportsOption(QImageIOHandler::ImageFormat))-
582 return (QImage::Format)d->handler->option(QImageIOHandler::ImageFormat).toInt();-
583-
584 return QImage::Format_Invalid;-
585}-
586QStringList QImageReader::textKeys() const-
587{-
588 d->getText();-
589 return d->text.keys();-
590}-
591QString QImageReader::text(const QString &key) const-
592{-
593 d->getText();-
594 return d->text.value(key);-
595}-
596void QImageReader::setClipRect(const QRect &rect)-
597{-
598 d->clipRect = rect;-
599}-
600QRect QImageReader::clipRect() const-
601{-
602 return d->clipRect;-
603}-
604void QImageReader::setScaledSize(const QSize &size)-
605{-
606 d->scaledSize = size;-
607}-
608-
609-
610-
611-
612-
613-
614QSize QImageReader::scaledSize() const-
615{-
616 return d->scaledSize;-
617}-
618void QImageReader::setScaledClipRect(const QRect &rect)-
619{-
620 d->scaledClipRect = rect;-
621}-
622-
623-
624-
625-
626-
627-
628QRect QImageReader::scaledClipRect() const-
629{-
630 return d->scaledClipRect;-
631}-
632void QImageReader::setBackgroundColor(const QColor &color)-
633{-
634 if (!d->initHandler())-
635 return;-
636 if (d->handler->supportsOption(QImageIOHandler::BackgroundColor))-
637 d->handler->setOption(QImageIOHandler::BackgroundColor, color);-
638}-
639QColor QImageReader::backgroundColor() const-
640{-
641 if (!d->initHandler())-
642 return QColor();-
643 if (d->handler->supportsOption(QImageIOHandler::BackgroundColor))-
644 return qvariant_cast<QColor>(d->handler->option(QImageIOHandler::BackgroundColor));-
645 return QColor();-
646}-
647bool QImageReader::supportsAnimation() const-
648{-
649 if (!d->initHandler())-
650 return false;-
651 if (d->handler->supportsOption(QImageIOHandler::Animation))-
652 return d->handler->option(QImageIOHandler::Animation).toBool();-
653 return false;-
654}-
655-
656-
657-
658-
659-
660-
661QByteArray QImageReader::subType() const-
662{-
663 if (!d->initHandler())-
664 return QByteArray();-
665-
666 if (d->handler->supportsOption(QImageIOHandler::SubType))-
667 return d->handler->option(QImageIOHandler::SubType).toByteArray();-
668 return QByteArray();-
669}-
670-
671-
672-
673-
674-
675-
676QList<QByteArray> QImageReader::supportedSubTypes() const-
677{-
678 if (!d->initHandler())-
679 return QList<QByteArray>();-
680-
681 if (!d->handler->supportsOption(QImageIOHandler::SupportedSubTypes))-
682 return d->handler->option(QImageIOHandler::SupportedSubTypes).value< QList<QByteArray> >();-
683 return QList<QByteArray>();-
684}-
685QImageIOHandler::Transformations QImageReader::transformation() const-
686{-
687 int option = QImageIOHandler::TransformationNone;-
688 if (d->initHandler() && d->handler->supportsOption(QImageIOHandler::ImageTransformation))-
689 option = d->handler->option(QImageIOHandler::ImageTransformation).toInt();-
690 return QImageIOHandler::Transformations(option);-
691}-
692void QImageReader::setAutoTransform(bool enabled)-
693{-
694 d->autoTransform = enabled ? QImageReaderPrivate::ApplyTransform-
695 : QImageReaderPrivate::DoNotApplyTransform;-
696}-
697bool QImageReader::autoTransform() const-
698{-
699 switch (d->autoTransform) {-
700 case QImageReaderPrivate::ApplyTransform:-
701 return true;-
702 case QImageReaderPrivate::DoNotApplyTransform:-
703 return false;-
704 case QImageReaderPrivate::UsePluginDefault:-
705 if (d->initHandler())-
706 return d->handler->supportsOption(QImageIOHandler::TransformedByDefault);-
707-
708 default:-
709 break;-
710 }-
711 return false;-
712}-
713void QImageReader::setGamma(float gamma)-
714{-
715 if (d->initHandler() && d->handler->supportsOption(QImageIOHandler::Gamma))-
716 d->handler->setOption(QImageIOHandler::Gamma, gamma);-
717}-
718float QImageReader::gamma() const-
719{-
720 if (d->initHandler() && d->handler->supportsOption(QImageIOHandler::Gamma))-
721 return d->handler->option(QImageIOHandler::Gamma).toFloat();-
722 return 0.0;-
723}-
724bool QImageReader::canRead() const-
725{-
726 if (!d->initHandler())-
727 return false;-
728-
729 return d->handler->canRead();-
730}-
731QImage QImageReader::read()-
732{-
733-
734-
735 QImage image;-
736 return read(&image) ? image : QImage();-
737}-
738-
739extern void qt_imageTransform(QImage &src, QImageIOHandler::Transformations orient);-
740bool QImageReader::read(QImage *image)-
741{-
742 if (!image) {-
743 QMessageLogger(__FILE__, 13061312, __PRETTY_FUNCTION__).warning("QImageReader::read: cannot read into null pointer");-
744 return false;-
745 }-
746-
747 if (!d->handler && !d->initHandler())-
748 return false;-
749-
750-
751 if (d->handler->supportsOption(QImageIOHandler::ScaledSize) && d->scaledSize.isValid()) {-
752 if ((d->handler->supportsOption(QImageIOHandler::ClipRect) && !d->clipRect.isNull())-
753 || d->clipRect.isNull()) {-
754-
755-
756 d->handler->setOption(QImageIOHandler::ScaledSize, d->scaledSize);-
757 }-
758 }-
759 if (d->handler->supportsOption(QImageIOHandler::ClipRect) && !d->clipRect.isNull())-
760 d->handler->setOption(QImageIOHandler::ClipRect, d->clipRect);-
761 if (d->handler->supportsOption(QImageIOHandler::ScaledClipRect) && !d->scaledClipRect.isNull())-
762 d->handler->setOption(QImageIOHandler::ScaledClipRect, d->scaledClipRect);-
763 if (d->handler->supportsOption(QImageIOHandler::Quality))-
764 d->handler->setOption(QImageIOHandler::Quality, d->quality);-
765-
766-
767 if (!d->handler->read(image)) {-
768 d->imageReaderError = InvalidDataError;-
769 d->errorString = QImageReader::tr("Unable to read image data");-
770 return false;-
771 }-
772-
773-
774-
775 if (d->handler->supportsOption(QImageIOHandler::ClipRect) && !d->clipRect.isNull()) {-
776 if (d->handler->supportsOption(QImageIOHandler::ScaledSize) && d->scaledSize.isValid()) {-
777 if (d->handler->supportsOption(QImageIOHandler::ScaledClipRect) && !d->scaledClipRect.isNull()) {-
778-
779 } else {-
780-
781 if (!d->scaledClipRect.isNull())-
782 *image = image->copy(d->scaledClipRect);-
783 }-
784 } else {-
785 if (d->handler->supportsOption(QImageIOHandler::ScaledClipRect) && !d->scaledClipRect.isNull()) {-
786-
787-
788 } else {-
789 if (d->scaledSize.isValid()) {-
790 *image = image->scaled(d->scaledSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);-
791 }-
792 if (d->scaledClipRect.isValid()) {-
793 *image = image->copy(d->scaledClipRect);-
794 }-
795 }-
796 }-
797 } else {-
798 if (d->handler->supportsOption(QImageIOHandler::ScaledSize) && d->scaledSize.isValid() && d->clipRect.isNull()) {-
799 if (d->handler->supportsOption(QImageIOHandler::ScaledClipRect) && !d->scaledClipRect.isNull()) {-
800-
801 } else {-
802-
803 if (d->scaledClipRect.isValid()) {-
804 *image = image->copy(d->scaledClipRect);-
805 }-
806 }-
807 } else {-
808 if (d->handler->supportsOption(QImageIOHandler::ScaledClipRect) && !d->scaledClipRect.isNull()) {-
809-
810-
811-
812 } else {-
813-
814 if (d->clipRect.isValid())-
815 *image = image->copy(d->clipRect);-
816 if (d->scaledSize.isValid())-
817 *image = image->scaled(d->scaledSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);-
818 if (d->scaledClipRect.isValid())-
819 *image = image->copy(d->scaledClipRect);-
820 }-
821 }-
822 }-
823-
824-
825 static bool disable2xImageLoading = !qEnvironmentVariableIsEmpty("QT_HIGHDPI_DISABLE_2X_IMAGE_LOADING");-
826 if (!disable2xImageLoading && QFileInfo(fileName()).baseName().endsWith(QLatin1String("@2x"))) {-
827 image->setDevicePixelRatio(2.0);-
828 }-
829 if (autoTransform())-
830 qt_imageTransform(*image, transformation());-
831-
832 return true;-
833}-
834bool QImageReader::jumpToNextImage()-
835{-
836 if (!d->initHandler())-
837 return false;-
838 return d->handler->jumpToNextImage();-
839}-
840bool QImageReader::jumpToImage(int imageNumber)-
841{-
842 if (!d->initHandler())-
843 return false;-
844 return d->handler->jumpToImage(imageNumber);-
845}-
846int QImageReader::loopCount() const-
847{-
848 if (!d->initHandler())-
849 return -1;-
850 return d->handler->loopCount();-
851}-
852int QImageReader::imageCount() const-
853{-
854 if (!d->initHandler())-
855 return -1;-
856 return d->handler->imageCount();-
857}-
858int QImageReader::nextImageDelay() const-
859{-
860 if (!d->initHandler())-
861 return -1;-
862 return d->handler->nextImageDelay();-
863}-
864int QImageReader::currentImageNumber() const-
865{-
866 if (!d->initHandler())-
867 return -1;-
868 return d->handler->currentImageNumber();-
869}-
870-
871-
872-
873-
874-
875-
876-
877QRect QImageReader::currentImageRect() const-
878{-
879 if (!d->initHandler())-
880 return QRect();-
881 return d->handler->currentImageRect();-
882}-
883-
884-
885-
886-
887-
888-
889QImageReader::ImageReaderError QImageReader::error() const-
890{-
891 return d->imageReaderError;-
892}-
893-
894-
895-
896-
897-
898-
899-
900QString QImageReader::errorString() const-
901{-
902 if (d->errorString.isEmpty())-
903 return QImageReader::tr("Unknown error");-
904 return d->errorString;-
905}-
906bool QImageReader::supportsOption(QImageIOHandler::ImageOption option) const-
907{-
908 if (!d->initHandler())-
909 return false;-
910 return d->handler->supportsOption(option);-
911}-
912-
913-
914-
915-
916-
917QByteArray QImageReader::imageFormat(const QString &fileName)-
918{-
919 QFile file(fileName);-
920 if (!file.open(QFile::ReadOnly))-
921 return QByteArray();-
922-
923 return imageFormat(&file);-
924}-
925-
926-
927-
928-
929-
930-
931-
932QByteArray QImageReader::imageFormat(QIODevice *device)-
933{-
934 QByteArray format;-
935 QImageIOHandler *handler = createReadHandlerHelper(device, format, true, false);-
936 if (handler) {-
937 if (handler->canRead())-
938 format = handler->format();-
939 delete handler;-
940 }-
941 return format;-
942}-
943-
944-
945void supportedImageHandlerFormats(QFactoryLoader *loader,-
946 QImageIOPlugin::Capability cap,-
947 QList<QByteArray> *result);-
948-
949void supportedImageHandlerMimeTypes(QFactoryLoader *loader,-
950 QImageIOPlugin::Capability cap,-
951 QList<QByteArray> *result);-
952QList<QByteArray> QImageReader::supportedImageFormats()-
953{-
954 QList<QByteArray> formats;-
955 formats.reserve(_qt_NumFormats);-
956 for (int i = 0; i < _qt_NumFormats; ++i)-
957 formats << _qt_BuiltInFormats[i].extension;-
958-
959-
960 supportedImageHandlerFormats(loader(), QImageIOPlugin::CanRead, &formats);-
961-
962-
963 std::sort(formats.begin(), formats.end());-
964 formats.erase(std::unique(formats.begin(), formats.end()), formats.end());-
965 return formats;-
966}-
967QList<QByteArray> QImageReader::supportedMimeTypes()-
968{-
969 QList<QByteArray> mimeTypes;-
970 mimeTypes.reserve(_qt_NumFormats);-
971 for (int i = 0; i < _qt_NumFormats; ++i)-
972 mimeTypes << _qt_BuiltInFormats[i].mimeType;-
973-
974-
975 supportedImageHandlerMimeTypes(loader(), QImageIOPlugin::CanRead, &mimeTypes);-
976-
977-
978 std::sort(mimeTypes.begin(), mimeTypes.end());-
979 mimeTypes.erase(std::unique(mimeTypes.begin(), mimeTypes.end()), mimeTypes.end());-
980 return mimeTypes;-
981}-
982-
983-
Switch to Source codePreprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9