rodzic
e96ee72ff0
commit
db19d360b6
@ -0,0 +1,361 @@
|
||||
/*
|
||||
* Copyright (C) 2008 Danilo Cesar Lemes de Paula <danilo@mandriva.com>
|
||||
* Copyright (C) 2008 Gustavo Boiko <boiko@mandriva.com>
|
||||
* Mandriva Conectiva
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License version 2 as published by the Free Software Foundation.
|
||||
*
|
||||
* This library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public License
|
||||
* along with this library; see the file COPYING.LIB. If not, write to
|
||||
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <tqdom.h>
|
||||
#include <tqfile.h>
|
||||
|
||||
#include <kdebug.h>
|
||||
|
||||
#include "KCrossBGRender.h"
|
||||
#include <tqapplication.h>
|
||||
#include <kimageeffect.h>
|
||||
|
||||
|
||||
KCrossBGRender::KCrossBGRender(int desk, int screen, bool drawBackgroundPerScreen, TDEConfig *config): KBackgroundRenderer(desk,screen,drawBackgroundPerScreen,config)
|
||||
{
|
||||
useCrossEfect = false;
|
||||
if ( wallpaperList()[0].endsWith("xml",false) ) {
|
||||
initCrossFade(wallpaperList()[0]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void KCrossBGRender::initCrossFade(TQString xmlFile)
|
||||
{
|
||||
useCrossEfect = true;
|
||||
if (xmlFile.isEmpty()){
|
||||
useCrossEfect = false;
|
||||
return;
|
||||
}
|
||||
secs = 0;
|
||||
timeList.empty();
|
||||
|
||||
// read the XMLfile
|
||||
TQDomDocument xmldoc = TQDomDocument(xmlFile);
|
||||
TQFile file( xmlFile );
|
||||
if ( !file.open( IO_ReadOnly ) ) {
|
||||
useCrossEfect = false;
|
||||
return;
|
||||
}
|
||||
if ( !xmldoc.setContent( &file ) ) {
|
||||
useCrossEfect = false;
|
||||
file.close();
|
||||
return;
|
||||
}
|
||||
file.close();
|
||||
|
||||
TQDomElement docElem = xmldoc.documentElement();
|
||||
TQDomNode n = docElem.firstChild();
|
||||
while( !n.isNull() ) {
|
||||
TQDomElement e = n.toElement(); // try to convert the node to an element.
|
||||
if( !e.isNull() ) {
|
||||
if (e.tagName() == "starttime") {
|
||||
createStartTime(e);
|
||||
} else if (e.tagName() == "transition") {
|
||||
createTransition(e);
|
||||
} else if (e.tagName() == "static") {
|
||||
createStatic(e);
|
||||
}
|
||||
}
|
||||
n = n.nextSibling();
|
||||
}
|
||||
|
||||
// Setting "now" state
|
||||
setCurrentEvent(true);
|
||||
pix = getCurrentPixmap();
|
||||
|
||||
useCrossEfect = true;
|
||||
}
|
||||
|
||||
|
||||
KCrossBGRender::~KCrossBGRender(){
|
||||
}
|
||||
|
||||
TQPixmap KCrossBGRender::pixmap() {
|
||||
fixEnabled();
|
||||
if (!useCrossEfect){
|
||||
TQPixmap p = KBackgroundRenderer::pixmap();
|
||||
kdDebug() << "Inherited " << p.size() << endl;
|
||||
if (p.width() == 0 && p.height() == 0){
|
||||
p.convertFromImage(image());
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
return pix;
|
||||
}
|
||||
|
||||
bool KCrossBGRender::needWallpaperChange(){
|
||||
if (!useCrossEfect) {
|
||||
return KBackgroundRenderer::needWallpaperChange();
|
||||
}
|
||||
|
||||
bool forceChange = setCurrentEvent(); // If we change the current state
|
||||
if (forceChange){ // do not matter what hapens
|
||||
actualPhase = 0; // we need to change background
|
||||
return true;
|
||||
}
|
||||
|
||||
// Return false if it's not a transition
|
||||
if (!current.transition) {
|
||||
return false;
|
||||
}
|
||||
|
||||
double timeLeft, timeTotal;
|
||||
TQTime now = TQTime::currentTime();
|
||||
|
||||
timeLeft = now.secsTo(current.etime);
|
||||
if (timeLeft < 0) {
|
||||
timeLeft += 86400; // before midnight
|
||||
}
|
||||
timeTotal = current.stime.secsTo(current.etime);
|
||||
if (timeTotal < 0) {
|
||||
timeTotal += 86400;
|
||||
}
|
||||
|
||||
double passed = timeTotal - timeLeft;
|
||||
double timeCell = timeTotal/60; //Time cell size
|
||||
|
||||
//kdDebug() << "\ntimeleft:" << timeLeft << " timeTotal:" << timeTotal
|
||||
// << "\npassed:" << passed << " timeCell:" << timeCell
|
||||
// << "\nactualPhase: " << actualPhase << endl;
|
||||
|
||||
int aux = passed/timeCell;
|
||||
if(actualPhase != aux){
|
||||
//kdDebug() << "needWallpaperChange() => returned true" << endl;
|
||||
actualPhase = passed/timeCell;
|
||||
return true;
|
||||
}
|
||||
|
||||
//kdDebug() << "needWallpaperChange() => returned false" << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* This method change the enabledEffect flag to TRUE of FALSE, according
|
||||
* with multiWallpaperMode and FileName (it needs to be a XML)
|
||||
*/
|
||||
void KCrossBGRender::fixEnabled(){
|
||||
|
||||
|
||||
TQString w = wallpaperList()[0];
|
||||
useCrossEfect = false;
|
||||
if(multiWallpaperMode() == Random || multiWallpaperMode() == InOrder){
|
||||
|
||||
if ( w != xmlFileName ){
|
||||
// New XML File
|
||||
xmlFileName = w;
|
||||
if (w.endsWith("xml",false)){
|
||||
initCrossFade(wallpaperList()[0]);
|
||||
//useCrossEfect = true;
|
||||
}else{
|
||||
// Not, it's not a xml file
|
||||
useCrossEfect = false;
|
||||
}
|
||||
}else if (w.endsWith("xml",false)){
|
||||
//xmlFile doesn't change
|
||||
//but it's there
|
||||
useCrossEfect = true;
|
||||
}else{
|
||||
// it's not a XML file
|
||||
useCrossEfect = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void KCrossBGRender::changeWallpaper(bool init){
|
||||
|
||||
|
||||
|
||||
fixEnabled();
|
||||
|
||||
if (!useCrossEfect){
|
||||
KBackgroundRenderer::changeWallpaper(init);
|
||||
return;
|
||||
}
|
||||
|
||||
pix = getCurrentPixmap();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
bool KCrossBGRender::setCurrentEvent(bool init){
|
||||
TQTime now = TQTime::currentTime();
|
||||
|
||||
|
||||
//Verify if is need to change
|
||||
if (!(init || now <= current.stime || now >= current.etime )) {
|
||||
return false;
|
||||
}
|
||||
|
||||
TQValueList<KBGCrossEvent>::iterator it;
|
||||
for ( it = timeList.begin(); it != timeList.end(); ++it ){
|
||||
|
||||
// Look for time
|
||||
if ( ((*it).stime <= now && now <= (*it).etime) || //normal situation
|
||||
((*it).etime <= (*it).stime && (now >= (*it).stime ||
|
||||
now <= (*it).etime) ) )
|
||||
{
|
||||
current = *it;
|
||||
actualPhase = 0;
|
||||
|
||||
//kdDebug() << "Cur: " << current.stime << "< now <" << current.etime << endl;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TQPixmap KCrossBGRender::getCurrentPixmap()
|
||||
{
|
||||
float alpha;
|
||||
TQPixmap ret;
|
||||
TQImage tmp;
|
||||
TQImage p1;
|
||||
if (!tmp.load(current.pix1))
|
||||
return TQPixmap();
|
||||
|
||||
// scale the pixmap to fit in the screen
|
||||
//p1 = TQPixmap(QApplication::desktop()->screenGeometry().size());
|
||||
//TQPainter p(&p1);
|
||||
//p.drawPixmap(p1.rect(), tmp);
|
||||
//
|
||||
p1 = tmp.smoothScale(TQApplication::desktop()->screenGeometry().size());
|
||||
|
||||
if (current.transition){
|
||||
TQTime now = TQTime::currentTime();
|
||||
double timeLeft,timeTotal;
|
||||
|
||||
TQImage p2;
|
||||
|
||||
if (!tmp.load(current.pix2) )
|
||||
return NULL;
|
||||
|
||||
p2 = tmp.smoothScale(TQApplication::desktop()->screenGeometry().size());
|
||||
//TQPainter p(&p2);
|
||||
//p.drawPixmap(p2.rect(), tmp);
|
||||
|
||||
timeLeft = now.secsTo(current.etime);
|
||||
if (timeLeft < 0)
|
||||
timeLeft += 86400;
|
||||
timeTotal = current.stime.secsTo(current.etime);
|
||||
if (timeTotal < 0)
|
||||
timeTotal += 86400;
|
||||
|
||||
alpha = (timeTotal - timeLeft)/timeTotal;
|
||||
|
||||
//ret = crossFade(p2,p1,alpha);
|
||||
tmp = KImageEffect::blend(p2,p1,alpha);
|
||||
ret.convertFromImage(tmp);
|
||||
return ret;
|
||||
}else{
|
||||
ret.convertFromImage(p1);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void KCrossBGRender::createStartTime(TQDomElement docElem)
|
||||
{
|
||||
int hour;
|
||||
int minutes;
|
||||
|
||||
TQDomNode n = docElem.firstChild();
|
||||
while( !n.isNull() ) {
|
||||
TQDomElement e = n.toElement();
|
||||
if( !e.isNull() ) {
|
||||
if (e.tagName() == "hour"){
|
||||
hour = e.text().toInt();
|
||||
}else if ( e.tagName() == "minute" ){
|
||||
minutes = e.text().toInt();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
n = n.nextSibling();
|
||||
}
|
||||
secs = hour*60*60 + minutes*60;
|
||||
}
|
||||
void KCrossBGRender::createTransition(TQDomElement docElem)
|
||||
{
|
||||
int duration;
|
||||
TQString from;
|
||||
TQString to;
|
||||
|
||||
TQDomNode n = docElem.firstChild();
|
||||
while( !n.isNull() ) {
|
||||
TQDomElement e = n.toElement();
|
||||
if( !e.isNull() ) {
|
||||
if (e.tagName() == "duration"){
|
||||
duration = e.text().toFloat();
|
||||
}else if ( e.tagName() == "from" ){
|
||||
from = e.text();
|
||||
}
|
||||
else if ( e.tagName() == "to" ){
|
||||
to = e.text();
|
||||
}
|
||||
|
||||
}
|
||||
n = n.nextSibling();
|
||||
}
|
||||
TQTime startTime(0,0,0);
|
||||
startTime = startTime.addSecs(secs);
|
||||
TQTime endTime(0,0,0);
|
||||
endTime = endTime.addSecs(secs+duration);
|
||||
|
||||
secs += duration;
|
||||
|
||||
KBGCrossEvent l = {true, from, to, startTime,endTime};
|
||||
|
||||
timeList.append(l);
|
||||
|
||||
}
|
||||
void KCrossBGRender::createStatic(TQDomElement docElem)
|
||||
{
|
||||
int duration;
|
||||
TQString file;
|
||||
|
||||
TQDomNode n = docElem.firstChild();
|
||||
while( !n.isNull() ) {
|
||||
TQDomElement e = n.toElement();
|
||||
if( !e.isNull() ) {
|
||||
if (e.tagName() == "duration"){
|
||||
duration = e.text().toFloat();
|
||||
}else if ( e.tagName() == "file" ){
|
||||
file = e.text();
|
||||
}
|
||||
|
||||
}
|
||||
n = n.nextSibling();
|
||||
}
|
||||
|
||||
TQTime startTime(0,0,0);
|
||||
startTime = startTime.addSecs(secs);
|
||||
TQTime endTime(0,0,0);
|
||||
endTime = endTime.addSecs(secs+duration);
|
||||
|
||||
secs += duration;
|
||||
|
||||
KBGCrossEvent l = {false, file, NULL, startTime,endTime};
|
||||
timeList.append(l);
|
||||
}
|
||||
|
||||
#include "KCrossBGRender.moc"
|
@ -0,0 +1,76 @@
|
||||
/*
|
||||
* Copyright (C) 2008 Danilo Cesar Lemes de Paula <danilo@mandriva.com>
|
||||
* Copyright (C) 2008 Gustavo Boiko <boiko@mandriva.com>
|
||||
* Mandriva Conectiva
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License version 2 as published by the Free Software Foundation.
|
||||
*
|
||||
* This library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public License
|
||||
* along with this library; see the file COPYING.LIB. If not, write to
|
||||
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __KCROSSBGRENDER_H__
|
||||
#define __KCROSSBGRENDER_H__
|
||||
|
||||
|
||||
#include <tqvaluelist.h>
|
||||
#include <tqpixmap.h>
|
||||
#include <tqvaluelist.h>
|
||||
#include <tqdatetime.h>
|
||||
|
||||
#include "bgrender.h"
|
||||
|
||||
class TQDomElement;
|
||||
|
||||
typedef struct crossEvent{
|
||||
bool transition;
|
||||
TQString pix1;
|
||||
TQString pix2;
|
||||
TQTime stime; //start time
|
||||
TQTime etime; //end time
|
||||
} KBGCrossEvent;
|
||||
|
||||
|
||||
class KCrossBGRender: public KBackgroundRenderer{
|
||||
|
||||
TQ_OBJECT
|
||||
|
||||
public:
|
||||
KCrossBGRender(int desk, int screen, bool drawBackgroundPerScreen, TDEConfig *config=0);
|
||||
~KCrossBGRender();
|
||||
|
||||
bool needWallpaperChange();
|
||||
void changeWallpaper(bool init=false);
|
||||
TQPixmap pixmap();
|
||||
bool usingCrossXml(){return useCrossEfect;};
|
||||
|
||||
|
||||
private:
|
||||
TQPixmap pix;
|
||||
int secs;
|
||||
TQString xmlFileName;
|
||||
bool useCrossEfect;
|
||||
|
||||
int actualPhase;
|
||||
|
||||
void createStartTime(TQDomElement e);
|
||||
void createTransition(TQDomElement e);
|
||||
void createStatic(TQDomElement e);
|
||||
bool setCurrentEvent(bool init = false);
|
||||
void initCrossFade(TQString xml);
|
||||
void fixEnabled();
|
||||
TQPixmap getCurrentPixmap();
|
||||
KBGCrossEvent current;
|
||||
TQValueList<KBGCrossEvent> timeList;
|
||||
};
|
||||
|
||||
#endif // __KCROSSBGRENDER_H__
|
@ -0,0 +1,56 @@
|
||||
/* vi: ts=8 sts=4 sw=4
|
||||
* kate: space-indent on; tab-width 8; indent-width 4; indent-mode cstyle;
|
||||
*
|
||||
* This file is part of the KDE project, module kdesktop.
|
||||
* Copyright (C) 1999,2000 Geert Jansen <jansen@kde.org>
|
||||
*
|
||||
* You can Freely distribute this program under the GNU General Public
|
||||
* License. See the file "COPYING" for the exact licensing terms.
|
||||
*/
|
||||
|
||||
#ifndef __CROSSFADE_H__
|
||||
#define __CROSSFADE_H__
|
||||
|
||||
#include <tqtimer.h>
|
||||
#include <tqpainter.h>
|
||||
#include <tqpixmap.h>
|
||||
#include <X11/X.h>
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xatom.h>
|
||||
#include <X11/extensions/Xrender.h>
|
||||
#include <kdebug.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
|
||||
inline TQPixmap crossFade(const TQPixmap &pix1, const TQPixmap &pix2, double r_alpha,
|
||||
bool sync = false){
|
||||
|
||||
TQPixmap pix = TQPixmap(1,1,8);
|
||||
int mw,mh;
|
||||
mw = pix1.width();
|
||||
mh = pix1.height();
|
||||
|
||||
int alpha = 0xffff * (1-r_alpha);
|
||||
|
||||
XRenderColor clr = { 0, 0, 0, alpha };
|
||||
XRenderPictureAttributes pa;
|
||||
pa.repeat = True;
|
||||
Picture pic = XRenderCreatePicture(pix.x11Display(), pix.handle(),
|
||||
XRenderFindStandardFormat (pix.x11Display(), PictStandardA8),
|
||||
CPRepeat, &pa);
|
||||
XRenderFillRectangle(pix.x11Display(), PictOpSrc, pic,
|
||||
&clr, 0, 0, 1, 1);
|
||||
TQPixmap dst(pix1);
|
||||
dst.detach();
|
||||
XRenderComposite(pix.x11Display(), PictOpOver, pix2.x11RenderHandle(),
|
||||
pic, dst.x11RenderHandle(),0,0, 0,0, 0,0, mw,mh);
|
||||
|
||||
if (sync) {
|
||||
XSync(pix.x11Display(), false);
|
||||
}
|
||||
XRenderFreePicture(pix.x11Display(), pic);
|
||||
return dst;
|
||||
}
|
||||
|
||||
#endif // __CROSSFADE_H__
|
Ładowanie…
Reference in new issue