From ae2a03c2941bf92573f89b88ef73f8aa842bea0a Mon Sep 17 00:00:00 2001 From: toma Date: Wed, 25 Nov 2009 17:56:58 +0000 Subject: 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 --- kworldwatch/maploader.cpp | 172 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 kworldwatch/maploader.cpp (limited to 'kworldwatch/maploader.cpp') 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 +** Maintainence has ceased - send questions to kde-devel@kde.org. +** +*/ + +/* +** 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 kde-devel@kde.org +*/ +#include + +#include +#include +#include +#include +#include +#include + + +#include +#include +#include +#include + + +#include "astro.h" +#include "maploader.h" + + +QPtrList MapLoader::themes() +{ + QPtrList 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 sizes; + QStringList files = maps(theme); + for (uint i=0; i= 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= 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; y0) + { + 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; +} + -- cgit v1.2.1