diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | ae2a03c2941bf92573f89b88ef73f8aa842bea0a (patch) | |
tree | 3566563f3fb6ac3cb3496669d8f233062d3091bc /kworldwatch/maploader.cpp | |
download | tdetoys-ae2a03c2941bf92573f89b88ef73f8aa842bea0a.tar.gz tdetoys-ae2a03c2941bf92573f89b88ef73f8aa842bea0a.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdetoys@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kworldwatch/maploader.cpp')
-rw-r--r-- | kworldwatch/maploader.cpp | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/kworldwatch/maploader.cpp b/kworldwatch/maploader.cpp new file mode 100644 index 0000000..236abd3 --- /dev/null +++ b/kworldwatch/maploader.cpp @@ -0,0 +1,172 @@ +/* +** +** Copyright (C) 1998-2001 by Matthias H�lzer-Kl�pfel <[email protected]> +** Maintainence has ceased - send questions to [email protected]. +** +*/ + +/* +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program in a file called COPYING; if not, write to +** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +** MA 02110-1301, USA. +*/ + +/* +** Bug reports and questions can be sent to [email protected] +*/ +#include <time.h> + +#include <qvaluelist.h> +#include <qdir.h> +#include <qimage.h> +#include <qpainter.h> +#include <qtl.h> +#include <qstringlist.h> + + +#include <kglobal.h> +#include <kstandarddirs.h> +#include <kdesktopfile.h> +#include <kimageeffect.h> + + +#include "astro.h" +#include "maploader.h" + + +QPtrList<MapTheme> MapLoader::themes() +{ + QPtrList<MapTheme> result; + + QStringList files = KGlobal::dirs()->findAllResources("data", "kworldclock/maps/*/*.desktop"); + for (QStringList::Iterator it=files.begin(); it != files.end(); ++it) + { + KDesktopFile conf(*it); + conf.setGroup("Theme"); + result.append(new MapTheme(conf.readName(), conf.readEntry("Theme"))); + } + + return result; +} + + +QStringList MapLoader::maps(const QString &theme) +{ + return KGlobal::dirs()->findAllResources("data", QString("kworldclock/maps/%1/*.jpg").arg(theme)); +} + + +void MapLoader::load(unsigned int width, const QString &theme, unsigned int height, float opacity) +{ + // find the maps available + QValueList<uint> sizes; + QStringList files = maps(theme); + for (uint i=0; i<files.count(); ++i) + { + QString f = files[i]; + int pos = f.findRev("/"); + if (pos >= 0) + f = f.mid(pos+1); + pos = f.findRev("."); + if (pos >= 0) + f = f.left(pos); + sizes.append(f.toInt()); + } + qHeapSort(sizes); + + // find the closest (bigger) size + uint size=0; + for (uint i=0; i<sizes.count(); ++i) + { + size = sizes[i]; + if (size >= width) + break; + } + + QImage image; + if (size == 0) + { + image = QImage(locate("data", "kworldclock/maps/depths/800.jpg")); + size = 800; + } + else + image = QImage(locate("data", QString("kworldclock/maps/%1/%2.jpg").arg(theme).arg(size))); + + if (height == 0) + height = width/2; + + if ((image.width() != (int)width) || (image.height() != (int)height)) + image = image.smoothScale(width, height); + + // convert to light map + _light.convertFromImage(image); + + // calculate dark map + _dark.convertFromImage(KImageEffect::blend(Qt::black, image, opacity)); +} + + +QBitmap MapLoader::darkMask(int width, int height) +{ + time_t t; + struct tm *tmp; + double jt, sunra, sundec, sunrv, sunlong; + short *wtab; + + QBitmap illuMask(width, height); + + // calculate the position of the sun + t = time(NULL); + tmp = gmtime(&t); + jt = jtime(tmp); + sunpos(jt,FALSE, &sunra, &sundec, &sunrv, &sunlong); + + int sec = tmp->tm_hour*60*60 + tmp->tm_min*60 + tmp->tm_sec; + int gmt_position = width * sec / 86400; // note: greenwich is in the middle! + + // calculate the illuminated area + wtab = new short[height]; + projillum(wtab,width,height,sundec); + + // draw illumination + illuMask.fill(Qt::black); + QPainter p; + p.begin(&illuMask); + + int start, stop; + int middle = width - gmt_position; + for (int y=0; y<height; y++) + if (wtab[y]>0) + { + start = middle - wtab[y]; + stop = middle + wtab[y]; + if (start < 0) + { + p.drawLine(0,y,stop,y); + p.drawLine(width+start,y,width,y); + } + else + if (stop > width) + { + p.drawLine(start,y,width,y); + p.drawLine(0,y,stop-width,y); + } + else + p.drawLine(start,y,stop,y); + } + p.end(); + delete [] wtab; + return illuMask; +} + |