summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/multimedia/opieplayer2/skin.cpp13
-rw-r--r--noncore/multimedia/opieplayer2/skin.h2
2 files changed, 11 insertions, 4 deletions
diff --git a/noncore/multimedia/opieplayer2/skin.cpp b/noncore/multimedia/opieplayer2/skin.cpp
index 06453f9..d2e3b00 100644
--- a/noncore/multimedia/opieplayer2/skin.cpp
+++ b/noncore/multimedia/opieplayer2/skin.cpp
@@ -1,206 +1,211 @@
1/* 1/*
2 Copyright (C) 2002 Simon Hausmann <simon@lst.de> 2 Copyright (C) 2002 Simon Hausmann <simon@lst.de>
3 (C) 2002 Max Reiss <harlekin@handhelds.org> 3 (C) 2002 Max Reiss <harlekin@handhelds.org>
4 (C) 2002 L. Potter <ljp@llornkcor.com> 4 (C) 2002 L. Potter <ljp@llornkcor.com>
5 (C) 2002 Holger Freyther <zecke@handhelds.org> 5 (C) 2002 Holger Freyther <zecke@handhelds.org>
6 6
7 This program is free software; you can redistribute it and/or 7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public 8 modify it under the terms of the GNU General Public
9 License as published by the Free Software Foundation; either 9 License as published by the Free Software Foundation; either
10 version 2 of the License, or (at your option) any later version. 10 version 2 of the License, or (at your option) any later version.
11 11
12 This program is distributed in the hope that it will be useful, 12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details. 15 General Public License for more details.
16 16
17 You should have received a copy of the GNU General Public License 17 You should have received a copy of the GNU General Public License
18 along with this program; see the file COPYING. If not, write to 18 along with this program; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. 20 Boston, MA 02111-1307, USA.
21*/ 21*/
22 22
23#include "skin.h" 23#include "skin.h"
24#include "singleton.h" 24#include "singleton.h"
25 25
26#include <qpe/resource.h> 26#include <qpe/resource.h>
27#include <qpe/config.h> 27#include <qpe/config.h>
28 28
29#include <assert.h> 29#include <assert.h>
30 30
31struct SkinData 31struct SkinData
32{ 32{
33 typedef QMap<QString, QImage> ButtonMaskImageMap; 33 typedef QMap<QString, QImage> ButtonMaskImageMap;
34 34
35 QImage backgroundImage; 35 QImage backgroundImage;
36 QImage buttonUpImage; 36 QImage buttonUpImage;
37 QImage buttonDownImage; 37 QImage buttonDownImage;
38 QImage buttonMask; 38 QImage buttonMask;
39 ButtonMaskImageMap buttonMasks; 39 ButtonMaskImageMap buttonMasks;
40}; 40};
41 41
42class SkinCache : public Singleton<SkinCache> 42class SkinCache : public Singleton<SkinCache>
43{ 43{
44public: 44public:
45 SkinCache(); 45 SkinCache();
46 46
47 QImage loadImage( const QString &name ); 47 QImage loadImage( const QString &name );
48 48
49private: 49private:
50 typedef QDict<QImage> ImageCache; 50 typedef QDict<QImage> ImageCache;
51 51
52 ImageCache m_cache; 52 ImageCache m_cache;
53 53
54 ThreadUtil::Mutex m_cacheGuard; 54 ThreadUtil::Mutex m_cacheGuard;
55}; 55};
56 56
57Skin::Skin( const QString &name, const QString &fileNameInfix ) 57Skin::Skin( const QString &name, const QString &fileNameInfix )
58 : m_fileNameInfix( fileNameInfix ) 58 : m_fileNameInfix( fileNameInfix )
59{ 59{
60 init( name ); 60 init( name );
61} 61}
62 62
63Skin::Skin( const QString &fileNameInfix ) 63Skin::Skin( const QString &fileNameInfix )
64 : m_fileNameInfix( fileNameInfix ) 64 : m_fileNameInfix( fileNameInfix )
65{ 65{
66 init( defaultSkinName() ); 66 init( defaultSkinName() );
67} 67}
68 68
69Skin::~Skin() 69Skin::~Skin()
70{ 70{
71 delete d; 71 delete d;
72} 72}
73 73
74void Skin::init( const QString &name ) 74void Skin::init( const QString &name )
75{ 75{
76 m_skinPath = "opieplayer2/skins/" + name; 76 m_skinPath = "opieplayer2/skins/" + name;
77 d = new SkinData; 77 d = new SkinData;
78} 78}
79 79
80void Skin::preload( const MediaWidget::SkinButtonInfo *skinButtonInfo, uint buttonCount ) 80void Skin::preload( const MediaWidget::SkinButtonInfo *skinButtonInfo, uint buttonCount )
81{ 81{
82 backgroundImage(); 82 backgroundImage();
83 buttonUpImage(); 83 buttonUpImage();
84 buttonDownImage(); 84 buttonDownImage();
85 ( void )buttonMask( skinButtonInfo, buttonCount ); 85 ( void )buttonMask( skinButtonInfo, buttonCount );
86} 86}
87 87
88QImage Skin::backgroundImage() const 88QImage Skin::backgroundImage() const
89{ 89{
90 if ( d->backgroundImage.isNull() ) 90 if ( d->backgroundImage.isNull() )
91 d->backgroundImage = SkinCache::self().loadImage( QString( "%1/background" ).arg( m_skinPath ) ); 91 d->backgroundImage = loadImage( QString( "%1/background" ).arg( m_skinPath ) );
92 return d->backgroundImage; 92 return d->backgroundImage;
93} 93}
94 94
95QImage Skin::buttonUpImage() const 95QImage Skin::buttonUpImage() const
96{ 96{
97 if ( d->buttonUpImage.isNull() ) 97 if ( d->buttonUpImage.isNull() )
98 d->buttonUpImage = SkinCache::self().loadImage( QString( "%1/skin%2_up" ).arg( m_skinPath ).arg( m_fileNameInfix ) ); 98 d->buttonUpImage = loadImage( QString( "%1/skin%2_up" ).arg( m_skinPath ).arg( m_fileNameInfix ) );
99 return d->buttonUpImage; 99 return d->buttonUpImage;
100} 100}
101 101
102QImage Skin::buttonDownImage() const 102QImage Skin::buttonDownImage() const
103{ 103{
104 if ( d->buttonDownImage.isNull() ) 104 if ( d->buttonDownImage.isNull() )
105 d->buttonDownImage = SkinCache::self().loadImage( QString( "%1/skin%2_down" ).arg( m_skinPath ).arg( m_fileNameInfix ) ); 105 d->buttonDownImage = loadImage( QString( "%1/skin%2_down" ).arg( m_skinPath ).arg( m_fileNameInfix ) );
106 return d->buttonDownImage; 106 return d->buttonDownImage;
107} 107}
108 108
109QImage Skin::buttonMask( const MediaWidget::SkinButtonInfo *skinButtonInfo, uint buttonCount ) const 109QImage Skin::buttonMask( const MediaWidget::SkinButtonInfo *skinButtonInfo, uint buttonCount ) const
110{ 110{
111 if ( !d->buttonMask.isNull() ) 111 if ( !d->buttonMask.isNull() )
112 return d->buttonMask; 112 return d->buttonMask;
113 113
114 QSize buttonAreaSize = buttonUpImage().size(); 114 QSize buttonAreaSize = buttonUpImage().size();
115 115
116 d->buttonMask = QImage( buttonAreaSize, 8, 255 ); 116 d->buttonMask = QImage( buttonAreaSize, 8, 255 );
117 d->buttonMask.fill( 0 ); 117 d->buttonMask.fill( 0 );
118 118
119 for ( uint i = 0; i < buttonCount; ++i ) 119 for ( uint i = 0; i < buttonCount; ++i )
120 addButtonToMask( skinButtonInfo[ i ].command + 1, buttonMaskImage( skinButtonInfo[ i ].fileName ) ); 120 addButtonToMask( skinButtonInfo[ i ].command + 1, buttonMaskImage( skinButtonInfo[ i ].fileName ) );
121 121
122 return d->buttonMask; 122 return d->buttonMask;
123} 123}
124 124
125void Skin::addButtonToMask( int tag, const QImage &maskImage ) const 125void Skin::addButtonToMask( int tag, const QImage &maskImage ) const
126{ 126{
127 if ( maskImage.isNull() ) 127 if ( maskImage.isNull() )
128 return; 128 return;
129 129
130 uchar **dest = d->buttonMask.jumpTable(); 130 uchar **dest = d->buttonMask.jumpTable();
131 for ( int y = 0; y < d->buttonMask.height(); y++ ) { 131 for ( int y = 0; y < d->buttonMask.height(); y++ ) {
132 uchar *line = dest[y]; 132 uchar *line = dest[y];
133 for ( int x = 0; x < d->buttonMask.width(); x++ ) 133 for ( int x = 0; x < d->buttonMask.width(); x++ )
134 if ( !qRed( maskImage.pixel( x, y ) ) ) 134 if ( !qRed( maskImage.pixel( x, y ) ) )
135 line[x] = tag; 135 line[x] = tag;
136 } 136 }
137} 137}
138 138
139QImage Skin::buttonMaskImage( const QString &fileName ) const 139QImage Skin::buttonMaskImage( const QString &fileName ) const
140{ 140{
141 SkinData::ButtonMaskImageMap::Iterator it = d->buttonMasks.find( fileName ); 141 SkinData::ButtonMaskImageMap::Iterator it = d->buttonMasks.find( fileName );
142 if ( it == d->buttonMasks.end() ) { 142 if ( it == d->buttonMasks.end() ) {
143 QString prefix = m_skinPath + QString::fromLatin1( "/skin%1_mask_" ).arg( m_fileNameInfix ); 143 QString prefix = m_skinPath + QString::fromLatin1( "/skin%1_mask_" ).arg( m_fileNameInfix );
144 QString path = prefix + fileName + ".png"; 144 QString path = prefix + fileName + ".png";
145 it = d->buttonMasks.insert( fileName, SkinCache::self().loadImage( path ) ); 145 it = d->buttonMasks.insert( fileName, loadImage( path ) );
146 } 146 }
147 return *it; 147 return *it;
148} 148}
149 149
150QString Skin::defaultSkinName() 150QString Skin::defaultSkinName()
151{ 151{
152 Config cfg( "OpiePlayer" ); 152 Config cfg( "OpiePlayer" );
153 cfg.setGroup( "Options" ); 153 cfg.setGroup( "Options" );
154 return cfg.readEntry( "Skin", "default" ); 154 return cfg.readEntry( "Skin", "default" );
155} 155}
156 156
157QImage Skin::loadImage( const QString &fileName )
158{
159 return QImage( Resource::findPixmap( fileName ) );
160}
161
157SkinCache::SkinCache() 162SkinCache::SkinCache()
158{ 163{
159 m_cache.setAutoDelete( true ); 164 m_cache.setAutoDelete( true );
160} 165}
161 166
162QImage SkinCache::loadImage( const QString &name ) 167QImage SkinCache::loadImage( const QString &name )
163{ 168{
164 ThreadUtil::AutoLock lock( m_cacheGuard ); 169 ThreadUtil::AutoLock lock( m_cacheGuard );
165 170
166 QImage *image = m_cache.find( name ); 171 QImage *image = m_cache.find( name );
167 if ( image ) { 172 if ( image ) {
168 qDebug( "cache hit for %s", name.ascii() ); 173 qDebug( "cache hit for %s", name.ascii() );
169 return *image; 174 return *image;
170 } 175 }
171 176
172 image = new QImage( Resource::findPixmap( name ) ); 177 image = new QImage( Resource::findPixmap( name ) );
173 m_cache.insert( name, image ); 178 m_cache.insert( name, image );
174 return *image; 179 return *image;
175} 180}
176 181
177SkinLoader::SkinLoader() 182SkinLoader::SkinLoader()
178{ 183{
179} 184}
180 185
181void SkinLoader::schedule( const QString &skinName, const QString &fileNameInfix, 186void SkinLoader::schedule( const QString &skinName, const QString &fileNameInfix,
182 const MediaWidget::SkinButtonInfo *skinButtonInfo, const uint buttonCount ) 187 const MediaWidget::SkinButtonInfo *skinButtonInfo, const uint buttonCount )
183{ 188{
184 assert( isRunning() == false ); 189 assert( isRunning() == false );
185 190
186 pendingSkins << Info( skinName, fileNameInfix, skinButtonInfo, buttonCount ); 191 pendingSkins << Info( skinName, fileNameInfix, skinButtonInfo, buttonCount );
187} 192}
188 193
189void SkinLoader::run() 194void SkinLoader::run()
190{ 195{
191 qDebug( "SkinLoader::run()" ); 196 qDebug( "SkinLoader::run()" );
192 for ( InfoList::ConstIterator it = pendingSkins.begin(); it != pendingSkins.end(); ++it ) 197 for ( InfoList::ConstIterator it = pendingSkins.begin(); it != pendingSkins.end(); ++it )
193 load( *it ); 198 load( *it );
194 qDebug( "SkinLoader is done." ); 199 qDebug( "SkinLoader is done." );
195} 200}
196 201
197void SkinLoader::load( const Info &nfo ) 202void SkinLoader::load( const Info &nfo )
198{ 203{
199 qDebug( "preloading %s with infix %s", nfo.skinName.ascii(), nfo.fileNameInfix.ascii() ); 204 qDebug( "preloading %s with infix %s", nfo.skinName.ascii(), nfo.fileNameInfix.ascii() );
200 205
201 Skin skin( nfo.skinName, nfo.fileNameInfix ); 206 Skin skin( nfo.skinName, nfo.fileNameInfix );
202 skin.preload( nfo.skinButtonInfo, nfo.buttonCount ); 207 skin.preload( nfo.skinButtonInfo, nfo.buttonCount );
203} 208}
204 209
205/* vim: et sw=4 ts=4 210/* vim: et sw=4 ts=4
206 */ 211 */
diff --git a/noncore/multimedia/opieplayer2/skin.h b/noncore/multimedia/opieplayer2/skin.h
index 060ff73..e55832c 100644
--- a/noncore/multimedia/opieplayer2/skin.h
+++ b/noncore/multimedia/opieplayer2/skin.h
@@ -1,105 +1,107 @@
1/* 1/*
2 Copyright (C) 2002 Simon Hausmann <simon@lst.de> 2 Copyright (C) 2002 Simon Hausmann <simon@lst.de>
3 (C) 2002 Max Reiss <harlekin@handhelds.org> 3 (C) 2002 Max Reiss <harlekin@handhelds.org>
4 (C) 2002 L. Potter <ljp@llornkcor.com> 4 (C) 2002 L. Potter <ljp@llornkcor.com>
5 (C) 2002 Holger Freyther <zecke@handhelds.org> 5 (C) 2002 Holger Freyther <zecke@handhelds.org>
6 6
7 This program is free software; you can redistribute it and/or 7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public 8 modify it under the terms of the GNU General Public
9 License as published by the Free Software Foundation; either 9 License as published by the Free Software Foundation; either
10 version 2 of the License, or (at your option) any later version. 10 version 2 of the License, or (at your option) any later version.
11 11
12 This program is distributed in the hope that it will be useful, 12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details. 15 General Public License for more details.
16 16
17 You should have received a copy of the GNU General Public License 17 You should have received a copy of the GNU General Public License
18 along with this program; see the file COPYING. If not, write to 18 along with this program; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. 20 Boston, MA 02111-1307, USA.
21*/ 21*/
22 22
23#ifndef SKIN_H 23#ifndef SKIN_H
24#define SKIN_H 24#define SKIN_H
25 25
26#include <qstring.h> 26#include <qstring.h>
27#include <qimage.h> 27#include <qimage.h>
28#include <qmap.h> 28#include <qmap.h>
29#include <qdict.h> 29#include <qdict.h>
30 30
31#include "mediawidget.h" 31#include "mediawidget.h"
32#include "threadutil.h" 32#include "threadutil.h"
33 33
34struct SkinData; 34struct SkinData;
35 35
36class Skin 36class Skin
37{ 37{
38public: 38public:
39 Skin( const QString &name, const QString &fileNameInfix ); 39 Skin( const QString &name, const QString &fileNameInfix );
40 Skin( const QString &fileNameInfix ); 40 Skin( const QString &fileNameInfix );
41 ~Skin(); 41 ~Skin();
42 42
43 void preload( const MediaWidget::SkinButtonInfo *skinButtonInfo, uint buttonCount ); 43 void preload( const MediaWidget::SkinButtonInfo *skinButtonInfo, uint buttonCount );
44 44
45 QImage backgroundImage() const; 45 QImage backgroundImage() const;
46 QImage buttonUpImage() const; 46 QImage buttonUpImage() const;
47 QImage buttonDownImage() const; 47 QImage buttonDownImage() const;
48 48
49 QImage buttonMask( const MediaWidget::SkinButtonInfo *skinButtonInfo, uint buttonCount ) const; 49 QImage buttonMask( const MediaWidget::SkinButtonInfo *skinButtonInfo, uint buttonCount ) const;
50 50
51 QImage buttonMaskImage( const QString &fileName ) const; 51 QImage buttonMaskImage( const QString &fileName ) const;
52 52
53 static QString defaultSkinName(); 53 static QString defaultSkinName();
54 54
55private: 55private:
56 void init( const QString &name ); 56 void init( const QString &name );
57 57
58 void addButtonToMask( int tag, const QImage &maskImage ) const; 58 void addButtonToMask( int tag, const QImage &maskImage ) const;
59 59
60 static QImage loadImage( const QString &fileName );
61
60 QString m_fileNameInfix; 62 QString m_fileNameInfix;
61 QString m_skinPath; 63 QString m_skinPath;
62 64
63 SkinData *d; 65 SkinData *d;
64 66
65 Skin( const Skin & ); 67 Skin( const Skin & );
66 Skin &operator=( const Skin & ); 68 Skin &operator=( const Skin & );
67}; 69};
68 70
69class SkinLoader : public ThreadUtil::Thread 71class SkinLoader : public ThreadUtil::Thread
70{ 72{
71public: 73public:
72 SkinLoader(); 74 SkinLoader();
73 75
74 void schedule( const QString &skinName, const QString &fileNameInfix, 76 void schedule( const QString &skinName, const QString &fileNameInfix,
75 const MediaWidget::SkinButtonInfo *skinButtonInfo, const uint buttonCount ); 77 const MediaWidget::SkinButtonInfo *skinButtonInfo, const uint buttonCount );
76 78
77protected: 79protected:
78 virtual void run(); 80 virtual void run();
79 81
80private: 82private:
81 struct Info 83 struct Info
82 { 84 {
83 Info() : skinButtonInfo( 0 ), buttonCount( 0 ) {} 85 Info() : skinButtonInfo( 0 ), buttonCount( 0 ) {}
84 Info( const QString &_skinName, const QString &_fileNameInfix, 86 Info( const QString &_skinName, const QString &_fileNameInfix,
85 const MediaWidget::SkinButtonInfo *_skinButtonInfo, const uint _buttonCount ) 87 const MediaWidget::SkinButtonInfo *_skinButtonInfo, const uint _buttonCount )
86 : skinName( _skinName ), fileNameInfix( _fileNameInfix ), 88 : skinName( _skinName ), fileNameInfix( _fileNameInfix ),
87 skinButtonInfo( _skinButtonInfo ), buttonCount( _buttonCount ) 89 skinButtonInfo( _skinButtonInfo ), buttonCount( _buttonCount )
88 {} 90 {}
89 91
90 const QString skinName; 92 const QString skinName;
91 const QString fileNameInfix; 93 const QString fileNameInfix;
92 const MediaWidget::SkinButtonInfo *skinButtonInfo; 94 const MediaWidget::SkinButtonInfo *skinButtonInfo;
93 const uint buttonCount; 95 const uint buttonCount;
94 }; 96 };
95 typedef QValueList<Info> InfoList; 97 typedef QValueList<Info> InfoList;
96 98
97 void load( const Info &nfo ); 99 void load( const Info &nfo );
98 100
99 InfoList pendingSkins; 101 InfoList pendingSkins;
100 ThreadUtil::Mutex guard; 102 ThreadUtil::Mutex guard;
101}; 103};
102 104
103#endif // SKIN_H 105#endif // SKIN_H
104/* vim: et sw=4 ts=4 106/* vim: et sw=4 ts=4
105 */ 107 */