*
*/
-#include "affine.h"
-#include "bcdisplayinfo.h"
-#include "clip.h"
-#include "bchash.h"
-#include "filexml.h"
-#include "guicast.h"
-#include "language.h"
-#include "pluginvclient.h"
-#include "rotateframe.h"
-#include "vframe.h"
-
-
-#include <string.h>
-
+#include "rotate.h"
#define MAXANGLE 360
-
-class RotateEffect;
-class RotateWindow;
-
-
-class RotateConfig
-{
-public:
- RotateConfig();
-
- int equivalent(RotateConfig &that);
- void copy_from(RotateConfig &that);
- void interpolate(RotateConfig &prev,
- RotateConfig &next,
- long prev_frame,
- long next_frame,
- long current_frame);
-
- float angle;
- float pivot_x;
- float pivot_y;
- int draw_pivot;
-// int bilinear;
-};
-
-class RotateToggle : public BC_Radial
-{
-public:
- RotateToggle(RotateWindow *window,
- RotateEffect *plugin,
- int init_value,
- int x,
- int y,
- int value,
- const char *string);
- int handle_event();
-
- RotateEffect *plugin;
- RotateWindow *window;
- int value;
-};
-
-class RotateDrawPivot : public BC_CheckBox
-{
-public:
- RotateDrawPivot(RotateWindow *window,
- RotateEffect *plugin,
- int x,
- int y);
- int handle_event();
- RotateEffect *plugin;
- RotateWindow *window;
- int value;
-};
-
-class RotateInterpolate : public BC_CheckBox
-{
-public:
- RotateInterpolate(RotateEffect *plugin, int x, int y);
- int handle_event();
- RotateEffect *plugin;
-};
-
-class RotateFine : public BC_FPot
-{
-public:
- RotateFine(RotateWindow *window,
- RotateEffect *plugin,
- int x,
- int y);
- int handle_event();
-
- RotateEffect *plugin;
- RotateWindow *window;
-};
-
-class RotateX : public BC_FPot
-{
-public:
- RotateX(RotateWindow *window,
- RotateEffect *plugin,
- int x,
- int y);
- int handle_event();
- RotateEffect *plugin;
- RotateWindow *window;
-};
-
-class RotateY : public BC_FPot
-{
-public:
- RotateY(RotateWindow *window,
- RotateEffect *plugin,
- int x,
- int y);
- int handle_event();
- RotateEffect *plugin;
- RotateWindow *window;
-};
-
-
-class RotateText : public BC_TextBox
-{
-public:
- RotateText(RotateWindow *window,
- RotateEffect *plugin,
- int x,
- int y);
- int handle_event();
-
- RotateEffect *plugin;
- RotateWindow *window;
-};
-
-class RotateWindow : public PluginClientWindow
-{
-public:
- RotateWindow(RotateEffect *plugin);
-
- void create_objects();
-
- int update();
- int update_fine();
- int update_text();
- int update_toggles();
-
- RotateEffect *plugin;
- RotateToggle *toggle0;
- RotateToggle *toggle90;
- RotateToggle *toggle180;
- RotateToggle *toggle270;
- RotateDrawPivot *draw_pivot;
- RotateFine *fine;
- RotateText *text;
- RotateX *x;
- RotateY *y;
-// RotateInterpolate *bilinear;
-};
-
-
-
-
-class RotateEffect : public PluginVClient
-{
-public:
- RotateEffect(PluginServer *server);
- ~RotateEffect();
-
- PLUGIN_CLASS_MEMBERS(RotateConfig)
- int process_buffer(VFrame *frame,
- int64_t start_position,
- double frame_rate);
- int is_realtime();
- void update_gui();
- void save_data(KeyFrame *keyframe);
- void read_data(KeyFrame *keyframe);
- int handle_opengl();
-
- AffineEngine *engine;
- int need_reconfigure;
-};
-
-
-
-
-
-
-
REGISTER_PLUGIN(RotateEffect)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
RotateConfig::RotateConfig()
{
- angle = 0;
- pivot_x = 50;
- pivot_y = 50;
+ reset();
+}
+
+void RotateConfig::reset()
+{
+ angle = 0.0;
+ pivot_x = 50.0;
+ pivot_y = 50.0;
draw_pivot = 0;
}
{
this->value = value;
this->plugin = plugin;
- this->window = window;
+ this->window = window;
}
int RotateToggle::handle_event()
{
plugin->config.angle = (float)value;
- window->update();
+ window->update();
plugin->send_configure_change();
return 1;
}
: BC_CheckBox(x, y, plugin->config.draw_pivot, _("Draw pivot"))
{
this->plugin = plugin;
- this->window = window;
+ this->window = window;
}
int RotateDrawPivot::handle_event()
int y)
: BC_TextBox(x,
y,
- 100,
+ xS(90),
1,
(float)plugin->config.angle)
{
}
+RotateReset::RotateReset(RotateEffect *plugin, RotateWindow *window, int x, int y)
+ : BC_GenericButton(x, y, _("Reset"))
+{
+ this->plugin = plugin;
+ this->window = window;
+}
+RotateReset::~RotateReset()
+{
+}
+int RotateReset::handle_event()
+{
+ plugin->config.reset();
+ window->update();
+ plugin->send_configure_change();
+ return 1;
+}
RotateWindow::RotateWindow(RotateEffect *plugin)
- : PluginClientWindow(plugin,
- 250,
- 230,
- 250,
- 230,
- 0)
+ : PluginClientWindow(plugin, xS(300), yS(230), xS(300), yS(230), 0)
{
this->plugin = plugin;
}
-#define RADIUS 30
+#define RADIUS xS(30)
void RotateWindow::create_objects()
{
- int x = 10, y = 10;
+ int xs10 = xS(10), xs50 = xS(50), xs150 = xS(150);
+ int ys10 = yS(10), ys20 = yS(20), ys25 = yS(25), ys50 = yS(50), ys60 = yS(60);
+ int x = xs10, y = ys10;
BC_Title *title;
-
-
-
add_tool(new BC_Title(x, y, _("Rotate")));
- x += 50;
- y += 20;
- add_tool(toggle0 = new RotateToggle(this,
- plugin,
- plugin->config.angle == 0,
- x,
- y,
- 0,
- "0"));
- x += RADIUS;
- y += RADIUS;
- add_tool(toggle90 = new RotateToggle(this,
- plugin,
- plugin->config.angle == 90,
- x,
- y,
- 90,
- "90"));
- x -= RADIUS;
- y += RADIUS;
- add_tool(toggle180 = new RotateToggle(this,
- plugin,
- plugin->config.angle == 180,
- x,
- y,
- 180,
- "180"));
- x -= RADIUS;
- y -= RADIUS;
- add_tool(toggle270 = new RotateToggle(this,
- plugin,
- plugin->config.angle == 270,
- x,
- y,
- 270,
- "270"));
-// add_subwindow(bilinear = new RotateInterpolate(plugin, 10, y + 60));
- x += 120;
- y -= 50;
+ x += xs50; y += ys20;
+ add_tool(toggle0 = new RotateToggle(this, plugin,
+ plugin->config.angle == 0, x, y, 0, "0"));
+ x += RADIUS; y += RADIUS;
+ add_tool(toggle90 = new RotateToggle(this, plugin,
+ plugin->config.angle == 90, x, y, 90, "90"));
+ x -= RADIUS; y += RADIUS;
+ add_tool(toggle180 = new RotateToggle(this, plugin,
+ plugin->config.angle == 180, x, y, 180, "180"));
+ x -= RADIUS; y -= RADIUS;
+ add_tool(toggle270 = new RotateToggle(this, plugin,
+ plugin->config.angle == 270, x, y, 270, "270"));
+// add_subwindow(bilinear = new RotateInterpolate(plugin, xs10, y + ys60));
+ x += xs150; y -= ys50;
add_tool(fine = new RotateFine(this, plugin, x, y));
- y += fine->get_h() + 10;
+ y += fine->get_h() + ys10;
add_tool(text = new RotateText(this, plugin, x, y));
- y += 30;
+ y += ys25;
add_tool(new BC_Title(x, y, _("Degrees")));
-
-
-
-
- y += text->get_h() + 10;
+ y += text->get_h() + ys10;
add_subwindow(title = new BC_Title(x, y, _("Pivot (x,y):")));
- y += title->get_h() + 10;
+ y += title->get_h() + ys10;
add_subwindow(this->x = new RotateX(this, plugin, x, y));
- x += this->x->get_w() + 10;
+ x += this->x->get_w() + xs10;
add_subwindow(this->y = new RotateY(this, plugin, x, y));
- x = 10;
- y += this->y->get_h() + 10;
+// y += this->y->get_h() + ys10;
+ x = xs10;
add_subwindow(draw_pivot = new RotateDrawPivot(this, plugin, x, y));
+ y += ys60;
+ add_subwindow(reset = new RotateReset(plugin, this, x, y));
show_window();
-
-
-
}
//printf("RotateEffect::process_buffer %d\n", __LINE__);
- if(config.angle == 0)
+ if(config.angle == 0 && !config.draw_pivot)
{
read_frame(frame,
0,
//printf("RotateEffect::process_buffer %d draw_pivot=%d\n", __LINE__, config.draw_pivot);
// Draw center
-#define CENTER_H 20
-#define CENTER_W 20
+#define CENTER_H xS(20)
+#define CENTER_W yS(20)
#define DRAW_CENTER(components, type, max) \
{ \
type **rows = (type**)get_output()->get_rows(); \
- if( (center_x >= 0 && center_x < w) || (center_y >= 0 && center_y < h) ) \
+ if( (center_x >= 0 && center_x < w) && (center_y >= 0 && center_y < h) ) \
{ \
- type *hrow = rows[center_y] + components * (center_x - CENTER_W / 2); \
for(int i = center_x - CENTER_W / 2; i <= center_x + CENTER_W / 2; i++) \
{ \
if(i >= 0 && i < w) \
{ \
+ type *hrow = rows[center_y] + components * i; \
hrow[0] = max - hrow[0]; \
hrow[1] = max - hrow[1]; \
hrow[2] = max - hrow[2]; \