Source Code (Use browser search to find items of interest.)
Class Index
qt'QImageDecoder (./qt-2.1.0/src/kernel/qasyncimageio.h:69)
class Q_EXPORT QImageDecoder {
public:
QImageDecoder( QImageConsumer* c );
~QImageDecoder();
const QImage& image() { return img; }
int decode( const uchar* buffer, int length );
static const char* formatName( const uchar* buffer, int length );
static QImageFormatType* format( const char* name ); // direct use - no decode()
static QStrList inputFormats();
static void registerDecoderFactory( QImageFormatType* );
static void unregisterDecoderFactory( QImageFormatType* );
private:
QImageFormat* actual_decoder;
QImageConsumer* consumer;
QImage img;
QImageDecoderPrivate *d;
};
qt'QImageDecoder::QImageDecoder() (./qt-2.1.0/src/kernel/qasyncimageio.cpp:293)
QImageDecoder::QImageDecoder(QImageConsumer* c)
{
d = new QImageDecoderPrivate;
CHECK_PTR(d);
consumer = c;
actual_decoder = 0;
}
/*!
Destroys a QImageDecoder. The image it built is destroyed. The decoder
built by the factory for the file format is destroyed. The consumer
for which it decoded the image is \e not destroyed.
*/
qt'QImageDecoder::~QImageDecoder() (./qt-2.1.0/src/kernel/qasyncimageio.cpp:306)
QImageDecoder::~QImageDecoder()
{
delete d;
delete actual_decoder;
}
/*!
\fn const QImage& QImageDecoder::image()
Returns the image currently being decoded.
*/
/*!
Call this function to decode some data into image changes. The data
will be decoded, sending change information to the QImageConsumer of
this QImageDecoder, until one of the change functions of the consumer
returns FALSE.
Returns the number of bytes consumed, 0 if consumption is complete,
and -1 if decoding fails due to invalid data.
*/
qt'QImageDecoder::decode() (./qt-2.1.0/src/kernel/qasyncimageio.cpp:327)
int QImageDecoder::decode(const uchar* buffer, int length)
{
if (actual_decoder) {
return actual_decoder->decode(img, consumer, buffer, length);
} else {
int consumed=0;
while (consumed < length && d->count < max_header) {
d->header[d->count++] = buffer[consumed++];
}
QImageDecoderPrivate::ensureFactories();
for (QImageFormatType* f = QImageDecoderPrivate::factories->first();
f && !actual_decoder;
f = QImageDecoderPrivate::factories->next())
{
actual_decoder = f->decoderFor(d->header, d->count);
}
if (actual_decoder) {
uchar* b = d->header;
int more = 1;
while (d->count > 0) {
more = actual_decoder->decode(img, consumer, b, d->count);
if ( more <= 0 ) break;
d->count -= more;
b += more;
}
if (more <= 0) {
// Decoder must have failed. Input not valid. We assume
// consumer has been notified.
delete actual_decoder;
actual_decoder = 0;
return more;
}
}
return consumed;
}
}
/*!
Returns a QImageFormatType by name. This might be used in cases where
the user needs to force data to be interpretted as being in a certain
format. \a name is one of the formats listed by
QImageDecoder::inputFormats(). Note that you will still need to supply
decodable data to result->decoderFor() before you can begin decoding
the data.
*/
qt'QImageDecoder::format() (./qt-2.1.0/src/kernel/qasyncimageio.cpp:376)
QImageFormatType* QImageDecoder::format( const char* name )
{
for (QImageFormatType* f = QImageDecoderPrivate::factories->first();
f;
f = QImageDecoderPrivate::factories->next())
{
if ( stricmp(name,f->formatName())==0 )
return f;
}
return 0;
}
/*!
Call this function to find the name of the format of the given header.
The returned string is statically allocated.
Returns 0 if the format is not recognized.
*/
qt'QImageDecoder::formatName() (./qt-2.1.0/src/kernel/qasyncimageio.cpp:394)
const char* QImageDecoder::formatName(const uchar* buffer, int length)
{
QImageDecoderPrivate::ensureFactories();
const char* name = 0;
for (QImageFormatType* f = QImageDecoderPrivate::factories->first();
f && !name;
f = QImageDecoderPrivate::factories->next())
{
QImageFormat *decoder = f->decoderFor(buffer, length);
if (decoder) {
name = f->formatName();
delete decoder;
}
}
return name;
}
/*!
Returns a sorted list of formats for which asynchronous loading is supported.
*/
qt'QImageDecoder::inputFormats() (./qt-2.1.0/src/kernel/qasyncimageio.cpp:415)
QStrList QImageDecoder::inputFormats()
{
QImageDecoderPrivate::ensureFactories();
QStrList result;
for (QImageFormatType* f = QImageDecoderPrivate::factories->first();
f;
f = QImageDecoderPrivate::factories->next())
{
if ( !result.contains( f->formatName() ) ) {
result.inSort( f->formatName() );
}
}
return result;
}
/*!
Registers a new QImageFormatType. This is not needed in
application code as factories call this themselves.
*/
qt'QImageDecoder::registerDecoderFactory() (./qt-2.1.0/src/kernel/qasyncimageio.cpp:437)
void QImageDecoder::registerDecoderFactory(QImageFormatType* f)
{
QImageDecoderPrivate::ensureFactories();
QImageDecoderPrivate::factories->insert(0,f);
}
/*!
Unregisters a new QImageFormatType. This is not needed in
application code as factories call this themselves.
*/
qt'QImageDecoder::unregisterDecoderFactory() (./qt-2.1.0/src/kernel/qasyncimageio.cpp:448)
void QImageDecoder::unregisterDecoderFactory(QImageFormatType* f)
{
if ( !QImageDecoderPrivate::factories )
return;
QImageDecoderPrivate::factories->remove(f);
}
/*!
\class QImageFormat qasyncimageio.h
\brief Incremental image decoder for a specific image format.
\ingroup images
By making a derived classes of QImageFormatType which in turn
creates objects that are a subclass of QImageFormat, you can add
support for more incremental image formats, allowing such formats to
be sources for a QMovie, or for the first frame of the image stream
to be loaded as a QImage or QPixmap.
Your new subclass must reimplement the decode() function in order to
process your new format.
New QImageFormat objects are generated by new QImageFormatType factories.
*/
/*!
Destructs the object.
\internal
More importantly, destructs derived classes.
*/