summaryrefslogtreecommitdiffstats
path: root/client/imageholder.cpp
diff options
context:
space:
mode:
authortpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-02-24 02:28:08 +0000
committertpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-02-24 02:28:08 +0000
commitf9c5bc16e192997a25a9547b4173551bab70630a (patch)
treea701b520cf924c8588305b6e6fdd0748070bd542 /client/imageholder.cpp
downloadtwin-style-crystal-f9c5bc16e192997a25a9547b4173551bab70630a.tar.gz
twin-style-crystal-f9c5bc16e192997a25a9547b4173551bab70630a.zip
Added KDE3 version of kwin Crystal style
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/kwin-style-crystal@1095345 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'client/imageholder.cpp')
-rw-r--r--client/imageholder.cpp171
1 files changed, 171 insertions, 0 deletions
diff --git a/client/imageholder.cpp b/client/imageholder.cpp
new file mode 100644
index 0000000..c24844e
--- /dev/null
+++ b/client/imageholder.cpp
@@ -0,0 +1,171 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Sascha Hlusiak *
+ * Spam84@gmx.de *
+ * *
+ * 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; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+
+#include <kapp.h>
+#include <qimage.h>
+#include <kimageeffect.h>
+#include <qapplication.h>
+#include <qdesktopwidget.h>
+#include "imageholder.h"
+#include "crystalclient.h"
+
+
+QImageHolder::QImageHolder(QImage act,QImage inact)
+:img_active(NULL),img_inactive(NULL)
+{
+ rootpixmap=NULL;
+ setUserdefinedPictures( act,inact);
+ initialized=userdefinedActive && userdefinedInactive;
+
+ emit repaintNeeded();
+}
+
+QImageHolder::~QImageHolder()
+{
+ if (rootpixmap)delete rootpixmap;
+ if (img_active && !userdefinedActive)delete img_active;
+ if (img_inactive && !userdefinedInactive)delete img_inactive;
+}
+
+void QImageHolder::setUserdefinedPictures( QImage act,QImage inact)
+{
+ int w=QApplication::desktop()->width();
+ int h=QApplication::desktop()->height();
+ if (img_active && !userdefinedActive)
+ {
+ delete img_active;
+ img_active=NULL;
+ }
+ if (img_inactive && !userdefinedInactive)
+ {
+ delete img_inactive;
+ img_inactive=NULL;
+ }
+
+ if (!act.isNull())
+ {
+ act=act.smoothScale(w,h);
+ img_active=ApplyEffect(act,&::factory->active,factory->options()->colorGroup(KDecoration::ColorTitleBar, true));
+ }else img_active=NULL;
+ if (!inact.isNull())
+ {
+ inact=inact.smoothScale(w,h);
+ img_inactive=ApplyEffect(inact,&::factory->inactive,factory->options()->colorGroup(KDecoration::ColorTitleBar, false));
+ }else img_inactive=NULL;
+
+ userdefinedActive=(img_active!=NULL);
+ userdefinedInactive=(img_inactive!=NULL);
+
+ CheckSanity();
+}
+
+void QImageHolder::Init()
+{
+ if (initialized)return;
+
+ rootpixmap=new KMyRootPixmap(NULL/*,this*/);
+ rootpixmap->start();
+ rootpixmap->repaint(true);
+ connect( rootpixmap,SIGNAL(backgroundUpdated(const QImage*)),this, SLOT(BackgroundUpdated(const QImage*)));
+ connect(kapp, SIGNAL(backgroundChanged(int)),SLOT(handleDesktopChanged(int)));
+
+ initialized=true;
+}
+
+void QImageHolder::repaint(bool force)
+{
+ Init();
+ if (rootpixmap)rootpixmap->repaint(force);
+}
+
+void QImageHolder::handleDesktopChanged(int)
+{
+ repaint(true);
+}
+
+void QImageHolder::CheckSanity()
+{
+ if (!initialized)return;
+ if (userdefinedActive && userdefinedInactive)return;
+ if (img_active!=NULL && !userdefinedActive)return;
+ if (img_inactive!=NULL && !userdefinedInactive)return;
+
+ if (rootpixmap)delete rootpixmap;
+ rootpixmap=NULL;
+
+ initialized=false;
+}
+
+QPixmap* QImageHolder::ApplyEffect(QImage &src,WND_CONFIG* cfg,QColorGroup colorgroup)
+{
+ QImage dst;
+
+ switch(cfg->mode)
+ {
+ case 0: if (cfg->amount>0.99)return new QPixmap();
+ dst=KImageEffect::fade(src, cfg->amount, colorgroup.background());
+ break;
+ case 1:dst=KImageEffect::channelIntensity(src,cfg->amount,KImageEffect::All);
+ break;
+ case 2:dst=KImageEffect::intensity(src,cfg->amount);
+ break;
+ case 3:dst=KImageEffect::desaturate(src,cfg->amount);
+ break;
+ case 4: dst=src;
+ KImageEffect::solarize(dst,cfg->amount*100.0);
+ break;
+
+ default:dst=src;
+ break;
+ }
+
+ if (cfg->blur>0)dst=KImageEffect::blur(dst,0,cfg->blur);
+
+ return new QPixmap(dst);
+}
+
+void QImageHolder::BackgroundUpdated(const QImage *src)
+{
+ if (img_active && !userdefinedActive)
+ {
+ delete img_active;
+ img_active=NULL;
+ }
+ if (img_inactive && !userdefinedInactive)
+ {
+ delete img_inactive;
+ img_inactive=NULL;
+ }
+
+ if (src && !src->isNull())
+ {
+ QImage tmp=src->copy();
+
+ if (!userdefinedInactive)
+ img_inactive=ApplyEffect(tmp,&::factory->inactive,factory->options()->colorGroup(KDecoration::ColorTitleBar, false));
+
+ tmp=src->copy();
+ if (!userdefinedActive)
+ img_active=ApplyEffect(tmp,&::factory->active,factory->options()->colorGroup(KDecoration::ColorTitleBar, true));
+ }
+
+ emit repaintNeeded();
+}