File indexing completed on 2025-03-09 03:52:07

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2007-11-14
0007  * Description : a presentation tool.
0008  *
0009  * SPDX-FileCopyrightText: 2007-2008 by Valerio Fuoglio <valerio dot fuoglio at gmail dot com>
0010  * SPDX-FileCopyrightText: 2012-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
0011  *
0012  * Parts of this code are based on smoothslidesaver by Carsten Weinhold
0013  * <carsten dot weinhold at gmx dot de>
0014  *
0015  * SPDX-License-Identifier: GPL-2.0-or-later
0016  *
0017  * ============================================================ */
0018 
0019 #include "kbeffect.h"
0020 
0021 // Qt includes
0022 
0023 #include <QRandomGenerator>
0024 
0025 // Local includes
0026 
0027 #include "presentationkb.h"
0028 #include "presentationkb_p.h"
0029 
0030 namespace DigikamGenericPresentationPlugin
0031 {
0032 
0033 // -------------------------------------------------------------------------
0034 
0035 int KBEffect::m_numKBEffectRepeated = 0;
0036 
0037 // -------------------------------------------------------------------------
0038 
0039 KBEffect::KBEffect(PresentationKB* const parent, bool needFadeIn)
0040     : m_needFadeIn (needFadeIn),
0041       m_slideWidget(parent)
0042 {
0043     m_img[0] = nullptr;
0044     m_img[1] = nullptr;
0045 }
0046 
0047 void KBEffect::setupNewImage(int img)
0048 {
0049     m_slideWidget->setupNewImage(img);
0050 }
0051 
0052 void KBEffect::swapImages()
0053 {
0054     m_slideWidget->swapImages();
0055 }
0056 
0057 KBImage* KBEffect::image(int img) const
0058 {
0059     Q_ASSERT ((img >= 0) && (img < 2));
0060 
0061     return m_slideWidget->d->image[img];
0062 }
0063 
0064 KBEffect::Type KBEffect::chooseKBEffect(KBEffect::Type oldType)
0065 {
0066     KBEffect::Type type;
0067 
0068     do
0069     {
0070         type = (QRandomGenerator::global()->bounded(2U) == 0) ? KBEffect::Fade : KBEffect::Blend;
0071     }
0072     while ((type == oldType) && (m_numKBEffectRepeated >= 1));
0073 
0074     if (type == oldType)
0075     {
0076         m_numKBEffectRepeated++;
0077     }
0078     else
0079     {
0080         m_numKBEffectRepeated = 0;
0081     }
0082 
0083     return type;
0084 }
0085 
0086 // -------------------------------------------------------------------------
0087 
0088 FadeKBEffect::FadeKBEffect(PresentationKB* const parent, bool needFadeIn)
0089     : KBEffect(parent, needFadeIn)
0090 {
0091     m_img[0] = image(0);
0092 }
0093 
0094 FadeKBEffect::~FadeKBEffect()
0095 {
0096 }
0097 
0098 bool FadeKBEffect::done()
0099 {
0100     if (m_img[0]->m_pos >= 1.0)
0101     {
0102         setupNewImage(0);
0103 
0104         return true;
0105     }
0106 
0107     return false;
0108 }
0109 
0110 void FadeKBEffect::advanceTime(float step)
0111 {
0112     m_img[0]->m_pos += step;
0113 
0114     if (m_img[0]->m_pos >= 1.0)
0115     {
0116         m_img[0]->m_pos = 1.0;
0117     }
0118 
0119     if      (m_needFadeIn && (m_img[0]->m_pos < 0.1))
0120     {
0121         m_img[0]->m_opacity = m_img[0]->m_pos * 10;
0122     }
0123     else if (m_img[0]->m_pos > 0.9)
0124     {
0125         m_img[0]->m_opacity = (1.0 - m_img[0]->m_pos) * 10;
0126     }
0127     else
0128     {
0129         m_img[0]->m_opacity = 1.0;
0130     }
0131 }
0132 
0133 // -------------------------------------------------------------------------
0134 
0135 BlendKBEffect::BlendKBEffect(PresentationKB* const parent, bool needFadeIn)
0136     : KBEffect(parent, needFadeIn)
0137 {
0138     m_img[0] = image(0);
0139     m_img[1] = nullptr;
0140 }
0141 
0142 BlendKBEffect::~BlendKBEffect()
0143 {
0144 }
0145 
0146 bool BlendKBEffect::done()
0147 {
0148     if (m_img[0]->m_pos >= 1.0)
0149     {
0150         m_img[0]->m_paint = false;
0151         swapImages();
0152 
0153         return true;
0154     }
0155 
0156     return false;
0157 }
0158 
0159 void BlendKBEffect::advanceTime(float step)
0160 {
0161     m_img[0]->m_pos += step;
0162 
0163     if (m_img[0]->m_pos >= 1.0)
0164     {
0165         m_img[0]->m_pos = 1.0;
0166     }
0167 
0168     if (m_img[1])
0169     {
0170         m_img[1]->m_pos += step;
0171     }
0172 
0173     if      (m_needFadeIn && (m_img[0]->m_pos < 0.1))
0174     {
0175         m_img[0]->m_opacity = m_img[0]->m_pos * 10;
0176     }
0177     else if (m_img[0]->m_pos > 0.9)
0178     {
0179         m_img[0]->m_opacity = (1.0 - m_img[0]->m_pos) * 10;
0180 
0181         if (m_img[1] == nullptr)
0182         {
0183             setupNewImage(1);
0184             m_img[1] = image(1);
0185             m_img[1]->m_opacity = 1.0;
0186         }
0187     }
0188     else
0189     {
0190         m_img[0]->m_opacity = 1.0;
0191     }
0192 }
0193 
0194 } // namespace DigikamGenericPresentationPlugin