#! /usr/bin/env octave
cv;
highgui;

global g;
inpaint_mask = [];
g.img0 = [];
g.img = [];
g.inpainted = [];
g.prev_pt = cvPoint(-1,-1);

function on_mouse( event, x, y, flags, param )
  global g;
  global cv;
  global highgui;
  if (!swig_this(g.img))
    return;
  endif

  if (event == highgui.CV_EVENT_LBUTTONUP || ! (bitand(flags,highgui.CV_EVENT_FLAG_LBUTTON)))
    g.prev_pt = cvPoint(-1,-1);
  elseif (event == highgui.CV_EVENT_LBUTTONDOWN)
    g.prev_pt = cvPoint(x,y);
  elseif (event == highgui.CV_EVENT_MOUSEMOVE && bitand(flags,highgui.CV_EVENT_FLAG_LBUTTON))
    pt = cvPoint(x,y);
    if (g.prev_pt.x < 0)
      g.prev_pt = pt;
    endif
    cvLine( g.inpaint_mask, g.prev_pt, pt, cvScalarAll(255), 5, 8, 0 );
    cvLine( g.img, g.prev_pt, pt, cvScalarAll(255), 5, 8, 0 );
    g.prev_pt = pt;
    cvShowImage( "image", g.img );
  endif
endfunction

filename = "../c/fruits.jpg";
if (size(argv, 1)>=1)
  filename = argv(){1};
endif

g.img0 = cvLoadImage(filename,-1);
if (!swig_this(g.img0))
  printf("Can't open image '%s'\n", filename);
  exit(1);
endif

printf("Hot keys:\n");
printf("\tESC - quit the program\n");
printf("\tr - restore the original image\n");
printf("\ti or ENTER - run inpainting algorithm\n");
printf("\t\t(before running it, paint something on the image)\n");

cvNamedWindow( "image", 1 );

g.img = cvCloneImage( g.img0 );
g.inpainted = cvCloneImage( g.img0 );
g.inpaint_mask = cvCreateImage( cvGetSize(g.img), 8, 1 );

cvZero( g.inpaint_mask );
cvZero( g.inpainted );
cvShowImage( "image", g.img );
cvShowImage( "watershed transform", g.inpainted );
cvSetMouseCallback( "image", @on_mouse, [] );

while (true)
  c = cvWaitKey(0);

  if( c == 27 || c=='q')
    break;
  endif

  if( c == 'r' )
    cvZero( g.inpaint_mask );
    cvCopy( g.img0, g.img );
    cvShowImage( "image", g.img );
  endif

  if( c == 'i' || c == '\012' )
    cvNamedWindow( "g.inpainted image", 1 );
    cvInpaint( g.img, g.inpaint_mask, g.inpainted, 3, CV_INPAINT_TELEA );
    cvShowImage( "g.inpainted image", g.inpainted );
  endif
endwhile