summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/styles/theme/ogfxeffect.cpp72
-rw-r--r--noncore/styles/theme/othemebase.cpp1985
2 files changed, 1033 insertions, 1024 deletions
diff --git a/noncore/styles/theme/ogfxeffect.cpp b/noncore/styles/theme/ogfxeffect.cpp
index 90b45fe..ab63c98 100644
--- a/noncore/styles/theme/ogfxeffect.cpp
+++ b/noncore/styles/theme/ogfxeffect.cpp
@@ -1,511 +1,515 @@
1/* This file is part of the KDE libraries 1/* This file is part of the KDE libraries
2 Copyright (C) 1998, 1999 Christian Tibirna <ctibirna@total.net> 2 Copyright (C) 1998, 1999 Christian Tibirna <ctibirna@total.net>
3 (C) 1998, 1999 Daniel M. Duley <mosfet@kde.org> 3 (C) 1998, 1999 Daniel M. Duley <mosfet@kde.org>
4 (C) 1998, 1999 Dirk A. Mueller <mueller@kde.org> 4 (C) 1998, 1999 Dirk A. Mueller <mueller@kde.org>
5 5
6*/ 6*/
7 7
8// $Id$ 8// $Id$
9 9
10#include <qimage.h> 10#include "ogfxeffect.h"
11#include <qpainter.h>
12 11
12/* OPIE */
13#include <opie2/odebug.h>
13#include <qpe/qmath.h> 14#include <qpe/qmath.h>
14 15
15#include "ogfxeffect.h" 16/* QT */
17#include <qimage.h>
18#include <qpainter.h>
16 19
20/* STD */
17#include <cstdlib> 21#include <cstdlib>
18#include <cmath> 22#include <cmath>
19 23
20//====================================================================== 24//======================================================================
21// 25//
22// Gradient effects 26// Gradient effects
23// 27//
24//====================================================================== 28//======================================================================
25 29
26 30
27QPixmap& OGfxEffect::gradient(QPixmap &pixmap, const QColor &ca, 31QPixmap& OGfxEffect::gradient(QPixmap &pixmap, const QColor &ca,
28 const QColor &cb, GradientType eff, int ncols) 32 const QColor &cb, GradientType eff, int ncols)
29{ 33{
30 if ( !pixmap. isNull ( )) { 34 if ( !pixmap. isNull ( )) {
31 QImage image = gradient(pixmap.size(), ca, cb, eff, ncols); 35 QImage image = gradient(pixmap.size(), ca, cb, eff, ncols);
32 pixmap.convertFromImage(image); 36 pixmap.convertFromImage(image);
33 } 37 }
34 return pixmap; 38 return pixmap;
35} 39}
36 40
37QImage OGfxEffect::gradient(const QSize &size, const QColor &ca, 41QImage OGfxEffect::gradient(const QSize &size, const QColor &ca,
38 const QColor &cb, GradientType eff, int /*ncols*/) 42 const QColor &cb, GradientType eff, int /*ncols*/)
39{ 43{
40 int rDiff, gDiff, bDiff; 44 int rDiff, gDiff, bDiff;
41 int rca, gca, bca, rcb, gcb, bcb; 45 int rca, gca, bca, rcb, gcb, bcb;
42
43 QImage image(size, 32);
44 46
45 if (size.width() == 0 || size.height() == 0) { 47 QImage image(size, 32);
46 qDebug ( "WARNING: OGfxEffect::gradient: invalid image" ); 48
47 return image; 49 if (size.width() == 0 || size.height() == 0) {
48 } 50 odebug << "WARNING: OGfxEffect::gradient: invalid image" << oendl;
51 return image;
52 }
49 53
50 register int x, y; 54 register int x, y;
51 55
52 rDiff = (rcb = cb.red()) - (rca = ca.red()); 56 rDiff = (rcb = cb.red()) - (rca = ca.red());
53 gDiff = (gcb = cb.green()) - (gca = ca.green()); 57 gDiff = (gcb = cb.green()) - (gca = ca.green());
54 bDiff = (bcb = cb.blue()) - (bca = ca.blue()); 58 bDiff = (bcb = cb.blue()) - (bca = ca.blue());
55 59
56 if( eff == VerticalGradient || eff == HorizontalGradient ){ 60 if( eff == VerticalGradient || eff == HorizontalGradient ){
57 61
58 uint *p; 62 uint *p;
59 uint rgb; 63 uint rgb;
60 64
61 register int rl = rca << 16; 65 register int rl = rca << 16;
62 register int gl = gca << 16; 66 register int gl = gca << 16;
63 register int bl = bca << 16; 67 register int bl = bca << 16;
64 68
65 if( eff == VerticalGradient ) { 69 if( eff == VerticalGradient ) {
66 70
67 int rcdelta = ((1<<16) / size.height()) * rDiff; 71 int rcdelta = ((1<<16) / size.height()) * rDiff;
68 int gcdelta = ((1<<16) / size.height()) * gDiff; 72 int gcdelta = ((1<<16) / size.height()) * gDiff;
69 int bcdelta = ((1<<16) / size.height()) * bDiff; 73 int bcdelta = ((1<<16) / size.height()) * bDiff;
70 74
71 for ( y = 0; y < size.height(); y++ ) { 75 for ( y = 0; y < size.height(); y++ ) {
72 p = (uint *) image.scanLine(y); 76 p = (uint *) image.scanLine(y);
73 77
74 rl += rcdelta; 78 rl += rcdelta;
75 gl += gcdelta; 79 gl += gcdelta;
76 bl += bcdelta; 80 bl += bcdelta;
77 81
78 rgb = qRgb( (rl>>16), (gl>>16), (bl>>16) ); 82 rgb = qRgb( (rl>>16), (gl>>16), (bl>>16) );
79 83
80 for( x = 0; x < size.width(); x++ ) { 84 for( x = 0; x < size.width(); x++ ) {
81 *p = rgb; 85 *p = rgb;
82 p++; 86 p++;
83 } 87 }
84 } 88 }
85 89
86 } 90 }
87 else { // must be HorizontalGradient 91 else { // must be HorizontalGradient
88 92
89 unsigned int *o_src = (unsigned int *)image.scanLine(0); 93 unsigned int *o_src = (unsigned int *)image.scanLine(0);
90 unsigned int *src = o_src; 94 unsigned int *src = o_src;
91 95
92 int rcdelta = ((1<<16) / size.width()) * rDiff; 96 int rcdelta = ((1<<16) / size.width()) * rDiff;
93 int gcdelta = ((1<<16) / size.width()) * gDiff; 97 int gcdelta = ((1<<16) / size.width()) * gDiff;
94 int bcdelta = ((1<<16) / size.width()) * bDiff; 98 int bcdelta = ((1<<16) / size.width()) * bDiff;
95 99
96 for( x = 0; x < size.width(); x++) { 100 for( x = 0; x < size.width(); x++) {
97 101
98 rl += rcdelta; 102 rl += rcdelta;
99 gl += gcdelta; 103 gl += gcdelta;
100 bl += bcdelta; 104 bl += bcdelta;
101 105
102 *src++ = qRgb( (rl>>16), (gl>>16), (bl>>16)); 106 *src++ = qRgb( (rl>>16), (gl>>16), (bl>>16));
103 } 107 }
104 108
105 src = o_src; 109 src = o_src;
106 110
107 // Believe it or not, manually copying in a for loop is faster 111 // Believe it or not, manually copying in a for loop is faster
108 // than calling memcpy for each scanline (on the order of ms...). 112 // than calling memcpy for each scanline (on the order of ms...).
109 // I think this is due to the function call overhead (mosfet). 113 // I think this is due to the function call overhead (mosfet).
110 114
111 for (y = 1; y < size.height(); ++y) { 115 for (y = 1; y < size.height(); ++y) {
112 116
113 p = (unsigned int *)image.scanLine(y); 117 p = (unsigned int *)image.scanLine(y);
114 src = o_src; 118 src = o_src;
115 for(x=0; x < size.width(); ++x) 119 for(x=0; x < size.width(); ++x)
116 *p++ = *src++; 120 *p++ = *src++;
117 } 121 }
118 } 122 }
119 } 123 }
120 124
121 else { 125 else {
122 126
123 float rfd, gfd, bfd; 127 float rfd, gfd, bfd;
124 float rd = rca, gd = gca, bd = bca; 128 float rd = rca, gd = gca, bd = bca;
125 129
126 unsigned char *xtable[3]; 130 unsigned char *xtable[3];
127 unsigned char *ytable[3]; 131 unsigned char *ytable[3];
128 132
129 unsigned int w = size.width(), h = size.height(); 133 unsigned int w = size.width(), h = size.height();
130 xtable[0] = new unsigned char[w]; 134 xtable[0] = new unsigned char[w];
131 xtable[1] = new unsigned char[w]; 135 xtable[1] = new unsigned char[w];
132 xtable[2] = new unsigned char[w]; 136 xtable[2] = new unsigned char[w];
133 ytable[0] = new unsigned char[h]; 137 ytable[0] = new unsigned char[h];
134 ytable[1] = new unsigned char[h]; 138 ytable[1] = new unsigned char[h];
135 ytable[2] = new unsigned char[h]; 139 ytable[2] = new unsigned char[h];
136 w*=2, h*=2; 140 w*=2, h*=2;
137 141
138 if ( eff == DiagonalGradient || eff == CrossDiagonalGradient) { 142 if ( eff == DiagonalGradient || eff == CrossDiagonalGradient) {
139 // Diagonal dgradient code inspired by BlackBox (mosfet) 143 // Diagonal dgradient code inspired by BlackBox (mosfet)
140 // BlackBox dgradient is (C) Brad Hughes, <bhughes@tcac.net> and 144 // BlackBox dgradient is (C) Brad Hughes, <bhughes@tcac.net> and
141 // Mike Cole <mike@mydot.com>. 145 // Mike Cole <mike@mydot.com>.
142 146
143 rfd = (float)rDiff/w; 147 rfd = (float)rDiff/w;
144 gfd = (float)gDiff/w; 148 gfd = (float)gDiff/w;
145 bfd = (float)bDiff/w; 149 bfd = (float)bDiff/w;
146 150
147 int dir; 151 int dir;
148 for (x = 0; x < size.width(); x++, rd+=rfd, gd+=gfd, bd+=bfd) { 152 for (x = 0; x < size.width(); x++, rd+=rfd, gd+=gfd, bd+=bfd) {
149 dir = eff == DiagonalGradient? x : size.width() - x - 1; 153 dir = eff == DiagonalGradient? x : size.width() - x - 1;
150 xtable[0][dir] = (unsigned char) rd; 154 xtable[0][dir] = (unsigned char) rd;
151 xtable[1][dir] = (unsigned char) gd; 155 xtable[1][dir] = (unsigned char) gd;
152 xtable[2][dir] = (unsigned char) bd; 156 xtable[2][dir] = (unsigned char) bd;
153 } 157 }
154 rfd = (float)rDiff/h; 158 rfd = (float)rDiff/h;
155 gfd = (float)gDiff/h; 159 gfd = (float)gDiff/h;
156 bfd = (float)bDiff/h; 160 bfd = (float)bDiff/h;
157 rd = gd = bd = 0; 161 rd = gd = bd = 0;
158 for (y = 0; y < size.height(); y++, rd+=rfd, gd+=gfd, bd+=bfd) { 162 for (y = 0; y < size.height(); y++, rd+=rfd, gd+=gfd, bd+=bfd) {
159 ytable[0][y] = (unsigned char) rd; 163 ytable[0][y] = (unsigned char) rd;
160 ytable[1][y] = (unsigned char) gd; 164 ytable[1][y] = (unsigned char) gd;
161 ytable[2][y] = (unsigned char) bd; 165 ytable[2][y] = (unsigned char) bd;
162 } 166 }
163 167
164 for (y = 0; y < size.height(); y++) { 168 for (y = 0; y < size.height(); y++) {
165 unsigned int *scanline = (unsigned int *)image.scanLine(y); 169 unsigned int *scanline = (unsigned int *)image.scanLine(y);
166 for (x = 0; x < size.width(); x++) { 170 for (x = 0; x < size.width(); x++) {
167 scanline[x] = qRgb(xtable[0][x] + ytable[0][y], 171 scanline[x] = qRgb(xtable[0][x] + ytable[0][y],
168 xtable[1][x] + ytable[1][y], 172 xtable[1][x] + ytable[1][y],
169 xtable[2][x] + ytable[2][y]); 173 xtable[2][x] + ytable[2][y]);
170 } 174 }
171 } 175 }
172 } 176 }
173 177
174 else if (eff == RectangleGradient || 178 else if (eff == RectangleGradient ||
175 eff == PyramidGradient || 179 eff == PyramidGradient ||
176 eff == PipeCrossGradient || 180 eff == PipeCrossGradient ||
177 eff == EllipticGradient) 181 eff == EllipticGradient)
178 { 182 {
179 int rSign = rDiff>0? 1: -1; 183 int rSign = rDiff>0? 1: -1;
180 int gSign = gDiff>0? 1: -1; 184 int gSign = gDiff>0? 1: -1;
181 int bSign = bDiff>0? 1: -1; 185 int bSign = bDiff>0? 1: -1;
182 186
183 rfd = (float)rDiff / size.width(); 187 rfd = (float)rDiff / size.width();
184 gfd = (float)gDiff / size.width(); 188 gfd = (float)gDiff / size.width();
185 bfd = (float)bDiff / size.width(); 189 bfd = (float)bDiff / size.width();
186 190
187 rd = (float)rDiff/2; 191 rd = (float)rDiff/2;
188 gd = (float)gDiff/2; 192 gd = (float)gDiff/2;
189 bd = (float)bDiff/2; 193 bd = (float)bDiff/2;
190 194
191 for (x = 0; x < size.width(); x++, rd-=rfd, gd-=gfd, bd-=bfd) 195 for (x = 0; x < size.width(); x++, rd-=rfd, gd-=gfd, bd-=bfd)
192 { 196 {
193 xtable[0][x] = (unsigned char) abs((int)rd); 197 xtable[0][x] = (unsigned char) abs((int)rd);
194 xtable[1][x] = (unsigned char) abs((int)gd); 198 xtable[1][x] = (unsigned char) abs((int)gd);
195 xtable[2][x] = (unsigned char) abs((int)bd); 199 xtable[2][x] = (unsigned char) abs((int)bd);
196 } 200 }
197 201
198 rfd = (float)rDiff/size.height(); 202 rfd = (float)rDiff/size.height();
199 gfd = (float)gDiff/size.height(); 203 gfd = (float)gDiff/size.height();
200 bfd = (float)bDiff/size.height(); 204 bfd = (float)bDiff/size.height();
201 205
202 rd = (float)rDiff/2; 206 rd = (float)rDiff/2;
203 gd = (float)gDiff/2; 207 gd = (float)gDiff/2;
204 bd = (float)bDiff/2; 208 bd = (float)bDiff/2;
205 209
206 for (y = 0; y < size.height(); y++, rd-=rfd, gd-=gfd, bd-=bfd) 210 for (y = 0; y < size.height(); y++, rd-=rfd, gd-=gfd, bd-=bfd)
207 { 211 {
208 ytable[0][y] = (unsigned char) abs((int)rd); 212 ytable[0][y] = (unsigned char) abs((int)rd);
209 ytable[1][y] = (unsigned char) abs((int)gd); 213 ytable[1][y] = (unsigned char) abs((int)gd);
210 ytable[2][y] = (unsigned char) abs((int)bd); 214 ytable[2][y] = (unsigned char) abs((int)bd);
211 } 215 }
212 unsigned int rgb; 216 unsigned int rgb;
213 int h = (size.height()+1)>>1; 217 int h = (size.height()+1)>>1;
214 for (y = 0; y < h; y++) { 218 for (y = 0; y < h; y++) {
215 unsigned int *sl1 = (unsigned int *)image.scanLine(y); 219 unsigned int *sl1 = (unsigned int *)image.scanLine(y);
216 unsigned int *sl2 = (unsigned int *)image.scanLine(QMAX(size.height()-y-1, y)); 220 unsigned int *sl2 = (unsigned int *)image.scanLine(QMAX(size.height()-y-1, y));
217 221
218 int w = (size.width()+1)>>1; 222 int w = (size.width()+1)>>1;
219 int x2 = size.width()-1; 223 int x2 = size.width()-1;
220 224
221 for (x = 0; x < w; x++, x2--) { 225 for (x = 0; x < w; x++, x2--) {
222 rgb = 0; 226 rgb = 0;
223 if (eff == PyramidGradient) { 227 if (eff == PyramidGradient) {
224 rgb = qRgb(rcb-rSign*(xtable[0][x]+ytable[0][y]), 228 rgb = qRgb(rcb-rSign*(xtable[0][x]+ytable[0][y]),
225 gcb-gSign*(xtable[1][x]+ytable[1][y]), 229 gcb-gSign*(xtable[1][x]+ytable[1][y]),
226 bcb-bSign*(xtable[2][x]+ytable[2][y])); 230 bcb-bSign*(xtable[2][x]+ytable[2][y]));
227 } 231 }
228 if (eff == RectangleGradient) { 232 if (eff == RectangleGradient) {
229 rgb = qRgb(rcb - rSign * 233 rgb = qRgb(rcb - rSign *
230 QMAX(xtable[0][x], ytable[0][y]) * 2, 234 QMAX(xtable[0][x], ytable[0][y]) * 2,
231 gcb - gSign * 235 gcb - gSign *
232 QMAX(xtable[1][x], ytable[1][y]) * 2, 236 QMAX(xtable[1][x], ytable[1][y]) * 2,
233 bcb - bSign * 237 bcb - bSign *
234 QMAX(xtable[2][x], ytable[2][y]) * 2); 238 QMAX(xtable[2][x], ytable[2][y]) * 2);
235 } 239 }
236 if (eff == PipeCrossGradient) { 240 if (eff == PipeCrossGradient) {
237 rgb = qRgb(rcb - rSign * 241 rgb = qRgb(rcb - rSign *
238 QMIN(xtable[0][x], ytable[0][y]) * 2, 242 QMIN(xtable[0][x], ytable[0][y]) * 2,
239 gcb - gSign * 243 gcb - gSign *
240 QMIN(xtable[1][x], ytable[1][y]) * 2, 244 QMIN(xtable[1][x], ytable[1][y]) * 2,
241 bcb - bSign * 245 bcb - bSign *
242 QMIN(xtable[2][x], ytable[2][y]) * 2); 246 QMIN(xtable[2][x], ytable[2][y]) * 2);
243 } 247 }
244 if (eff == EllipticGradient) { 248 if (eff == EllipticGradient) {
245 rgb = qRgb(rcb - rSign * 249 rgb = qRgb(rcb - rSign *
246 (int)sqrt((xtable[0][x]*xtable[0][x] + 250 (int)sqrt((xtable[0][x]*xtable[0][x] +
247 ytable[0][y]*ytable[0][y])*2.0), 251 ytable[0][y]*ytable[0][y])*2.0),
248 gcb - gSign * 252 gcb - gSign *
249 (int)sqrt((xtable[1][x]*xtable[1][x] + 253 (int)sqrt((xtable[1][x]*xtable[1][x] +
250 ytable[1][y]*ytable[1][y])*2.0), 254 ytable[1][y]*ytable[1][y])*2.0),
251 bcb - bSign * 255 bcb - bSign *
252 (int)sqrt((xtable[2][x]*xtable[2][x] + 256 (int)sqrt((xtable[2][x]*xtable[2][x] +
253 ytable[2][y]*ytable[2][y])*2.0)); 257 ytable[2][y]*ytable[2][y])*2.0));
254 } 258 }
255 259
256 sl1[x] = sl2[x] = rgb; 260 sl1[x] = sl2[x] = rgb;
257 sl1[x2] = sl2[x2] = rgb; 261 sl1[x2] = sl2[x2] = rgb;
258 } 262 }
259 } 263 }
260 } 264 }
261 265
262 delete [] xtable[0]; 266 delete [] xtable[0];
263 delete [] xtable[1]; 267 delete [] xtable[1];
264 delete [] xtable[2]; 268 delete [] xtable[2];
265 delete [] ytable[0]; 269 delete [] ytable[0];
266 delete [] ytable[1]; 270 delete [] ytable[1];
267 delete [] ytable[2]; 271 delete [] ytable[2];
268 } 272 }
269 return image; 273 return image;
270} 274}
271 275
272 276
273//====================================================================== 277//======================================================================
274// 278//
275// Blend effects 279// Blend effects
276// 280//
277//====================================================================== 281//======================================================================
278 282
279 283
280QPixmap& OGfxEffect::blend(QPixmap &pixmap, float initial_intensity, 284QPixmap& OGfxEffect::blend(QPixmap &pixmap, float initial_intensity,
281 const QColor &bgnd, GradientType eff, 285 const QColor &bgnd, GradientType eff,
282 bool anti_dir, int /*ncols*/) 286 bool anti_dir, int /*ncols*/)
283{ 287{
284 if ( !pixmap. isNull ( )) { 288 if ( !pixmap. isNull ( )) {
285 QImage image = pixmap.convertToImage(); 289 QImage image = pixmap.convertToImage();
286 OGfxEffect::blend(image, initial_intensity, bgnd, eff, anti_dir); 290 OGfxEffect::blend(image, initial_intensity, bgnd, eff, anti_dir);
287 291
288 if ( pixmap. depth ( ) <= 8 ) 292 if ( pixmap. depth ( ) <= 8 )
289 image. convertDepth ( pixmap. depth ( )); 293 image. convertDepth ( pixmap. depth ( ));
290 294
291 pixmap.convertFromImage(image); 295 pixmap.convertFromImage(image);
292 } 296 }
293 return pixmap; 297 return pixmap;
294} 298}
295 299
296 300
297QImage& OGfxEffect::blend(QImage &image, float initial_intensity, 301QImage& OGfxEffect::blend(QImage &image, float initial_intensity,
298 const QColor &bgnd, GradientType eff, 302 const QColor &bgnd, GradientType eff,
299 bool anti_dir) 303 bool anti_dir)
300{ 304{
301 if (image.width() == 0 || image.height() == 0) { 305 if (image.width() == 0 || image.height() == 0) {
302 qDebug ( "Invalid image\n" ); 306 odebug << "Invalid image" << oendl;
303 return image; 307 return image;
304 } 308 }
305 309
306 int r_bgnd = bgnd.red(), g_bgnd = bgnd.green(), b_bgnd = bgnd.blue(); 310 int r_bgnd = bgnd.red(), g_bgnd = bgnd.green(), b_bgnd = bgnd.blue();
307 int r, g, b; 311 int r, g, b;
308 int ind; 312 int ind;
309 313
310 unsigned int xi, xf, yi, yf; 314 unsigned int xi, xf, yi, yf;
311 unsigned int a; 315 unsigned int a;
312 316
313 // check the boundaries of the initial intesity param 317 // check the boundaries of the initial intesity param
314 float unaffected = 1; 318 float unaffected = 1;
315 if (initial_intensity > 1) initial_intensity = 1; 319 if (initial_intensity > 1) initial_intensity = 1;
316 if (initial_intensity < -1) initial_intensity = -1; 320 if (initial_intensity < -1) initial_intensity = -1;
317 if (initial_intensity < 0) { 321 if (initial_intensity < 0) {
318 unaffected = 1. + initial_intensity; 322 unaffected = 1. + initial_intensity;
319 initial_intensity = 0; 323 initial_intensity = 0;
320 } 324 }
321 325
322 326
323 float intensity = initial_intensity; 327 float intensity = initial_intensity;
324 float var = 1. - initial_intensity; 328 float var = 1. - initial_intensity;
325 329
326 if (anti_dir) { 330 if (anti_dir) {
327 initial_intensity = intensity = 1.; 331 initial_intensity = intensity = 1.;
328 var = -var; 332 var = -var;
329 } 333 }
330 334
331 register int x, y; 335 register int x, y;
332 336
333 unsigned int *data = (unsigned int *)image.bits(); 337 unsigned int *data = (unsigned int *)image.bits();
334 338
335 if( eff == VerticalGradient || eff == HorizontalGradient ) { 339 if( eff == VerticalGradient || eff == HorizontalGradient ) {
336 340
337 // set the image domain to apply the effect to 341 // set the image domain to apply the effect to
338 xi = 0, xf = image.width(); 342 xi = 0, xf = image.width();
339 yi = 0, yf = image.height(); 343 yi = 0, yf = image.height();
340 if (eff == VerticalGradient) { 344 if (eff == VerticalGradient) {
341 if (anti_dir) yf = (int)(image.height() * unaffected); 345 if (anti_dir) yf = (int)(image.height() * unaffected);
342 else yi = (int)(image.height() * (1 - unaffected)); 346 else yi = (int)(image.height() * (1 - unaffected));
343 } 347 }
344 else { 348 else {
345 if (anti_dir) xf = (int)(image.width() * unaffected); 349 if (anti_dir) xf = (int)(image.width() * unaffected);
346 else xi = (int)(image.height() * (1 - unaffected)); 350 else xi = (int)(image.height() * (1 - unaffected));
347 } 351 }
348 352
349 var /= (eff == VerticalGradient?yf-yi:xf-xi); 353 var /= (eff == VerticalGradient?yf-yi:xf-xi);
350 354
351 for (y = yi; y < (int)yf; y++) { 355 for (y = yi; y < (int)yf; y++) {
352 intensity = eff == VerticalGradient? intensity + var : 356 intensity = eff == VerticalGradient? intensity + var :
353 initial_intensity; 357 initial_intensity;
354 for (x = xi; x < (int)xf ; x++) { 358 for (x = xi; x < (int)xf ; x++) {
355 if (eff == HorizontalGradient) intensity += var; 359 if (eff == HorizontalGradient) intensity += var;
356 ind = x + image.width() * y ; 360 ind = x + image.width() * y ;
357 r = qRed (data[ind]) + (int)(intensity * 361 r = qRed (data[ind]) + (int)(intensity *
358 (r_bgnd - qRed (data[ind]))); 362 (r_bgnd - qRed (data[ind])));
359 g = qGreen(data[ind]) + (int)(intensity * 363 g = qGreen(data[ind]) + (int)(intensity *
360 (g_bgnd - qGreen(data[ind]))); 364 (g_bgnd - qGreen(data[ind])));
361 b = qBlue (data[ind]) + (int)(intensity * 365 b = qBlue (data[ind]) + (int)(intensity *
362 (b_bgnd - qBlue (data[ind]))); 366 (b_bgnd - qBlue (data[ind])));
363 if (r > 255) r = 255; if (r < 0 ) r = 0; 367 if (r > 255) r = 255; if (r < 0 ) r = 0;
364 if (g > 255) g = 255; if (g < 0 ) g = 0; 368 if (g > 255) g = 255; if (g < 0 ) g = 0;
365 if (b > 255) b = 255; if (b < 0 ) b = 0; 369 if (b > 255) b = 255; if (b < 0 ) b = 0;
366 a = qAlpha(data[ind]); 370 a = qAlpha(data[ind]);
367 data[ind] = qRgba(r, g, b, a); 371 data[ind] = qRgba(r, g, b, a);
368 } 372 }
369 } 373 }
370 } 374 }
371 else if (eff == DiagonalGradient || eff == CrossDiagonalGradient) { 375 else if (eff == DiagonalGradient || eff == CrossDiagonalGradient) {
372 float xvar = var / 2 / image.width(); // / unaffected; 376 float xvar = var / 2 / image.width(); // / unaffected;
373 float yvar = var / 2 / image.height(); // / unaffected; 377 float yvar = var / 2 / image.height(); // / unaffected;
374 float tmp; 378 float tmp;
375 379
376 for (x = 0; x < image.width() ; x++) { 380 for (x = 0; x < image.width() ; x++) {
377 tmp = xvar * (eff == DiagonalGradient? x : image.width()-x-1); 381 tmp = xvar * (eff == DiagonalGradient? x : image.width()-x-1);
378 for (y = 0; y < image.height() ; y++) { 382 for (y = 0; y < image.height() ; y++) {
379 intensity = initial_intensity + tmp + yvar * y; 383 intensity = initial_intensity + tmp + yvar * y;
380 ind = x + image.width() * y ; 384 ind = x + image.width() * y ;
381 r = qRed (data[ind]) + (int)(intensity * 385 r = qRed (data[ind]) + (int)(intensity *
382 (r_bgnd - qRed (data[ind]))); 386 (r_bgnd - qRed (data[ind])));
383 g = qGreen(data[ind]) + (int)(intensity * 387 g = qGreen(data[ind]) + (int)(intensity *
384 (g_bgnd - qGreen(data[ind]))); 388 (g_bgnd - qGreen(data[ind])));
385 b = qBlue (data[ind]) + (int)(intensity * 389 b = qBlue (data[ind]) + (int)(intensity *
386 (b_bgnd - qBlue (data[ind]))); 390 (b_bgnd - qBlue (data[ind])));
387 if (r > 255) r = 255; if (r < 0 ) r = 0; 391 if (r > 255) r = 255; if (r < 0 ) r = 0;
388 if (g > 255) g = 255; if (g < 0 ) g = 0; 392 if (g > 255) g = 255; if (g < 0 ) g = 0;
389 if (b > 255) b = 255; if (b < 0 ) b = 0; 393 if (b > 255) b = 255; if (b < 0 ) b = 0;
390 a = qAlpha(data[ind]); 394 a = qAlpha(data[ind]);
391 data[ind] = qRgba(r, g, b, a); 395 data[ind] = qRgba(r, g, b, a);
392 } 396 }
393 } 397 }
394 } 398 }
395 399
396 else if (eff == RectangleGradient || eff == EllipticGradient) { 400 else if (eff == RectangleGradient || eff == EllipticGradient) {
397 float xvar; 401 float xvar;
398 float yvar; 402 float yvar;
399 403
400 for (x = 0; x < image.width() / 2 + image.width() % 2; x++) { 404 for (x = 0; x < image.width() / 2 + image.width() % 2; x++) {
401 xvar = var / image.width() * (image.width() - x*2/unaffected-1); 405 xvar = var / image.width() * (image.width() - x*2/unaffected-1);
402 for (y = 0; y < image.height() / 2 + image.height() % 2; y++) { 406 for (y = 0; y < image.height() / 2 + image.height() % 2; y++) {
403 yvar = var / image.height() * (image.height() - y*2/unaffected -1); 407 yvar = var / image.height() * (image.height() - y*2/unaffected -1);
404 408
405 if (eff == RectangleGradient) 409 if (eff == RectangleGradient)
406 intensity = initial_intensity + QMAX(xvar, yvar); 410 intensity = initial_intensity + QMAX(xvar, yvar);
407 else 411 else
408 intensity = initial_intensity + qSqrt(xvar * xvar + yvar * yvar); 412 intensity = initial_intensity + qSqrt(xvar * xvar + yvar * yvar);
409 if (intensity > 1) intensity = 1; 413 if (intensity > 1) intensity = 1;
410 if (intensity < 0) intensity = 0; 414 if (intensity < 0) intensity = 0;
411 415
412 //NW 416 //NW
413 ind = x + image.width() * y ; 417 ind = x + image.width() * y ;
414 r = qRed (data[ind]) + (int)(intensity * 418 r = qRed (data[ind]) + (int)(intensity *
415 (r_bgnd - qRed (data[ind]))); 419 (r_bgnd - qRed (data[ind])));
416 g = qGreen(data[ind]) + (int)(intensity * 420 g = qGreen(data[ind]) + (int)(intensity *
417 (g_bgnd - qGreen(data[ind]))); 421 (g_bgnd - qGreen(data[ind])));
418 b = qBlue (data[ind]) + (int)(intensity * 422 b = qBlue (data[ind]) + (int)(intensity *
419 (b_bgnd - qBlue (data[ind]))); 423 (b_bgnd - qBlue (data[ind])));
420 if (r > 255) r = 255; if (r < 0 ) r = 0; 424 if (r > 255) r = 255; if (r < 0 ) r = 0;
421 if (g > 255) g = 255; if (g < 0 ) g = 0; 425 if (g > 255) g = 255; if (g < 0 ) g = 0;
422 if (b > 255) b = 255; if (b < 0 ) b = 0; 426 if (b > 255) b = 255; if (b < 0 ) b = 0;
423 a = qAlpha(data[ind]); 427 a = qAlpha(data[ind]);
424 data[ind] = qRgba(r, g, b, a); 428 data[ind] = qRgba(r, g, b, a);
425 429
426 //NE 430 //NE
427 ind = image.width() - x - 1 + image.width() * y ; 431 ind = image.width() - x - 1 + image.width() * y ;
428 r = qRed (data[ind]) + (int)(intensity * 432 r = qRed (data[ind]) + (int)(intensity *
429 (r_bgnd - qRed (data[ind]))); 433 (r_bgnd - qRed (data[ind])));
430 g = qGreen(data[ind]) + (int)(intensity * 434 g = qGreen(data[ind]) + (int)(intensity *
431 (g_bgnd - qGreen(data[ind]))); 435 (g_bgnd - qGreen(data[ind])));
432 b = qBlue (data[ind]) + (int)(intensity * 436 b = qBlue (data[ind]) + (int)(intensity *
433 (b_bgnd - qBlue (data[ind]))); 437 (b_bgnd - qBlue (data[ind])));
434 if (r > 255) r = 255; if (r < 0 ) r = 0; 438 if (r > 255) r = 255; if (r < 0 ) r = 0;
435 if (g > 255) g = 255; if (g < 0 ) g = 0; 439 if (g > 255) g = 255; if (g < 0 ) g = 0;
436 if (b > 255) b = 255; if (b < 0 ) b = 0; 440 if (b > 255) b = 255; if (b < 0 ) b = 0;
437 a = qAlpha(data[ind]); 441 a = qAlpha(data[ind]);
438 data[ind] = qRgba(r, g, b, a); 442 data[ind] = qRgba(r, g, b, a);
439 } 443 }
440 } 444 }
441 445
442 //CT loop is doubled because of stupid central row/column issue. 446 //CT loop is doubled because of stupid central row/column issue.
443 // other solution? 447 // other solution?
444 for (x = 0; x < image.width() / 2; x++) { 448 for (x = 0; x < image.width() / 2; x++) {
445 xvar = var / image.width() * (image.width() - x*2/unaffected-1); 449 xvar = var / image.width() * (image.width() - x*2/unaffected-1);
446 for (y = 0; y < image.height() / 2; y++) { 450 for (y = 0; y < image.height() / 2; y++) {
447 yvar = var / image.height() * (image.height() - y*2/unaffected -1); 451 yvar = var / image.height() * (image.height() - y*2/unaffected -1);
448 452
449 if (eff == RectangleGradient) 453 if (eff == RectangleGradient)
450 intensity = initial_intensity + QMAX(xvar, yvar); 454 intensity = initial_intensity + QMAX(xvar, yvar);
451 else 455 else
452 intensity = initial_intensity + qSqrt(xvar * xvar + yvar * yvar); 456 intensity = initial_intensity + qSqrt(xvar * xvar + yvar * yvar);
453 if (intensity > 1) intensity = 1; 457 if (intensity > 1) intensity = 1;
454 if (intensity < 0) intensity = 0; 458 if (intensity < 0) intensity = 0;
455 459
456 //SW 460 //SW
457 ind = x + image.width() * (image.height() - y -1) ; 461 ind = x + image.width() * (image.height() - y -1) ;
458 r = qRed (data[ind]) + (int)(intensity * 462 r = qRed (data[ind]) + (int)(intensity *
459 (r_bgnd - qRed (data[ind]))); 463 (r_bgnd - qRed (data[ind])));
460 g = qGreen(data[ind]) + (int)(intensity * 464 g = qGreen(data[ind]) + (int)(intensity *
461 (g_bgnd - qGreen(data[ind]))); 465 (g_bgnd - qGreen(data[ind])));
462 b = qBlue (data[ind]) + (int)(intensity * 466 b = qBlue (data[ind]) + (int)(intensity *
463 (b_bgnd - qBlue (data[ind]))); 467 (b_bgnd - qBlue (data[ind])));
464 if (r > 255) r = 255; if (r < 0 ) r = 0; 468 if (r > 255) r = 255; if (r < 0 ) r = 0;
465 if (g > 255) g = 255; if (g < 0 ) g = 0; 469 if (g > 255) g = 255; if (g < 0 ) g = 0;
466 if (b > 255) b = 255; if (b < 0 ) b = 0; 470 if (b > 255) b = 255; if (b < 0 ) b = 0;
467 a = qAlpha(data[ind]); 471 a = qAlpha(data[ind]);
468 data[ind] = qRgba(r, g, b, a); 472 data[ind] = qRgba(r, g, b, a);
469 473
470 //SE 474 //SE
471 ind = image.width()-x-1 + image.width() * (image.height() - y - 1) ; 475 ind = image.width()-x-1 + image.width() * (image.height() - y - 1) ;
472 r = qRed (data[ind]) + (int)(intensity * 476 r = qRed (data[ind]) + (int)(intensity *
473 (r_bgnd - qRed (data[ind]))); 477 (r_bgnd - qRed (data[ind])));
474 g = qGreen(data[ind]) + (int)(intensity * 478 g = qGreen(data[ind]) + (int)(intensity *
475 (g_bgnd - qGreen(data[ind]))); 479 (g_bgnd - qGreen(data[ind])));
476 b = qBlue (data[ind]) + (int)(intensity * 480 b = qBlue (data[ind]) + (int)(intensity *
477 (b_bgnd - qBlue (data[ind]))); 481 (b_bgnd - qBlue (data[ind])));
478 if (r > 255) r = 255; if (r < 0 ) r = 0; 482 if (r > 255) r = 255; if (r < 0 ) r = 0;
479 if (g > 255) g = 255; if (g < 0 ) g = 0; 483 if (g > 255) g = 255; if (g < 0 ) g = 0;
480 if (b > 255) b = 255; if (b < 0 ) b = 0; 484 if (b > 255) b = 255; if (b < 0 ) b = 0;
481 a = qAlpha(data[ind]); 485 a = qAlpha(data[ind]);
482 data[ind] = qRgba(r, g, b, a); 486 data[ind] = qRgba(r, g, b, a);
483 } 487 }
484 } 488 }
485 } 489 }
486 490
487 else 491 else
488 qDebug ( "not implemented\n" ); 492 odebug << "not implemented" << oendl;
489 493
490 return image; 494 return image;
491} 495}
492 496
493#if 0 497#if 0
494// Not very efficient as we create a third big image... 498// Not very efficient as we create a third big image...
495// 499//
496QImage& KQGfxEffect::blend(QImage &image1, QImage &image2, 500QImage& KQGfxEffect::blend(QImage &image1, QImage &image2,
497 GradientType gt, int xf, int yf) 501 GradientType gt, int xf, int yf)
498{ 502{
499 if (image1.width() == 0 || image1.height() == 0 || 503 if (image1.width() == 0 || image1.height() == 0 ||
500 image2.width() == 0 || image2.height() == 0) 504 image2.width() == 0 || image2.height() == 0)
501 return image1; 505 return image1;
502 506
503 QImage image3; 507 QImage image3;
504 508
505 image3 = KQGfxEffect::unbalancedGradient(image1.size(), 509 image3 = KQGfxEffect::unbalancedGradient(image1.size(),
506 QColor(0,0,0), QColor(255,255,255), 510 QColor(0,0,0), QColor(255,255,255),
507 gt, xf, yf, 0); 511 gt, xf, yf, 0);
508 512
509 return blend(image1,image2,image3, Red); // Channel to use is arbitrary 513 return blend(image1,image2,image3, Red); // Channel to use is arbitrary
510} 514}
511#endif 515#endif
diff --git a/noncore/styles/theme/othemebase.cpp b/noncore/styles/theme/othemebase.cpp
index 7ce4e5a..d2226e6 100644
--- a/noncore/styles/theme/othemebase.cpp
+++ b/noncore/styles/theme/othemebase.cpp
@@ -1,1200 +1,1205 @@
1/* This file is part of the KDE libraries 1/* This file is part of the KDE libraries
2 Copyright (C) 1999 Daniel M. Duley <mosfet@kde.org> 2 Copyright (C) 1999 Daniel M. Duley <mosfet@kde.org>
3 3
4 This library is free software; you can redistribute it and/or 4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public 5 modify it under the terms of the GNU Library General Public
6 License version 2 as published by the Free Software Foundation. 6 License version 2 as published by the Free Software Foundation.
7 7
8 This library is distributed in the hope that it will be useful, 8 This library is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of 9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 Library General Public License for more details. 11 Library General Public License for more details.
12 12
13 You should have received a copy of the GNU Library General Public License 13 You should have received a copy of the GNU Library General Public License
14 along with this library; see the file COPYING.LIB. If not, write to 14 along with this library; see the file COPYING.LIB. If not, write to
15 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 15 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
16 Boston, MA 02111-1307, USA. 16 Boston, MA 02111-1307, USA.
17*/ 17*/
18 18
19#include "othemebase.h" 19#include "othemebase.h"
20#include "ogfxeffect.h" 20#include "ogfxeffect.h"
21 21
22/* OPIE */ 22/* OPIE */
23#include <opie2/odebug.h> 23#include <opie2/odebug.h>
24#include <qpe/qpeapplication.h> 24#include <qpe/qpeapplication.h>
25#include <qpe/config.h> 25#include <qpe/config.h>
26using namespace Opie::Core; 26using namespace Opie::Core;
27 27
28/* QT */ 28/* QT */
29#include <qfile.h> 29#include <qfile.h>
30#include <qtextstream.h> 30#include <qtextstream.h>
31#include <qdir.h> 31#include <qdir.h>
32#include <qpainter.h> 32#include <qpainter.h>
33#include <qbitmap.h> 33#include <qbitmap.h>
34#include <qstringlist.h> 34#include <qstringlist.h>
35 35
36/* STD */ 36/* STD */
37#include <stdlib.h> 37#include <stdlib.h>
38 38
39 39
40template class QIntCache<OThemePixmap> 40template class QIntCache<OThemePixmap>
41; 41;
42 42
43static const char *widgetEntries[] = 43static const char *widgetEntries[] =
44 { // unsunken widgets (see header) 44 { // unsunken widgets (see header)
45 "PushButton", "ComboBox", "HSBarSlider", "VSBarSlider", "Bevel", "ToolButton", 45 "PushButton", "ComboBox", "HSBarSlider", "VSBarSlider", "Bevel", "ToolButton",
46 "ScrollButton", "HScrollDeco", "VScrollDeco", "ComboDeco", "MenuItem", "Tab", 46 "ScrollButton", "HScrollDeco", "VScrollDeco", "ComboDeco", "MenuItem", "Tab",
47 "ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", 47 "ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight",
48 // sunken widgets 48 // sunken widgets
49 "PushButtonDown", "ComboBoxDown", "HSBarSliderDown", "VSBarSliderDown", 49 "PushButtonDown", "ComboBoxDown", "HSBarSliderDown", "VSBarSliderDown",
50 "BevelDown", "ToolButtonDown", "ScrollButtonDown", "HScrollDecoDown", 50 "BevelDown", "ToolButtonDown", "ScrollButtonDown", "HScrollDecoDown",
51 "VScrollDecoDown", "ComboDecoDown", "MenuItemDown", "TabDown", "SunkenArrowUp", 51 "VScrollDecoDown", "ComboDecoDown", "MenuItemDown", "TabDown", "SunkenArrowUp",
52 "SunkenArrowDown", "SunkenArrowLeft", "SunkenArrowRight", 52 "SunkenArrowDown", "SunkenArrowLeft", "SunkenArrowRight",
53 // everything else 53 // everything else
54 "HScrollGroove", "VScrollGroove", "Slider", "SliderGroove", "CheckBoxDown", 54 "HScrollGroove", "VScrollGroove", "Slider", "SliderGroove", "CheckBoxDown",
55 "CheckBox", "RadioDown", "Radio", "HBarHandle", "VBarHandle", 55 "CheckBox", "RadioDown", "Radio", "HBarHandle", "VBarHandle",
56 "ToolBar", "Splitter", "CheckMark", "MenuBar", "DisableArrowUp", 56 "ToolBar", "Splitter", "CheckMark", "MenuBar", "DisableArrowUp",
57 "DisableArrowDown", "DisableArrowLeft", "DisableArrowRight", "ProgressBar", 57 "DisableArrowDown", "DisableArrowLeft", "DisableArrowRight", "ProgressBar",
58 "ProgressBackground", "MenuBarItem", "Background" 58 "ProgressBackground", "MenuBarItem", "Background"
59 }; 59 };
60 60
61#define INHERIT_ITEMS 16 61#define INHERIT_ITEMS 16
62 62
63 63
64// This is used to encode the keys. I used to use masks but I think this 64// This is used to encode the keys. I used to use masks but I think this
65// bitfield is nicer :) I don't know why C++ coders don't use these more.. 65// bitfield is nicer :) I don't know why C++ coders don't use these more..
66// (mosfet) 66// (mosfet)
67struct kthemeKeyData 67struct kthemeKeyData
68{ 68{
69unsigned int id : 69unsigned int id :
70 6; 70 6;
71unsigned int width : 71unsigned int width :
72 12; 72 12;
73unsigned int height : 73unsigned int height :
74 12; 74 12;
75unsigned int border : 75unsigned int border :
76 1; 76 1;
77unsigned int mask : 77unsigned int mask :
78 1; 78 1;
79}; 79};
80 80
81union kthemeKey{ 81union kthemeKey{
82 kthemeKeyData data; 82 kthemeKeyData data;
83 unsigned int cacheKey; 83 unsigned int cacheKey;
84}; 84};
85 85
86 86
87void OThemeBase::generateBorderPix( int i ) 87void OThemeBase::generateBorderPix( int i )
88{ 88{
89 // separate pixmap into separate components 89 // separate pixmap into separate components
90 if ( pbPixmaps[ i ] ) { 90 if ( pbPixmaps[ i ] ) {
91 // evidently I have to do masks manually... 91 // evidently I have to do masks manually...
92 const QBitmap * srcMask = pbPixmaps[ i ] ->mask(); 92 const QBitmap * srcMask = pbPixmaps[ i ] ->mask();
93 QBitmap destMask( pbWidth[ i ], pbWidth[ i ] ); 93 QBitmap destMask( pbWidth[ i ], pbWidth[ i ] );
94 QPixmap tmp( pbWidth[ i ], pbWidth[ i ] ); 94 QPixmap tmp( pbWidth[ i ], pbWidth[ i ] );
95 95
96 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], 0, 0, pbWidth[ i ], pbWidth[ i ], 96 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], 0, 0, pbWidth[ i ], pbWidth[ i ],
97 Qt::CopyROP, false ); 97 Qt::CopyROP, false );
98 if ( srcMask ) { 98 if ( srcMask ) {
99 bitBlt( &destMask, 0, 0, srcMask, 0, 0, pbWidth[ i ], pbWidth[ i ], 99 bitBlt( &destMask, 0, 0, srcMask, 0, 0, pbWidth[ i ], pbWidth[ i ],
100 Qt::CopyROP, false ); 100 Qt::CopyROP, false );
101 tmp.setMask( destMask ); 101 tmp.setMask( destMask );
102 } 102 }
103 pbPixmaps[ i ] ->setBorder( OThemePixmap::TopLeft, tmp ); 103 pbPixmaps[ i ] ->setBorder( OThemePixmap::TopLeft, tmp );
104 104
105 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], pbPixmaps[ i ] ->width() - pbWidth[ i ], 0, 105 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], pbPixmaps[ i ] ->width() - pbWidth[ i ], 0,
106 pbWidth[ i ], pbWidth[ i ], Qt::CopyROP, false ); 106 pbWidth[ i ], pbWidth[ i ], Qt::CopyROP, false );
107 if ( srcMask ) { 107 if ( srcMask ) {
108 bitBlt( &destMask, 0, 0, srcMask, pbPixmaps[ i ] ->width() - pbWidth[ i ], 108 bitBlt( &destMask, 0, 0, srcMask, pbPixmaps[ i ] ->width() - pbWidth[ i ],
109 0, pbWidth[ i ], pbWidth[ i ], Qt::CopyROP, false ); 109 0, pbWidth[ i ], pbWidth[ i ], Qt::CopyROP, false );
110 tmp.setMask( destMask ); 110 tmp.setMask( destMask );
111 } 111 }
112 pbPixmaps[ i ] ->setBorder( OThemePixmap::TopRight, tmp ); 112 pbPixmaps[ i ] ->setBorder( OThemePixmap::TopRight, tmp );
113 113
114 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], 0, pbPixmaps[ i ] ->height() - pbWidth[ i ], 114 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], 0, pbPixmaps[ i ] ->height() - pbWidth[ i ],
115 pbWidth[ i ], pbWidth[ i ], Qt::CopyROP, false ); 115 pbWidth[ i ], pbWidth[ i ], Qt::CopyROP, false );
116 if ( srcMask ) { 116 if ( srcMask ) {
117 bitBlt( &destMask, 0, 0, srcMask, 0, pbPixmaps[ i ] ->height() - pbWidth[ i ], 117 bitBlt( &destMask, 0, 0, srcMask, 0, pbPixmaps[ i ] ->height() - pbWidth[ i ],
118 pbWidth[ i ], pbWidth[ i ], Qt::CopyROP, false ); 118 pbWidth[ i ], pbWidth[ i ], Qt::CopyROP, false );
119 tmp.setMask( destMask ); 119 tmp.setMask( destMask );
120 } 120 }
121 pbPixmaps[ i ] ->setBorder( OThemePixmap::BottomLeft, tmp ); 121 pbPixmaps[ i ] ->setBorder( OThemePixmap::BottomLeft, tmp );
122 122
123 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], pbPixmaps[ i ] ->width() - pbWidth[ i ], 123 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], pbPixmaps[ i ] ->width() - pbWidth[ i ],
124 pbPixmaps[ i ] ->height() - pbWidth[ i ], pbWidth[ i ], pbWidth[ i ], 124 pbPixmaps[ i ] ->height() - pbWidth[ i ], pbWidth[ i ], pbWidth[ i ],
125 Qt::CopyROP, false ); 125 Qt::CopyROP, false );
126 if ( srcMask ) { 126 if ( srcMask ) {
127 bitBlt( &destMask, 0, 0, srcMask, pbPixmaps[ i ] ->width() - pbWidth[ i ], 127 bitBlt( &destMask, 0, 0, srcMask, pbPixmaps[ i ] ->width() - pbWidth[ i ],
128 pbPixmaps[ i ] ->height() - pbWidth[ i ], pbWidth[ i ], pbWidth[ i ], 128 pbPixmaps[ i ] ->height() - pbWidth[ i ], pbWidth[ i ], pbWidth[ i ],
129 Qt::CopyROP, false ); 129 Qt::CopyROP, false );
130 tmp.setMask( destMask ); 130 tmp.setMask( destMask );
131 } 131 }
132 pbPixmaps[ i ] ->setBorder( OThemePixmap::BottomRight, tmp ); 132 pbPixmaps[ i ] ->setBorder( OThemePixmap::BottomRight, tmp );
133 133
134 tmp.resize( pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ] ); 134 tmp.resize( pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ] );
135 destMask.resize( pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ] ); 135 destMask.resize( pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ] );
136 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], pbWidth[ i ], 0, 136 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], pbWidth[ i ], 0,
137 pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ], Qt::CopyROP, false ); 137 pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ], Qt::CopyROP, false );
138 if ( srcMask ) { 138 if ( srcMask ) {
139 bitBlt( &destMask, 0, 0, srcMask, pbWidth[ i ], 0, 139 bitBlt( &destMask, 0, 0, srcMask, pbWidth[ i ], 0,
140 pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ], 140 pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ],
141 Qt::CopyROP, false ); 141 Qt::CopyROP, false );
142 tmp.setMask( destMask ); 142 tmp.setMask( destMask );
143 } 143 }
144 pbPixmaps[ i ] ->setBorder( OThemePixmap::Top, tmp ); 144 pbPixmaps[ i ] ->setBorder( OThemePixmap::Top, tmp );
145 145
146 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], pbWidth[ i ], 146 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], pbWidth[ i ],
147 pbPixmaps[ i ] ->height() - pbWidth[ i ], 147 pbPixmaps[ i ] ->height() - pbWidth[ i ],
148 pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ], Qt::CopyROP, false ); 148 pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ], Qt::CopyROP, false );
149 if ( srcMask ) { 149 if ( srcMask ) {
150 bitBlt( &destMask, 0, 0, srcMask, pbWidth[ i ], 150 bitBlt( &destMask, 0, 0, srcMask, pbWidth[ i ],
151 pbPixmaps[ i ] ->height() - pbWidth[ i ], 151 pbPixmaps[ i ] ->height() - pbWidth[ i ],
152 pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ], Qt::CopyROP, false ); 152 pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ], Qt::CopyROP, false );
153 tmp.setMask( destMask ); 153 tmp.setMask( destMask );
154 } 154 }
155 pbPixmaps[ i ] ->setBorder( OThemePixmap::Bottom, tmp ); 155 pbPixmaps[ i ] ->setBorder( OThemePixmap::Bottom, tmp );
156 156
157 tmp.resize( pbWidth[ i ], pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2 ); 157 tmp.resize( pbWidth[ i ], pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2 );
158 destMask.resize( pbWidth[ i ], pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2 ); 158 destMask.resize( pbWidth[ i ], pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2 );
159 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], 0, pbWidth[ i ], pbWidth[ i ], 159 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], 0, pbWidth[ i ], pbWidth[ i ],
160 pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2, Qt::CopyROP, false ); 160 pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2, Qt::CopyROP, false );
161 if ( srcMask ) { 161 if ( srcMask ) {
162 bitBlt( &destMask, 0, 0, srcMask, 0, pbWidth[ i ], pbWidth[ i ], 162 bitBlt( &destMask, 0, 0, srcMask, 0, pbWidth[ i ], pbWidth[ i ],
163 pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2, Qt::CopyROP, false ); 163 pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2, Qt::CopyROP, false );
164 tmp.setMask( destMask ); 164 tmp.setMask( destMask );
165 } 165 }
166 166
167 pbPixmaps[ i ] ->setBorder( OThemePixmap::Left, tmp ); 167 pbPixmaps[ i ] ->setBorder( OThemePixmap::Left, tmp );
168 168
169 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], pbPixmaps[ i ] ->width() - pbWidth[ i ], 169 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], pbPixmaps[ i ] ->width() - pbWidth[ i ],
170 pbWidth[ i ], pbWidth[ i ], pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2, 170 pbWidth[ i ], pbWidth[ i ], pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2,
171 Qt::CopyROP, false ); 171 Qt::CopyROP, false );
172 if ( srcMask ) { 172 if ( srcMask ) {
173 bitBlt( &destMask, 0, 0, srcMask, pbPixmaps[ i ] ->width() - pbWidth[ i ], 173 bitBlt( &destMask, 0, 0, srcMask, pbPixmaps[ i ] ->width() - pbWidth[ i ],
174 pbWidth[ i ], pbWidth[ i ], pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2, 174 pbWidth[ i ], pbWidth[ i ], pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2,
175 Qt::CopyROP, false ); 175 Qt::CopyROP, false );
176 tmp.setMask( destMask ); 176 tmp.setMask( destMask );
177 } 177 }
178 pbPixmaps[ i ] ->setBorder( OThemePixmap::Right, tmp ); 178 pbPixmaps[ i ] ->setBorder( OThemePixmap::Right, tmp );
179 } 179 }
180 else 180 else
181 qDebug ( "OThemeBase: Tried making border from empty pixmap" ); 181 odebug << "OThemeBase: Tried making border from empty pixmap" << oendl;
182} 182}
183 183
184 184
185void OThemeBase::copyWidgetConfig( int sourceID, int destID, QString *pixnames, 185void OThemeBase::copyWidgetConfig( int sourceID, int destID, QString *pixnames,
186 QString *brdnames ) 186 QString *brdnames )
187{ 187{
188 scaleHints[ destID ] = scaleHints[ sourceID ]; 188 scaleHints[ destID ] = scaleHints[ sourceID ];
189 gradients[ destID ] = gradients[ sourceID ]; 189 gradients[ destID ] = gradients[ sourceID ];
190 blends[ destID ] = blends[ sourceID ]; 190 blends[ destID ] = blends[ sourceID ];
191 bContrasts[ destID ] = bContrasts[ sourceID ]; 191 bContrasts[ destID ] = bContrasts[ sourceID ];
192 borders[ destID ] = borders[ sourceID ]; 192 borders[ destID ] = borders[ sourceID ];
193 highlights[ destID ] = highlights[ sourceID ]; 193 highlights[ destID ] = highlights[ sourceID ];
194 194
195 if ( grLowColors[ sourceID ] ) 195 if ( grLowColors[ sourceID ] )
196 grLowColors[ destID ] = new QColor( *grLowColors[ sourceID ] ); 196 grLowColors[ destID ] = new QColor( *grLowColors[ sourceID ] );
197 else 197 else
198 grLowColors[ destID ] = NULL; 198 grLowColors[ destID ] = NULL;
199 199
200 if ( grHighColors[ sourceID ] ) 200 if ( grHighColors[ sourceID ] )
201 grHighColors[ destID ] = new QColor( *grHighColors[ sourceID ] ); 201 grHighColors[ destID ] = new QColor( *grHighColors[ sourceID ] );
202 else 202 else
203 grHighColors[ destID ] = NULL; 203 grHighColors[ destID ] = NULL;
204 204
205 if ( colors[ sourceID ] ) 205 if ( colors[ sourceID ] )
206 colors[ destID ] = new QColorGroup( *colors[ sourceID ] ); 206 colors[ destID ] = new QColorGroup( *colors[ sourceID ] );
207 else 207 else
208 colors[ destID ] = NULL; 208 colors[ destID ] = NULL;
209 209
210 // pixmap 210 // pixmap
211 pixnames[ destID ] = pixnames[ sourceID ]; 211 pixnames[ destID ] = pixnames[ sourceID ];
212 duplicate[ destID ] = false; 212 duplicate[ destID ] = false;
213 pixmaps[ destID ] = NULL; 213 pixmaps[ destID ] = NULL;
214 images[ destID ] = NULL; 214 images[ destID ] = NULL;
215 if ( !pixnames[ destID ].isEmpty() ) { 215 if ( !pixnames[ destID ].isEmpty() ) {
216 if ( scaleHints[ sourceID ] == TileScale && blends[ sourceID ] == 0.0 ) { 216 if ( scaleHints[ sourceID ] == TileScale && blends[ sourceID ] == 0.0 ) {
217 pixmaps[ destID ] = pixmaps[ sourceID ]; 217 pixmaps[ destID ] = pixmaps[ sourceID ];
218 duplicate[ destID ] = true; 218 duplicate[ destID ] = true;
219 } 219 }
220 if ( !duplicate[ destID ] ) { 220 if ( !duplicate[ destID ] ) {
221 pixmaps[ destID ] = loadPixmap( pixnames[ destID ] ); 221 pixmaps[ destID ] = loadPixmap( pixnames[ destID ] );
222 if ( scaleHints[ destID ] == TileScale && blends[ destID ] == 0.0 ) 222 if ( scaleHints[ destID ] == TileScale && blends[ destID ] == 0.0 )
223 images[ destID ] = NULL; 223 images[ destID ] = NULL;
224 else 224 else
225 images[ destID ] = loadImage( pixnames[ destID ] ); 225 images[ destID ] = loadImage( pixnames[ destID ] );
226 } 226 }
227 } 227 }
228 228
229 // border pixmap 229 // border pixmap
230 pbDuplicate[ destID ] = false; 230 pbDuplicate[ destID ] = false;
231 pbPixmaps[ destID ] = NULL; 231 pbPixmaps[ destID ] = NULL;
232 pbWidth[ destID ] = pbWidth[ sourceID ]; 232 pbWidth[ destID ] = pbWidth[ sourceID ];
233 brdnames[ destID ] = brdnames[ sourceID ]; 233 brdnames[ destID ] = brdnames[ sourceID ];
234 if ( !brdnames[ destID ].isEmpty() ) { 234 if ( !brdnames[ destID ].isEmpty() ) {
235 pbPixmaps[ destID ] = pbPixmaps[ sourceID ]; 235 pbPixmaps[ destID ] = pbPixmaps[ sourceID ];
236 pbDuplicate[ destID ] = true; 236 pbDuplicate[ destID ] = true;
237 } 237 }
238 238
239 if ( sourceID == ActiveTab && destID == InactiveTab ) 239 if ( sourceID == ActiveTab && destID == InactiveTab )
240 aTabLine = iTabLine; 240 aTabLine = iTabLine;
241 else if ( sourceID == InactiveTab && destID == ActiveTab ) 241 else if ( sourceID == InactiveTab && destID == ActiveTab )
242 iTabLine = aTabLine; 242 iTabLine = aTabLine;
243} 243}
244 244
245void OThemeBase::readConfig( Qt::GUIStyle /*style*/ ) 245void OThemeBase::readConfig( Qt::GUIStyle /*style*/ )
246{ 246{
247#define PREBLEND_ITEMS 12 247#define PREBLEND_ITEMS 12
248 static WidgetType preBlend[] = {Slider, IndicatorOn, IndicatorOff, 248 static WidgetType preBlend[] = {Slider, IndicatorOn, IndicatorOff,
249 ExIndicatorOn, ExIndicatorOff, HScrollDeco, VScrollDeco, HScrollDecoDown, 249 ExIndicatorOn, ExIndicatorOff, HScrollDeco, VScrollDeco, HScrollDecoDown,
250 VScrollDecoDown, ComboDeco, ComboDecoDown, CheckMark}; 250 VScrollDecoDown, ComboDeco, ComboDecoDown, CheckMark};
251 251
252 int i; 252 int i;
253 QString tmpStr; 253 QString tmpStr;
254 QString copyfrom[ WIDGETS ]; 254 QString copyfrom[ WIDGETS ];
255 QString pixnames[ WIDGETS ]; // used for duplicate check 255 QString pixnames[ WIDGETS ]; // used for duplicate check
256 QString brdnames[ WIDGETS ]; 256 QString brdnames[ WIDGETS ];
257 bool loaded[ WIDGETS ]; // used for preloading for CopyWidget 257 bool loaded[ WIDGETS ]; // used for preloading for CopyWidget
258 258
259 if ( configFileName.isEmpty() ) { 259 if ( configFileName.isEmpty() ) {
260 Config cfg ( "qpe" ); 260 Config cfg ( "qpe" );
261 cfg. setGroup ( "Appearance" ); 261 cfg. setGroup ( "Appearance" );
262 262
263 configFileName = cfg. readEntry ( "Theme", "default" ); 263 configFileName = cfg. readEntry ( "Theme", "default" );
264 } 264 }
265 Config config( configFilePath + "/themes/" + configFileName + ".themerc" , Config::File ); 265 Config config( configFilePath + "/themes/" + configFileName + ".themerc" , Config::File );
266 266
267 // Are we initalized? 267 // Are we initalized?
268 applyMiscResourceGroup( &config ); 268 applyMiscResourceGroup( &config );
269 for ( i = 0; i < INHERIT_ITEMS; ++i ) { 269 for ( i = 0; i < INHERIT_ITEMS; ++i ) {
270 applyResourceGroup( &config, i, copyfrom, pixnames, brdnames ); 270 applyResourceGroup( &config, i, copyfrom, pixnames, brdnames );
271 } 271 }
272 for ( ; i < INHERIT_ITEMS*2; ++i ) { 272 for ( ; i < INHERIT_ITEMS*2; ++i ) {
273 if ( config.hasGroup( QString( widgetEntries[ i ] ) ) ) { 273 if ( config.hasGroup( QString( widgetEntries[ i ] ) ) ) {
274 applyResourceGroup( &config, i, copyfrom, pixnames, brdnames ); 274 applyResourceGroup( &config, i, copyfrom, pixnames, brdnames );
275 } 275 }
276 else { 276 else {
277 copyfrom [ i ] = widgetEntries[ i - INHERIT_ITEMS ]; 277 copyfrom [ i ] = widgetEntries[ i - INHERIT_ITEMS ];
278 } 278 }
279 } 279 }
280 for ( ; i < WIDGETS; ++i ) { 280 for ( ; i < WIDGETS; ++i ) {
281 applyResourceGroup( &config, i, copyfrom, pixnames, brdnames ); 281 applyResourceGroup( &config, i, copyfrom, pixnames, brdnames );
282 } 282 }
283 283
284 // initalize defaults that may not be read 284 // initalize defaults that may not be read
285 for ( i = 0; i < WIDGETS; ++i ) 285 for ( i = 0; i < WIDGETS; ++i )
286 loaded[ i ] = false; 286 loaded[ i ] = false;
287 btnXShift = btnYShift = focus3DOffset = 0; 287 btnXShift = btnYShift = focus3DOffset = 0;
288 aTabLine = iTabLine = true; 288 aTabLine = iTabLine = true;
289 roundedButton = roundedCombo = roundedSlider = focus3D = false; 289 roundedButton = roundedCombo = roundedSlider = focus3D = false;
290 splitterWidth = 10; 290 splitterWidth = 10;
291 291
292 for ( i = 0; i < WIDGETS; ++i ) { 292 for ( i = 0; i < WIDGETS; ++i ) {
293 readResourceGroup( i, copyfrom, pixnames, brdnames, loaded ); 293 readResourceGroup( i, copyfrom, pixnames, brdnames, loaded );
294 } 294 }
295 295
296 // misc items 296 // misc items
297 readMiscResourceGroup(); 297 readMiscResourceGroup();
298 298
299 // Handle preblend items 299 // Handle preblend items
300 for ( i = 0; i < PREBLEND_ITEMS; ++i ) { 300 for ( i = 0; i < PREBLEND_ITEMS; ++i ) {
301 if ( pixmaps[ preBlend[ i ] ] != NULL && blends[ preBlend[ i ] ] != 0.0 ) 301 if ( pixmaps[ preBlend[ i ] ] != NULL && blends[ preBlend[ i ] ] != 0.0 )
302 blend( preBlend[ i ] ); 302 blend( preBlend[ i ] );
303 } 303 }
304} 304}
305 305
306OThemeBase::OThemeBase( const QString & configFile ) 306OThemeBase::OThemeBase( const QString & configFile )
307 : QWindowsStyle() 307 : QWindowsStyle()
308{ 308{
309 configFilePath = QPEApplication::qpeDir ( ) + "/plugins/styles/"; 309 configFilePath = QPEApplication::qpeDir ( ) + "/plugins/styles/";
310 configFileName = configFile; 310 configFileName = configFile;
311 311
312 readConfig( Qt::WindowsStyle ); 312 readConfig( Qt::WindowsStyle );
313 cache = new OThemeCache( cacheSize ); 313 cache = new OThemeCache( cacheSize );
314} 314}
315 315
316void OThemeBase::applyConfigFile( const QString &/*file*/ ) 316void OThemeBase::applyConfigFile( const QString &/*file*/ )
317{ 317{
318#if 0 318#if 0
319 // handle std color scheme 319 // handle std color scheme
320 Config inConfig( file, Config::File ); 320 Config inConfig( file, Config::File );
321 Config globalConfig ( "qpe" ); 321 Config globalConfig ( "qpe" );
322 322
323 globalConfig. setGroup ( "Apperance" ); 323 globalConfig. setGroup ( "Apperance" );
324 inConfig. setGroup( "General" ); 324 inConfig. setGroup( "General" );
325 325
326 if ( inConfig.hasKey( "foreground" ) ) 326 if ( inConfig.hasKey( "foreground" ) )
327 globalConfig.writeEntry( "Text", inConfig.readEntry( "foreground", " " ) ); 327 globalConfig.writeEntry( "Text", inConfig.readEntry( "foreground", " " ) );
328 if ( inConfig.hasKey( "background" ) ) 328 if ( inConfig.hasKey( "background" ) )
329 globalConfig.writeEntry( "Background", inConfig.readEntry( "background", " " ) ); 329 globalConfig.writeEntry( "Background", inConfig.readEntry( "background", " " ) );
330 if ( inConfig.hasKey( "selectForeground" ) ) 330 if ( inConfig.hasKey( "selectForeground" ) )
331 globalConfig.writeEntry( "HighlightedText", inConfig.readEntry( "selectForeground", " " ) ); 331 globalConfig.writeEntry( "HighlightedText", inConfig.readEntry( "selectForeground", " " ) );
332 if ( inConfig.hasKey( "selectBackground" ) ) 332 if ( inConfig.hasKey( "selectBackground" ) )
333 globalConfig.writeEntry( "Highlight", inConfig.readEntry( "selectBackground", " " ) ); 333 globalConfig.writeEntry( "Highlight", inConfig.readEntry( "selectBackground", " " ) );
334 if ( inConfig.hasKey( "windowForeground" ) ) 334 if ( inConfig.hasKey( "windowForeground" ) )
335 globalConfig.writeEntry( "Text", inConfig.readEntry( "windowForeground", " " ) ); 335 globalConfig.writeEntry( "Text", inConfig.readEntry( "windowForeground", " " ) );
336 if ( inConfig.hasKey( "windowBackground" ) ) 336 if ( inConfig.hasKey( "windowBackground" ) )
337 globalConfig.writeEntry( "Base", inConfig.readEntry( "windowBackground", " " ) ); 337 globalConfig.writeEntry( "Base", inConfig.readEntry( "windowBackground", " " ) );
338 338
339 // Keep track of the current theme so that we can select the right one 339 // Keep track of the current theme so that we can select the right one
340 // in the KControl module. 340 // in the KControl module.
341 globalConfig.writeEntry ( "CurrentTheme", file ); 341 globalConfig.writeEntry ( "CurrentTheme", file );
342 342
343 globalConfig.write(); 343 globalConfig.write();
344#endif 344#endif
345} 345}
346 346
347OThemeBase::~OThemeBase() 347OThemeBase::~OThemeBase()
348{ 348{
349 int i; 349 int i;
350 for ( i = 0; i < WIDGETS; ++i ) { 350 for ( i = 0; i < WIDGETS; ++i ) {
351 if ( !duplicate[ i ] ) { 351 if ( !duplicate[ i ] ) {
352 if ( images[ i ] ) 352 if ( images[ i ] )
353 delete images[ i ]; 353 delete images[ i ];
354 if ( pixmaps[ i ] ) 354 if ( pixmaps[ i ] )
355 delete pixmaps[ i ]; 355 delete pixmaps[ i ];
356 } 356 }
357 if ( !pbDuplicate[ i ] && pbPixmaps[ i ] ) 357 if ( !pbDuplicate[ i ] && pbPixmaps[ i ] )
358 delete pbPixmaps[ i ]; 358 delete pbPixmaps[ i ];
359 if ( colors[ i ] ) 359 if ( colors[ i ] )
360 delete( colors[ i ] ); 360 delete( colors[ i ] );
361 if ( grLowColors[ i ] ) 361 if ( grLowColors[ i ] )
362 delete( grLowColors[ i ] ); 362 delete( grLowColors[ i ] );
363 if ( grHighColors[ i ] ) 363 if ( grHighColors[ i ] )
364 delete( grHighColors[ i ] ); 364 delete( grHighColors[ i ] );
365 } 365 }
366 delete cache; 366 delete cache;
367} 367}
368 368
369QImage* OThemeBase::loadImage( QString &name ) 369QImage* OThemeBase::loadImage( QString &name )
370{ 370{
371 QImage * image = new QImage; 371 QImage * image = new QImage;
372 QString path = configFilePath + "/pixmaps/" + name; 372 QString path = configFilePath + "/pixmaps/" + name;
373 image->load( path ); 373 image->load( path );
374 if ( !image->isNull() ) 374 if ( !image->isNull() )
375 return ( image ); 375 return ( image );
376 qDebug ( "OThemeBase: Unable to load image %s\n", name.ascii ( ) ); 376 odebug << "OThemeBase: Unable to load image " << name.ascii ( ) << oendl;
377 delete image; 377 delete image;
378 return ( NULL ); 378 return ( NULL );
379} 379}
380 380
381OThemePixmap* OThemeBase::loadPixmap( QString &name ) 381OThemePixmap* OThemeBase::loadPixmap( QString &name )
382{ 382{
383 OThemePixmap * pixmap = new OThemePixmap( false ); 383 OThemePixmap * pixmap = new OThemePixmap( false );
384 QString path = configFilePath + "/pixmaps/" + name; 384 QString path = configFilePath + "/pixmaps/" + name;
385 pixmap->load( path ); 385 pixmap->load( path );
386 if ( !pixmap->isNull() ) 386 if ( !pixmap->isNull() )
387 return pixmap; 387 return pixmap;
388 qDebug ( "OThemeBase: Unable to load pixmap %s\n", name.ascii() ); 388 odebug << "OThemeBase: Unable to load pixmap " << name.ascii() << oendl;
389 delete pixmap; 389 delete pixmap;
390 return ( NULL ); 390 return ( NULL );
391} 391}
392 392
393OThemePixmap* OThemeBase::scale( int w, int h, WidgetType widget ) 393OThemePixmap* OThemeBase::scale( int w, int h, WidgetType widget )
394{ 394{
395 if ( scaleHints[ widget ] == FullScale ) { 395 if ( scaleHints[ widget ] == FullScale ) {
396 if ( !pixmaps[ widget ] || pixmaps[ widget ] ->width() != w || 396 if ( !pixmaps[ widget ] || pixmaps[ widget ] ->width() != w ||
397 pixmaps[ widget ] ->height() != h ) { 397 pixmaps[ widget ] ->height() != h ) {
398 OThemePixmap * cachePix = cache->pixmap( w, h, widget ); 398 OThemePixmap * cachePix = cache->pixmap( w, h, widget );
399 if ( cachePix ) { 399 if ( cachePix ) {
400 cachePix = new OThemePixmap( *cachePix ); 400 cachePix = new OThemePixmap( *cachePix );
401 if ( pixmaps[ widget ] ) 401 if ( pixmaps[ widget ] )
402 cache->insert( pixmaps[ widget ], OThemeCache::FullScale, 402 cache->insert( pixmaps[ widget ], OThemeCache::FullScale,
403 widget ); 403 widget );
404 else 404 else
405 odebug << "We would have inserted a null pixmap!\n" << oendl; 405 odebug << "We would have inserted a null pixmap!\n" << oendl;
406 pixmaps[ widget ] = cachePix; 406 pixmaps[ widget ] = cachePix;
407 } 407 }
408 else { 408 else {
409 cache->insert( pixmaps[ widget ], OThemeCache::FullScale, widget ); 409 cache->insert( pixmaps[ widget ], OThemeCache::FullScale, widget );
410 QImage tmpImg = images[ widget ] ->smoothScale( w, h ); 410 QImage tmpImg = images[ widget ] ->smoothScale( w, h );
411 pixmaps[ widget ] = new OThemePixmap; 411 pixmaps[ widget ] = new OThemePixmap;
412 pixmaps[ widget ] ->convertFromImage( tmpImg ); 412 pixmaps[ widget ] ->convertFromImage( tmpImg );
413 if ( blends[ widget ] != 0.0 ) 413 if ( blends[ widget ] != 0.0 )
414 blend( widget ); 414 blend( widget );
415 } 415 }
416 } 416 }
417 } 417 }
418 else if ( scaleHints[ widget ] == HorizontalScale ) { 418 else if ( scaleHints[ widget ] == HorizontalScale ) {
419 if ( pixmaps[ widget ] ->width() != w ) { 419 if ( pixmaps[ widget ] ->width() != w ) {
420 OThemePixmap * cachePix = cache->horizontalPixmap( w, widget ); 420 OThemePixmap * cachePix = cache->horizontalPixmap( w, widget );
421 if ( cachePix ) { 421 if ( cachePix ) {
422 cachePix = new OThemePixmap( *cachePix ); 422 cachePix = new OThemePixmap( *cachePix );
423 if ( pixmaps[ widget ] ) 423 if ( pixmaps[ widget ] )
424 cache->insert( pixmaps[ widget ], OThemeCache::HorizontalScale, widget ); 424 cache->insert( pixmaps[ widget ], OThemeCache::HorizontalScale, widget );
425 else 425 else
426 qDebug ( "We would have inserted a null pixmap!\n" ); 426 odebug << "We would have inserted a null pixmap!" << oendl;
427 pixmaps[ widget ] = cachePix; 427 pixmaps[ widget ] = cachePix;
428 } 428 }
429 else { 429 else {
430 cache->insert( pixmaps[ widget ], OThemeCache::HorizontalScale, widget ); 430 cache->insert( pixmaps[ widget ], OThemeCache::HorizontalScale, widget );
431 QImage tmpImg = images[ widget ] -> 431 QImage tmpImg = images[ widget ] ->
432 smoothScale( w, images[ widget ] ->height() ); 432 smoothScale( w, images[ widget ] ->height() );
433 pixmaps[ widget ] = new OThemePixmap; 433 pixmaps[ widget ] = new OThemePixmap;
434 pixmaps[ widget ] ->convertFromImage( tmpImg ); 434 pixmaps[ widget ] ->convertFromImage( tmpImg );
435 if ( blends[ widget ] != 0.0 ) 435 if ( blends[ widget ] != 0.0 )
436 blend( widget ); 436 blend( widget );
437 } 437 }
438 } 438 }
439 } 439 }
440 else if ( scaleHints[ widget ] == VerticalScale ) { 440 else if ( scaleHints[ widget ] == VerticalScale ) {
441 if ( pixmaps[ widget ] ->height() != h ) { 441 if ( pixmaps[ widget ] ->height() != h ) {
442 OThemePixmap * cachePix = cache->verticalPixmap( w, widget ); 442 OThemePixmap * cachePix = cache->verticalPixmap( w, widget );
443 if ( cachePix ) { 443 if ( cachePix ) {
444 cachePix = new OThemePixmap( *cachePix ); 444 cachePix = new OThemePixmap( *cachePix );
445 if ( pixmaps[ widget ] ) 445 if ( pixmaps[ widget ] )
446 cache->insert( pixmaps[ widget ], OThemeCache::VerticalScale, widget ); 446 cache->insert( pixmaps[ widget ], OThemeCache::VerticalScale, widget );
447 else 447 else
448 qDebug ( "We would have inserted a null pixmap!\n" ); 448 odebug << "We would have inserted a null pixmap!" << oendl;
449 pixmaps[ widget ] = cachePix; 449 pixmaps[ widget ] = cachePix;
450 } 450 }
451 else { 451 else {
452 cache->insert( pixmaps[ widget ], OThemeCache::VerticalScale, widget ); 452 cache->insert( pixmaps[ widget ], OThemeCache::VerticalScale, widget );
453 QImage tmpImg = 453 QImage tmpImg =
454 images[ widget ] ->smoothScale( images[ widget ] ->width(), h ); 454 images[ widget ] ->smoothScale( images[ widget ] ->width(), h );
455 pixmaps[ widget ] = new OThemePixmap; 455 pixmaps[ widget ] = new OThemePixmap;
456 pixmaps[ widget ] ->convertFromImage( tmpImg ); 456 pixmaps[ widget ] ->convertFromImage( tmpImg );
457 if ( blends[ widget ] != 0.0 ) 457 if ( blends[ widget ] != 0.0 )
458 blend( widget ); 458 blend( widget );
459 } 459 }
460 } 460 }
461 } 461 }
462 // If blended tile here so the blend is scaled properly 462 // If blended tile here so the blend is scaled properly
463 else if ( scaleHints[ widget ] == TileScale && blends[ widget ] != 0.0 ) { 463 else if ( scaleHints[ widget ] == TileScale && blends[ widget ] != 0.0 ) {
464 if ( !pixmaps[ widget ] || pixmaps[ widget ] ->width() != w || 464 if ( !pixmaps[ widget ] || pixmaps[ widget ] ->width() != w ||
465 pixmaps[ widget ] ->height() != h ) { 465 pixmaps[ widget ] ->height() != h ) {
466 OThemePixmap * cachePix = cache->pixmap( w, h, widget ); 466 OThemePixmap * cachePix = cache->pixmap( w, h, widget );
467 if ( cachePix ) { 467 if ( cachePix ) {
468 cachePix = new OThemePixmap( *cachePix ); 468 cachePix = new OThemePixmap( *cachePix );
469 cache->insert( pixmaps[ widget ], OThemeCache::FullScale, widget ); 469 cache->insert( pixmaps[ widget ], OThemeCache::FullScale, widget );
470 pixmaps[ widget ] = cachePix; 470 pixmaps[ widget ] = cachePix;
471 } 471 }
472 else { 472 else {
473 cache->insert( pixmaps[ widget ], OThemeCache::FullScale, widget ); 473 cache->insert( pixmaps[ widget ], OThemeCache::FullScale, widget );
474 QPixmap tile; 474 QPixmap tile;
475 tile.convertFromImage( *images[ widget ] ); 475 tile.convertFromImage( *images[ widget ] );
476 pixmaps[ widget ] = new OThemePixmap; 476 pixmaps[ widget ] = new OThemePixmap;
477 pixmaps[ widget ] ->resize( w, h ); 477 pixmaps[ widget ] ->resize( w, h );
478 QPainter p( pixmaps[ widget ] ); 478 QPainter p( pixmaps[ widget ] );
479 p.drawTiledPixmap( 0, 0, w, h, tile ); 479 p.drawTiledPixmap( 0, 0, w, h, tile );
480 if ( blends[ widget ] != 0.0 ) 480 if ( blends[ widget ] != 0.0 )
481 blend( widget ); 481 blend( widget );
482 } 482 }
483 } 483 }
484 } 484 }
485 return ( pixmaps[ widget ] ); 485 return ( pixmaps[ widget ] );
486} 486}
487 487
488OThemePixmap* OThemeBase::scaleBorder( int w, int h, WidgetType widget ) 488OThemePixmap* OThemeBase::scaleBorder( int w, int h, WidgetType widget )
489{ 489{
490 OThemePixmap * pixmap = NULL; 490 OThemePixmap * pixmap = NULL;
491 if ( !pbPixmaps[ widget ] && !pbWidth[ widget ] ) 491 if ( !pbPixmaps[ widget ] && !pbWidth[ widget ] )
492 return ( NULL ); 492 return ( NULL );
493 pixmap = cache->pixmap( w, h, widget, true ); 493 pixmap = cache->pixmap( w, h, widget, true );
494 if ( pixmap ) { 494 if ( pixmap ) {
495 pixmap = new OThemePixmap( *pixmap ); 495 pixmap = new OThemePixmap( *pixmap );
496 } 496 }
497 else { 497 else {
498 pixmap = new OThemePixmap(); 498 pixmap = new OThemePixmap();
499 pixmap->resize( w, h ); 499 pixmap->resize( w, h );
500 QBitmap mask; 500 QBitmap mask;
501 mask.resize( w, h ); 501 mask.resize( w, h );
502 mask.fill( color0 ); 502 mask.fill( color0 );
503 QPainter mPainter; 503 QPainter mPainter;
504 mPainter.begin( &mask ); 504 mPainter.begin( &mask );
505 505
506 QPixmap *tmp = borderPixmap( widget ) ->border( OThemePixmap::TopLeft ); 506 QPixmap *tmp = borderPixmap( widget ) ->border( OThemePixmap::TopLeft );
507 const QBitmap *srcMask = tmp->mask(); 507 const QBitmap *srcMask = tmp->mask();
508 int bdWidth = tmp->width(); 508 int bdWidth = tmp->width();
509 509
510 bitBlt( pixmap, 0, 0, tmp, 0, 0, bdWidth, bdWidth, 510 bitBlt( pixmap, 0, 0, tmp, 0, 0, bdWidth, bdWidth,
511 Qt::CopyROP, false ); 511 Qt::CopyROP, false );
512 if ( srcMask ) 512 if ( srcMask )
513 bitBlt( &mask, 0, 0, srcMask, 0, 0, bdWidth, bdWidth, 513 bitBlt( &mask, 0, 0, srcMask, 0, 0, bdWidth, bdWidth,
514 Qt::CopyROP, false ); 514 Qt::CopyROP, false );
515 else 515 else
516 mPainter.fillRect( 0, 0, bdWidth, bdWidth, color1 ); 516 mPainter.fillRect( 0, 0, bdWidth, bdWidth, color1 );
517 517
518 518
519 tmp = borderPixmap( widget ) ->border( OThemePixmap::TopRight ); 519 tmp = borderPixmap( widget ) ->border( OThemePixmap::TopRight );
520 srcMask = tmp->mask(); 520 srcMask = tmp->mask();
521 bitBlt( pixmap, w - bdWidth, 0, tmp, 0, 0, bdWidth, 521 bitBlt( pixmap, w - bdWidth, 0, tmp, 0, 0, bdWidth,
522 bdWidth, Qt::CopyROP, false ); 522 bdWidth, Qt::CopyROP, false );
523 if ( srcMask ) 523 if ( srcMask )
524 bitBlt( &mask, w - bdWidth, 0, srcMask, 0, 0, bdWidth, 524 bitBlt( &mask, w - bdWidth, 0, srcMask, 0, 0, bdWidth,
525 bdWidth, Qt::CopyROP, false ); 525 bdWidth, Qt::CopyROP, false );
526 else 526 else
527 mPainter.fillRect( w - bdWidth, 0, bdWidth, bdWidth, color1 ); 527 mPainter.fillRect( w - bdWidth, 0, bdWidth, bdWidth, color1 );
528 528
529 tmp = borderPixmap( widget ) ->border( OThemePixmap::BottomLeft ); 529 tmp = borderPixmap( widget ) ->border( OThemePixmap::BottomLeft );
530 srcMask = tmp->mask(); 530 srcMask = tmp->mask();
531 bitBlt( pixmap, 0, h - bdWidth, tmp, 0, 0, bdWidth, 531 bitBlt( pixmap, 0, h - bdWidth, tmp, 0, 0, bdWidth,
532 bdWidth, Qt::CopyROP, false ); 532 bdWidth, Qt::CopyROP, false );
533 if ( srcMask ) 533 if ( srcMask )
534 bitBlt( &mask, 0, h - bdWidth, srcMask, 0, 0, bdWidth, 534 bitBlt( &mask, 0, h - bdWidth, srcMask, 0, 0, bdWidth,
535 bdWidth, Qt::CopyROP, false ); 535 bdWidth, Qt::CopyROP, false );
536 else 536 else
537 mPainter.fillRect( 0, h - bdWidth, bdWidth, bdWidth, color1 ); 537 mPainter.fillRect( 0, h - bdWidth, bdWidth, bdWidth, color1 );
538 538
539 tmp = borderPixmap( widget ) ->border( OThemePixmap::BottomRight ); 539 tmp = borderPixmap( widget ) ->border( OThemePixmap::BottomRight );
540 srcMask = tmp->mask(); 540 srcMask = tmp->mask();
541 bitBlt( pixmap, w - bdWidth, h - bdWidth, tmp, 0, 0, 541 bitBlt( pixmap, w - bdWidth, h - bdWidth, tmp, 0, 0,
542 bdWidth, bdWidth, Qt::CopyROP, false ); 542 bdWidth, bdWidth, Qt::CopyROP, false );
543 if ( srcMask ) 543 if ( srcMask )
544 bitBlt( &mask, w - bdWidth, h - bdWidth, srcMask, 0, 0, 544 bitBlt( &mask, w - bdWidth, h - bdWidth, srcMask, 0, 0,
545 bdWidth, bdWidth, Qt::CopyROP, false ); 545 bdWidth, bdWidth, Qt::CopyROP, false );
546 else 546 else
547 mPainter.fillRect( w - bdWidth, h - bdWidth, bdWidth, bdWidth, color1 ); 547 mPainter.fillRect( w - bdWidth, h - bdWidth, bdWidth, bdWidth, color1 );
548 548
549 QPainter p; 549 QPainter p;
550 p.begin( pixmap ); 550 p.begin( pixmap );
551 if ( w - bdWidth * 2 > 0 ) { 551 if ( w - bdWidth * 2 > 0 ) {
552 tmp = borderPixmap( widget ) ->border( OThemePixmap::Top ); 552 tmp = borderPixmap( widget ) ->border( OThemePixmap::Top );
553 srcMask = tmp->mask(); 553 srcMask = tmp->mask();
554 p.drawTiledPixmap( bdWidth, 0, w - bdWidth * 2, bdWidth, *tmp ); 554 p.drawTiledPixmap( bdWidth, 0, w - bdWidth * 2, bdWidth, *tmp );
555 if ( srcMask ) 555 if ( srcMask )
556 mPainter.drawTiledPixmap( bdWidth, 0, w - bdWidth * 2, bdWidth, *srcMask ); 556 mPainter.drawTiledPixmap( bdWidth, 0, w - bdWidth * 2, bdWidth, *srcMask );
557 else 557 else
558 mPainter.fillRect( bdWidth, 0, w - bdWidth * 2, bdWidth, color1 ); 558 mPainter.fillRect( bdWidth, 0, w - bdWidth * 2, bdWidth, color1 );
559 559
560 tmp = borderPixmap( widget ) ->border( OThemePixmap::Bottom ); 560 tmp = borderPixmap( widget ) ->border( OThemePixmap::Bottom );
561 srcMask = tmp->mask(); 561 srcMask = tmp->mask();
562 p.drawTiledPixmap( bdWidth, h - bdWidth, w - bdWidth * 2, bdWidth, 562 p.drawTiledPixmap( bdWidth, h - bdWidth, w - bdWidth * 2, bdWidth,
563 *tmp ); 563 *tmp );
564 if ( srcMask ) 564 if ( srcMask )
565 mPainter.drawTiledPixmap( bdWidth, h - bdWidth, w - bdWidth * 2, bdWidth, *srcMask ); 565 mPainter.drawTiledPixmap( bdWidth, h - bdWidth, w - bdWidth * 2, bdWidth, *srcMask );
566 else 566 else
567 mPainter.fillRect( bdWidth, h - bdWidth, w - bdWidth * 2, bdWidth, 567 mPainter.fillRect( bdWidth, h - bdWidth, w - bdWidth * 2, bdWidth,
568 color1 ); 568 color1 );
569 } 569 }
570 if ( h - bdWidth * 2 > 0 ) { 570 if ( h - bdWidth * 2 > 0 ) {
571 tmp = borderPixmap( widget ) ->border( OThemePixmap::Left ); 571 tmp = borderPixmap( widget ) ->border( OThemePixmap::Left );
572 srcMask = tmp->mask(); 572 srcMask = tmp->mask();
573 p.drawTiledPixmap( 0, bdWidth, bdWidth, h - bdWidth * 2, *tmp ); 573 p.drawTiledPixmap( 0, bdWidth, bdWidth, h - bdWidth * 2, *tmp );
574 if ( srcMask ) 574 if ( srcMask )
575 mPainter.drawTiledPixmap( 0, bdWidth, bdWidth, h - bdWidth * 2, *srcMask ); 575 mPainter.drawTiledPixmap( 0, bdWidth, bdWidth, h - bdWidth * 2, *srcMask );
576 else 576 else
577 mPainter.fillRect( 0, bdWidth, bdWidth, h - bdWidth * 2, color1 ); 577 mPainter.fillRect( 0, bdWidth, bdWidth, h - bdWidth * 2, color1 );
578 578
579 tmp = borderPixmap( widget ) ->border( OThemePixmap::Right ); 579 tmp = borderPixmap( widget ) ->border( OThemePixmap::Right );
580 srcMask = tmp->mask(); 580 srcMask = tmp->mask();
581 p.drawTiledPixmap( w - bdWidth, bdWidth, bdWidth, h - bdWidth * 2, 581 p.drawTiledPixmap( w - bdWidth, bdWidth, bdWidth, h - bdWidth * 2,
582 *tmp ); 582 *tmp );
583 if ( srcMask ) 583 if ( srcMask )
584 mPainter.drawTiledPixmap( w - bdWidth, bdWidth, bdWidth, h - bdWidth * 2, *srcMask ); 584 mPainter.drawTiledPixmap( w - bdWidth, bdWidth, bdWidth, h - bdWidth * 2, *srcMask );
585 else 585 else
586 mPainter.fillRect( w - bdWidth, bdWidth, bdWidth, h - bdWidth * 2, color1 ); 586 mPainter.fillRect( w - bdWidth, bdWidth, bdWidth, h - bdWidth * 2, color1 );
587 } 587 }
588 p.end(); 588 p.end();
589 mPainter.end(); 589 mPainter.end();
590 pixmap->setMask( mask ); 590 pixmap->setMask( mask );
591 cache->insert( pixmap, OThemeCache::FullScale, widget, true ); 591 cache->insert( pixmap, OThemeCache::FullScale, widget, true );
592 if ( !pixmap->mask() ) 592 if ( !pixmap->mask() )
593 qDebug ( "No mask for border pixmap!\n" ); 593 odebug << "No mask for border pixmap!" << oendl;
594 } 594 }
595 return ( pixmap ); 595 return ( pixmap );
596} 596}
597 597
598 598
599OThemePixmap* OThemeBase::blend( WidgetType widget ) 599OThemePixmap* OThemeBase::blend( WidgetType widget )
600{ 600{
601 OGfxEffect::GradientType g; 601 OGfxEffect::GradientType g;
602 switch ( gradients[ widget ] ) { 602 switch ( gradients[ widget ] ) {
603 case GrHorizontal: 603 case GrHorizontal:
604 g = OGfxEffect::HorizontalGradient; 604 g = OGfxEffect::HorizontalGradient;
605 break; 605 break;
606 case GrVertical: 606 case GrVertical:
607 g = OGfxEffect::VerticalGradient; 607 g = OGfxEffect::VerticalGradient;
608 break; 608 break;
609 case GrPyramid: 609 case GrPyramid:
610 g = OGfxEffect::PyramidGradient; 610 g = OGfxEffect::PyramidGradient;
611 break; 611 break;
612 case GrRectangle: 612 case GrRectangle:
613 g = OGfxEffect::RectangleGradient; 613 g = OGfxEffect::RectangleGradient;
614 break; 614 break;
615 case GrElliptic: 615 case GrElliptic:
616 g = OGfxEffect::EllipticGradient; 616 g = OGfxEffect::EllipticGradient;
617 break; 617 break;
618 default: 618 default:
619 g = OGfxEffect::DiagonalGradient; 619 g = OGfxEffect::DiagonalGradient;
620 break; 620 break;
621 } 621 }
622 OGfxEffect::blend( *pixmaps[ widget ], blends[ widget ], *grLowColors[ widget ], 622 OGfxEffect::blend( *pixmaps[ widget ], blends[ widget ], *grLowColors[ widget ],
623 g, false ); 623 g, false );
624 return ( pixmaps[ widget ] ); 624 return ( pixmaps[ widget ] );
625} 625}
626 626
627OThemePixmap* OThemeBase::gradient( int w, int h, WidgetType widget ) 627OThemePixmap* OThemeBase::gradient( int w, int h, WidgetType widget )
628{ 628{
629 if ( gradients[ widget ] == GrVertical ) { 629 if ( gradients[ widget ] == GrVertical ) {
630 if ( !pixmaps[ widget ] || pixmaps[ widget ] ->height() != h ) { 630 if ( !pixmaps[ widget ] || pixmaps[ widget ] ->height() != h ) {
631 OThemePixmap * cachePix = cache->verticalPixmap( h, widget ); 631 OThemePixmap * cachePix = cache->verticalPixmap( h, widget );
632 if ( cachePix ) { 632 if ( cachePix ) {
633 cachePix = new OThemePixmap( *cachePix ); 633 cachePix = new OThemePixmap( *cachePix );
634 if ( pixmaps[ widget ] ) 634 if ( pixmaps[ widget ] )
635 cache->insert( pixmaps[ widget ], OThemeCache::VerticalScale, 635 cache->insert( pixmaps[ widget ], OThemeCache::VerticalScale,
636 widget ); 636 widget );
637 pixmaps[ widget ] = cachePix; 637 pixmaps[ widget ] = cachePix;
638 } 638 }
639 else { 639 else {
640 if ( pixmaps[ widget ] ) 640 if ( pixmaps[ widget ] )
641 cache->insert( pixmaps[ widget ], OThemeCache::VerticalScale, 641 cache->insert( pixmaps[ widget ], OThemeCache::VerticalScale,
642 widget ); 642 widget );
643 pixmaps[ widget ] = new OThemePixmap; 643 pixmaps[ widget ] = new OThemePixmap;
644 pixmaps[ widget ] ->resize( w, h ); 644 pixmaps[ widget ] ->resize( w, h );
645 OGfxEffect::gradient( *pixmaps[ widget ], *grHighColors[ widget ], 645 OGfxEffect::gradient( *pixmaps[ widget ], *grHighColors[ widget ],
646 *grLowColors[ widget ], 646 *grLowColors[ widget ],
647 OGfxEffect::VerticalGradient ); 647 OGfxEffect::VerticalGradient );
648 } 648 }
649 } 649 }
650 } 650 }
651 else if ( gradients[ widget ] == GrHorizontal ) { 651 else if ( gradients[ widget ] == GrHorizontal ) {
652 if ( !pixmaps[ widget ] || pixmaps[ widget ] ->width() != w ) { 652 if ( !pixmaps[ widget ] || pixmaps[ widget ] ->width() != w ) {
653 OThemePixmap * cachePix = cache->horizontalPixmap( w, widget ); 653 OThemePixmap * cachePix = cache->horizontalPixmap( w, widget );
654 if ( cachePix ) { 654 if ( cachePix ) {
655 cachePix = new OThemePixmap( *cachePix ); 655 cachePix = new OThemePixmap( *cachePix );
656 if ( pixmaps[ widget ] ) 656 if ( pixmaps[ widget ] )
657 cache->insert( pixmaps[ widget ], 657 cache->insert( pixmaps[ widget ],
658 OThemeCache::HorizontalScale, widget ); 658 OThemeCache::HorizontalScale, widget );
659 pixmaps[ widget ] = cachePix; 659 pixmaps[ widget ] = cachePix;
660 } 660 }
661 else { 661 else {
662 if ( pixmaps[ widget ] ) 662 if ( pixmaps[ widget ] )
663 cache->insert( pixmaps[ widget ], 663 cache->insert( pixmaps[ widget ],
664 OThemeCache::HorizontalScale, widget ); 664 OThemeCache::HorizontalScale, widget );
665 pixmaps[ widget ] = new OThemePixmap; 665 pixmaps[ widget ] = new OThemePixmap;
666 pixmaps[ widget ] ->resize( w, h ); 666 pixmaps[ widget ] ->resize( w, h );
667 OGfxEffect::gradient( *pixmaps[ widget ], *grHighColors[ widget ], 667 OGfxEffect::gradient( *pixmaps[ widget ], *grHighColors[ widget ],
668 *grLowColors[ widget ], 668 *grLowColors[ widget ],
669 OGfxEffect::HorizontalGradient ); 669 OGfxEffect::HorizontalGradient );
670 } 670 }
671 } 671 }
672 } 672 }
673 else if ( gradients[ widget ] == GrReverseBevel ) { 673 else if ( gradients[ widget ] == GrReverseBevel ) {
674 if ( !pixmaps[ widget ] || pixmaps[ widget ] ->width() != w || 674 if ( !pixmaps[ widget ] || pixmaps[ widget ] ->width() != w ||
675 pixmaps[ widget ] ->height() != h ) { 675 pixmaps[ widget ] ->height() != h ) {
676 OThemePixmap * cachePix = cache->pixmap( w, h, widget ); 676 OThemePixmap * cachePix = cache->pixmap( w, h, widget );
677 if ( cachePix ) { 677 if ( cachePix ) {
678 cachePix = new OThemePixmap( *cachePix ); 678 cachePix = new OThemePixmap( *cachePix );
679 if ( pixmaps[ widget ] ) 679 if ( pixmaps[ widget ] )
680 cache->insert( pixmaps[ widget ], OThemeCache::FullScale, 680 cache->insert( pixmaps[ widget ], OThemeCache::FullScale,
681 widget ); 681 widget );
682 pixmaps[ widget ] = cachePix; 682 pixmaps[ widget ] = cachePix;
683 } 683 }
684 else { 684 else {
685 if ( pixmaps[ widget ] ) 685 if ( pixmaps[ widget ] )
686 cache->insert( pixmaps[ widget ], OThemeCache::FullScale, 686 cache->insert( pixmaps[ widget ], OThemeCache::FullScale,
687 widget ); 687 widget );
688 pixmaps[ widget ] = new OThemePixmap; 688 pixmaps[ widget ] = new OThemePixmap;
689 pixmaps[ widget ] ->resize( w, h ); 689 pixmaps[ widget ] ->resize( w, h );
690 690
691 QPixmap s; 691 QPixmap s;
692 int offset = decoWidth( widget ); 692 int offset = decoWidth( widget );
693 s.resize( w - offset * 2, h - offset * 2 ); 693 s.resize( w - offset * 2, h - offset * 2 );
694 QColor lc( *grLowColors[ widget ] ); 694 QColor lc( *grLowColors[ widget ] );
695 QColor hc( *grHighColors[ widget ] ); 695 QColor hc( *grHighColors[ widget ] );
696 if ( bevelContrast( widget ) ) { 696 if ( bevelContrast( widget ) ) {
697 int bc = bevelContrast( widget ); 697 int bc = bevelContrast( widget );
698 // want single increments, not factors like light()/dark() 698 // want single increments, not factors like light()/dark()
699 lc.setRgb( lc.red() - bc, lc.green() - bc, lc.blue() - bc ); 699 lc.setRgb( lc.red() - bc, lc.green() - bc, lc.blue() - bc );
700 hc.setRgb( hc.red() + bc, hc.green() + bc, hc.blue() + bc ); 700 hc.setRgb( hc.red() + bc, hc.green() + bc, hc.blue() + bc );
701 } 701 }
702 OGfxEffect::gradient( *pixmaps[ widget ], 702 OGfxEffect::gradient( *pixmaps[ widget ],
703 lc, hc, 703 lc, hc,
704 OGfxEffect::DiagonalGradient ); 704 OGfxEffect::DiagonalGradient );
705 OGfxEffect::gradient( s, *grHighColors[ widget ], 705 OGfxEffect::gradient( s, *grHighColors[ widget ],
706 *grLowColors[ widget ], 706 *grLowColors[ widget ],
707 OGfxEffect::DiagonalGradient ); 707 OGfxEffect::DiagonalGradient );
708 bitBlt( pixmaps[ widget ], offset, offset, &s, 0, 0, w - offset * 2, 708 bitBlt( pixmaps[ widget ], offset, offset, &s, 0, 0, w - offset * 2,
709 h - offset * 2, Qt::CopyROP ); 709 h - offset * 2, Qt::CopyROP );
710 } 710 }
711 } 711 }
712 } 712 }
713 else { 713 else {
714 OGfxEffect::GradientType g; 714 OGfxEffect::GradientType g;
715 switch ( gradients[ widget ] ) { 715 switch ( gradients[ widget ] ) {
716 case GrPyramid: 716 case GrPyramid:
717 g = OGfxEffect::PyramidGradient; 717 g = OGfxEffect::PyramidGradient;
718 break; 718 break;
719 case GrRectangle: 719 case GrRectangle:
720 g = OGfxEffect::RectangleGradient; 720 g = OGfxEffect::RectangleGradient;
721 break; 721 break;
722 case GrElliptic: 722 case GrElliptic:
723 g = OGfxEffect::EllipticGradient; 723 g = OGfxEffect::EllipticGradient;
724 break; 724 break;
725 default: 725 default:
726 g = OGfxEffect::DiagonalGradient; 726 g = OGfxEffect::DiagonalGradient;
727 break; 727 break;
728 } 728 }
729 if ( !pixmaps[ widget ] || pixmaps[ widget ] ->width() != w || 729 if ( !pixmaps[ widget ] || pixmaps[ widget ] ->width() != w ||
730 pixmaps[ widget ] ->height() != h ) { 730 pixmaps[ widget ] ->height() != h ) {
731 OThemePixmap * cachePix = cache->pixmap( w, h, widget ); 731 OThemePixmap * cachePix = cache->pixmap( w, h, widget );
732 if ( cachePix ) { 732 if ( cachePix ) {
733 cachePix = new OThemePixmap( *cachePix ); 733 cachePix = new OThemePixmap( *cachePix );
734 if ( pixmaps[ widget ] ) 734 if ( pixmaps[ widget ] )
735 cache->insert( pixmaps[ widget ], OThemeCache::FullScale, 735 cache->insert( pixmaps[ widget ], OThemeCache::FullScale,
736 widget ); 736 widget );
737 pixmaps[ widget ] = cachePix; 737 pixmaps[ widget ] = cachePix;
738 } 738 }
739 else { 739 else {
740 if ( pixmaps[ widget ] ) 740 if ( pixmaps[ widget ] )
741 cache->insert( pixmaps[ widget ], OThemeCache::FullScale, 741 cache->insert( pixmaps[ widget ], OThemeCache::FullScale,
742 widget ); 742 widget );
743 pixmaps[ widget ] = new OThemePixmap; 743 pixmaps[ widget ] = new OThemePixmap;
744 pixmaps[ widget ] ->resize( w, h ); 744 pixmaps[ widget ] ->resize( w, h );
745 OGfxEffect::gradient( *pixmaps[ widget ], *grHighColors[ widget ], 745 OGfxEffect::gradient( *pixmaps[ widget ], *grHighColors[ widget ],
746 *grLowColors[ widget ], g ); 746 *grLowColors[ widget ], g );
747 } 747 }
748 } 748 }
749 } 749 }
750 return ( pixmaps[ widget ] ); 750 return ( pixmaps[ widget ] );
751} 751}
752 752
753OThemePixmap* OThemeBase::scalePixmap( int w, int h, WidgetType widget ) 753OThemePixmap* OThemeBase::scalePixmap( int w, int h, WidgetType widget )
754{ 754{
755 755
756 if ( gradients[ widget ] && blends[ widget ] == 0.0 ) 756 if ( gradients[ widget ] && blends[ widget ] == 0.0 )
757 return ( gradient( w, h, widget ) ); 757 return ( gradient( w, h, widget ) );
758 758
759 return ( scale( w, h, widget ) ); 759 return ( scale( w, h, widget ) );
760} 760}
761 761
762QColorGroup* OThemeBase::makeColorGroup( QColor &fg, QColor &bg, 762QColorGroup* OThemeBase::makeColorGroup( QColor &fg, QColor &bg,
763 Qt::GUIStyle ) 763 Qt::GUIStyle )
764{ 764{
765 if ( shading == Motif ) { 765 if ( shading == Motif ) {
766 int highlightVal, lowlightVal; 766 int highlightVal, lowlightVal;
767 highlightVal = 100 + ( 2* /*KGlobalSettings::contrast()*/ 3 + 4 ) * 16 / 10; 767 highlightVal = 100 + ( 2* /*KGlobalSettings::contrast()*/ 3 + 4 ) * 16 / 10;
768 lowlightVal = 100 + ( ( 2* /*KGlobalSettings::contrast()*/ 3 + 4 ) * 10 ); 768 lowlightVal = 100 + ( ( 2* /*KGlobalSettings::contrast()*/ 3 + 4 ) * 10 );
769 return ( new QColorGroup( fg, bg, bg.light( highlightVal ), 769 return ( new QColorGroup( fg, bg, bg.light( highlightVal ),
770 bg.dark( lowlightVal ), bg.dark( 120 ), 770 bg.dark( lowlightVal ), bg.dark( 120 ),
771 fg, qApp->palette().normal().base() ) ); 771 fg, qApp->palette().normal().base() ) );
772 } 772 }
773 else 773 else
774 return ( new QColorGroup( fg, bg, bg.light( 150 ), bg.dark(), 774 return ( new QColorGroup( fg, bg, bg.light( 150 ), bg.dark(),
775 bg.dark( 120 ), fg, 775 bg.dark( 120 ), fg,
776 qApp->palette().normal().base() ) ); 776 qApp->palette().normal().base() ) );
777} 777}
778 778
779static QColor strToColor ( const QString &str ) 779static QColor strToColor ( const QString &str )
780{ 780{
781 QString str2 = str. stripWhiteSpace ( ); 781 QString str2 = str. stripWhiteSpace ( );
782 782
783 if ( str2 [0] == '#' ) 783 if ( str2 [0] == '#' )
784 return QColor ( str2 ); 784 return QColor ( str2 );
785 else { 785 else {
786 QStringList sl = QStringList::split ( ',', str2 ); 786 QStringList sl = QStringList::split ( ',', str2 );
787 787
788 if ( sl. count ( ) >= 3 ) 788 if ( sl. count ( ) >= 3 )
789 return QColor ( sl [0]. toInt ( ), sl [1]. toInt ( ), sl [2]. toInt ( )); 789 return QColor ( sl [0]. toInt ( ), sl [1]. toInt ( ), sl [2]. toInt ( ));
790 } 790 }
791 return QColor ( 0, 0, 0 ); 791 return QColor ( 0, 0, 0 );
792} 792}
793 793
794 794
795 795
796void OThemeBase::applyMiscResourceGroup( Config *config ) 796void OThemeBase::applyMiscResourceGroup( Config *config )
797{ 797{
798 config-> setGroup ( "Misc" ); 798 config-> setGroup ( "Misc" );
799 QString tmpStr; 799 QString tmpStr;
800 800
801 tmpStr = config->readEntry( "SButtonPosition" ); 801 tmpStr = config->readEntry( "SButtonPosition" );
802 if ( tmpStr == "BottomLeft" ) 802 if ( tmpStr == "BottomLeft" )
803 sbPlacement = SBBottomLeft; 803 sbPlacement = SBBottomLeft;
804 else if ( tmpStr == "BottomRight" ) 804 else if ( tmpStr == "BottomRight" )
805 sbPlacement = SBBottomRight; 805 sbPlacement = SBBottomRight;
806 else { 806 else {
807 if ( tmpStr != "Opposite" && !tmpStr.isEmpty() ) 807 if ( tmpStr != "Opposite" && !tmpStr.isEmpty() )
808 qDebug ( "OThemeBase: Unrecognized sb button option %s, using Opposite.\n", tmpStr.ascii() ); 808 odebug << "OThemeBase: Unrecognized sb button option " << tmpStr.ascii()
809 sbPlacement = SBOpposite; 809 << ", using Opposite." << oendl;
810 } 810 sbPlacement = SBOpposite;
811 tmpStr = config->readEntry( "ArrowType" ); 811 }
812 if ( tmpStr == "Small" ) 812 tmpStr = config->readEntry( "ArrowType" );
813 arrowStyle = SmallArrow; 813 if ( tmpStr == "Small" )
814 else if ( tmpStr == "3D" ) 814 arrowStyle = SmallArrow;
815 arrowStyle = MotifArrow; 815 else if ( tmpStr == "3D" )
816 else { 816 arrowStyle = MotifArrow;
817 if ( tmpStr != "Normal" && !tmpStr.isEmpty() ) 817 else {
818 qDebug ( "OThemeBase: Unrecognized arrow option %s, using Normal.\n", tmpStr.ascii() ); 818 if ( tmpStr != "Normal" && !tmpStr.isEmpty() )
819 arrowStyle = LargeArrow; 819 odebug << "OThemeBase: Unrecognized arrow option " << tmpStr.ascii()
820 } 820 << ", using Normal." << oendl;
821 tmpStr = config->readEntry( "ShadeStyle" ); 821 arrowStyle = LargeArrow;
822 if ( tmpStr == "Motif" ) 822 }
823 shading = Motif; 823 tmpStr = config->readEntry( "ShadeStyle" );
824 else if ( tmpStr == "Next" ) 824 if ( tmpStr == "Motif" )
825 shading = Next; 825 shading = Motif;
826 else if ( tmpStr == "KDE" ) 826 else if ( tmpStr == "Next" )
827 shading = KDE; 827 shading = Next;
828 else 828 else if ( tmpStr == "KDE" )
829 shading = Windows; 829 shading = KDE;
830 830 else
831 defaultFrame = config->readNumEntry( "FrameWidth", 2 ); 831 shading = Windows;
832 cacheSize = config->readNumEntry( "Cache", 1024 ); 832
833 sbExtent = config->readNumEntry( "ScrollBarExtent", 16 ); 833 defaultFrame = config->readNumEntry( "FrameWidth", 2 );
834 834 cacheSize = config->readNumEntry( "Cache", 1024 );
835 config-> setGroup ( "General" ); 835 sbExtent = config->readNumEntry( "ScrollBarExtent", 16 );
836 836
837 if ( config-> hasKey ( "foreground" )) fgcolor = strToColor ( config-> readEntry ( "foreground" )); 837 config-> setGroup ( "General" );
838 if ( config-> hasKey ( "background" )) bgcolor = strToColor ( config-> readEntry ( "background" )); 838
839 if ( config-> hasKey ( "selectForeground" )) selfgcolor = strToColor ( config-> readEntry ( "selectForeground" )); 839 if ( config-> hasKey ( "foreground" )) fgcolor = strToColor ( config-> readEntry ( "foreground" ));
840 if ( config-> hasKey ( "selectBackground" )) selbgcolor = strToColor ( config-> readEntry ( "selectBackground" )); 840 if ( config-> hasKey ( "background" )) bgcolor = strToColor ( config-> readEntry ( "background" ));
841 if ( config-> hasKey ( "windowForeground" )) winfgcolor = strToColor ( config-> readEntry ( "windowForeground" )); 841 if ( config-> hasKey ( "selectForeground" )) selfgcolor = strToColor ( config-> readEntry ( "selectForeground" ));
842 if ( config-> hasKey ( "windowBackground" )) winbgcolor = strToColor ( config-> readEntry ( "windowBackground" )); 842 if ( config-> hasKey ( "selectBackground" )) selbgcolor = strToColor ( config-> readEntry ( "selectBackground" ));
843 if ( config-> hasKey ( "windowForeground" )) winfgcolor = strToColor ( config-> readEntry ( "windowForeground" ));
844 if ( config-> hasKey ( "windowBackground" )) winbgcolor = strToColor ( config-> readEntry ( "windowBackground" ));
843} 845}
844 846
845void OThemeBase::readMiscResourceGroup() 847void OThemeBase::readMiscResourceGroup()
846{} 848{}
847 849
848void OThemeBase::applyResourceGroup( Config *config, int i, QString *copyfrom, QString *pixnames, QString *brdnames ) 850void OThemeBase::applyResourceGroup( Config *config, int i, QString *copyfrom, QString *pixnames, QString *brdnames )
849{ 851{
850 QString tmpStr; 852 QString tmpStr;
851 853
852 config-> setGroup ( widgetEntries [ i ] ); 854 config-> setGroup ( widgetEntries [ i ] );
853 855
854 tmpStr = config->readEntry( "CopyWidget", "" ); 856 tmpStr = config->readEntry( "CopyWidget", "" );
855 copyfrom [ i ] = tmpStr; 857 copyfrom [ i ] = tmpStr;
856 if ( !tmpStr.isEmpty() ) 858 if ( !tmpStr.isEmpty() )
857 return ; 859 return ;
858 860
859 // Scale hint 861 // Scale hint
860 tmpStr = config->readEntry( "Scale" ); 862 tmpStr = config->readEntry( "Scale" );
861 if ( tmpStr == "Full" ) 863 if ( tmpStr == "Full" )
862 scaleHints [ i ] = FullScale; 864 scaleHints [ i ] = FullScale;
863 else if ( tmpStr == "Horizontal" ) 865 else if ( tmpStr == "Horizontal" )
864 scaleHints [ i ] = HorizontalScale; 866 scaleHints [ i ] = HorizontalScale;
865 else if ( tmpStr == "Vertical" ) 867 else if ( tmpStr == "Vertical" )
866 scaleHints [ i ] = VerticalScale; 868 scaleHints [ i ] = VerticalScale;
867 else { 869 else {
868 if ( tmpStr != "Tile" && !tmpStr.isEmpty() ) 870 if ( tmpStr != "Tile" && !tmpStr.isEmpty() )
869 qDebug ( "OThemeBase: Unrecognized scale option %s, using Tile.\n", tmpStr.ascii() ); 871 odebug << "OThemeBase: Unrecognized scale option " << tmpStr.ascii()
870 scaleHints [ i ] = TileScale; 872 << ", using Tile." << oendl;
871 } 873 scaleHints [ i ] = TileScale;
872 874 }
873 875
874 // Gradient type 876
875 tmpStr = config->readEntry( "Gradient" ); 877 // Gradient type
876 if ( tmpStr == "Diagonal" ) 878 tmpStr = config->readEntry( "Gradient" );
877 gradients [ i ] = GrDiagonal; 879 if ( tmpStr == "Diagonal" )
878 else if ( tmpStr == "Horizontal" ) 880 gradients [ i ] = GrDiagonal;
879 gradients [ i ] = GrHorizontal; 881 else if ( tmpStr == "Horizontal" )
880 else if ( tmpStr == "Vertical" ) 882 gradients [ i ] = GrHorizontal;
881 gradients [ i ] = GrVertical; 883 else if ( tmpStr == "Vertical" )
882 else if ( tmpStr == "Pyramid" ) 884 gradients [ i ] = GrVertical;
883 gradients [ i ] = GrPyramid; 885 else if ( tmpStr == "Pyramid" )
884 else if ( tmpStr == "Rectangle" ) 886 gradients [ i ] = GrPyramid;
885 gradients [ i ] = GrRectangle; 887 else if ( tmpStr == "Rectangle" )
886 else if ( tmpStr == "Elliptic" ) 888 gradients [ i ] = GrRectangle;
887 gradients [ i ] = GrElliptic; 889 else if ( tmpStr == "Elliptic" )
888 else if ( tmpStr == "ReverseBevel" ) 890 gradients [ i ] = GrElliptic;
889 gradients [ i ] = GrReverseBevel; 891 else if ( tmpStr == "ReverseBevel" )
890 else { 892 gradients [ i ] = GrReverseBevel;
891 if ( tmpStr != "None" && !tmpStr.isEmpty() ) 893 else {
892 qDebug ( "OThemeBase: Unrecognized gradient option %s, using None.\n", tmpStr.ascii() ); 894 if ( tmpStr != "None" && !tmpStr.isEmpty() )
893 gradients [ i ] = GrNone; 895 odebug << "OThemeBase: Unrecognized gradient option " << tmpStr.ascii()
894 } 896 << ", using None." << oendl;
895 897 gradients [ i ] = GrNone;
896 // Blend intensity 898 }
897 blends[ i ] = config->readEntry( "BlendIntensity", "0.0" ).toDouble(); 899
898 900 // Blend intensity
899 // Bevel contrast 901 blends[ i ] = config->readEntry( "BlendIntensity", "0.0" ).toDouble();
900 bContrasts[ i ] = config->readNumEntry( "BevelContrast", 0 ); 902
901 903 // Bevel contrast
902 // Border width 904 bContrasts[ i ] = config->readNumEntry( "BevelContrast", 0 );
903 borders [ i ] = config->readNumEntry( "Border", 1 ); 905
904 906 // Border width
905 // Highlight width 907 borders [ i ] = config->readNumEntry( "Border", 1 );
906 highlights [ i ] = config->readNumEntry( "Highlight", 1 ); 908
907 909 // Highlight width
908 // Gradient low color or blend background 910 highlights [ i ] = config->readNumEntry( "Highlight", 1 );
909 if ( config->hasKey( "GradientLow" ) && ( gradients[ i ] != GrNone || blends[ i ] != 0.0 )) 911
910 grLowColors[ i ] = new QColor( strToColor ( config->readEntry( "GradientLow", qApp->palette().normal().background().name() ))); 912 // Gradient low color or blend background
911 else 913 if ( config->hasKey( "GradientLow" ) && ( gradients[ i ] != GrNone || blends[ i ] != 0.0 ))
912 grLowColors[ i ] = NULL; 914 grLowColors[ i ] = new QColor( strToColor ( config->readEntry( "GradientLow", qApp->palette().normal().background().name() )));
913 915 else
914 916 grLowColors[ i ] = NULL;
915 // Gradient high color 917
916 if ( config->hasKey( "GradientHigh" ) && ( gradients[ i ] != GrNone )) 918
917 grHighColors[ i ] = new QColor( strToColor ( config->readEntry( "GradientHigh", qApp->palette().normal().background().name() ))); 919 // Gradient high color
918 else 920 if ( config->hasKey( "GradientHigh" ) && ( gradients[ i ] != GrNone ))
919 grHighColors[ i ] = NULL; 921 grHighColors[ i ] = new QColor( strToColor ( config->readEntry( "GradientHigh", qApp->palette().normal().background().name() )));
920 922 else
921 // Extended color attributes 923 grHighColors[ i ] = NULL;
922 if ( config->hasKey( "Foreground" ) || config->hasKey( "Background" ) ) { 924
923 QColor bg = strToColor( config->readEntry( "Background", qApp->palette().normal().background().name() )); 925 // Extended color attributes
924 QColor fg = strToColor( config->readEntry( "Foreground", qApp->palette().normal().foreground().name() )); 926 if ( config->hasKey( "Foreground" ) || config->hasKey( "Background" ) ) {
925 927 QColor bg = strToColor( config->readEntry( "Background", qApp->palette().normal().background().name() ));
926 colors[ i ] = makeColorGroup( fg, bg, Qt::WindowsStyle ); 928 QColor fg = strToColor( config->readEntry( "Foreground", qApp->palette().normal().foreground().name() ));
927 } 929
928 else 930 colors[ i ] = makeColorGroup( fg, bg, Qt::WindowsStyle );
929 colors[ i ] = NULL; 931 }
930 932 else
931 // Pixmap 933 colors[ i ] = NULL;
932 tmpStr = config->readEntry( "Pixmap", "" ); 934
933 pixnames[ i ] = tmpStr; 935 // Pixmap
934 duplicate[ i ] = false; 936 tmpStr = config->readEntry( "Pixmap", "" );
935 pixmaps[ i ] = NULL; 937 pixnames[ i ] = tmpStr;
936 images[ i ] = NULL; 938 duplicate[ i ] = false;
937 939 pixmaps[ i ] = NULL;
938 940 images[ i ] = NULL;
939 // Pixmap border 941
940 tmpStr = config->readEntry( "PixmapBorder", "" ); 942
941 brdnames[ i ] = tmpStr; 943 // Pixmap border
942 pbDuplicate[ i ] = false; 944 tmpStr = config->readEntry( "PixmapBorder", "" );
943 pbPixmaps[ i ] = NULL; 945 brdnames[ i ] = tmpStr;
944 pbWidth[ i ] = 0; 946 pbDuplicate[ i ] = false;
945 if ( !tmpStr.isEmpty() ) { 947 pbPixmaps[ i ] = NULL;
946 pbWidth[ i ] = config->readNumEntry( "PixmapBWidth", 0 ); 948 pbWidth[ i ] = 0;
947 if ( pbWidth[ i ] == 0 ) { 949 if ( !tmpStr.isEmpty() ) {
948 qDebug ( "OThemeBase: No border width specified for pixmapped border widget %s\n", widgetEntries[ i ] ); 950 pbWidth[ i ] = config->readNumEntry( "PixmapBWidth", 0 );
949 qDebug ( "OThemeBase: Using default of 2.\n" ); 951 if ( pbWidth[ i ] == 0 ) {
950 pbWidth[ i ] = 2; 952 odebug << "OThemeBase: No border width specified for pixmapped border widget "
951 } 953 << widgetEntries[ i ] << oendl;
952 } 954 odebug << "OThemeBase: Using default of 2." << oendl;
953 955 pbWidth[ i ] = 2;
954 956 }
955 // Various widget specific settings. This was more efficent when bunched 957 }
956 // together in the misc group, but this makes an easier to read config. 958
957 if ( i == SliderGroove ) 959
958 roundedSlider = config->readBoolEntry( "SmallGroove", false ); 960 // Various widget specific settings. This was more efficent when bunched
959 else if ( i == ActiveTab ) { 961 // together in the misc group, but this makes an easier to read config.
960 aTabLine = config->readBoolEntry( "BottomLine", true ); 962 if ( i == SliderGroove )
961 } 963 roundedSlider = config->readBoolEntry( "SmallGroove", false );
962 else if ( i == InactiveTab ) { 964 else if ( i == ActiveTab ) {
963 iTabLine = config->readBoolEntry( "BottomLine", true ); 965 aTabLine = config->readBoolEntry( "BottomLine", true );
964 } 966 }
965 else if ( i == Splitter ) 967 else if ( i == InactiveTab ) {
966 splitterWidth = config->readNumEntry( "Width", 10 ); 968 iTabLine = config->readBoolEntry( "BottomLine", true );
967 else if ( i == ComboBox || i == ComboBoxDown ) { 969 }
968 roundedCombo = config->readBoolEntry( "Round", false ); 970 else if ( i == Splitter )
969 } 971 splitterWidth = config->readNumEntry( "Width", 10 );
970 else if ( i == PushButton || i == PushButtonDown ) { 972 else if ( i == ComboBox || i == ComboBoxDown ) {
971 btnXShift = config->readNumEntry( "XShift", 0 ); 973 roundedCombo = config->readBoolEntry( "Round", false );
972 btnYShift = config->readNumEntry( "YShift", 0 ); 974 }
973 focus3D = config->readBoolEntry( "3DFocusRect", false ); 975 else if ( i == PushButton || i == PushButtonDown ) {
974 focus3DOffset = config->readBoolEntry( "3DFocusOffset", 0 ); 976 btnXShift = config->readNumEntry( "XShift", 0 );
975 roundedButton = config->readBoolEntry( "Round", false ); 977 btnYShift = config->readNumEntry( "YShift", 0 );
976 } 978 focus3D = config->readBoolEntry( "3DFocusRect", false );
979 focus3DOffset = config->readBoolEntry( "3DFocusOffset", 0 );
980 roundedButton = config->readBoolEntry( "Round", false );
981 }
977} 982}
978 983
979 984
980void OThemeBase::readResourceGroup( int i, QString *copyfrom, QString *pixnames, QString *brdnames, 985void OThemeBase::readResourceGroup( int i, QString *copyfrom, QString *pixnames, QString *brdnames,
981 bool *loadArray ) 986 bool *loadArray )
982{ 987{
983 if ( loadArray[ i ] == true ) { 988 if ( loadArray[ i ] == true ) {
984 return ; // already been preloaded. 989 return ; // already been preloaded.
985 } 990 }
986 991
987 int tmpVal; 992 int tmpVal;
988 QString tmpStr; 993 QString tmpStr;
989 994
990 tmpStr = copyfrom [ i ]; 995 tmpStr = copyfrom [ i ];
991 if ( !tmpStr.isEmpty() ) { // Duplicate another widget's config 996 if ( !tmpStr.isEmpty() ) { // Duplicate another widget's config
992 int sIndex; 997 int sIndex;
993 loadArray[ i ] = true; 998 loadArray[ i ] = true;
994 for ( sIndex = 0; sIndex < WIDGETS; ++sIndex ) { 999 for ( sIndex = 0; sIndex < WIDGETS; ++sIndex ) {
995 if ( tmpStr == widgetEntries[ sIndex ] ) { 1000 if ( tmpStr == widgetEntries[ sIndex ] ) {
996 if ( !loadArray[ sIndex ] ) // hasn't been loaded yet 1001 if ( !loadArray[ sIndex ] ) // hasn't been loaded yet
997 readResourceGroup( sIndex, copyfrom, pixnames, brdnames, 1002 readResourceGroup( sIndex, copyfrom, pixnames, brdnames,
998 loadArray ); 1003 loadArray );
999 break; 1004 break;
1000 } 1005 }
1001 } 1006 }
1002 if ( loadArray[ sIndex ] ) { 1007 if ( loadArray[ sIndex ] ) {
1003 copyWidgetConfig( sIndex, i, pixnames, brdnames ); 1008 copyWidgetConfig( sIndex, i, pixnames, brdnames );
1004 } 1009 }
1005 else 1010 else
1006 qDebug ( "OThemeBase: Unable to identify source widget for %s\n", widgetEntries[ i ] ); 1011 odebug << "OThemeBase: Unable to identify source widget for " << widgetEntries[ i ] << oendl;
1007 return ; 1012 return ;
1008 } 1013 }
1009 // special inheritance for disabled arrows (these are tri-state unlike 1014 // special inheritance for disabled arrows (these are tri-state unlike
1010 // the rest of what we handle). 1015 // the rest of what we handle).
1011 for ( tmpVal = DisArrowUp; tmpVal <= DisArrowRight; ++tmpVal ) { 1016 for ( tmpVal = DisArrowUp; tmpVal <= DisArrowRight; ++tmpVal ) {
1012 if ( tmpVal == i ) { 1017 if ( tmpVal == i ) {
1013 tmpStr = pixnames [ i ]; 1018 tmpStr = pixnames [ i ];
1014 if ( tmpStr.isEmpty() ) { 1019 if ( tmpStr.isEmpty() ) {
1015 copyWidgetConfig( ArrowUp + ( tmpVal - DisArrowUp ), i, pixnames, 1020 copyWidgetConfig( ArrowUp + ( tmpVal - DisArrowUp ), i, pixnames,
1016 brdnames ); 1021 brdnames );
1017 return ; 1022 return ;
1018 } 1023 }
1019 } 1024 }
1020 } 1025 }
1021 1026
1022 // Pixmap 1027 // Pixmap
1023 int existing; 1028 int existing;
1024 // Scan for duplicate pixmaps(two identical pixmaps, tile scale, no blend, 1029 // Scan for duplicate pixmaps(two identical pixmaps, tile scale, no blend,
1025 // no pixmapped border) 1030 // no pixmapped border)
1026 if ( !pixnames [ i ].isEmpty() ) { 1031 if ( !pixnames [ i ].isEmpty() ) {
1027 for ( existing = 0; existing < i; ++existing ) { 1032 for ( existing = 0; existing < i; ++existing ) {
1028 if ( pixnames[ i ] == pixnames[ existing ] && scaleHints[ i ] == TileScale && 1033 if ( pixnames[ i ] == pixnames[ existing ] && scaleHints[ i ] == TileScale &&
1029 scaleHints[ existing ] == TileScale && blends[ existing ] == 0.0 && 1034 scaleHints[ existing ] == TileScale && blends[ existing ] == 0.0 &&
1030 blends[ i ] == 0.0 ) { 1035 blends[ i ] == 0.0 ) {
1031 pixmaps[ i ] = pixmaps[ existing ]; 1036 pixmaps[ i ] = pixmaps[ existing ];
1032 duplicate[ i ] = true; 1037 duplicate[ i ] = true;
1033 break; 1038 break;
1034 } 1039 }
1035 } 1040 }
1036 } 1041 }
1037 // load 1042 // load
1038 if ( !duplicate[ i ] && !pixnames[ i ].isEmpty() ) { 1043 if ( !duplicate[ i ] && !pixnames[ i ].isEmpty() ) {
1039 pixmaps[ i ] = loadPixmap( pixnames[ i ] ); 1044 pixmaps[ i ] = loadPixmap( pixnames[ i ] );
1040 // load and save images for scaled/blended widgets for speed. 1045 // load and save images for scaled/blended widgets for speed.
1041 if ( scaleHints[ i ] == TileScale && blends[ i ] == 0.0 ) 1046 if ( scaleHints[ i ] == TileScale && blends[ i ] == 0.0 )
1042 images[ i ] = NULL; 1047 images[ i ] = NULL;
1043 else 1048 else
1044 images[ i ] = loadImage( pixnames[ i ] ); 1049 images[ i ] = loadImage( pixnames[ i ] );
1045 } 1050 }
1046 1051
1047 // Pixmap border 1052 // Pixmap border
1048 if ( !brdnames [ i ]. isEmpty () ) { 1053 if ( !brdnames [ i ]. isEmpty () ) {
1049 // duplicate check 1054 // duplicate check
1050 for ( existing = 0; existing < i; ++existing ) { 1055 for ( existing = 0; existing < i; ++existing ) {
1051 if ( brdnames [i] == brdnames[ existing ] ) { 1056 if ( brdnames [i] == brdnames[ existing ] ) {
1052 pbPixmaps[ i ] = pbPixmaps[ existing ]; 1057 pbPixmaps[ i ] = pbPixmaps[ existing ];
1053 pbDuplicate[ i ] = true; 1058 pbDuplicate[ i ] = true;
1054 break; 1059 break;
1055 } 1060 }
1056 } 1061 }
1057 } 1062 }
1058 // load 1063 // load
1059 if ( !pbDuplicate[ i ] && !brdnames[ i ].isEmpty() ) 1064 if ( !pbDuplicate[ i ] && !brdnames[ i ].isEmpty() )
1060 pbPixmaps[ i ] = loadPixmap( brdnames[ i ] ); 1065 pbPixmaps[ i ] = loadPixmap( brdnames[ i ] );
1061 1066
1062 if ( pbPixmaps[ i ] && !pbDuplicate[ i ] ) 1067 if ( pbPixmaps[ i ] && !pbDuplicate[ i ] )
1063 generateBorderPix( i ); 1068 generateBorderPix( i );
1064 1069
1065 loadArray[ i ] = true; 1070 loadArray[ i ] = true;
1066} 1071}
1067 1072
1068 1073
1069OThemePixmap::OThemePixmap( bool timer ) 1074OThemePixmap::OThemePixmap( bool timer )
1070 : QPixmap() 1075 : QPixmap()
1071{ 1076{
1072 if(timer){ 1077 if(timer){
1073 t = new QTime; 1078 t = new QTime;
1074 t->start(); 1079 t->start();
1075 } 1080 }
1076 else 1081 else
1077 t = NULL; 1082 t = NULL;
1078 int i; 1083 int i;
1079 for ( i = 0; i < 8; ++i ) 1084 for ( i = 0; i < 8; ++i )
1080 b[ i ] = NULL; 1085 b[ i ] = NULL;
1081} 1086}
1082 1087
1083OThemePixmap::OThemePixmap( const OThemePixmap &p ) 1088OThemePixmap::OThemePixmap( const OThemePixmap &p )
1084 : QPixmap( p ) 1089 : QPixmap( p )
1085{ 1090{
1086 if(p.t){ 1091 if(p.t){
1087 t = new QTime; 1092 t = new QTime;
1088 t->start(); 1093 t->start();
1089 } 1094 }
1090 else 1095 else
1091 t = NULL; 1096 t = NULL;
1092 int i; 1097 int i;
1093 for ( i = 0; i < 8; ++i ) 1098 for ( i = 0; i < 8; ++i )
1094 if ( p.b[ i ] ) 1099 if ( p.b[ i ] )
1095 b[ i ] = new QPixmap( *p.b[ i ] ); 1100 b[ i ] = new QPixmap( *p.b[ i ] );
1096 else 1101 else
1097 b[ i ] = NULL; 1102 b[ i ] = NULL;
1098} 1103}
1099 1104
1100 1105
1101 1106
1102OThemePixmap::~OThemePixmap() 1107OThemePixmap::~OThemePixmap()
1103{ 1108{
1104 if(t) 1109 if(t)
1105 delete t; 1110 delete t;
1106 int i; 1111 int i;
1107 for ( i = 0; i < 8; ++i ) 1112 for ( i = 0; i < 8; ++i )
1108 if ( b[ i ] ) 1113 if ( b[ i ] )
1109 delete b[ i ]; 1114 delete b[ i ];
1110} 1115}
1111 1116
1112OThemeCache::OThemeCache( int maxSize, QObject *parent, const char *name ) 1117OThemeCache::OThemeCache( int maxSize, QObject *parent, const char *name )
1113 : QObject( parent, name ) 1118 : QObject( parent, name )
1114{ 1119{
1115 cache.setMaxCost( maxSize * 1024 ); 1120 cache.setMaxCost( maxSize * 1024 );
1116 cache.setAutoDelete( true ); 1121 cache.setAutoDelete( true );
1117 flushTimer.start(300000); // 5 minutes 1122 flushTimer.start(300000); // 5 minutes
1118 connect(&flushTimer, SIGNAL(timeout()), SLOT(flushTimeout())); 1123 connect(&flushTimer, SIGNAL(timeout()), SLOT(flushTimeout()));
1119} 1124}
1120 1125
1121void OThemeCache::flushTimeout() 1126void OThemeCache::flushTimeout()
1122{ 1127{
1123 QIntCacheIterator<OThemePixmap> it( cache ); 1128 QIntCacheIterator<OThemePixmap> it( cache );
1124 while ( it.current() ) { 1129 while ( it.current() ) {
1125 if ( it.current() ->isOld() ) 1130 if ( it.current() ->isOld() )
1126 cache.remove( it.currentKey() ); 1131 cache.remove( it.currentKey() );
1127 else 1132 else
1128 ++it; 1133 ++it;
1129 } 1134 }
1130} 1135}
1131 1136
1132OThemePixmap* OThemeCache::pixmap( int w, int h, int widgetID, bool border, 1137OThemePixmap* OThemeCache::pixmap( int w, int h, int widgetID, bool border,
1133 bool mask ) 1138 bool mask )
1134{ 1139{
1135 1140
1136 kthemeKey key; 1141 kthemeKey key;
1137 key.cacheKey = 0; // shut up, gcc 1142 key.cacheKey = 0; // shut up, gcc
1138 key.data.id = widgetID; 1143 key.data.id = widgetID;
1139 key.data.width = w; 1144 key.data.width = w;
1140 key.data.height = h; 1145 key.data.height = h;
1141 key.data.border = border; 1146 key.data.border = border;
1142 key.data.mask = mask; 1147 key.data.mask = mask;
1143 1148
1144 OThemePixmap *pix = cache.find( ( unsigned long ) key.cacheKey ); 1149 OThemePixmap *pix = cache.find( ( unsigned long ) key.cacheKey );
1145 if ( pix ) 1150 if ( pix )
1146 pix->updateAccessed(); 1151 pix->updateAccessed();
1147 return ( pix ); 1152 return ( pix );
1148} 1153}
1149 1154
1150OThemePixmap* OThemeCache::horizontalPixmap( int w, int widgetID ) 1155OThemePixmap* OThemeCache::horizontalPixmap( int w, int widgetID )
1151{ 1156{
1152 kthemeKey key; 1157 kthemeKey key;
1153 key.cacheKey = 0; // shut up, gcc 1158 key.cacheKey = 0; // shut up, gcc
1154 key.data.id = widgetID; 1159 key.data.id = widgetID;
1155 key.data.width = w; 1160 key.data.width = w;
1156 key.data.height = 0; 1161 key.data.height = 0;
1157 key.data.border = false; 1162 key.data.border = false;
1158 key.data.mask = false; 1163 key.data.mask = false;
1159 OThemePixmap *pix = cache.find( ( unsigned long ) key.cacheKey ); 1164 OThemePixmap *pix = cache.find( ( unsigned long ) key.cacheKey );
1160 if ( pix ) 1165 if ( pix )
1161 pix->updateAccessed(); 1166 pix->updateAccessed();
1162 return ( pix ); 1167 return ( pix );
1163} 1168}
1164 1169
1165OThemePixmap* OThemeCache::verticalPixmap( int h, int widgetID ) 1170OThemePixmap* OThemeCache::verticalPixmap( int h, int widgetID )
1166{ 1171{
1167 kthemeKey key; 1172 kthemeKey key;
1168 key.cacheKey = 0; // shut up, gcc 1173 key.cacheKey = 0; // shut up, gcc
1169 key.data.id = widgetID; 1174 key.data.id = widgetID;
1170 key.data.width = 0; 1175 key.data.width = 0;
1171 key.data.height = h; 1176 key.data.height = h;
1172 key.data.border = false; 1177 key.data.border = false;
1173 key.data.mask = false; 1178 key.data.mask = false;
1174 OThemePixmap *pix = cache.find( ( unsigned long ) key.cacheKey ); 1179 OThemePixmap *pix = cache.find( ( unsigned long ) key.cacheKey );
1175 if ( pix ) 1180 if ( pix )
1176 pix->updateAccessed(); 1181 pix->updateAccessed();
1177 return ( pix ); 1182 return ( pix );
1178} 1183}
1179 1184
1180bool OThemeCache::insert( OThemePixmap *pixmap, ScaleHint scale, int widgetID, 1185bool OThemeCache::insert( OThemePixmap *pixmap, ScaleHint scale, int widgetID,
1181 bool border, bool mask ) 1186 bool border, bool mask )
1182{ 1187{
1183 kthemeKey key; 1188 kthemeKey key;
1184 key.cacheKey = 0; // shut up, gcc 1189 key.cacheKey = 0; // shut up, gcc
1185 key.data.id = widgetID; 1190 key.data.id = widgetID;
1186 key.data.width = ( scale == FullScale || scale == HorizontalScale ) ? 1191 key.data.width = ( scale == FullScale || scale == HorizontalScale ) ?
1187 pixmap->width() : 0; 1192 pixmap->width() : 0;
1188 key.data.height = ( scale == FullScale || scale == VerticalScale ) ? 1193 key.data.height = ( scale == FullScale || scale == VerticalScale ) ?
1189 pixmap->height() : 0; 1194 pixmap->height() : 0;
1190 key.data.border = border; 1195 key.data.border = border;
1191 key.data.mask = mask; 1196 key.data.mask = mask;
1192 1197
1193 if ( cache.find( ( unsigned long ) key.cacheKey, true ) != NULL ) { 1198 if ( cache.find( ( unsigned long ) key.cacheKey, true ) != NULL ) {
1194 return ( true ); // a pixmap of this scale is already in there 1199 return ( true ); // a pixmap of this scale is already in there
1195 } 1200 }
1196 return ( cache.insert( ( unsigned long ) key.cacheKey, pixmap, 1201 return ( cache.insert( ( unsigned long ) key.cacheKey, pixmap,
1197 pixmap->width() * pixmap->height() * pixmap->depth() / 8 ) ); 1202 pixmap->width() * pixmap->height() * pixmap->depth() / 8 ) );
1198} 1203}
1199 1204
1200//#include "kthemebase.moc" 1205//#include "kthemebase.moc"