2 #include "colormodels.h"
6 #include "flipwindow.h"
13 REGISTER_PLUGIN(FlipMain)
20 FlipConfig::FlipConfig()
26 void FlipConfig::copy_from(FlipConfig &that)
28 flip_horizontal = that.flip_horizontal;
29 flip_vertical = that.flip_vertical;
32 int FlipConfig::equivalent(FlipConfig &that)
34 return flip_horizontal == that.flip_horizontal &&
35 flip_vertical == that.flip_vertical;
38 void FlipConfig::interpolate(FlipConfig &prev,
44 this->flip_horizontal = prev.flip_horizontal;
45 this->flip_vertical = prev.flip_vertical;
57 FlipMain::FlipMain(PluginServer *server)
58 : PluginVClient(server)
60 PLUGIN_CONSTRUCTOR_MACRO
65 PLUGIN_DESTRUCTOR_MACRO
68 char* FlipMain::plugin_title() { return N_("Flip"); }
69 int FlipMain::is_realtime() { return 1; }
72 #define SWAP_PIXELS(type, components, in, out) \
94 #define FLIP_MACRO(type, components) \
96 type **input_rows, **output_rows; \
97 type *input_row, *output_row; \
98 input_rows = ((type**)frame->get_rows()); \
99 output_rows = ((type**)frame->get_rows()); \
101 if(config.flip_vertical) \
103 for(i = 0, j = h - 1; i < h / 2; i++, j--) \
105 input_row = input_rows[i]; \
106 output_row = output_rows[j]; \
107 for(k = 0; k < w; k++) \
109 SWAP_PIXELS(type, components, output_row, input_row); \
110 output_row += components; \
111 input_row += components; \
116 if(config.flip_horizontal) \
118 for(i = 0; i < h; i++) \
120 input_row = input_rows[i]; \
121 output_row = output_rows[i] + (w - 1) * components; \
122 for(k = 0; k < w / 2; k++) \
124 SWAP_PIXELS(type, components, output_row, input_row); \
125 input_row += components; \
126 output_row -= components; \
132 int FlipMain::process_buffer(VFrame *frame,
133 int64_t start_position,
137 int w = frame->get_w();
138 int h = frame->get_h();
139 int colormodel = frame->get_color_model();
141 load_configuration();
145 get_source_position(),
153 if(config.flip_vertical || config.flip_horizontal)
163 FLIP_MACRO(unsigned char, 3);
166 FLIP_MACRO(float, 3);
170 FLIP_MACRO(uint16_t, 3);
174 FLIP_MACRO(unsigned char, 4);
177 FLIP_MACRO(float, 4);
179 case BC_RGBA16161616:
180 case BC_YUVA16161616:
181 FLIP_MACRO(uint16_t, 4);
188 SHOW_GUI_MACRO(FlipMain, FlipThread)
190 RAISE_WINDOW_MACRO(FlipMain)
192 SET_STRING_MACRO(FlipMain)
194 NEW_PICON_MACRO(FlipMain)
196 LOAD_CONFIGURATION_MACRO(FlipMain, FlipConfig)
198 void FlipMain::update_gui()
202 load_configuration();
203 thread->window->lock_window();
204 thread->window->flip_vertical->update((int)config.flip_vertical);
205 thread->window->flip_horizontal->update((int)config.flip_horizontal);
206 thread->window->unlock_window();
210 void FlipMain::save_data(KeyFrame *keyframe)
214 // cause data to be stored directly in text
215 output.set_shared_string(keyframe->data, MESSAGESIZE);
216 output.tag.set_title("FLIP");
218 if(config.flip_vertical)
220 output.tag.set_title("VERTICAL");
224 if(config.flip_horizontal)
226 output.tag.set_title("HORIZONTAL");
229 output.terminate_string();
230 // data is now in *text
233 void FlipMain::read_data(KeyFrame *keyframe)
237 input.set_shared_string(keyframe->data, strlen(keyframe->data));
240 config.flip_vertical = config.flip_horizontal = 0;
244 result = input.read_tag();
248 if(input.tag.title_is("VERTICAL"))
250 config.flip_vertical = 1;
253 if(input.tag.title_is("HORIZONTAL"))
255 config.flip_horizontal = 1;
261 int FlipMain::load_defaults()
263 char directory[BCTEXTLEN], string[BCTEXTLEN];
264 // set the default directory
265 sprintf(directory, "%sflip.rc", BCASTDIR);
268 defaults = new BC_Hash(directory);
271 config.flip_horizontal = defaults->get("FLIP_HORIZONTAL", config.flip_horizontal);
272 config.flip_vertical = defaults->get("FLIP_VERTICAL", config.flip_vertical);
276 int FlipMain::save_defaults()
278 defaults->update("FLIP_HORIZONTAL", config.flip_horizontal);
279 defaults->update("FLIP_VERTICAL", config.flip_vertical);
284 int FlipMain::handle_opengl()
287 get_output()->to_texture();
288 get_output()->enable_opengl();
289 get_output()->init_screen();
290 get_output()->bind_texture(0);
292 if(config.flip_vertical && !config.flip_horizontal)
294 get_output()->draw_texture(0,
296 get_output()->get_w(),
297 get_output()->get_h(),
299 get_output()->get_h(),
300 get_output()->get_w(),
304 if(config.flip_horizontal && !config.flip_vertical)
306 get_output()->draw_texture(0,
308 get_output()->get_w(),
309 get_output()->get_h(),
310 get_output()->get_w(),
313 get_output()->get_h());
316 if(config.flip_vertical && config.flip_horizontal)
318 get_output()->draw_texture(0,
320 get_output()->get_w(),
321 get_output()->get_h(),
322 get_output()->get_w(),
323 get_output()->get_h(),
328 get_output()->set_opengl_state(VFrame::SCREEN);