cd78677fa8bc91455ddb14335e9254847075a7e0
[goodguy/cinelerra.git] / cinelerra-5.1 / plugins / zoomblur / zoomblur.h
1
2 /*
3  * CINELERRA
4  * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  */
21
22 #ifndef ZOOMBLUR_H
23 #define ZOOMBLUR_H
24
25
26 #include "bcdisplayinfo.h"
27 #include "bcsignals.h"
28 #include "clip.h"
29 #include "bchash.h"
30 #include "filexml.h"
31 #include "keyframe.h"
32 #include "language.h"
33 #include "loadbalance.h"
34 #include "pluginvclient.h"
35 #include "theme.h"
36 #include "vframe.h"
37
38 #define RESET_DEFAULT_SETTINGS 10
39 #define RESET_ALL     0
40 #define RESET_XSLIDER 1
41 #define RESET_YSLIDER 2
42 #define RESET_RADIUS  3
43 #define RESET_STEPS   4
44
45 class ZoomBlurMain;
46 class ZoomBlurWindow;
47 class ZoomBlurEngine;
48 class ZoomBlurReset;
49 class ZoomBlurDefaultSettings;
50 class ZoomBlurSliderClr;
51
52
53
54 class ZoomBlurConfig
55 {
56 public:
57         ZoomBlurConfig();
58
59         void reset(int clear);
60         int equivalent(ZoomBlurConfig &that);
61         void copy_from(ZoomBlurConfig &that);
62         void interpolate(ZoomBlurConfig &prev,
63                 ZoomBlurConfig &next,
64                 long prev_frame,
65                 long next_frame,
66                 long current_frame);
67
68         int x;
69         int y;
70         int radius;
71         int steps;
72         int r;
73         int g;
74         int b;
75         int a;
76 };
77
78
79
80 class ZoomBlurSize : public BC_ISlider
81 {
82 public:
83         ZoomBlurSize(ZoomBlurMain *plugin,
84                 int x,
85                 int y,
86                 int *output,
87                 int min,
88                 int max);
89         int handle_event();
90         ZoomBlurMain *plugin;
91         int *output;
92 };
93
94 class ZoomBlurToggle : public BC_CheckBox
95 {
96 public:
97         ZoomBlurToggle(ZoomBlurMain *plugin,
98                 int x,
99                 int y,
100                 int *output,
101                 char *string);
102         int handle_event();
103         ZoomBlurMain *plugin;
104         int *output;
105 };
106
107 class ZoomBlurWindow : public PluginClientWindow
108 {
109 public:
110         ZoomBlurWindow(ZoomBlurMain *plugin);
111         ~ZoomBlurWindow();
112
113         void create_objects();
114         void update_gui(int clear);
115
116         ZoomBlurSize *x, *y, *radius, *steps;
117         ZoomBlurToggle *r, *g, *b, *a;
118         ZoomBlurMain *plugin;
119         ZoomBlurReset *reset;
120         ZoomBlurDefaultSettings *default_settings;
121         ZoomBlurSliderClr *xClr, *yClr, *radiusClr, *stepsClr;
122 };
123
124 class ZoomBlurReset : public BC_GenericButton
125 {
126 public:
127         ZoomBlurReset(ZoomBlurMain *plugin, ZoomBlurWindow *window, int x, int y);
128         ~ZoomBlurReset();
129         int handle_event();
130         ZoomBlurMain *plugin;
131         ZoomBlurWindow *window;
132 };
133
134 class ZoomBlurDefaultSettings : public BC_GenericButton
135 {
136 public:
137         ZoomBlurDefaultSettings(ZoomBlurMain *plugin, ZoomBlurWindow *window, int x, int y, int w);
138         ~ZoomBlurDefaultSettings();
139         int handle_event();
140         ZoomBlurMain *plugin;
141         ZoomBlurWindow *window;
142 };
143
144
145 class ZoomBlurSliderClr : public BC_Button
146 {
147 public:
148         ZoomBlurSliderClr(ZoomBlurMain *plugin, ZoomBlurWindow *window, int x, int y, int w, int clear);
149         ~ZoomBlurSliderClr();
150         int handle_event();
151         ZoomBlurMain *plugin;
152         ZoomBlurWindow *window;
153         int clear;
154 };
155
156
157
158 // Output coords for a layer of blurring
159 // Used for OpenGL only
160 class ZoomBlurLayer
161 {
162 public:
163         ZoomBlurLayer() {};
164         float x1, y1, x2, y2;
165 };
166
167 class ZoomBlurMain : public PluginVClient
168 {
169 public:
170         ZoomBlurMain(PluginServer *server);
171         ~ZoomBlurMain();
172
173         int process_buffer(VFrame *frame,
174                 int64_t start_position,
175                 double frame_rate);
176         int is_realtime();
177         void save_data(KeyFrame *keyframe);
178         void read_data(KeyFrame *keyframe);
179         void update_gui();
180         int handle_opengl();
181
182         PLUGIN_CLASS_MEMBERS(ZoomBlurConfig)
183
184         void delete_tables();
185         VFrame *input, *output, *temp;
186         ZoomBlurEngine *engine;
187         int **scale_y_table;
188         int **scale_x_table;
189         ZoomBlurLayer *layer_table;
190         int table_entries;
191         int need_reconfigure;
192 // The accumulation buffer is needed because 8 bits isn't precise enough
193         unsigned char *accum;
194 };
195
196 class ZoomBlurPackage : public LoadPackage
197 {
198 public:
199         ZoomBlurPackage();
200         int y1, y2;
201 };
202
203 class ZoomBlurUnit : public LoadClient
204 {
205 public:
206         ZoomBlurUnit(ZoomBlurEngine *server, ZoomBlurMain *plugin);
207         void process_package(LoadPackage *package);
208         ZoomBlurEngine *server;
209         ZoomBlurMain *plugin;
210 };
211
212 class ZoomBlurEngine : public LoadServer
213 {
214 public:
215         ZoomBlurEngine(ZoomBlurMain *plugin,
216                 int total_clients,
217                 int total_packages);
218         void init_packages();
219         LoadClient* new_client();
220         LoadPackage* new_package();
221         ZoomBlurMain *plugin;
222 };
223
224
225 #endif