1 /* ============================================================
2  *
3  * This file is a part of digiKam project
4  * https://www.digikam.org
5  *
6  * Date        : 2017-05-24
7  * Description : images transition manager.
8  *
9  * Copyright (C) 2017-2021 by Gilles Caulier <caulier dot gilles at gmail dot com>
10  *
11  * This program is free software; you can redistribute it
12  * and/or modify it under the terms of the GNU General
13  * Public License as published by the Free Software Foundation;
14  * either version 2, or (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  * GNU General Public License for more details.
20  *
21  * ============================================================ */
22 
23 #ifndef DIGIKAM_TRANSITION_MNGR_PRIVATE_H
24 #define DIGIKAM_TRANSITION_MNGR_PRIVATE_H
25 
26 // C++ includes
27 
28 #include <cmath>
29 
30 // Qt includes
31 
32 #include <QPainter>
33 #include <QPainterPath>
34 #include <QPolygon>
35 
36 // Local includes
37 
38 #include "transitionmngr.h"
39 #include "digikam_config.h"
40 #include "digikam_debug.h"
41 
42 namespace Digikam
43 {
44 
45 class Q_DECL_HIDDEN TransitionMngr::Private
46 {
47 public:
48 
49     typedef int (TransitionMngr::Private::*TransMethod)(bool);
50 
51 public:
52 
Private()53     explicit Private()
54       : eff_isRunning    (false),
55         eff_curTransition(TransitionMngr::None),
56         eff_x            (0),
57         eff_y            (0),
58         eff_w            (0),
59         eff_h            (0),
60         eff_dx           (0),
61         eff_dy           (0),
62         eff_ix           (0),
63         eff_iy           (0),
64         eff_i            (0),
65         eff_j            (0),
66         eff_subType      (0),
67         eff_x0           (0),
68         eff_y0           (0),
69         eff_x1           (0),
70         eff_y1           (0),
71         eff_wait         (0),
72         eff_fx           (0),
73         eff_fy           (0),
74         eff_alpha        (0),
75         eff_fd           (0),
76         eff_intArray     (nullptr),
77         eff_pdone        (0),
78         eff_pixelMatrix  (nullptr),
79         eff_pa           (QPolygon(4)),
80         eff_px           (0),
81         eff_py           (0),
82         eff_psx          (0),
83         eff_psy          (0)
84     {
85         registerTransitions();
86     }
87 
~Private()88     ~Private()
89     {
90         if (eff_intArray)
91         {
92             delete [] eff_intArray;
93         }
94     }
95 
96     QMap<TransitionMngr::TransType, TransMethod>  eff_transList;
97 
98     QImage                                        eff_inImage;
99     QImage                                        eff_outImage;
100     QImage                                        eff_curFrame;
101     QSize                                         eff_outSize;
102 
103     bool                                          eff_isRunning;
104     TransitionMngr::TransType                     eff_curTransition;
105 
106     // values for state of various transitions:
107     int                                           eff_x;
108     int                                           eff_y;
109     int                                           eff_w;
110     int                                           eff_h;
111     int                                           eff_dx;
112     int                                           eff_dy;
113     int                                           eff_ix;
114     int                                           eff_iy;
115     int                                           eff_i;
116     int                                           eff_j;
117     int                                           eff_subType;
118     int                                           eff_x0;
119     int                                           eff_y0;
120     int                                           eff_x1;
121     int                                           eff_y1;
122     int                                           eff_wait;
123     double                                        eff_fx;
124     double                                        eff_fy;
125     double                                        eff_alpha;
126     double                                        eff_fd;
127     int*                                          eff_intArray;
128     bool                                          eff_pdone;
129     bool**                                        eff_pixelMatrix;
130 
131     //static
132     QPolygon                                      eff_pa;
133 
134     int                                           eff_px;
135     int                                           eff_py;
136     int                                           eff_psx;
137     int                                           eff_psy;
138 
139 public:
140 
141     void registerTransitions();
142 
143     TransitionMngr::TransType getRandomTransition() const;
144 
145 private:
146 
147     // Internal functions to render an effect frame.
148     // aInit is to true when effect is initialized (first call).
149     // The integer value is a tempo in ms to wait between frames,
150     // or -1 if the effect is completed.
151 
152     int transitionNone(bool aInit);
153     int transitionChessboard(bool aInit);
154     int transitionMeltdown(bool aInit);
155     int transitionSweep(bool aInit);
156     int transitionMosaic(bool aInit);
157     int transitionCubism(bool aInit);
158     int transitionRandom(bool aInit);
159     int transitionGrowing(bool aInit);
160     int transitionHorizLines(bool aInit);
161     int transitionVertLines(bool aInit);
162     int transitionMultiCircleOut(bool aInit);
163     int transitionSpiralIn(bool aInit);
164     int transitionCircleOut(bool aInit);
165     int transitionBlobs(bool aInit);
166     int transitionFade(bool aInit);
167     int transitionSlideL2R(bool aInit);
168     int transitionSlideR2L(bool aInit);
169     int transitionSlideT2B(bool aInit);
170     int transitionSlideB2T(bool aInit);
171     int transitionPushL2R(bool aInit);
172     int transitionPushR2L(bool aInit);
173     int transitionPushT2B(bool aInit);
174     int transitionPushB2T(bool aInit);
175     int transitionSwapL2R(bool aInit);
176     int transitionSwapR2L(bool aInit);
177     int transitionSwapT2B(bool aInit);
178     int transitionSwapB2T(bool aInit);
179     int transitionBlurIn(bool aInit);
180     int transitionBlurOut(bool aInit);
181 
182 private:
183 
184     QRgb   convertFromPremult(const QRgb& p)       const;
185     QImage fastBlur(const QImage& img, int radius) const;
186 };
187 
188 } // namespace Digikam
189 
190 #endif // DIGIKAM_TRANSITION_MNGR_PRIVATE_H
191