class NTSCFilter : public QObject {
  Q_OBJECT

public:
  void bind(configuration&);
  void size(unsigned&, unsigned&, unsigned, unsigned);
  void render(uint32_t*, unsigned, const uint16_t*, unsigned, const unsigned*, unsigned, unsigned);
  QWidget* settings();

  NTSCFilter();
  ~NTSCFilter();

private:
  void initialize();
  void loadSettingsFromConfig();
  void syncUiToSettings();

private slots:
  void syncSettingsToUi();
  void setRfPreset();
  void setCompositePreset();
  void setSvideoPreset();
  void setRgbPreset();
  void setMonoPreset();

private:
  QWidget *widget;
  QVBoxLayout *layout;
  QGridLayout *gridLayout;
  QLabel *basicSettings;
  QLabel *hueLabel;
  QLabel *hueValue;
  QSlider *hueSlider;
  QLabel *saturationLabel;
  QLabel *saturationValue;
  QSlider *saturationSlider;
  QLabel *contrastLabel;
  QLabel *contrastValue;
  QSlider *contrastSlider;
  QLabel *brightnessLabel;
  QLabel *brightnessValue;
  QSlider *brightnessSlider;
  QLabel *sharpnessLabel;
  QLabel *sharpnessValue;
  QSlider *sharpnessSlider;
  QLabel *advancedSettings;
  QLabel *gammaLabel;
  QLabel *gammaValue;
  QSlider *gammaSlider;
  QLabel *resolutionLabel;
  QLabel *resolutionValue;
  QSlider *resolutionSlider;
  QLabel *artifactsLabel;
  QLabel *artifactsValue;
  QSlider *artifactsSlider;
  QLabel *fringingLabel;
  QLabel *fringingValue;
  QSlider *fringingSlider;
  QLabel *bleedLabel;
  QLabel *bleedValue;
  QSlider *bleedSlider;
  QCheckBox *mergeFieldsBox;
  QLabel *presets;
  QHBoxLayout *controlLayout;
  QPushButton *rfPreset;
  QPushButton *compositePreset;
  QPushButton *svideoPreset;
  QPushButton *rgbPreset;
  QPushButton *monoPreset;
  QWidget *spacer;
  QPushButton *ok;

  bool blockSignals;

  struct snes_ntsc_t *ntsc;
  snes_ntsc_setup_t setup;
  int burst, burst_toggle;

  //settings
  double hue;
  double saturation;
  double contrast;
  double brightness;
  double sharpness;
  double gamma;
  double resolution;
  double artifacts;
  double fringing;
  double bleed;
  bool mergeFields;
} filter_ntsc;
