src/gui/image/qimageiohandler.cpp
changeset 0 1918ee327afb
child 4 3b1da2848fc7
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the QtGui module of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    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 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    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 
       
   225 QT_BEGIN_NAMESPACE
       
   226 
       
   227 class QIODevice;
       
   228 
       
   229 class QImageIOHandlerPrivate
       
   230 {
       
   231     Q_DECLARE_PUBLIC(QImageIOHandler)
       
   232 public:
       
   233     QImageIOHandlerPrivate(QImageIOHandler *q);
       
   234     virtual ~QImageIOHandlerPrivate();
       
   235 
       
   236     QIODevice *device;
       
   237     mutable QByteArray format;
       
   238 
       
   239     QImageIOHandler *q_ptr;
       
   240 };
       
   241 
       
   242 QImageIOHandlerPrivate::QImageIOHandlerPrivate(QImageIOHandler *q)
       
   243 {
       
   244     device = 0;
       
   245     q_ptr = q;
       
   246 }
       
   247 
       
   248 QImageIOHandlerPrivate::~QImageIOHandlerPrivate()
       
   249 {
       
   250 }
       
   251 
       
   252 /*!
       
   253     Constructs a QImageIOHandler object.
       
   254 */
       
   255 QImageIOHandler::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 */
       
   265 QImageIOHandler::QImageIOHandler(QImageIOHandlerPrivate &dd)
       
   266     : d_ptr(&dd)
       
   267 {
       
   268 }
       
   269 
       
   270 /*!
       
   271     Destructs the QImageIOHandler object.
       
   272 */
       
   273 QImageIOHandler::~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 */
       
   288 void 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 */
       
   298 QIODevice *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 */
       
   310 void 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 */
       
   324 void 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 */
       
   337 QByteArray 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 
       
   378 QByteArray 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 */
       
   389 bool 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 */
       
   400 void 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 */
       
   413 QVariant 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 */
       
   427 bool 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 */
       
   443 int 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 */
       
   455 QRect 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 */
       
   469 int 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 */
       
   480 bool 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 */
       
   492 bool 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 */
       
   503 int 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 */
       
   514 int 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 */
       
   523 QImageIOPlugin::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 */
       
   534 QImageIOPlugin::~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 
       
   570 QT_END_NAMESPACE