--- /dev/null
+#ifndef __DESCRATCH_H__
+#define __DESCRATCH_H__
+
+#include "bcbutton.h"
+#include "bchash.h"
+#include "bcmenuitem.h"
+#include "bcpopupmenu.h"
+#include "bcslider.h"
+#include "bctitle.h"
+#include "bctoggle.h"
+#include "mutex.h"
+#include "overlayframe.h"
+#include "pluginvclient.h"
+
+// so that write_pgm can create grey images of inf
+#define SD_NULL 0
+#define SD_EXTREM 0x80
+#define SD_TESTED 0x60
+#define SD_GOOD 0x40
+#define SD_REJECT 0x10
+
+#define MODE_NONE 0
+#define MODE_LOW 1
+#define MODE_HIGH 2
+#define MODE_ALL 3
+
+class DeScratchConfig;
+class DeScratchMain;
+class DeScratchWindow;
+class DeScratchModeItem;
+class DeScratchMode;
+class DeScratchISlider;
+class DeScratchFSlider;
+class DeScratchMark;
+class DeScratchReset;
+
+
+class DeScratchConfig
+{
+public:
+ DeScratchConfig();
+ ~DeScratchConfig();
+ void reset();
+ int equivalent(DeScratchConfig &that);
+ void copy_from(DeScratchConfig &that);
+ void interpolate(DeScratchConfig &prev, DeScratchConfig &next,
+ int64_t prev_frame, int64_t next_frame, int64_t current_frame);
+
+ int threshold;
+ int asymmetry;
+ int min_width;
+ int max_width;
+ float min_len;
+ float max_len;
+ float max_angle;
+ int blur_len;
+ float gap_len;
+ int mode_y;
+ int mode_u;
+ int mode_v;
+ int mark;
+ float ffade;
+ int border;
+};
+
+class DeScratchMain : public PluginVClient
+{
+public:
+ DeScratchMain(PluginServer *server);
+ ~DeScratchMain();
+
+ PLUGIN_CLASS_MEMBERS(DeScratchConfig)
+ uint8_t *inf; int sz_inf;
+ int src_w, src_h;
+ VFrame *src, *dst;
+ VFrame *tmp_frame, *blurry;
+ OverlayFrame *overlay_frame;
+ int is_realtime();
+ void update_gui();
+ void save_data(KeyFrame *keyframe);
+ void read_data(KeyFrame *keyframe);
+
+ void get_extrems_plane(int comp, int thresh);
+ void remove_min_extrems_plane(int comp, int thresh);
+ void close_gaps();
+ void test_scratches();
+ void mark_scratches_plane(int comp, int mask, int value);
+ void remove_scratches_plane(int comp);
+ void pass(int comp, int thresh);
+ void blur(int scale);
+ void copy(int comp);
+ void plane_pass(int comp, int mode);
+ int process_realtime(VFrame *input, VFrame *output);
+};
+
+
+class DeScratchWindow : public PluginClientWindow
+{
+public:
+ DeScratchWindow(DeScratchMain *plugin);
+ ~DeScratchWindow();
+ void update_gui();
+ void create_objects();
+
+ DeScratchMain *plugin;
+ DeScratchMode *y_mode, *u_mode, *v_mode;
+ DeScratchISlider *threshold, *asymmetry;
+ DeScratchISlider *min_width, *max_width;
+ DeScratchFSlider *min_len, *max_len;
+ DeScratchISlider *blur_len;
+ DeScratchFSlider *gap_len;
+ DeScratchFSlider *max_angle;
+ DeScratchISlider *border;
+ DeScratchMark *mark;
+ DeScratchFSlider *ffade;
+ DeScratchReset *reset;
+};
+
+class DeScratchModeItem : public BC_MenuItem
+{
+public:
+ DeScratchModeItem(DeScratchMode *popup, int type, const char *text);
+ ~DeScratchModeItem();
+ int handle_event();
+
+ DeScratchMode *popup;
+ int type;
+};
+
+class DeScratchMode : public BC_PopupMenu
+{
+public:
+ DeScratchMode(DeScratchWindow *win, int x, int y, int *value);
+ ~DeScratchMode();
+ void create_objects();
+ int handle_event();
+ void update(int v);
+ void set_value(int v);
+
+ DeScratchWindow *win;
+ int *value;
+};
+
+class DeScratchISlider : public BC_ISlider
+{
+public:
+ DeScratchISlider(DeScratchWindow *win,
+ int x, int y, int w, int min, int max, int *output);
+ ~DeScratchISlider();
+ int handle_event();
+
+ DeScratchWindow *win;
+ int *output;
+};
+
+class DeScratchFSlider : public BC_FSlider
+{
+public:
+ DeScratchFSlider(DeScratchWindow *win,
+ int x, int y, int w, float min, float max, float *output);
+ ~DeScratchFSlider();
+ int handle_event();
+
+ DeScratchWindow *win;
+ float *output;
+};
+
+class DeScratchMark : public BC_CheckBox
+{
+public:
+ DeScratchMark(DeScratchWindow *win, int x, int y);
+ ~DeScratchMark();
+ int handle_event();
+
+ DeScratchWindow *win;
+};
+
+class DeScratchReset : public BC_GenericButton
+{
+public:
+ DeScratchReset(DeScratchWindow *win, int x, int y);
+ int handle_event();
+
+ DeScratchWindow *win;
+};
+
+#endif