summaryrefslogtreecommitdiff
path: root/library/resource.cpp
authorzecke <zecke>2005-04-04 20:23:39 (UTC)
committer zecke <zecke>2005-04-04 20:23:39 (UTC)
commit8ea4d025ded75eee0918258121d54273aead66ad (patch) (unidiff)
tree9fd3ac0d4c355cc3e5c7345b2de8c7edd3b60db1 /library/resource.cpp
parentbe7d04d2b402e5515cfac3a2b32ed5831e15340b (diff)
downloadopie-8ea4d025ded75eee0918258121d54273aead66ad.zip
opie-8ea4d025ded75eee0918258121d54273aead66ad.tar.gz
opie-8ea4d025ded75eee0918258121d54273aead66ad.tar.bz2
Speed up start times of applications:
-Do not load MimeType when using Resource::loadIconSet we introduce a global boolean (like TT) What is bad: The boolean is visible outside of libqpe and we've that extern in the header... On the former we can use visibility attributes soon
Diffstat (limited to 'library/resource.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--library/resource.cpp35
1 files changed, 23 insertions, 12 deletions
diff --git a/library/resource.cpp b/library/resource.cpp
index 18139b9..da09892 100644
--- a/library/resource.cpp
+++ b/library/resource.cpp
@@ -1,255 +1,266 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. 2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of the Qtopia Environment. 4** This file is part of the Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20 20
21#define QTOPIA_INTERNAL_MIMEEXT 21#define QTOPIA_INTERNAL_MIMEEXT
22#include <qpe/qpeapplication.h> 22#include <qpe/qpeapplication.h>
23#include "resource.h" 23#include "resource.h"
24#include "mimetype.h" 24#include "mimetype.h"
25#include <qdir.h> 25#include <qdir.h>
26#include <qpixmapcache.h> 26#include <qpixmapcache.h>
27 27
28/*
29 * enable or disable the search for the icon without .png or .xpm
30 * suffix. We would use MimeType to lookup possible extensions...
31 */
32bool qpe_fast_findPixmap = false; // visible in libqpe
33
28// this namespace is just a workaround for a gcc bug 34// this namespace is just a workaround for a gcc bug
29// gcc exports inline functions in the generated file 35// gcc exports inline functions in the generated file
30// inlinepics_p.h 36// inlinepics_p.h
31 37
32#ifndef LIBQPE_NO_INLINE_IMAGES 38#ifndef LIBQPE_NO_INLINE_IMAGES
33namespace { 39namespace {
34#include "inlinepics_p.h" 40#include "inlinepics_p.h"
35} 41}
36#endif 42#endif
37 43
38/*! 44/*!
39 \class Resource resource.h 45 \class Resource resource.h
40 \brief The Resource class provides access to named resources. 46 \brief The Resource class provides access to named resources.
41 47
42 The resources may be provided from files or other sources. 48 The resources may be provided from files or other sources.
43 49
44 The allSounds() function returns a list of all the sounds available. 50 The allSounds() function returns a list of all the sounds available.
45 A particular sound can be searched for using findSound(). 51 A particular sound can be searched for using findSound().
46 52
47 Images can be loaded with loadImage(), loadPixmap(), loadBitmap() 53 Images can be loaded with loadImage(), loadPixmap(), loadBitmap()
48 and loadIconSet(). 54 and loadIconSet().
49 55
50 \ingroup qtopiaemb 56 \ingroup qtopiaemb
51*/ 57*/
52 58
53/*! 59/*!
54 \fn Resource::Resource() 60 \fn Resource::Resource()
55 \internal 61 \internal
56*/ 62*/
57 63
58/*! 64/*!
59 Returns the QPixmap called \a pix. You should avoid including 65 Returns the QPixmap called \a pix. You should avoid including
60 any filename type extension (e.g. .png, .xpm). 66 any filename type extension (e.g. .png, .xpm).
61*/ 67*/
62#include <stdio.h> 68#include <stdio.h>
63QPixmap Resource::loadPixmap( const QString &pix ) 69QPixmap Resource::loadPixmap( const QString &pix )
64{ 70{
65 QPixmap pm; // null pixmap 71 QPixmap pm; // null pixmap
66 QString key="QPE_"+pix; 72 QString key="QPE_"+pix;
67 if ( !QPixmapCache::find(key,pm) ) { 73 if ( !QPixmapCache::find(key,pm) ) {
68 QImage I = loadImage(pix); 74 QImage I = loadImage(pix);
69 if( I.isNull() ) { 75 if( I.isNull() ) {
70 qWarning( "Could not load %s", pix.latin1() ); 76 qWarning( "Could not load %s", pix.latin1() );
71 } else { 77 } else {
72 pm.convertFromImage(I); 78 pm.convertFromImage(I);
73 QPixmapCache::insert(key,pm); 79 QPixmapCache::insert(key,pm);
74 } 80 }
81 }else {
82 qWarning("In Cache for %s pixmap %s", qApp->argv()[0], pix.local8Bit().data() );
75 } 83 }
76 return pm; 84 return pm;
77} 85}
78 86
79/*! 87/*!
80 Returns the QBitmap called \a pix. You should avoid including 88 Returns the QBitmap called \a pix. You should avoid including
81 any filename type extension (e.g. .png, .xpm). 89 any filename type extension (e.g. .png, .xpm).
82*/ 90*/
83QBitmap Resource::loadBitmap( const QString &pix ) 91QBitmap Resource::loadBitmap( const QString &pix )
84{ 92{
85 QBitmap bm; 93 QBitmap bm;
86 bm = loadPixmap(pix); 94 bm = loadPixmap(pix);
87 return bm; 95 return bm;
88} 96}
89 97
90/* 98/*
91 * @internal 99 * @internal
92 * Parse the extensions only once. If the MimeType mapping 100 * Parse the extensions only once. If the MimeType mapping
93 * changes we will still use the old extensions, applications 101 * changes we will still use the old extensions, applications
94 * will need to be restarted to be aware of new extensions... 102 * will need to be restarted to be aware of new extensions...
95 * For now it seems ok to have that limitation, if that is a wrong 103 * For now it seems ok to have that limitation, if that is a wrong
96 * assumption we will need to invalidate this list 104 * assumption we will need to invalidate this list
97 */ 105 */
98QStringList *opie_image_extension_List = 0; 106QStringList *opie_image_extension_List = 0;
99static void clean_opie_image_extension_List() { 107static void clean_opie_image_extension_List() {
100 delete opie_image_extension_List; 108 delete opie_image_extension_List;
101 opie_image_extension_List = 0; 109 opie_image_extension_List = 0;
102} 110}
103 111
104QStringList opie_imageExtensions() { 112QStringList opie_imageExtensions() {
105 /* 113 /*
106 * File extensions (e.g jpeg JPG jpg) are not 114 * File extensions (e.g jpeg JPG jpg) are not
107 * parsed yet 115 * parsed yet
108 */ 116 */
109 if ( !opie_image_extension_List ) { 117 if ( !opie_image_extension_List ) {
110 opie_image_extension_List = new QStringList(); 118 opie_image_extension_List = new QStringList();
111 qAddPostRoutine( clean_opie_image_extension_List ); 119 qAddPostRoutine( clean_opie_image_extension_List );
112 120
113 QStrList fileFormats = QImageIO::inputFormats(); 121 QStrList fileFormats = QImageIO::inputFormats();
114 QString ff = fileFormats.first(); 122 QString ff = fileFormats.first();
115 while ( fileFormats.current() ) { 123 while ( fileFormats.current() ) {
116 *opie_image_extension_List += MimeType("image/"+ff.lower()).extensions(); 124 *opie_image_extension_List += MimeType("image/"+ff.lower()).extensions();
117 ff = fileFormats.next(); 125 ff = fileFormats.next();
118 } 126 }
119 } 127 }
120 128
121 return *opie_image_extension_List; // QShared so it should be efficient 129 return *opie_image_extension_List; // QShared so it should be efficient
122} 130}
123 131
124/*! 132/*!
125 Returns the filename of a pixmap called \a pix. You should avoid including 133 Returns the filename of a pixmap called \a pix. You should avoid including
126 any filename type extension (e.g. .png, .xpm). 134 any filename type extension (e.g. .png, .xpm).
127 135
128 Normally you will use loadPixmap() rather than this function. 136 Normally you will use loadPixmap() rather than this function.
129*/ 137*/
130QString Resource::findPixmap( const QString &pix ) 138QString Resource::findPixmap( const QString &pix )
131{ 139{
132 QString picsPath = QPEApplication::qpeDir() + "pics/"; 140 QString picsPath = QPEApplication::qpeDir() + "pics/";
133 QString f; 141 QString f;
134 142
135 // Common case optimizations... 143 // Common case optimizations...
136 f = picsPath + pix + ".png"; 144 f = picsPath + pix + ".png";
137 if ( QFile( f ).exists() ) 145 if ( QFile( f ).exists() )
138 return f; 146 return f;
139 f = picsPath + pix + ".xpm"; 147 f = picsPath + pix + ".xpm";
140 if ( QFile( f ).exists() ) 148 if ( QFile( f ).exists() )
141 return f; 149 return f;
142 150
143 // All formats... 151 if ( !qpe_fast_findPixmap ) {
144 QStringList exts = opie_imageExtensions(); 152 printf("Doing slow search for %s %s\n", qApp->argv()[0], pix.local8Bit().data() );
145 for ( QStringList::ConstIterator it = exts.begin(); it!=exts.end(); ++it ) { 153 // All formats...
146 QString f = picsPath + pix + "." + *it; 154 QStringList exts = opie_imageExtensions();
147 if ( QFile(f).exists() ) 155 for ( QStringList::ConstIterator it = exts.begin(); it!=exts.end(); ++it ) {
148 return f; 156 QString f = picsPath + pix + "." + *it;
149 } 157 if ( QFile(f).exists() )
158 return f;
159 }
150 160
151 // Finally, no (or existing) extension... 161 // Finally, no (or existing) extension...
152 if ( QFile( picsPath + pix ).exists() ) 162 if ( QFile( picsPath + pix ).exists() )
153 return picsPath + pix; 163 return picsPath + pix;
164 }
154 165
155 //qDebug("Cannot find pixmap: %s", pix.latin1()); 166 //qDebug("Cannot find pixmap: %s", pix.latin1());
156 return QString(); 167 return QString();
157} 168}
158 169
159/*! 170/*!
160 Returns a sound file for a sound called \a name. 171 Returns a sound file for a sound called \a name.
161 172
162 You should avoid including any filename type extension (e.g. .wav), 173 You should avoid including any filename type extension (e.g. .wav),
163 as the system will search for only those fileformats which are supported 174 as the system will search for only those fileformats which are supported
164 by the library. 175 by the library.
165 176
166 Currently, only WAV files are supported. 177 Currently, only WAV files are supported.
167*/ 178*/
168QString Resource::findSound( const QString &name ) 179QString Resource::findSound( const QString &name )
169{ 180{
170 QString picsPath = QPEApplication::qpeDir() + "sounds/"; 181 QString picsPath = QPEApplication::qpeDir() + "sounds/";
171 182
172 QString result; 183 QString result;
173 if ( QFile( (result = picsPath + name + ".wav") ).exists() ) 184 if ( QFile( (result = picsPath + name + ".wav") ).exists() )
174 return result; 185 return result;
175 186
176 return QString(); 187 return QString();
177} 188}
178 189
179/*! 190/*!
180 Returns a list of all sound names. 191 Returns a list of all sound names.
181*/ 192*/
182QStringList Resource::allSounds() 193QStringList Resource::allSounds()
183{ 194{
184 QDir resourcedir( QPEApplication::qpeDir() + "sounds/", "*.wav" ); 195 QDir resourcedir( QPEApplication::qpeDir() + "sounds/", "*.wav" );
185 QStringList entries = resourcedir.entryList(); 196 QStringList entries = resourcedir.entryList();
186 QStringList result; 197 QStringList result;
187 for (QStringList::Iterator i=entries.begin(); i != entries.end(); ++i) 198 for (QStringList::Iterator i=entries.begin(); i != entries.end(); ++i)
188 result.append((*i).replace(QRegExp("\\.wav"),"")); 199 result.append((*i).replace(QRegExp("\\.wav"),""));
189 return result; 200 return result;
190} 201}
191 202
192static QImage load_image(const QString &name) 203static QImage load_image(const QString &name)
193{ 204{
194 QImage img; 205 QImage img;
195 206
196#ifndef LIBQPE_NO_INLINE_IMAGES 207#ifndef LIBQPE_NO_INLINE_IMAGES
197 img = qembed_findImage(name.latin1()); 208 img = qembed_findImage(name.latin1());
198#endif 209#endif
199 if ( img.isNull() ) 210 if ( img.isNull() )
200 { 211 {
201 // No inlined image, try file 212 // No inlined image, try file
202 QString f = Resource::findPixmap(name); 213 QString f = Resource::findPixmap(name);
203 if ( !f.isEmpty() ) 214 if ( !f.isEmpty() )
204 img.load(f); 215 img.load(f);
205 } 216 }
206 return img; 217 return img;
207} 218}
208 219
209/*! 220/*!
210 Returns the QImage called \a name. You should avoid including 221 Returns the QImage called \a name. You should avoid including
211 any filename type extension (e.g. .png, .xpm). 222 any filename type extension (e.g. .png, .xpm).
212*/ 223*/
213QImage Resource::loadImage( const QString &name) 224QImage Resource::loadImage( const QString &name)
214{ 225{
215 #ifndef QT_NO_DEPTH_32// have alpha-blended pixmaps 226 #ifndef QT_NO_DEPTH_32// have alpha-blended pixmaps
216 static QImage last_enabled; 227 static QImage last_enabled;
217 static QString last_enabled_name; 228 static QString last_enabled_name;
218 if ( name == last_enabled_name ) 229 if ( name == last_enabled_name )
219 return last_enabled; 230 return last_enabled;
220#endif 231#endif
221 QImage img = load_image(name); 232 QImage img = load_image(name);
222 #ifndef QT_NO_DEPTH_32// have alpha-blended pixmaps 233 #ifndef QT_NO_DEPTH_32// have alpha-blended pixmaps
223 if ( img.isNull() ) { 234 if ( img.isNull() ) {
224 // No file, try generating 235 // No file, try generating
225 if ( name[name.length()-1]=='d' && name.right(9)=="_disabled" ) { 236 if ( name[name.length()-1]=='d' && name.right(9)=="_disabled" ) {
226 last_enabled_name = name.left(name.length()-9); 237 last_enabled_name = name.left(name.length()-9);
227 last_enabled = load_image(last_enabled_name); 238 last_enabled = load_image(last_enabled_name);
228 if ( last_enabled.isNull() ) { 239 if ( last_enabled.isNull() ) {
229 last_enabled_name = QString::null; 240 last_enabled_name = QString::null;
230 } else { 241 } else {
231 img.detach(); 242 img.detach();
232 img.create( last_enabled.width(), last_enabled.height(), 32 ); 243 img.create( last_enabled.width(), last_enabled.height(), 32 );
233 for ( int y = 0; y < img.height(); y++ ) { 244 for ( int y = 0; y < img.height(); y++ ) {
234 for ( int x = 0; x < img.width(); x++ ) { 245 for ( int x = 0; x < img.width(); x++ ) {
235 QRgb p = last_enabled.pixel( x, y ); 246 QRgb p = last_enabled.pixel( x, y );
236 int a = qAlpha(p)/3; 247 int a = qAlpha(p)/3;
237 int g = qGray(qRed(p),qGreen(p),qBlue(p)); 248 int g = qGray(qRed(p),qGreen(p),qBlue(p));
238 img.setPixel( x, y, qRgba(g,g,g,a) ); 249 img.setPixel( x, y, qRgba(g,g,g,a) );
239 } 250 }
240 } 251 }
241 img.setAlphaBuffer( TRUE ); 252 img.setAlphaBuffer( TRUE );
242 } 253 }
243 } 254 }
244 } 255 }
245#endif 256#endif
246 return img; 257 return img;
247} 258}
248 259
249/*! 260/*!
250 \fn QIconSet Resource::loadIconSet( const QString &name ) 261 \fn QIconSet Resource::loadIconSet( const QString &name )
251 262
252 Returns a QIconSet for the pixmap named \a name. A disabled icon is 263 Returns a QIconSet for the pixmap named \a name. A disabled icon is
253 generated that conforms to the Qtopia look & feel. You should avoid 264 generated that conforms to the Qtopia look & feel. You should avoid
254 including any filename type extension (eg. .png, .xpm). 265 including any filename type extension (eg. .png, .xpm).
255*/ 266*/