-rw-r--r-- | library/resource.cpp | 125 |
1 files changed, 98 insertions, 27 deletions
diff --git a/library/resource.cpp b/library/resource.cpp index 0915c45..0db2a75 100644 --- a/library/resource.cpp +++ b/library/resource.cpp @@ -1,6 +1,6 @@ /********************************************************************** -** Copyright (C) 2000 Trolltech AS. All rights reserved. +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** -** This file is part of Qtopia Environment. +** This file is part of the Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the @@ -19,6 +19,8 @@ **********************************************************************/ +#define QTOPIA_INTERNAL_MIMEEXT #include "qpeapplication.h" #include "resource.h" +#include "mimetype.h" #include <qdir.h> #include <qfile.h> @@ -34,4 +36,12 @@ The resources may be provided from files or other sources. + + The allSounds() function returns a list of all the sounds available. + A particular sound can be searched for using findSound(). + + Images can be loaded with loadImage(), loadPixmap(), loadBitmap() + and loadIconSet(). + + \ingroup qtopiaemb */ @@ -42,8 +52,8 @@ /*! - Returns the QPixmap named \a pix. You should avoid including - any filename type extension (eg. .png, .xpm). + Returns the QPixmap called \a pix. You should avoid including + any filename type extension (e.g. .png, .xpm). */ -QPixmap Resource::loadPixmap( const QString &pix ) +QPixmap Resource::loadPixmap( const QString &pix ) { QPixmap pm; @@ -57,8 +67,8 @@ QPixmap Resource::loadPixmap( const QString &pix ) /*! - Returns the QBitmap named \a pix. You should avoid including - any filename type extension (eg. .png, .xpm). + Returns the QBitmap called \a pix. You should avoid including + any filename type extension (e.g. .png, .xpm). */ -QBitmap Resource::loadBitmap( const QString &pix ) +QBitmap Resource::loadBitmap( const QString &pix ) { QBitmap bm; @@ -68,6 +78,6 @@ QBitmap Resource::loadBitmap( const QString &pix ) /*! - Returns the filename of a pixmap named \a pix. You should avoid including - any filename type extension (eg. .png, .xpm .jpg .jpeg). + Returns the filename of a pixmap called \a pix. You should avoid including + any filename type extension (e.g. .png, .xpm). Normally you will use loadPixmap() rather than this function. @@ -77,13 +87,29 @@ QString Resource::findPixmap( const QString &pix ) QString picsPath = QPEApplication::qpeDir() + "pics/"; - if ( QFile( picsPath + pix + ".png").exists() ) - return picsPath + pix + ".png"; - else if ( QFile( picsPath + pix + ".jpeg").exists() ) - return picsPath + pix + ".jpeg"; - else if ( QFile( picsPath + pix + ".jpg").exists() ) - return picsPath + pix + ".jpg"; - else if ( QFile( picsPath + pix + ".xpm").exists() ) - return picsPath + pix + ".xpm"; - else if ( QFile( picsPath + pix ).exists() ) + QString f; + + // Common case optimizations... + f = picsPath + pix + ".png"; + if ( QFile( f ).exists() ) + return f; + f = picsPath + pix + ".xpm"; + if ( QFile( f ).exists() ) + return f; + + // All formats... + QStrList fileFormats = QImageIO::inputFormats(); + QString ff = fileFormats.first(); + while ( fileFormats.current() ) { + QStringList exts = MimeType("image/"+ff.lower()).extensions(); + for ( QStringList::ConstIterator it = exts.begin(); it!=exts.end(); ++it ) { + QString f = picsPath + pix + "." + *it; + if ( QFile(f).exists() ) + return f; + } + ff = fileFormats.next(); + } + + // Finally, no (or existing) extension... + if ( QFile( picsPath + pix ).exists() ) return picsPath + pix; @@ -93,6 +119,11 @@ QString Resource::findPixmap( const QString &pix ) /*! - Returns a sound file for a sound named \a name. - You should avoid including any filename type extension (eg. .wav, .au, .mp3). + Returns a sound file for a sound called \a name. + + You should avoid including any filename type extension (e.g. .wav), + as the system will search for only those fileformats which are supported + by the library. + + Currently, only WAV files are supported. */ QString Resource::findSound( const QString &name ) @@ -120,18 +151,58 @@ QStringList Resource::allSounds() } +static QImage load_image(const QString &name) +{ + QImage img = qembed_findImage(name.latin1()); + if ( img.isNull() ) { + // No inlined image, try file + QString f = Resource::findPixmap(name); + if ( !f.isEmpty() ) + img.load(f); + } + return img; +} + /*! - Returns the QImage named \a name. You should avoid including - any filename type extension (eg. .png, .xpm .jpg). + Returns the QImage called \a name. You should avoid including + any filename type extension (e.g. .png, .xpm). */ QImage Resource::loadImage( const QString &name) { - QImage img = qembed_findImage(name.latin1()); - if ( img.isNull() ) - return QImage(findPixmap(name)); +#ifndef QT_NO_DEPTH_32 // have alpha-blended pixmaps + static QImage last_enabled; + static QString last_enabled_name; + if ( name == last_enabled_name ) + return last_enabled; +#endif + QImage img = load_image(name); +#ifndef QT_NO_DEPTH_32 // have alpha-blended pixmaps + if ( img.isNull() ) { + // No file, try generating + if ( name[name.length()-1]=='d' && name.right(9)=="_disabled" ) { + last_enabled_name = name.left(name.length()-9); + last_enabled = load_image(last_enabled_name); + if ( last_enabled.isNull() ) { + last_enabled_name = QString::null; + } else { + img.detach(); + img.create( last_enabled.width(), last_enabled.height(), 32 ); + for ( int y = 0; y < img.height(); y++ ) { + for ( int x = 0; x < img.width(); x++ ) { + QRgb p = last_enabled.pixel( x, y ); + int a = qAlpha(p)/3; + int g = qGray(qRed(p),qGreen(p),qBlue(p)); + img.setPixel( x, y, qRgba(g,g,g,a) ); + } + } + img.setAlphaBuffer( TRUE ); + } + } + } +#endif return img; } /*! - \fn QIconSet Resource::loadIconSet( const QString &name ) + \fn QIconSet Resource::loadIconSet( const QString &name ) Returns a QIconSet for the pixmap named \a name. A disabled icon is |