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