summaryrefslogtreecommitdiffstats
path: root/kpresenter/KPrPageEffects.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kpresenter/KPrPageEffects.cpp')
-rw-r--r--kpresenter/KPrPageEffects.cpp1590
1 files changed, 1590 insertions, 0 deletions
diff --git a/kpresenter/KPrPageEffects.cpp b/kpresenter/KPrPageEffects.cpp
new file mode 100644
index 00000000..d98f5141
--- /dev/null
+++ b/kpresenter/KPrPageEffects.cpp
@@ -0,0 +1,1590 @@
+// -*- Mode: c++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4; -*-
+/* This file is part of the KDE project
+ Copyright (C) 1998, 1999 Reginald Stadlbauer <reggie@kde.org>
+ Copyright (C) 2002 Ariya Hidayat <ariya@kde.org>
+ Copyright (C) 2002 Harri Porten <porten@kde.org>
+ Copyright (C) 2004 Thorsten Zachmann <zachmann@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ 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., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+*/
+
+#include "KPrPageEffects.h"
+
+#include <qpixmap.h>
+#include <qwidget.h>
+#include <qwmatrix.h>
+
+#include <kapplication.h>
+#include <kdebug.h>
+#include <krandomsequence.h>
+
+
+KPrPageEffects::KPrPageEffects( QPaintDevice *dst, const QPixmap &pageTo, PageEffect effect, EffectSpeed speed )
+: m_dst( dst ), m_pageTo( pageTo ), m_pageFrom(m_pageTo.width(),m_pageTo.height()), m_effect(effect), m_speed(speed), m_effectStep(0)
+, m_width(m_pageTo.width()), m_height(m_pageTo.height()), m_finished(false)
+{
+ if ( m_effect == PEF_RANDOM )
+ {
+ KRandomSequence random;
+ m_randomEffect = static_cast<PageEffect>( random.getLong( PEF_LAST_MARKER ) );
+ }
+ int div[] = { 100, 65, 30 };
+
+ m_stepWidth = (int) ( m_width / div[m_speed] );
+ m_stepHeight = (int) ( m_height / div[m_speed] );
+}
+
+
+KPrPageEffects::~KPrPageEffects()
+{
+}
+
+
+bool KPrPageEffects::doEffect()
+{
+ if ( !m_finished )
+ {
+ PageEffect effect = m_effect == PEF_RANDOM ? m_randomEffect : m_effect;
+ switch ( effect )
+ {
+ case PEF_NONE:
+ m_finished = effectNone();
+ break;
+ case PEF_CLOSE_HORZ:
+ m_finished = effectCloseHorizontal();
+ break;
+ case PEF_CLOSE_VERT:
+ m_finished = effectCloseVertical();
+ break;
+ case PEF_CLOSE_ALL:
+ m_finished = effectCloseFromAllDirections();
+ break;
+ case PEF_OPEN_HORZ:
+ m_finished = effectOpenHorizontal();
+ break;
+ case PEF_OPEN_VERT:
+ m_finished = effectOpenVertical();
+ break;
+ case PEF_OPEN_ALL:
+ m_finished = effectOpenFromAllDirections();
+ break;
+ case PEF_INTERLOCKING_HORZ_1:
+ m_finished = effectInterlockingHorizontal1();
+ break;
+ case PEF_INTERLOCKING_HORZ_2:
+ m_finished = effectInterlockingHorizontal2();
+ break;
+ case PEF_INTERLOCKING_VERT_1:
+ m_finished = effectInterlockingVertical1();
+ break;
+ case PEF_INTERLOCKING_VERT_2:
+ m_finished = effectInterlockingVertical2();
+ break;
+ case PEF_SURROUND1:
+ m_finished = effectSurround1();
+ break;
+ case PEF_FLY1:
+ m_finished = effectFlyAway1();
+ break;
+ case PEF_BLINDS_HOR:
+ m_finished = effectBlindsHorizontal();
+ break;
+ case PEF_BLINDS_VER:
+ m_finished = effectBlindsVertical();
+ break;
+ case PEF_BOX_IN:
+ m_finished = effectBoxIn();
+ break;
+ case PEF_BOX_OUT:
+ m_finished = effectBoxOut();
+ break;
+ case PEF_CHECKBOARD_ACROSS:
+ m_finished = effectCheckboardAcross();
+ break;
+ case PEF_CHECKBOARD_DOWN:
+ m_finished = effectCheckboardDown();
+ break;
+ case PEF_COVER_DOWN:
+ m_finished = effectCoverDown();
+ break;
+ case PEF_UNCOVER_DOWN:
+ m_finished = effectUncoverDown();
+ break;
+ case PEF_COVER_UP:
+ m_finished = effectCoverUp();
+ break;
+ case PEF_UNCOVER_UP:
+ m_finished = effectUncoverUp();
+ break;
+ case PEF_COVER_LEFT:
+ m_finished = effectCoverLeft();
+ break;
+ case PEF_UNCOVER_LEFT:
+ m_finished = effectUncoverLeft();
+ break;
+ case PEF_COVER_RIGHT:
+ m_finished = effectCoverRight();
+ break;
+ case PEF_UNCOVER_RIGHT:
+ m_finished = effectUncoverRight();
+ break;
+ case PEF_COVER_LEFT_UP:
+ m_finished = effectCoverLeftUp();
+ break;
+ case PEF_UNCOVER_LEFT_UP:
+ m_finished = effectUncoverLeftUp();
+ break;
+ case PEF_COVER_LEFT_DOWN:
+ m_finished = effectCoverLeftDown();
+ break;
+ case PEF_UNCOVER_LEFT_DOWN:
+ m_finished = effectUncoverLeftDown();
+ break;
+ case PEF_COVER_RIGHT_UP:
+ m_finished = effectCoverRightUp();
+ break;
+ case PEF_UNCOVER_RIGHT_UP:
+ m_finished = effectUncoverRightUp();
+ break;
+ case PEF_COVER_RIGHT_DOWN:
+ m_finished = effectCoverRightDown();
+ break;
+ case PEF_UNCOVER_RIGHT_DOWN:
+ m_finished = effectUncoverRightDown();
+ break;
+ case PEF_DISSOLVE:
+ m_finished = effectDissolve();
+ break;
+ case PEF_STRIPS_LEFT_UP:
+ m_finished = effectStripesLeftUp();
+ break;
+ case PEF_STRIPS_LEFT_DOWN:
+ m_finished = effectStripesLeftDown();
+ break;
+ case PEF_STRIPS_RIGHT_UP:
+ m_finished = effectStripesRightUp();
+ break;
+ case PEF_STRIPS_RIGHT_DOWN:
+ m_finished = effectStripesRigthDown();
+ break;
+ case PEF_MELTING:
+ m_finished = effectMelting();
+ break;
+ default:
+ m_finished = effectCloseHorizontal();
+ break;
+ }
+ ++m_effectStep;
+ }
+ return m_finished;
+}
+
+
+void KPrPageEffects::finish()
+{
+ if ( !m_finished )
+ {
+ bitBlt( m_dst, 0, 0, &m_pageTo );
+ m_finished = true;
+ }
+}
+
+
+bool KPrPageEffects::effectNone() const
+{
+ bitBlt( m_dst, 0, 0, &m_pageTo );
+ return true;
+}
+
+
+bool KPrPageEffects::effectCloseHorizontal() const
+{
+ int h = m_effectStep * m_stepHeight;
+
+ bool finished = false;
+ if ( h >= m_height / 2 )
+ {
+ h = m_height / 2;
+ finished = true;
+ }
+
+ bitBlt( m_dst, 0, 0, &m_pageTo, 0, m_height / 2 - h, m_width, h );
+ bitBlt( m_dst, 0, m_height - h, &m_pageTo, 0, m_height / 2, m_width, h );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectCloseVertical() const
+{
+ int w = m_effectStep * m_stepWidth;
+
+ bool finished = false;
+ if ( w >= m_width / 2 )
+ {
+ w = m_width / 2;
+ finished = true;
+ }
+
+ bitBlt( m_dst, 0, 0, &m_pageTo, m_width / 2 - w, 0, w, m_height );
+ bitBlt( m_dst, m_width - w, 0, &m_pageTo, m_width / 2, 0, w, m_height );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectCloseFromAllDirections() const
+{
+ double fact = (double) m_height / (double) m_width;
+ int h = (int)( m_effectStep * m_stepWidth * fact );
+ int w = m_effectStep * m_stepWidth;
+
+ bool finished = false;
+ if ( h >= m_height / 2 )
+ {
+ h = m_height / 2;
+ }
+ if ( w >= m_width / 2 )
+ {
+ w = m_width / 2;
+ }
+ if ( h >= m_height / 2 && w >= m_width / 2 )
+ {
+ finished = true;
+ }
+
+ bitBlt( m_dst, 0, 0, &m_pageTo, m_width / 2 - w, m_height / 2 - h, w, h );
+ bitBlt( m_dst, m_width - w, 0, &m_pageTo, m_width / 2, m_height / 2 - h, w, h );
+ bitBlt( m_dst, 0, m_height - h, &m_pageTo, m_width / 2 - w, m_height / 2, w, h );
+ bitBlt( m_dst, m_width - w, m_height - h, &m_pageTo, m_width / 2, m_height / 2, w, h );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectOpenHorizontal() const
+{
+ int h = m_effectStep * m_stepHeight;
+
+ bool finished = false;
+ if ( h >= m_height / 2 )
+ {
+ h = m_height / 2;
+ finished = true;
+ }
+
+ bitBlt( m_dst, 0, m_height / 2 - h, &m_pageTo, 0, 0, m_width, h );
+ bitBlt( m_dst, 0, m_height / 2, &m_pageTo, 0, m_height - h, m_width, h );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectOpenVertical() const
+{
+ int w = m_effectStep * m_stepWidth;
+
+ bool finished = false;
+ if ( w >= m_width / 2 )
+ {
+ w = m_width / 2;
+ finished = true;
+ }
+
+ bitBlt( m_dst, m_width / 2 - w, 0, &m_pageTo, 0, 0, w, m_height );
+ bitBlt( m_dst, m_width / 2, 0, &m_pageTo, m_width - w, 0, w, m_height );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectOpenFromAllDirections() const
+{
+ double fact = (double) m_height / (double) m_width;
+ int h = (int)( m_effectStep * m_stepWidth * fact );
+ int w = m_effectStep * m_stepWidth;
+
+ bool finished = false;
+ if ( h >= m_height / 2 )
+ {
+ h = m_height / 2;
+ }
+ if ( w >= m_width / 2 )
+ {
+ w = m_width / 2;
+ }
+ if ( h >= m_height / 2 && w >= m_width / 2 )
+ {
+ finished = true;
+ }
+
+ bitBlt( m_dst, m_width / 2 - w, m_height / 2 - h, &m_pageTo, 0, 0, w, h );
+ bitBlt( m_dst, m_width / 2, m_height / 2 - h, &m_pageTo, m_width - w, 0, w, h );
+ bitBlt( m_dst, m_width / 2 - w, m_height / 2, &m_pageTo, 0, m_height - h, w, h );
+ bitBlt( m_dst, m_width / 2, m_height / 2, &m_pageTo, m_width - w, m_height - h, w, h );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectInterlockingHorizontal1() const
+{
+ int w = m_effectStep * m_stepWidth;
+
+ bool finished = false;
+ if ( w >= m_width )
+ {
+ w = m_width;
+ finished = true;
+ }
+
+ int h = m_height / 4;
+
+ bitBlt( m_dst, w, 0, &m_pageTo, w, 0, m_stepWidth, h );
+ bitBlt( m_dst, m_width - w - m_stepWidth, h, &m_pageTo, m_width - w - m_stepWidth, h, m_stepWidth, h );
+ bitBlt( m_dst, w, 2 * h, &m_pageTo, w, 2 * h, m_stepWidth, h );
+ bitBlt( m_dst, m_width - w - m_stepWidth, 3 * h, &m_pageTo, m_width - w - m_stepWidth, 3 * h, m_stepWidth, m_height - 3 * h );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectInterlockingHorizontal2() const
+{
+ int w = m_effectStep * m_stepWidth;
+
+ bool finished = false;
+ if ( w >= m_width )
+ {
+ w = m_width;
+ finished = true;
+ }
+
+ int h = m_height / 4;
+
+ bitBlt( m_dst, m_width - w - m_stepWidth, 0, &m_pageTo, m_width - w - m_stepWidth, 0, m_stepWidth, h );
+ bitBlt( m_dst, w, h, &m_pageTo, w, h, m_stepWidth, h );
+ bitBlt( m_dst, m_width - w - m_stepWidth, 2 * h, &m_pageTo, m_width - w - m_stepWidth, 2 * h, m_stepWidth, h );
+ bitBlt( m_dst, w, 3 * h, &m_pageTo, w, 3 * h, m_stepWidth, h );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectInterlockingVertical1() const
+{
+ int h = m_effectStep * m_stepHeight;
+
+ bool finished = false;
+ if ( h >= m_height )
+ {
+ h = m_height;
+ finished = true;
+ }
+
+ int w = m_width / 4;
+
+ bitBlt( m_dst, 0, h, &m_pageTo, 0, h, w, m_stepHeight );
+ bitBlt( m_dst, w, m_height - h - m_stepHeight, &m_pageTo, w, m_height - h - m_stepHeight, w, m_stepHeight );
+ bitBlt( m_dst, 2 * w, h, &m_pageTo, 2 * w, h, w, m_stepHeight );
+ bitBlt( m_dst, 3 * w, m_height - h - m_stepHeight, &m_pageTo, 3 * w, m_height - h - m_stepHeight, w, m_stepHeight );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectInterlockingVertical2() const
+{
+ int h = m_effectStep * m_stepHeight;
+
+ bool finished = false;
+ if ( h >= m_height )
+ {
+ h = m_height;
+ finished = true;
+ }
+
+ int w = m_width / 4;
+
+ bitBlt( m_dst, 0, m_height - h - m_stepHeight, &m_pageTo, 0, m_height - h - m_stepHeight, w, m_stepHeight );
+ bitBlt( m_dst, w, h, &m_pageTo, w, h, w, m_stepHeight );
+ bitBlt( m_dst, 2 * w, m_height - h - m_stepHeight, &m_pageTo, 2 * w, m_height - h - m_stepHeight, w, m_stepHeight );
+ bitBlt( m_dst, 3 * w, h, &m_pageTo, 3 * w, h, w, m_stepHeight );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectSurround1() const
+{
+ int div[] = { 20, 15, 10 };
+ int stepSize = m_height / div[m_speed];
+ int step = m_effectStep * stepSize;
+
+ int h = m_height / 10;
+ int w = m_width / 10;
+ int repaint_h = h;
+ int repaint_w = w;
+
+ bool finished = false;
+ bool repaint= false;
+ int rh = 0;
+ int rw = 0;
+ int repaint_rh = 0;
+ int repaint_rw = 0;
+
+ // 1
+ if ( step < m_height )
+ {
+ rh = step;
+ rw = 0;
+ h = stepSize;
+ if ( step + stepSize >= m_height )
+ {
+ repaint = true;
+
+ repaint_rh = m_height - repaint_h;
+ repaint_rw = step - m_height + repaint_w;
+ repaint_w = stepSize;
+ }
+ }
+ // 2
+ else if ( step < m_height + m_width - w )
+ {
+ rh = m_height - h;
+ rw = step - m_height + w;
+ w = stepSize;
+ if ( step + stepSize >= m_height + m_width - repaint_w )
+ {
+ repaint = true;
+
+ repaint_rh = m_height - ( step - m_height + repaint_h - m_width + repaint_w + stepSize );
+ repaint_rw = m_width - repaint_w;
+ repaint_h = stepSize;
+ }
+ }
+ // 3
+ else if ( step < 2 * m_height - h + m_width - w )
+ {
+ rh = m_height - ( step - m_height + h - m_width + w + stepSize );
+ rw = m_width - w;
+ h = stepSize;
+ if ( step + stepSize >= 2 * m_height - repaint_h + m_width - repaint_w )
+ {
+ repaint = true;
+
+ repaint_rh = 0;
+ repaint_rw = m_width - ( step - 2 * m_height + repaint_h - m_width + 2 * repaint_w + stepSize );
+ repaint_w = stepSize;
+ }
+ }
+ // 4
+ else if ( step < 2 * m_height - h + 2 * m_width - 3 * w )
+ {
+ rh = 0;
+ rw = m_width - ( step - 2 * m_height + h - m_width + 2 * w + stepSize );
+ w = stepSize;
+ if ( step + stepSize >= 2 * m_height - repaint_h + 2 * m_width - 3 * repaint_w )
+ {
+ repaint = true;
+
+ repaint_rh = step - 2 * m_height + 2 * repaint_h - 2 * m_width + 3 * repaint_w;
+ repaint_rw = repaint_w;
+ repaint_h = stepSize;
+ }
+ }
+ // 5
+ else if ( step < 3 * m_height - 3 * h + 2 * m_width - 3 * w )
+ {
+ rh = step - 2 * m_height + 2 * h - 2 * m_width + 3 * w;
+ rw = w;
+ h = stepSize;
+ if ( step + stepSize >= 3 * m_height - 3 * repaint_h + 2 * m_width - 3 * repaint_w )
+ {
+ repaint = true;
+
+ repaint_rh = m_height - 2 * repaint_h;
+ repaint_rw = step - 3 * m_height + 3 * repaint_h - 2 * m_width + 5 * repaint_w;
+ repaint_w = stepSize;
+ }
+ }
+ // 6
+ else if ( step < 3 * m_height - 3 * h + 3 * m_width - 6 * w )
+ {
+ rh = m_height - 2 * h;
+ rw = step - 3 * m_height + 3 * h - 2 * m_width + 5 * w;
+ w = stepSize;
+ if ( step + stepSize >= 3 * m_height - 3 * repaint_h + 3 * m_width - 6 * repaint_w )
+ {
+ repaint = true;
+
+ repaint_rh = m_height - ( step - 3 * m_height + 5 * repaint_h - 3 * m_width + 6 * repaint_w + stepSize );
+ repaint_rw = m_width - 2 * repaint_w;
+ repaint_h = stepSize;
+ }
+ }
+ // 7
+ else if ( step < 4 * m_height - 6 * h + 3 * m_width - 6 * w )
+ {
+ rh = m_height - ( step - 3 * m_height + 5 * h - 3 * m_width + 6 * w + stepSize );
+ rw = m_width - 2 * w;
+ h = stepSize;
+ if ( step + stepSize >= 4 * m_height - 6 * repaint_h + 3 * m_width - 6 * repaint_w )
+ {
+ repaint = true;
+
+ repaint_rh = repaint_h;
+ repaint_rw = m_width - ( step - 4 * m_height + 6 * repaint_h - 3 * m_width + 8 * repaint_w + stepSize );
+ repaint_w = stepSize;
+ }
+ }
+ // 8
+ else if ( step < 4 * m_height - 6 * h + 4 * m_width - 10 * w )
+ {
+ rh = h;
+ rw = m_width - ( step - 4 * m_height + 6 * h - 3 * m_width + 8 * w + stepSize );
+ w = stepSize;
+ if ( step + stepSize >= 4 * m_height - 6 * repaint_h + 4 * m_width - 10 * repaint_w )
+ {
+ repaint = true;
+
+ repaint_rh = step - 4 * m_height + 8 * repaint_h - 4 * m_width + 10 * repaint_w;
+ repaint_rw = 2 * repaint_w;
+ repaint_h = stepSize;
+ }
+ }
+ // 9
+ else if ( step < 5 * m_height - 10 * h + 4 * m_width - 10 * w )
+ {
+ rh = step - 4 * m_height + 8 * h - 4 * m_width + 10 * w;
+ rw = 2 * w;
+ h = stepSize;
+ if ( step + stepSize >= 5 * m_height - 10 * repaint_h + 4 * m_width - 10 * repaint_w )
+ {
+ repaint = true;
+
+ repaint_rh = m_height - 3 * repaint_h;
+ repaint_rw = step - 5 * m_height + 10 * repaint_h - 4 * m_width + 13 * repaint_w;
+ repaint_w = stepSize;
+ }
+ }
+ // 10
+ else if ( step < 5 * m_height - 10 * h + 5 * m_width - 15 * w )
+ {
+ rh = m_height - 3 * h;
+ rw = step - 5 * m_height + 10 * h - 4 * m_width + 13 * w;
+ w = stepSize;
+ if ( step + stepSize >= 5 * m_height - 10 * repaint_h + 5 * m_width - 15 * repaint_w )
+ {
+ repaint = true;
+
+ repaint_rh = m_height - ( step - 5 * m_height + 13 * repaint_h - 5 * m_width + 15 * repaint_w + stepSize );
+ repaint_rw = m_width - 3 * repaint_w;
+ repaint_h = stepSize;
+ }
+ }
+ // 11
+ else if ( step < 6 * m_height - 15 * h + 5 * m_width - 15 * w )
+ {
+ rh = m_height - ( step - 5 * m_height + 13 * h - 5 * m_width + 15 * w + stepSize );
+ rw = m_width - 3 * w;
+ h = stepSize;
+ if ( step + stepSize >= 6 * m_height - 15 * repaint_h + 5 * m_width - 15 * repaint_w )
+ {
+ repaint = true;
+
+ repaint_rh = 2 * repaint_h;
+ repaint_rw = m_width - ( step - 6 * m_height + 15 * repaint_h - 5 * m_width + 18 * repaint_w + stepSize );
+ repaint_w = stepSize;
+ }
+ }
+ // 12
+ else if ( step < 6 * m_height - 15 * h + 6 * m_width - 21 * w )
+ {
+ rh = 2 * h;
+ rw = m_width - ( step - 6 * m_height + 15 * h - 5 * m_width + 18 * w + stepSize );
+ w = stepSize;
+ if ( step + stepSize >= 6 * m_height - 15 * repaint_h + 6 * m_width - 21 * repaint_w )
+ {
+ repaint = true;
+
+ repaint_rh = step - 6 * m_height + 18 * repaint_h - 6 * m_width + 21 * repaint_w;
+ repaint_rw = 3 * repaint_w;
+ repaint_h = stepSize;
+ }
+ }
+ // 13
+ else if ( step < 7 * m_height - 21 * h + 6 * m_width - 21 * w )
+ {
+ rh = step - 6 * m_height + 18 * h - 6 * m_width + 21 * w;
+ rw = 3 * w;
+ h = stepSize;
+ if ( step + stepSize >= 7 * m_height - 21 * repaint_h + 6 * m_width - 21 * repaint_w )
+ {
+ repaint = true;
+
+ repaint_rh = m_height - 4 * repaint_h;
+ repaint_rw = step - 7 * m_height + 21 * repaint_h - 6 * m_width + 25 * repaint_w;
+ repaint_w = stepSize;
+ }
+ }
+ // 14
+ else if ( step < 7 * m_height - 21 * h + 7 * m_width - 28 * w )
+ {
+ rh = m_height - 4 * h;
+ rw = step - 7 * m_height + 21 * h - 6 * m_width + 25 * w;
+ w = stepSize;
+ if ( step + stepSize >= 7 * m_height - 21 * repaint_h + 7 * m_width - 28 * repaint_w )
+ {
+ repaint = true;
+
+ repaint_rh = m_height - ( step - 7 * m_height + 25 * repaint_h - 7 * m_width + 28 * repaint_w + stepSize );
+ repaint_rw = m_width - 4 * repaint_w;
+ repaint_h = stepSize;
+ }
+ }
+ // 15
+ else if ( step < 8 * m_height - 28 * h + 7 * m_width - 28 * w )
+ {
+ rh = m_height - ( step - 7 * m_height + 25 * h - 7 * m_width + 28 * w + stepSize );
+ rw = m_width - 4 * w;
+ h = stepSize;
+ if ( step + stepSize >= 8 * m_height - 28 * repaint_h + 7 * m_width - 28 * repaint_w )
+ {
+ repaint = true;
+
+ repaint_rh = 3 * repaint_h;
+ repaint_rw = m_width - ( step - 8 * m_height + 28 * repaint_h - 7 * m_width + 32 * repaint_w + stepSize );
+ repaint_w = stepSize;
+ }
+ }
+ // 16
+ else if ( step < 8 * m_height - 28 * h + 8 * m_width - 36 * w )
+ {
+ rh = 3 * h;
+ rw = m_width - ( step - 8 * m_height + 28 * h - 7 * m_width + 32 * w + stepSize );
+ w = stepSize;
+ if ( step + stepSize >= 8 * m_height - 28 * repaint_h + 8 * m_width - 36 * repaint_w )
+ {
+ repaint = true;
+
+ repaint_rh = step - 8 * m_height + 32 * repaint_h - 8 * m_width + 36 * repaint_w;
+ repaint_rw = 4 * repaint_w;
+ repaint_h = stepSize;
+ }
+ }
+ // 17
+ else if ( step < 9 * m_height - 36 * h + 8 * m_width - 36 * w )
+ {
+ rh = step - 8 * m_height + 32 * h - 8 * m_width + 36 * w;
+ rw = 4 * w;
+ h = stepSize;
+ if ( step + stepSize >= 9 * m_height - 36 * repaint_h + 8 * m_width - 36 * repaint_w )
+ {
+ repaint = true;
+
+ repaint_rh = m_height - 5 * repaint_h;
+ repaint_rw = step - 9 * m_height + 36 * repaint_h - 8 * m_width + 41 * repaint_w;
+ repaint_w = stepSize;
+ }
+ }
+ // 18
+ else if ( step < 9 * m_height - 36 * h + 9 * m_width - 45 * w )
+ {
+ rh = m_height - 5 * h;
+ rw = step - 9 * m_height + 36 * h - 8 * m_width + 41 * w;
+ w = stepSize;
+ if ( step + stepSize >= 9 * m_height - 36 * repaint_h + 9 * m_width - 45 * repaint_w )
+ {
+ repaint = true;
+
+ repaint_rh = m_height - ( step - 9 * m_height + 41 * repaint_h - 9 * m_width + 45 * repaint_w + stepSize );
+ repaint_rw = m_width - 5 * repaint_w;
+ repaint_h = stepSize;
+ }
+ }
+ // 19
+ else if ( step < 10 * m_height - 45 * h + 9 * m_width - 45 * w )
+ {
+ rh = m_height - ( step - 9 * m_height + 41 * h - 9 * m_width + 45 * w + stepSize );
+ rw = m_width - 5 * w;
+ h = stepSize;
+ }
+ // 20
+ /*else if ( step < 8 * m_height - 28 * h + 8 * m_width - 36 * w )
+ {
+ rh = 3 * h;
+ rw = m_width - ( step - 8 * m_height + 28 * h - 7 * m_width + 32 * w + stepSize );
+ w = stepSize;
+ }*/
+ else
+ {
+ finished = true;
+ }
+
+ bitBlt( m_dst, rw, rh, &m_pageTo, rw, rh, w, h );
+
+ if ( repaint )
+ {
+ bitBlt( m_dst, repaint_rw, repaint_rh, &m_pageTo, repaint_rw, repaint_rh, repaint_w, repaint_h );
+ }
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectFlyAway1()
+{
+ bool finished = false;
+ int steps[] = { 20, 15, 10 };
+ int pSteps = steps[m_speed];
+
+ if ( m_effectStep == 0 )
+ {
+ bitBlt( &m_pageFrom, 0, 0, m_dst );
+ m_list.append( m_width );
+ m_list.append( m_height );
+ m_list.append( 0 );
+ m_list.append( 0 );
+ }
+ else if ( m_effectStep <= pSteps )
+ {
+ double dw = 1.0 - 83.0 / 100.0 * m_effectStep / (double)pSteps;
+
+ QWMatrix m;
+ m.scale( dw, dw );
+ QPixmap pix( m_pageFrom.xForm( m ) );
+
+ if ( m_effectStep == pSteps )
+ m_pageFrom = pix;
+
+ int w = pix.width();
+ int h = pix.height();
+ int x = ( m_width - w ) / 2;
+ int y = ( m_height - h ) / 2;
+
+ int ow = *(m_list.at(0));
+ int oh = *(m_list.at(1));
+ int ox = *(m_list.at(2));
+ int oy = *(m_list.at(3));
+
+ bitBlt( m_dst, x, y, &pix, 0, 0 , w, h );
+ // top
+ bitBlt( m_dst, ox, oy, &m_pageTo, ox, oy, ow, y - oy );
+ // left
+ bitBlt( m_dst, ox, y, &m_pageTo, ox, y, x - ox, h );
+ // right
+ bitBlt( m_dst, x + w, y, &m_pageTo, x + w, y, ( ow - w + 1 ) / 2, h );
+ // bottom
+ bitBlt( m_dst, ox, y + h, &m_pageTo, ox, y + h, ow, ( oh - h + 1 ) / 2 );
+
+ *(m_list.at(0)) = w;
+ *(m_list.at(1)) = h;
+ *(m_list.at(2)) = x;
+ *(m_list.at(3)) = y;
+ }
+ else if ( m_effectStep <= 2 * pSteps )
+ {
+ int w = m_pageFrom.width();
+ int h = m_pageFrom.height();
+ int x = ( m_width - w ) / 2;
+ int y = ( m_height - h ) / 2 - ( m_height - h ) / 2 * ( m_effectStep - pSteps ) / pSteps;
+
+ int oy = *(m_list.at(3));
+
+ bitBlt( m_dst, x, y, &m_pageFrom, 0, 0 , w, h );
+ bitBlt( m_dst, x, y + h, &m_pageTo, x, y + h, w, oy - y);
+
+ *(m_list.at(3)) = y;
+ }
+ else if ( m_effectStep <= 3 * pSteps )
+ {
+ int w = m_pageFrom.width();
+ int h = m_pageFrom.height();
+ int x = ( m_width - w ) / 2 - ( m_width - w ) / 2 * ( m_effectStep - 2 * pSteps ) / pSteps;
+ int y = ( m_height - h ) / 2 * ( m_effectStep - 2 * pSteps ) / pSteps;
+
+ int ox = *(m_list.at(2));
+ int oy = *(m_list.at(3));
+
+ bitBlt( m_dst, x, y, &m_pageFrom, 0, 0 , w, h );
+ bitBlt( m_dst, ox, oy, &m_pageTo, ox, oy, w, y - oy);
+ bitBlt( m_dst, x + w, oy, &m_pageTo, x + w, oy, x - ox, h );
+
+ *(m_list.at(2)) = x;
+ *(m_list.at(3)) = y;
+ }
+ else
+ {
+ int w = m_pageFrom.width();
+ int h = m_pageFrom.height();
+ int x = ( m_width - w ) / 2 * ( m_effectStep - 3 * pSteps ) / pSteps;
+ int y = ( m_height - h ) / 2 * ( m_effectStep - 2 * pSteps ) / pSteps;
+
+ int ox = *(m_list.at(2));
+ int oy = *(m_list.at(3));
+
+ bitBlt( m_dst, x, y, &m_pageFrom, 0, 0 , w, h );
+ bitBlt( m_dst, ox, oy, &m_pageTo, ox, oy, w, y - oy);
+ bitBlt( m_dst, ox, oy, &m_pageTo, ox, oy, x - ox, h );
+
+ if ( x >= m_height )
+ {
+ finished = true;
+ }
+ else
+ {
+ *(m_list.at(2)) = x;
+ *(m_list.at(3)) = y;
+ }
+ }
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectBlindsHorizontal() const
+{
+ int h = m_effectStep * m_stepHeight;
+ int blockSize = m_height / 8;
+
+ bool finished = false;
+ if ( h >= blockSize )
+ {
+ h = blockSize;
+ finished = true;
+ }
+
+ for ( int i=0; i < m_height; i += blockSize )
+ bitBlt( m_dst, 0, h + i, &m_pageTo, 0, h + i, m_width, m_stepHeight );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectBlindsVertical() const
+{
+ int w = m_effectStep * m_stepWidth;
+ int blockSize = m_width / 8;
+
+ bool finished = false;
+ if ( w >= blockSize )
+ {
+ w = blockSize;
+ finished = true;
+ }
+
+ for ( int i=0; i < m_width; i += blockSize )
+ bitBlt( m_dst, w + i, 0, &m_pageTo, w + i, 0, m_stepWidth, m_height );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectBoxIn() const
+{
+ double fact = (double) m_height / (double) m_width;
+ int h = (int)( m_effectStep * m_stepWidth * fact );
+ int stepHeight = (int)( ( m_effectStep + 1 ) * m_stepWidth * fact - h );
+ int w = m_effectStep * m_stepWidth;
+
+ bool finished = false;
+ if ( h >= m_height / 2 )
+ {
+ h = m_height / 2;
+ }
+ if ( w >= m_width / 2 )
+ {
+ w = m_width / 2;
+ }
+ if ( h >= m_height / 2 && w >= m_width / 2 )
+ {
+ finished = true;
+ }
+
+ // top
+ bitBlt( m_dst, w, h, &m_pageTo, w, h, m_width - 2 * w, stepHeight );
+ // left
+ bitBlt( m_dst, w, h, &m_pageTo, w, h, m_stepWidth, m_height - 2 * h );
+ //right
+ bitBlt( m_dst, m_width - w, h, &m_pageTo, m_width - w, h, m_stepWidth, m_height - 2 * h );
+ // bottom
+ bitBlt( m_dst, w, m_height - h - stepHeight, &m_pageTo, w, m_height - h - stepHeight, m_width - 2 * w, stepHeight );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectBoxOut() const
+{
+ double fact = (double) m_height / (double) m_width;
+ int h = (int)( m_effectStep * m_stepWidth * fact );
+ int stepHeight = (int)( ( m_effectStep + 1 ) * m_stepWidth * fact - h );
+ int w = m_effectStep * m_stepWidth;
+
+ bool finished = false;
+ if ( h >= m_height / 2 )
+ {
+ h = m_height / 2;
+ }
+ if ( w >= m_width / 2 )
+ {
+ w = m_width / 2;
+ }
+ if ( h >= m_height / 2 && w >= m_width / 2 )
+ {
+ finished = true;
+ }
+
+ bitBlt( m_dst, m_width / 2 - w - m_stepWidth, m_height / 2 - h - stepHeight,
+ &m_pageTo, m_width / 2 - w - m_stepWidth, m_height / 2 - h - stepHeight, 2 * ( w + m_stepWidth ), stepHeight );
+ bitBlt( m_dst, m_width / 2 - w - m_stepWidth, m_height / 2 - h,
+ &m_pageTo, m_width / 2 - w - m_stepWidth, m_height / 2 - h, m_stepWidth, 2 * h );
+ bitBlt( m_dst, m_width / 2 + w, m_height / 2 - h,
+ &m_pageTo, m_width / 2 + w, m_height / 2 - h, m_stepWidth, 2 * h );
+ bitBlt( m_dst, m_width / 2 - w - m_stepWidth, m_height / 2 + h,
+ &m_pageTo, m_width / 2 - w - m_stepWidth, m_height / 2 + h, 2 * ( w + m_stepWidth), stepHeight );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectCheckboardAcross() const
+{
+ int w = m_effectStep * m_stepWidth;
+ int blockSize = m_height / 8;
+
+ bool finished = false;
+ if ( w >= blockSize * 2 )
+ {
+ w = blockSize * 2;
+ finished = true;
+ }
+
+ for ( int y = 0; y < m_height; y += blockSize )
+ {
+ int x = ( ( y / blockSize ) & 1 ) * blockSize;
+
+ if ( x == blockSize && w >= blockSize - m_stepWidth )
+ bitBlt( m_dst, w - blockSize, y, &m_pageTo, w - blockSize, y, m_stepWidth, blockSize );
+
+ for ( ; x < m_width; x += 2 * blockSize )
+ {
+ bitBlt( m_dst, x + w, y, &m_pageTo, x + w, y, m_stepWidth, blockSize );
+ }
+ }
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectCheckboardDown() const
+{
+ int h = m_effectStep * m_stepHeight;
+ int blockSize = m_height / 8;
+
+ bool finished = false;
+ if ( h >= blockSize * 2 )
+ {
+ h = blockSize * 2;
+ finished = true;
+ }
+
+ for ( int x = 0; x < m_width; x += blockSize )
+ {
+ int y = ( ( x / blockSize ) & 1 ) * blockSize;
+
+ if ( y == blockSize && h >= blockSize - m_stepHeight )
+ bitBlt( m_dst, x, h - blockSize, &m_pageTo, x, h - blockSize, blockSize, m_stepHeight );
+
+ for ( ; y < m_width; y += 2 * blockSize )
+ {
+ bitBlt( m_dst, x, y + h, &m_pageTo, x, y + h, blockSize, m_stepHeight );
+ }
+ }
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectCoverDown() const
+{
+ int h = m_effectStep * m_stepHeight;
+
+ bool finished = false;
+ if ( h >= m_height )
+ {
+ h = m_height;
+ finished = true;
+ }
+
+ bitBlt( m_dst, 0, 0, &m_pageTo, 0, m_height - h, m_width, h );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectUncoverDown() const
+{
+ int h = m_effectStep * m_stepHeight;
+
+ bool finished = false;
+ if ( h >= m_height )
+ {
+ h = m_height;
+ finished = true;
+ }
+
+ bitBlt( m_dst, 0, h + m_stepHeight, m_dst, 0, h, m_width, m_height - h - m_stepHeight );
+ bitBlt( m_dst, 0, h, &m_pageTo, 0, h, m_width, m_stepHeight );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectCoverUp() const
+{
+ int h = m_effectStep * m_stepHeight;
+
+ bool finished = false;
+ if ( h >= m_height )
+ {
+ h = m_height;
+ finished = true;
+ }
+
+ bitBlt( m_dst, 0, m_height - h, &m_pageTo, 0, 0, m_width, h );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectUncoverUp()
+{
+ if ( m_effectStep == 0 )
+ bitBlt( &m_pageFrom, 0, 0, m_dst );
+
+ int h = m_effectStep * m_stepHeight;
+
+ bool finished = false;
+ if ( h >= m_height )
+ {
+ h = m_height;
+ finished = true;
+ }
+
+ bitBlt( m_dst, 0, 0, &m_pageFrom, 0, h + m_stepHeight, m_width, m_height - h - m_stepHeight );
+ bitBlt( m_dst, 0, m_height - h - m_stepHeight, &m_pageTo, 0, m_height - h - m_stepHeight, m_width, m_stepHeight );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectCoverLeft() const
+{
+ int w = m_effectStep * m_stepHeight;
+
+ bool finished = false;
+ if ( w >= m_width )
+ {
+ w = m_width;
+ finished = true;
+ }
+
+ bitBlt( m_dst, m_width - w, 0, &m_pageTo, 0, 0, w, m_height );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectUncoverLeft()
+{
+ if ( m_effectStep == 0 )
+ bitBlt( &m_pageFrom, 0, 0, m_dst );
+
+ int w = m_effectStep * m_stepWidth;
+
+ bool finished = false;
+ if ( w >= m_width )
+ {
+ w = m_width;
+ finished = true;
+ }
+
+ bitBlt( m_dst, 0, 0, &m_pageFrom, w + m_stepWidth, 0, m_width - w - m_stepWidth, m_height );
+ bitBlt( m_dst, m_width - w - m_stepWidth, 0, &m_pageTo, m_width - w - m_stepWidth, 0, m_stepWidth, m_height );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectCoverRight() const
+{
+ int w = m_effectStep * m_stepWidth;
+
+ bool finished = false;
+ if ( w >= m_width )
+ {
+ w = m_width;
+ finished = true;
+ }
+
+ bitBlt( m_dst, 0, 0, &m_pageTo, m_width - w, 0, w, m_height );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectUncoverRight()
+{
+ if ( m_effectStep == 0 )
+ bitBlt( &m_pageFrom, 0, 0, m_dst );
+
+ int w = m_effectStep * m_stepWidth;
+
+ bool finished = false;
+ if ( w >= m_width )
+ {
+ w = m_width;
+ finished = true;
+ }
+
+ bitBlt( m_dst, w + m_stepWidth, 0, &m_pageFrom, 0, 0, m_width - w - m_stepWidth, m_height );
+ bitBlt( m_dst, w, 0, &m_pageTo, w, 0, m_stepWidth, m_height );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectCoverLeftUp() const
+{
+ double fact = (double) m_height / (double) m_width;
+ int h = (int)( m_effectStep * m_stepWidth * fact );
+ int w = m_effectStep * m_stepWidth;
+
+ bool finished = false;
+ if ( h >= m_height )
+ {
+ h = m_height;
+ }
+ if ( w >= m_width )
+ {
+ w = m_width;
+ }
+ if ( h >= m_height && w >= m_width )
+ {
+ finished = true;
+ }
+
+ bitBlt( m_dst, m_width - w, m_height - h, &m_pageTo, 0, 0, w, h );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectUncoverLeftUp()
+{
+ if ( m_effectStep == 0 )
+ bitBlt( &m_pageFrom, 0, 0, m_dst );
+
+ double fact = (double) m_height / (double) m_width;
+ int h = (int)( m_effectStep * m_stepWidth * fact );
+ int w = m_effectStep * m_stepWidth;
+
+ bool finished = false;
+ if ( h >= m_height )
+ {
+ h = m_height;
+ }
+ if ( w >= m_width )
+ {
+ w = m_width;
+ }
+ if ( h >= m_height && w >= m_width )
+ {
+ finished = true;
+ }
+
+ // fix only copy what is nesseccary
+ bitBlt( m_dst, 0, 0, &m_pageFrom, w, h, m_width - w, m_height - h );
+ bitBlt( m_dst, m_width - w, 0, &m_pageTo, m_width - w, 0, w, m_height );
+ bitBlt( m_dst, 0, m_height - h, &m_pageTo, 0, m_height - h, m_width, h );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectCoverLeftDown() const
+{
+ double fact = (double) m_height / (double) m_width;
+ int h = (int)( m_effectStep * m_stepWidth * fact );
+ int w = m_effectStep * m_stepWidth;
+
+ bool finished = false;
+ if ( h >= m_height )
+ {
+ h = m_height;
+ }
+ if ( w >= m_width )
+ {
+ w = m_width;
+ }
+ if ( h >= m_height && w >= m_width )
+ {
+ finished = true;
+ }
+
+ bitBlt( m_dst, m_width - w, 0, &m_pageTo, 0, m_height - h, w, h );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectUncoverLeftDown()
+{
+ if ( m_effectStep == 0 )
+ bitBlt( &m_pageFrom, 0, 0, m_dst );
+
+ double fact = (double) m_height / (double) m_width;
+ int h = (int)( m_effectStep * m_stepWidth * fact );
+ int w = m_effectStep * m_stepWidth;
+
+ bool finished = false;
+ if ( h >= m_height )
+ {
+ h = m_height;
+ }
+ if ( w >= m_width )
+ {
+ w = m_width;
+ }
+ if ( h >= m_height && w >= m_width )
+ {
+ finished = true;
+ }
+
+ // fix only copy what is nesseccary
+ bitBlt( m_dst, 0, h, &m_pageFrom, w, 0, m_width - w, m_height - h );
+ bitBlt( m_dst, 0, 0, &m_pageTo, 0, 0, m_width, h );
+ bitBlt( m_dst, m_width - w, h, &m_pageTo, m_width - w, h, w, m_height - h );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectCoverRightUp() const
+{
+ double fact = (double) m_height / (double) m_width;
+ int h = (int)( m_effectStep * m_stepWidth * fact );
+ int w = m_effectStep * m_stepWidth;
+
+ bool finished = false;
+ if ( h >= m_height )
+ {
+ h = m_height;
+ }
+ if ( w >= m_width )
+ {
+ w = m_width;
+ }
+ if ( h >= m_height && w >= m_width )
+ {
+ finished = true;
+ }
+
+ bitBlt( m_dst, 0, m_height - h, &m_pageTo, m_width - w, 0, w, h );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectUncoverRightUp()
+{
+ if ( m_effectStep == 0 )
+ bitBlt( &m_pageFrom, 0, 0, m_dst );
+
+ double fact = (double) m_height / (double) m_width;
+ int h = (int)( m_effectStep * m_stepWidth * fact );
+ int w = m_effectStep * m_stepWidth;
+
+ bool finished = false;
+ if ( h >= m_height )
+ {
+ h = m_height;
+ }
+ if ( w >= m_width )
+ {
+ w = m_width;
+ }
+ if ( h >= m_height && w >= m_width )
+ {
+ finished = true;
+ }
+ // only draw what nesseccary
+ bitBlt( m_dst, w, 0, &m_pageFrom, 0, h, m_width - w, m_height - h );
+ bitBlt( m_dst, 0, 0, &m_pageTo, 0, 0, w, m_height );
+ bitBlt( m_dst, w, m_height - h, &m_pageTo, w, m_height - h, m_width - w, h );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectCoverRightDown() const
+{
+ double fact = (double) m_height / (double) m_width;
+ int h = (int)( m_effectStep * m_stepWidth * fact );
+ int w = m_effectStep * m_stepWidth;
+
+ bool finished = false;
+ if ( h >= m_height )
+ {
+ h = m_height;
+ }
+ if ( w >= m_width )
+ {
+ w = m_width;
+ }
+ if ( h >= m_height && w >= m_width )
+ {
+ finished = true;
+ }
+
+ bitBlt( m_dst, 0, 0, &m_pageTo, m_width - w, m_height - h, w, h );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectUncoverRightDown()
+{
+ if ( m_effectStep == 0 )
+ bitBlt( &m_pageFrom, 0, 0, m_dst );
+
+ double fact = (double) m_height / (double) m_width;
+ int h = (int)( m_effectStep * m_stepWidth * fact );
+ int w = m_effectStep * m_stepWidth;
+
+ bool finished = false;
+ if ( h >= m_height )
+ {
+ h = m_height;
+ }
+ if ( w >= m_width )
+ {
+ w = m_width;
+ }
+ if ( h >= m_height && w >= m_width )
+ {
+ finished = true;
+ }
+ // only draw what nesseccary
+ bitBlt( m_dst, w, h, &m_pageFrom, 0, 0, m_width - w, m_height - h );
+ bitBlt( m_dst, 0, 0, &m_pageTo, 0, 0, m_width, h );
+ bitBlt( m_dst, 0, h, &m_pageTo, 0, h, w, m_height - h );
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectDissolve()
+{
+ KRandomSequence random;
+
+ int blockSize = m_height / 32; // small enough
+ int rowno = ( m_height + blockSize - 1 ) / blockSize;
+ int colno = ( m_width + blockSize - 1 ) / blockSize;
+ int cellno = rowno * colno;
+
+ if ( m_effectStep == 0 )
+ {
+ for( int c = 0; c < cellno; c++ )
+ m_list.append( c );
+ }
+
+ int steps[] = { 30, 60, 90 };
+ int dissove = steps[m_speed];
+ while ( !m_list.isEmpty() && dissove > 0 )
+ {
+ --dissove;
+
+ int index = random.getLong( m_list.count() );
+ QValueListIterator<int> it = m_list.at( index );
+
+ unsigned int x = ( *it % colno ) * blockSize;
+ unsigned int y = ( *it / colno ) * blockSize;
+
+ m_list.remove( it );
+
+ bitBlt( m_dst, x, y, &m_pageTo, x, y, blockSize, blockSize );
+ }
+
+ return m_list.isEmpty();
+}
+
+
+bool KPrPageEffects::effectStripesLeftUp() const
+{
+ int wSteps = m_width / m_stepWidth + 1;
+ int hSteps = m_height / m_stepWidth + 1;
+
+ int xStart = m_effectStep < wSteps ? m_effectStep : wSteps;
+ int xStop = 1 > m_effectStep - hSteps + 1 ? 1 : m_effectStep - hSteps + 1;
+
+ bool finished = false;
+ if ( m_effectStep >= wSteps + hSteps )
+ {
+ finished = true;
+ }
+
+ int y = m_effectStep - wSteps + 1 > 1 ? m_effectStep - wSteps + 1 : 1;
+
+ for ( int x = xStart; x >= xStop; --x )
+ {
+ bitBlt( m_dst, m_width - x * m_stepWidth, m_height - y * m_stepWidth,
+ &m_pageTo, m_width - x * m_stepWidth, m_height - y * m_stepWidth , m_stepWidth, m_stepWidth );
+ ++y;
+ }
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectStripesLeftDown() const
+{
+ int wSteps = m_width / m_stepWidth + 1;
+ int hSteps = m_height / m_stepWidth + 1;
+
+ int xStart = m_effectStep < wSteps ? m_effectStep : wSteps;
+ int xStop = 1 > m_effectStep - hSteps + 1 ? 1 : m_effectStep - hSteps + 1;
+
+ bool finished = false;
+ if ( m_effectStep >= wSteps + hSteps )
+ {
+ finished = true;
+ }
+
+ int y = m_effectStep - wSteps + 1 > 1 ? m_effectStep - wSteps + 1 : 1;
+
+ for ( int x = xStart; x >= xStop; --x )
+ {
+ bitBlt( m_dst, m_width - x * m_stepWidth, ( y - 1 ) * m_stepWidth,
+ &m_pageTo, m_width - x * m_stepWidth, ( y - 1 ) * m_stepWidth , m_stepWidth, m_stepWidth );
+ ++y;
+ }
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectStripesRightUp() const
+{
+ int wSteps = m_width / m_stepWidth + 1;
+ int hSteps = m_height / m_stepWidth + 1;
+
+ int xStart = m_effectStep < wSteps ? m_effectStep : wSteps;
+ int xStop = 1 > m_effectStep - hSteps + 1 ? 1 : m_effectStep - hSteps + 1;
+
+ bool finished = false;
+ if ( m_effectStep >= wSteps + hSteps )
+ {
+ finished = true;
+ }
+
+ int y = m_effectStep - wSteps + 1 > 1 ? m_effectStep - wSteps + 1 : 1;
+
+ for ( int x = xStart; x >= xStop; --x )
+ {
+ bitBlt( m_dst, ( x - 1 ) * m_stepWidth, m_height - y * m_stepWidth,
+ &m_pageTo, ( x - 1 ) * m_stepWidth, m_height - y * m_stepWidth , m_stepWidth, m_stepWidth );
+ ++y;
+ }
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectStripesRigthDown() const
+{
+ int wSteps = m_width / m_stepWidth + 1;
+ int hSteps = m_height / m_stepWidth + 1;
+
+ int xStart = m_effectStep < wSteps ? m_effectStep : wSteps;
+ int xStop = 1 > m_effectStep - hSteps + 1 ? 1 : m_effectStep - hSteps + 1;
+
+ bool finished = false;
+ if ( m_effectStep >= wSteps + hSteps )
+ {
+ finished = true;
+ }
+
+ int y = m_effectStep - wSteps + 1 > 1 ? m_effectStep - wSteps + 1 : 1;
+
+ for ( int x = xStart; x >= xStop; --x )
+ {
+ bitBlt( m_dst, ( x - 1 ) * m_stepWidth, ( y - 1 ) * m_stepWidth,
+ &m_pageTo, ( x - 1 ) * m_stepWidth, ( y - 1 ) * m_stepWidth , m_stepWidth, m_stepWidth );
+ ++y;
+ }
+
+ return finished;
+}
+
+
+bool KPrPageEffects::effectMelting()
+{
+ int count = 32;
+ int max_melt = 2 * m_stepHeight;
+
+ if ( m_effectStep == 0 )
+ {
+ bitBlt( &m_pageFrom, 0, 0, m_dst );
+
+ for( int c = 0; c < count; c++ )
+ m_list.append( 0 );
+ }
+
+ int w = ( m_width + count - 1 ) / count;
+
+ QValueListIterator<int> it = m_list.begin();
+
+ int finished = 32;
+ for ( int c = 0; c < count; c++ )
+ {
+ int x = c * w;
+
+ KRandomSequence random;
+ int grow = 1 + random.getLong( max_melt );
+
+ if ( *it + grow >= m_height )
+ {
+ grow = m_height - *it;
+ --finished;
+ }
+
+ if( *it < m_height )
+ {
+ bitBlt( m_dst, x, *it, &m_pageTo, x, *it, w, grow );
+ bitBlt( m_dst, x, *it + grow, &m_pageFrom, x, 0, w, m_height - *it - grow );
+
+ *it += grow;
+ }
+ ++it;
+ }
+
+ return finished == 0;
+}
+
+