/* ============================================================
 *
 * This file is a part of kipi-plugins project
 * http://www.kipi-plugins.org
 *
 * Date        : 2007-11-14
 * Description : a kipi plugin to slide images.
 *
 * Copyright (C) 2007 by Valerio Fuoglio <valerio dot fuoglio at gmail dot com>
 *
 * Parts of this code are based on smoothslidesaver by Carsten Weinhold 
 * <carsten dot weinhold at gmx dot 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, 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.
 *
 * ============================================================ */

// C++ includes.

#include <assert.h>

// TQt includes.

#include <tqdatetime.h>

// KDE includes.

#include "kbeffect.h"

// Local includes.

#include "slideshowkb.h"

namespace KIPISlideShowPlugin
{

// -------------------------------------------------------------------------

int KBEffect::m_numKBEffectRepeated = 0;

// -------------------------------------------------------------------------

KBEffect::KBEffect(SlideShowKB *parent, bool needFadeIn) {

    this->slideWidget = parent;
    this->m_needFadeIn  = needFadeIn;
}


KBEffect::~KBEffect() {

}


void KBEffect::setupNewImage(int img) {

    slideWidget->setupNewImage(img);
}


void KBEffect::swapImages() {

    slideWidget->swapImages();
}


Image *KBEffect::image(int img) {

    assert(img >= 0 && img < 2);
    return slideWidget->m_image[img];
}


KBEffect::Type KBEffect::chooseKBEffect(KBEffect::Type oldType) {

    KBEffect::Type type;

    do {
        type = (rand() < RAND_MAX / 2) ? KBEffect::Fade : KBEffect::Blend;        
    } while (type == oldType && m_numKBEffectRepeated >= 1);
    
    if (type == oldType)
        m_numKBEffectRepeated++;
    else
        m_numKBEffectRepeated = 0;
        
   return type;
}



// -------------------------------------------------------------------------

FadeKBEffect::FadeKBEffect(SlideShowKB *parent, bool needFadeIn):
    KBEffect(parent, needFadeIn)
{
    m_img[0] = image(0);
}


FadeKBEffect::~FadeKBEffect() {

}


bool FadeKBEffect::done() {

    if (m_img[0]->m_pos >= 1.0) {
        setupNewImage(0);
        return true;
    }
    
    return false;
}


void FadeKBEffect::advanceTime(float step) {

    m_img[0]->m_pos += step;
    if (m_img[0]->m_pos >= 1.0)
        m_img[0]->m_pos = 1.0;
        
    if (m_needFadeIn && m_img[0]->m_pos < 0.1)
        m_img[0]->m_opacity = m_img[0]->m_pos * 10;
    else if (m_img[0]->m_pos > 0.9)
        m_img[0]->m_opacity = (1.0 - m_img[0]->m_pos) * 10;
    else
        m_img[0]->m_opacity = 1.0;    
}

// -------------------------------------------------------------------------

BlendKBEffect::BlendKBEffect(SlideShowKB *parent, bool needFadeIn):
    KBEffect(parent, needFadeIn)
{
    m_img[0] = image(0);
    m_img[1] = 0;
}


BlendKBEffect::~BlendKBEffect() {

}


bool BlendKBEffect::done() {

    if (m_img[0]->m_pos >= 1.0) {
        m_img[0]->m_paint = false;
        swapImages();
        return true;
    }
    
    return false;
}


void BlendKBEffect::advanceTime(float step) {

    m_img[0]->m_pos += step;
    if (m_img[0]->m_pos >= 1.0)
        m_img[0]->m_pos = 1.0;
        
    if (m_img[1])
        m_img[1]->m_pos += step;

    if (m_needFadeIn && m_img[0]->m_pos < 0.1)
        m_img[0]->m_opacity = m_img[0]->m_pos * 10;
    
    else if (m_img[0]->m_pos > 0.9) {
        
        m_img[0]->m_opacity = (1.0 - m_img[0]->m_pos) * 10;
        
        if (m_img[1] == 0) {
            setupNewImage(1);
            m_img[1] = image(1);
            m_img[1]->m_opacity = 1.0;
        }
    
    } else
        m_img[0]->m_opacity = 1.0;
}

}  // NameSpace KIPISlideShowPlugin
