#ifndef CANNYOUTPUT_H
#define CANNYOUTPUT_H

#include "output.h"
#include "../recognition/canny.h"

extern "C"
{
  #include <opencv/highgui.h>
}

namespace seemicro
{

class CannyOutput : public OutputModule
{
  CannyModule& c;
  
  /**
    * Dieser Zeiger ermöglicht es cannyCallback, auf das
    * OutputObjekt zuzugreifen. home muß in jedem
    * ageleiteten OutputModule erneut abgeleitet werden
    * und läßt sich nicht in einer Klasse "CallbackUsingOutput"
    * zusammenfassen, da alle davon abgeleiteten Klassen
    * ja die static *home-Variable teilen würden.
    * OpenCV-Callbacks-Funktionen sollten einen solchen Pointer
    * als Argument geliefert bekommen!
    */
  static CannyOutput *home;

public:
  CannyOutput(CannyModule& Ac) :
    c(Ac)
  {
    cvNamedWindow("Canny", 1);
    cvCreateTrackbar("Canny1", "Canny", &c.canny1, 200, cannyCallback);
    cvCreateTrackbar("Canny2", "Canny", &c.canny2, 200, cannyCallback);
    home = this;
  };

  ~CannyOutput()
  {
    cvDestroyWindow("Canny");
  }
  
  void output(bool keyframe)
  {
    if(!c.outputChanged) return;
    if(!keyframe) return;

    if(c.paramChanged)
    {
      // App crashes when "Canny" window was closed
      // and we call SetTrackbarPos()!
      cvSetTrackbarPos("Canny1", "Canny", c.canny1);
      cvSetTrackbarPos("Canny2", "Canny", c.canny2);
    }
    cvShowImage("Canny", c.img);
    cvResizeWindow("Canny", c.img->width+15, c.img->height+1+120);
    c.outputChanged = false;
  }

  static void cannyCallback(int dummy)
  {
    if(!home) return;
    home->c.paramChanged = true;
  }

}; // CannyOutput

} // seemicro

#endif
