update internationalization data
[goodguy/history.git] / cinelerra-5.0 / plugins / bandslide / bandslide.C
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 #include "bandslide.h"
23 #include "bcdisplayinfo.h"
24 #include "bchash.h"
25 #include "edl.inc"
26 #include "filexml.h"
27 #include "language.h"
28 #include "overlayframe.h"
29 #include "vframe.h"
30
31
32 #include <stdint.h>
33 #include <string.h>
34 #include <libintl.h>
35
36
37
38
39
40
41 REGISTER_PLUGIN(BandSlideMain)
42
43
44
45
46
47 BandSlideCount::BandSlideCount(BandSlideMain *plugin, 
48         BandSlideWindow *window,
49         int x,
50         int y)
51  : BC_TumbleTextBox(window, 
52                 (int64_t)plugin->bands,
53                 (int64_t)0,
54                 (int64_t)1000,
55                 x, 
56                 y, 
57                 50)
58 {
59         this->plugin = plugin;
60         this->window = window;
61 }
62
63 int BandSlideCount::handle_event()
64 {
65         plugin->bands = atol(get_text());
66         plugin->send_configure_change();
67         return 0;
68 }
69
70 BandSlideIn::BandSlideIn(BandSlideMain *plugin, 
71         BandSlideWindow *window,
72         int x,
73         int y)
74  : BC_Radial(x, 
75                 y, 
76                 plugin->direction == 0, 
77                 _("In"))
78 {
79         this->plugin = plugin;
80         this->window = window;
81 }
82
83 int BandSlideIn::handle_event()
84 {
85         update(1);
86         plugin->direction = 0;
87         window->out->update(0);
88         plugin->send_configure_change();
89         return 0;
90 }
91
92 BandSlideOut::BandSlideOut(BandSlideMain *plugin, 
93         BandSlideWindow *window,
94         int x,
95         int y)
96  : BC_Radial(x, 
97                 y, 
98                 plugin->direction == 1, 
99                 _("Out"))
100 {
101         this->plugin = plugin;
102         this->window = window;
103 }
104
105 int BandSlideOut::handle_event()
106 {
107         update(1);
108         plugin->direction = 1;
109         window->in->update(0);
110         plugin->send_configure_change();
111         return 0;
112 }
113
114
115
116
117
118
119
120
121 BandSlideWindow::BandSlideWindow(BandSlideMain *plugin)
122  : PluginClientWindow(plugin, 
123         320, 
124         100, 
125         320, 
126         100, 
127         0)
128 {
129         this->plugin = plugin;
130 }
131
132
133 void BandSlideWindow::create_objects()
134 {
135         int x = 10, y = 10;
136         add_subwindow(new BC_Title(x, y, _("Bands:")));
137         x += 50;
138         count = new BandSlideCount(plugin, 
139                 this,
140                 x,
141                 y);
142         count->create_objects();
143
144         y += 30;
145         x = 10;
146         add_subwindow(new BC_Title(x, y, _("Direction:")));
147         x += 100;
148         add_subwindow(in = new BandSlideIn(plugin, 
149                 this,
150                 x,
151                 y));
152         x += 100;
153         add_subwindow(out = new BandSlideOut(plugin, 
154                 this,
155                 x,
156                 y));
157
158         show_window();
159         flush();
160 }
161
162
163
164
165
166
167
168
169
170
171 BandSlideMain::BandSlideMain(PluginServer *server)
172  : PluginVClient(server)
173 {
174         bands = 9;
175         direction = 0;
176         
177 }
178
179 BandSlideMain::~BandSlideMain()
180 {
181         
182 }
183
184 const char* BandSlideMain::plugin_title() { return _("BandSlide"); }
185 int BandSlideMain::is_transition() { return 1; }
186 int BandSlideMain::uses_gui() { return 1; }
187
188 NEW_WINDOW_MACRO(BandSlideMain, BandSlideWindow);
189
190
191 void BandSlideMain::save_data(KeyFrame *keyframe)
192 {
193         FileXML output;
194         output.set_shared_output(keyframe->get_data(), MESSAGESIZE);
195         output.tag.set_title("BANDSLIDE");
196         output.tag.set_property("BANDS", bands);
197         output.tag.set_property("DIRECTION", direction);
198         output.append_tag();
199         output.terminate_string();
200 }
201
202 void BandSlideMain::read_data(KeyFrame *keyframe)
203 {
204         FileXML input;
205
206         input.set_shared_input(keyframe->get_data(), strlen(keyframe->get_data()));
207
208         while(!input.read_tag())
209         {
210                 if(input.tag.title_is("BANDSLIDE"))
211                 {
212                         bands = input.tag.get_property("BANDS", bands);
213                         direction = input.tag.get_property("DIRECTION", direction);
214                 }
215         }
216 }
217
218 int BandSlideMain::load_configuration()
219 {
220         read_data(get_prev_keyframe(get_source_position()));
221         return 1;
222 }
223
224
225
226 #define BANDSLIDE(type, components) \
227 { \
228         if(direction == 0) \
229         { \
230                 int x = w * \
231                         PluginClient::get_source_position() / \
232                         PluginClient::get_total_len(); \
233                 for(int i = 0; i < bands; i++) \
234                 { \
235                         for(int j = 0; j < band_h; j++) \
236                         { \
237                                 int row = i * band_h + j; \
238                                  \
239                                 if(row >= 0 && row < h) \
240                                 { \
241                                         type *in_row = (type*)incoming->get_rows()[row]; \
242                                         type *out_row = (type*)outgoing->get_rows()[row]; \
243                                          \
244                                         if(i % 2) \
245                                         { \
246                                                 for(int k = 0, l = w - x; k < x; k++, l++) \
247                                                 { \
248                                                         out_row[k * components + 0] = in_row[l * components + 0]; \
249                                                         out_row[k * components + 1] = in_row[l * components + 1]; \
250                                                         out_row[k * components + 2] = in_row[l * components + 2]; \
251                                                         if(components == 4) out_row[k * components + 3] = in_row[l * components + 3]; \
252                                                 } \
253                                         } \
254                                         else \
255                                         { \
256                                                 for(int k = w - x, l = 0; k < w; k++, l++) \
257                                                 { \
258                                                         out_row[k * components + 0] = in_row[l * components + 0]; \
259                                                         out_row[k * components + 1] = in_row[l * components + 1]; \
260                                                         out_row[k * components + 2] = in_row[l * components + 2]; \
261                                                         if(components == 4) out_row[k * components + 3] = in_row[l * components + 3]; \
262                                                 } \
263                                         } \
264                                 } \
265                         } \
266                 } \
267         } \
268         else \
269         { \
270                 int x = w - w * \
271                         PluginClient::get_source_position() / \
272                         PluginClient::get_total_len(); \
273                 for(int i = 0; i < bands; i++) \
274                 { \
275                         for(int j = 0; j < band_h; j++) \
276                         { \
277                                 int row = i * band_h + j; \
278  \
279                                 if(row >= 0 && row < h) \
280                                 { \
281                                         type *in_row = (type*)incoming->get_rows()[row]; \
282                                         type *out_row = (type*)outgoing->get_rows()[row]; \
283  \
284                                         if(i % 2) \
285                                         { \
286                                                 int k, l; \
287                                                 for(k = 0, l = w - x; k < x; k++, l++) \
288                                                 { \
289                                                         out_row[k * components + 0] = out_row[l * components + 0]; \
290                                                         out_row[k * components + 1] = out_row[l * components + 1]; \
291                                                         out_row[k * components + 2] = out_row[l * components + 2]; \
292                                                         if(components == 4) out_row[k * components + 3] = out_row[l * components + 3]; \
293                                                 } \
294                                                 for( ; k < w; k++) \
295                                                 { \
296                                                         out_row[k * components + 0] = in_row[k * components + 0]; \
297                                                         out_row[k * components + 1] = in_row[k * components + 1]; \
298                                                         out_row[k * components + 2] = in_row[k * components + 2]; \
299                                                         if(components == 4) out_row[k * components + 3] = in_row[k * components + 3]; \
300                                                 } \
301                                         } \
302                                         else \
303                                         { \
304                                                 for(int k = w - 1, l = x - 1; k >= w - x; k--, l--) \
305                                                 { \
306                                                         out_row[k * components + 0] = out_row[l * components + 0]; \
307                                                         out_row[k * components + 1] = out_row[l * components + 1]; \
308                                                         out_row[k * components + 2] = out_row[l * components + 2]; \
309                                                         if(components == 4) out_row[k * components + 3] = out_row[l * components + 3]; \
310                                                 } \
311                                                 for(int k = 0; k < w - x; k++) \
312                                                 { \
313                                                         out_row[k * components + 0] = in_row[k * components + 0]; \
314                                                         out_row[k * components + 1] = in_row[k * components + 1]; \
315                                                         out_row[k * components + 2] = in_row[k * components + 2]; \
316                                                         if(components == 4) out_row[k * components + 3] = in_row[k * components + 3]; \
317                                                 } \
318                                         } \
319                                 } \
320                         } \
321                 } \
322         } \
323 }
324
325
326
327 int BandSlideMain::process_realtime(VFrame *incoming, VFrame *outgoing)
328 {
329         load_configuration();
330
331         int w = incoming->get_w();
332         int h = incoming->get_h();
333         int band_h = ((bands == 0) ? h : (h / bands + 1));
334
335         switch(incoming->get_color_model())
336         {
337                 case BC_RGB888:
338                 case BC_YUV888:
339                         BANDSLIDE(unsigned char, 3)
340                         break;
341                 case BC_RGB_FLOAT:
342                         BANDSLIDE(float, 3);
343                         break;
344                 case BC_RGBA8888:
345                 case BC_YUVA8888:
346                         BANDSLIDE(unsigned char, 4)
347                         break;
348                 case BC_RGBA_FLOAT:
349                         BANDSLIDE(float, 4);
350                         break;
351                 case BC_RGB161616:
352                 case BC_YUV161616:
353                         BANDSLIDE(uint16_t, 3)
354                         break;
355                 case BC_RGBA16161616:
356                 case BC_YUVA16161616:
357                         BANDSLIDE(uint16_t, 4)
358                         break;
359         }
360
361         return 0;
362 }