4 * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
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.
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.
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
22 #include "bandslide.h"
23 #include "bcdisplayinfo.h"
28 #include "overlayframe.h"
41 REGISTER_PLUGIN(BandSlideMain)
47 BandSlideCount::BandSlideCount(BandSlideMain *plugin,
48 BandSlideWindow *window,
51 : BC_TumbleTextBox(window,
52 (int64_t)plugin->bands,
59 this->plugin = plugin;
60 this->window = window;
63 int BandSlideCount::handle_event()
65 plugin->bands = atol(get_text());
66 plugin->send_configure_change();
70 BandSlideIn::BandSlideIn(BandSlideMain *plugin,
71 BandSlideWindow *window,
76 plugin->direction == 0,
79 this->plugin = plugin;
80 this->window = window;
83 int BandSlideIn::handle_event()
86 plugin->direction = 0;
87 window->out->update(0);
88 plugin->send_configure_change();
92 BandSlideOut::BandSlideOut(BandSlideMain *plugin,
93 BandSlideWindow *window,
98 plugin->direction == 1,
101 this->plugin = plugin;
102 this->window = window;
105 int BandSlideOut::handle_event()
108 plugin->direction = 1;
109 window->in->update(0);
110 plugin->send_configure_change();
121 BandSlideWindow::BandSlideWindow(BandSlideMain *plugin)
122 : PluginClientWindow(plugin,
129 this->plugin = plugin;
133 void BandSlideWindow::create_objects()
135 int xs10 = xS(10), xs50 = xS(50), xs100 = xS(100);
136 int ys10 = yS(10), ys30 = yS(30);
137 int x = xs10, y = ys10;
138 add_subwindow(new BC_Title(x, y, _("Bands:")));
140 count = new BandSlideCount(plugin,
144 count->create_objects();
148 add_subwindow(new BC_Title(x, y, _("Direction:")));
150 add_subwindow(in = new BandSlideIn(plugin,
155 add_subwindow(out = new BandSlideOut(plugin,
173 BandSlideMain::BandSlideMain(PluginServer *server)
174 : PluginVClient(server)
181 BandSlideMain::~BandSlideMain()
186 const char* BandSlideMain::plugin_title() { return N_("BandSlide"); }
187 int BandSlideMain::is_transition() { return 1; }
188 int BandSlideMain::uses_gui() { return 1; }
190 NEW_WINDOW_MACRO(BandSlideMain, BandSlideWindow);
193 void BandSlideMain::save_data(KeyFrame *keyframe)
196 output.set_shared_output(keyframe->xbuf);
197 output.tag.set_title("BANDSLIDE");
198 output.tag.set_property("BANDS", bands);
199 output.tag.set_property("DIRECTION", direction);
201 output.tag.set_title("/BANDSLIDE");
203 output.append_newline();
204 output.terminate_string();
207 void BandSlideMain::read_data(KeyFrame *keyframe)
211 input.set_shared_input(keyframe->xbuf);
213 while(!input.read_tag())
215 if(input.tag.title_is("BANDSLIDE"))
217 bands = input.tag.get_property("BANDS", bands);
218 direction = input.tag.get_property("DIRECTION", direction);
223 int BandSlideMain::load_configuration()
225 read_data(get_prev_keyframe(get_source_position()));
231 #define BANDSLIDE(type, components) \
236 PluginClient::get_source_position() / \
237 PluginClient::get_total_len(); \
238 for(int i = 0; i < bands; i++) \
240 for(int j = 0; j < band_h; j++) \
242 int row = i * band_h + j; \
244 if(row >= 0 && row < h) \
246 type *in_row = (type*)incoming->get_rows()[row]; \
247 type *out_row = (type*)outgoing->get_rows()[row]; \
251 for(int k = 0, l = w - x; k < x; k++, l++) \
253 out_row[k * components + 0] = in_row[l * components + 0]; \
254 out_row[k * components + 1] = in_row[l * components + 1]; \
255 out_row[k * components + 2] = in_row[l * components + 2]; \
256 if(components == 4) out_row[k * components + 3] = in_row[l * components + 3]; \
261 for(int k = w - x, l = 0; k < w; k++, l++) \
263 out_row[k * components + 0] = in_row[l * components + 0]; \
264 out_row[k * components + 1] = in_row[l * components + 1]; \
265 out_row[k * components + 2] = in_row[l * components + 2]; \
266 if(components == 4) out_row[k * components + 3] = in_row[l * components + 3]; \
276 PluginClient::get_source_position() / \
277 PluginClient::get_total_len(); \
278 for(int i = 0; i < bands; i++) \
280 for(int j = 0; j < band_h; j++) \
282 int row = i * band_h + j; \
284 if(row >= 0 && row < h) \
286 type *in_row = (type*)incoming->get_rows()[row]; \
287 type *out_row = (type*)outgoing->get_rows()[row]; \
292 for(k = 0, l = w - x; k < x; k++, l++) \
294 out_row[k * components + 0] = out_row[l * components + 0]; \
295 out_row[k * components + 1] = out_row[l * components + 1]; \
296 out_row[k * components + 2] = out_row[l * components + 2]; \
297 if(components == 4) out_row[k * components + 3] = out_row[l * components + 3]; \
301 out_row[k * components + 0] = in_row[k * components + 0]; \
302 out_row[k * components + 1] = in_row[k * components + 1]; \
303 out_row[k * components + 2] = in_row[k * components + 2]; \
304 if(components == 4) out_row[k * components + 3] = in_row[k * components + 3]; \
309 for(int k = w - 1, l = x - 1; k >= w - x; k--, l--) \
311 out_row[k * components + 0] = out_row[l * components + 0]; \
312 out_row[k * components + 1] = out_row[l * components + 1]; \
313 out_row[k * components + 2] = out_row[l * components + 2]; \
314 if(components == 4) out_row[k * components + 3] = out_row[l * components + 3]; \
316 for(int k = 0; k < w - x; k++) \
318 out_row[k * components + 0] = in_row[k * components + 0]; \
319 out_row[k * components + 1] = in_row[k * components + 1]; \
320 out_row[k * components + 2] = in_row[k * components + 2]; \
321 if(components == 4) out_row[k * components + 3] = in_row[k * components + 3]; \
332 int BandSlideMain::process_realtime(VFrame *incoming, VFrame *outgoing)
334 load_configuration();
336 int w = incoming->get_w();
337 int h = incoming->get_h();
338 int band_h = ((bands == 0) ? h : (h / bands + 1));
340 switch(incoming->get_color_model())
344 BANDSLIDE(unsigned char, 3)
351 BANDSLIDE(unsigned char, 4)
358 BANDSLIDE(uint16_t, 3)
360 case BC_RGBA16161616:
361 case BC_YUVA16161616:
362 BANDSLIDE(uint16_t, 4)