source: trunk/src/gui/image/qimageiohandler.cpp@ 621

Last change on this file since 621 was 561, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.1 sources.

File size: 17.6 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the QtGui module of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42/*!
43 \class QImageIOHandler
44 \brief The QImageIOHandler class defines the common image I/O
45 interface for all image formats in Qt.
46 \reentrant
47
48 Qt uses QImageIOHandler for reading and writing images through
49 QImageReader and QImageWriter. You can also derive from this class
50 to write your own image format handler using Qt's plugin mechanism.
51
52 Call setDevice() to assign a device to the handler, and
53 setFormat() to assign a format to it. One QImageIOHandler may
54 support more than one image format. canRead() returns true if an
55 image can be read from the device, and read() and write() return
56 true if reading or writing an image was completed successfully.
57
58 QImageIOHandler also has support for animations formats, through
59 the functions loopCount(), imageCount(), nextImageDelay() and
60 currentImageNumber().
61
62 In order to determine what options an image handler supports, Qt
63 will call supportsOption() and setOption(). Make sure to
64 reimplement these functions if you can provide support for any of
65 the options in the ImageOption enum.
66
67 To write your own image handler, you must at least reimplement
68 canRead() and read(). Then create a QImageIOPlugin that
69 can create the handler. Finally, install your plugin, and
70 QImageReader and QImageWriter will then automatically load the
71 plugin, and start using it.
72
73 \sa QImageIOPlugin, QImageReader, QImageWriter
74*/
75
76/*! \enum QImageIOHandler::ImageOption
77
78 This enum describes the different options supported by
79 QImageIOHandler. Some options are used to query an image for
80 properties, and others are used to toggle the way in which an
81 image should be written.
82
83 \value Size The original size of an image. A handler that supports
84 this option is expected to read the size of the image from the
85 image metadata, and return this size from option() as a QSize.
86
87 \value ClipRect The clip rect, or ROI (Region Of Interest). A
88 handler that supports this option is expected to only read the
89 provided QRect area from the original image in read(), before any
90 other transformation is applied.
91
92 \value ScaledSize The scaled size of the image. A handler that
93 supports this option is expected to scale the image to the
94 provided size (a QSize), after applying any clip rect
95 transformation (ClipRect). If the handler does not support this
96 option, QImageReader will perform the scaling after the image has
97 been read.
98
99 \value ScaledClipRect The scaled clip rect (or ROI, Region Of
100 Interest) of the image. A handler that supports this option is
101 expected to apply the provided clip rect (a QRect), after applying
102 any scaling (ScaleSize) or regular clipping (ClipRect). If the
103 handler does not support this option, QImageReader will apply the
104 scaled clip rect after the image has been read.
105
106 \value Description The image description. Some image formats,
107 such as GIF and PNG, allow embedding of text
108 or comments into the image data (e.g., for storing copyright
109 information). It's common that the text is stored in key-value
110 pairs, but some formats store all text in one continuous block.
111 QImageIOHandler returns the text as one
112 QString, where keys and values are separated by a ':', and
113 keys-value pairs are separated by two newlines (\\n\\n). For example,
114 "Title: Sunset\\n\\nAuthor: Jim Smith\\nSarah Jones\\n\\n". Formats that
115 store text in a single block can use "Description" as the key.
116
117 \value CompressionRatio The compression ratio of the image data. A
118 handler that supports this option is expected to set its
119 compression rate depending on the value of this option (an int)
120 when writing.
121
122 \value Gamma The gamma level of the image. A handler that supports
123 this option is expected to set the image gamma level depending on
124 the value of this option (a float) when writing.
125
126 \value Quality The quality level of the image. A handler that
127 supports this option is expected to set the image quality level
128 depending on the value of this option (an int) when writing.
129
130 \value Name The name of the image. A handler that supports this
131 option is expected to read the name from the image metadata and
132 return this as a QString, or when writing an image it is expected
133 to store the name in the image metadata.
134
135 \value SubType The subtype of the image. A handler that supports
136 this option can use the subtype value to help when reading and
137 writing images. For example, a PPM handler may have a subtype
138 value of "ppm" or "ppmraw".
139
140 \value IncrementalReading A handler that supports this option is
141 expected to read the image in several passes, as if it was an
142 animation. QImageReader will treat the image as an animation.
143
144 \value Endianness The endianness of the image. Certain image
145 formats can be stored as BigEndian or LittleEndian. A handler that
146 supports Endianness uses the value of this option to determine how
147 the image should be stored.
148
149 \value Animation Image formats that support animation return
150 true for this value in supportsOption(); otherwise, false is returned.
151
152 \value BackgroundColor Certain image formats allow the
153 background color to be specified. A handler that supports
154 BackgroundColor initializes the background color to this option
155 (a QColor) when reading an image.
156
157 \value ImageFormat The image's data format returned by the handler.
158 This can be any of the formats listed in QImage::Format.
159*/
160
161/*!
162 \class QImageIOPlugin
163 \brief The QImageIOPlugin class defines an interface for writing
164 an image format plugin.
165 \reentrant
166
167 \ingroup plugins
168
169 QImageIOPlugin is a factory for creating QImageIOHandler objects,
170 which are used internally by QImageReader and QImageWriter to add
171 support for different image formats to Qt.
172
173 Writing an image I/O plugin is achieved by subclassing this
174 base class, reimplementing the pure virtual functions capabilities(),
175 create(), and keys(), and exporting the class with the
176 Q_EXPORT_PLUGIN2() macro. See \l{How to Create Qt Plugins} for details.
177
178 An image format plugin can support three capabilities: reading (\l
179 CanRead), writing (\l CanWrite) and \e incremental reading (\l
180 CanReadIncremental). Reimplement capabilities() in you subclass to
181 expose the capabilities of your image format.
182
183 create() should create an instance of your QImageIOHandler
184 subclass, with the provided device and format properly set, and
185 return this handler. You must also reimplement keys() so that Qt
186 knows which image formats your plugin supports.
187
188 Different plugins can support different capabilities. For example,
189 you may have one plugin that supports reading the GIF format, and
190 another that supports writing. Qt will select the correct plugin
191 for the job, depending on the return value of capabilities(). If
192 several plugins support the same capability, Qt will select one
193 arbitrarily.
194
195 \sa QImageIOHandler, {How to Create Qt Plugins}
196*/
197
198/*!
199 \enum QImageIOPlugin::Capability
200
201 This enum describes the capabilities of a QImageIOPlugin.
202
203 \value CanRead The plugin can read images.
204 \value CanWrite The plugin can write images.
205 \value CanReadIncremental The plugin can read images incrementally.
206*/
207
208/*!
209 \class QImageIOHandlerFactoryInterface
210 \brief The QImageIOHandlerFactoryInterface class provides the factory
211 interface for QImageIOPlugin.
212 \reentrant
213
214 \internal
215
216 \sa QImageIOPlugin
217*/
218
219#include "qimageiohandler.h"
220
221#include <qbytearray.h>
222#include <qimage.h>
223#include <qvariant.h>
224
225QT_BEGIN_NAMESPACE
226
227class QIODevice;
228
229class QImageIOHandlerPrivate
230{
231 Q_DECLARE_PUBLIC(QImageIOHandler)
232public:
233 QImageIOHandlerPrivate(QImageIOHandler *q);
234 virtual ~QImageIOHandlerPrivate();
235
236 QIODevice *device;
237 mutable QByteArray format;
238
239 QImageIOHandler *q_ptr;
240};
241
242QImageIOHandlerPrivate::QImageIOHandlerPrivate(QImageIOHandler *q)
243{
244 device = 0;
245 q_ptr = q;
246}
247
248QImageIOHandlerPrivate::~QImageIOHandlerPrivate()
249{
250}
251
252/*!
253 Constructs a QImageIOHandler object.
254*/
255QImageIOHandler::QImageIOHandler()
256 : d_ptr(new QImageIOHandlerPrivate(this))
257{
258}
259
260/*! \internal
261
262 Constructs a QImageIOHandler object, using the private member \a
263 dd.
264*/
265QImageIOHandler::QImageIOHandler(QImageIOHandlerPrivate &dd)
266 : d_ptr(&dd)
267{
268}
269
270/*!
271 Destructs the QImageIOHandler object.
272*/
273QImageIOHandler::~QImageIOHandler()
274{
275}
276
277/*!
278 Sets the device of the QImageIOHandler to \a device. The image
279 handler will use this device when reading and writing images.
280
281 The device can only be set once and must be set before calling
282 canRead(), read(), write(), etc. If you need to read multiple
283 files, construct multiple instances of the appropriate
284 QImageIOHandler subclass.
285
286 \sa device()
287*/
288void QImageIOHandler::setDevice(QIODevice *device)
289{
290 Q_D(QImageIOHandler);
291 d->device = device;
292}
293
294/*!
295 Returns the device currently assigned to the QImageIOHandler. If
296 not device has been assigned, 0 is returned.
297*/
298QIODevice *QImageIOHandler::device() const
299{
300 Q_D(const QImageIOHandler);
301 return d->device;
302}
303
304/*!
305 Sets the format of the QImageIOHandler to \a format. The format is
306 most useful for handlers that support multiple image formats.
307
308 \sa format()
309*/
310void QImageIOHandler::setFormat(const QByteArray &format)
311{
312 Q_D(QImageIOHandler);
313 d->format = format;
314}
315
316/*!
317 Sets the format of the QImageIOHandler to \a format. The format is
318 most useful for handlers that support multiple image formats.
319
320 This function is declared const so that it can be called from canRead().
321
322 \sa format()
323*/
324void QImageIOHandler::setFormat(const QByteArray &format) const
325{
326 Q_D(const QImageIOHandler);
327 d->format = format;
328}
329
330/*!
331 Returns the format that is currently assigned to
332 QImageIOHandler. If no format has been assigned, an empty string
333 is returned.
334
335 \sa setFormat()
336*/
337QByteArray QImageIOHandler::format() const
338{
339 Q_D(const QImageIOHandler);
340 return d->format;
341}
342
343/*!
344 \fn bool QImageIOHandler::read(QImage *image)
345
346 Read an image from the device, and stores it in \a image.
347 Returns true if the image is successfully read; otherwise returns
348 false.
349
350 For image formats that support incremental loading, and for animation
351 formats, the image handler can assume that \a image points to the
352 previous frame.
353
354 \sa canRead()
355*/
356
357/*!
358 \fn bool QImageIOHandler::canRead() const
359
360 Returns true if an image can be read from the device (i.e., the
361 image format is supported, the device can be read from and the
362 initial header information suggests that the image can be read);
363 otherwise returns false.
364
365 When reimplementing canRead(), make sure that the I/O device
366 (device()) is left in its original state (e.g., by using peek()
367 rather than read()).
368
369 \sa read(), QIODevice::peek()
370*/
371
372/*!
373 \obsolete
374
375 Use format() instead.
376*/
377
378QByteArray QImageIOHandler::name() const
379{
380 return format();
381}
382
383/*!
384 Writes the image \a image to the assigned device. Returns true on
385 success; otherwise returns false.
386
387 The default implementation does nothing, and simply returns false.
388*/
389bool QImageIOHandler::write(const QImage &image)
390{
391 Q_UNUSED(image);
392 return false;
393}
394
395/*!
396 Sets the option \a option with the value \a value.
397
398 \sa option(), ImageOption
399*/
400void QImageIOHandler::setOption(ImageOption option, const QVariant &value)
401{
402 Q_UNUSED(option);
403 Q_UNUSED(value);
404}
405
406/*!
407 Returns the value assigned to \a option as a QVariant. The type of
408 the value depends on the option. For example, option(Size) returns
409 a QSize variant.
410
411 \sa setOption(), supportsOption()
412*/
413QVariant QImageIOHandler::option(ImageOption option) const
414{
415 Q_UNUSED(option);
416 return QVariant();
417}
418
419/*!
420 Returns true if the QImageIOHandler supports the option \a option;
421 otherwise returns false. For example, if the QImageIOHandler
422 supports the \l Size option, supportsOption(Size) must return
423 true.
424
425 \sa setOption(), option()
426*/
427bool QImageIOHandler::supportsOption(ImageOption option) const
428{
429 Q_UNUSED(option);
430 return false;
431}
432
433/*!
434 For image formats that support animation, this function returns
435 the sequence number of the current image in the animation. If
436 this function is called before any image is read(), -1 is
437 returned. The number of the first image in the sequence is 0.
438
439 If the image format does not support animation, 0 is returned.
440
441 \sa read()
442*/
443int QImageIOHandler::currentImageNumber() const
444{
445 return 0;
446}
447
448/*!
449 Returns the rect of the current image. If no rect is defined for the
450 image, and empty QRect() is returned.
451
452 This function is useful for animations, where only parts of the frame
453 may be updated at a time.
454*/
455QRect QImageIOHandler::currentImageRect() const
456{
457 return QRect();
458}
459
460/*!
461 For image formats that support animation, this function returns
462 the number of images in the animation. If the image format does
463 not support animation, or if it is unable to determine the number
464 of images, 0 is returned.
465
466 The default implementation returns 1 if canRead() returns true;
467 otherwise 0 is returned.
468*/
469int QImageIOHandler::imageCount() const
470{
471 return canRead() ? 1 : 0;
472}
473
474/*!
475 For image formats that support animation, this function jumps to the
476 next image.
477
478 The default implementation does nothing, and returns false.
479*/
480bool QImageIOHandler::jumpToNextImage()
481{
482 return false;
483}
484
485/*!
486 For image formats that support animation, this function jumps to the image
487 whose sequence number is \a imageNumber. The next call to read() will
488 attempt to read this image.
489
490 The default implementation does nothing, and returns false.
491*/
492bool QImageIOHandler::jumpToImage(int imageNumber)
493{
494 Q_UNUSED(imageNumber);
495 return false;
496}
497
498/*!
499 For image formats that support animation, this function returns
500 the number of times the animation should loop. If the image format
501 does not support animation, 0 is returned.
502*/
503int QImageIOHandler::loopCount() const
504{
505 return 0;
506}
507
508/*!
509 For image formats that support animation, this function returns
510 the number of milliseconds to wait until reading the next
511 image. If the image format does not support animation, 0 is
512 returned.
513*/
514int QImageIOHandler::nextImageDelay() const
515{
516 return 0;
517}
518
519/*!
520 Constructs an image plugin with the given \a parent. This is
521 invoked automatically by the Q_EXPORT_PLUGIN2() macro.
522*/
523QImageIOPlugin::QImageIOPlugin(QObject *parent)
524 : QObject(parent)
525{
526}
527
528/*!
529 Destroys the picture format plugin.
530
531 You never have to call this explicitly. Qt destroys a plugin
532 automatically when it is no longer used.
533*/
534QImageIOPlugin::~QImageIOPlugin()
535{
536}
537
538/*! \fn QImageIOPlugin::capabilities(QIODevice *device, const QByteArray &format) const
539
540 Returns the capabilities on the plugin, based on the data in \a
541 device and the format \a format. For example, if the
542 QImageIOHandler supports the BMP format, and the data in the
543 device starts with the characters "BM", this function should
544 return \l CanRead. If \a format is "bmp" and the handler supports
545 both reading and writing, this function should return \l CanRead |
546 \l CanWrite.
547*/
548
549/*!
550 \fn QImageIOPlugin::keys() const
551
552 Returns the list of image keys this plugin supports.
553
554 These keys are usually the names of the image formats that are implemented
555 in the plugin (e.g., "jpg" or "gif").
556
557 \sa capabilities()
558*/
559
560/*!
561 \fn QImageIOHandler *QImageIOPlugin::create(QIODevice *device, const QByteArray &format) const
562
563 Creates and returns a QImageIOHandler subclass, with \a device
564 and \a format set. The \a format must come from the list returned by keys().
565 Format names are case sensitive.
566
567 \sa keys()
568*/
569
570QT_END_NAMESPACE
Note: See TracBrowser for help on using the repository browser.