
// simpleNeighborSearch test


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#include "vision.h"
#include "bmp_io.h"
#include "filter.h"
#include "search.h"

int main(int argc, char *argv[])
{

   int *temp_r;
   int *temp_g;
   int *temp_b;
   int rows, cols, i, j;
   int *result;
   rgbPicture *pic = (rgbPicture *)malloc(sizeof(rgbPicture));
   bitPicture *bit_pic;
   clock_t begin, end, time_read, time_filter, time_search, time_write, time_total;
   
   
   if(argc < 5)
   {
      printf("USAGE: test_search1.exe color min_intensity input_file output_file\n");
      return 0;
   }

   
   // ----- Read image data -----
   begin = clock();
   bmp_read(argv[3], &cols, &rows, &temp_r, &temp_g, &temp_b);
   end = clock();
   time_read = end - begin;   


   // ----- Convert data to struct -----
   pic->buf = (unsigned char *)malloc(3*rows*cols*sizeof(unsigned char));
   for(i=0; i<rows*cols; i++)
   {
      pic->buf[i*3] = temp_b[i];
      pic->buf[i*3+1] = temp_g[i];
      pic->buf[i*3+2] = temp_r[i];
   }
   pic->x_size = cols;
   pic->y_size = rows;


   // ----- Filtering -----
   printf("Filtering...\n");
   begin = clock();
   bit_pic = autoFilter(pic, atoi(argv[1]), atoi(argv[2]));
   end = clock();
   time_filter = end - begin;
   printf("Done\n");



   // ----- Searching areas -----
   printf("Searching...\n");
   begin = clock();
   result = simpleNeighborSearch(bit_pic);   
   end = clock();
   time_search = end - begin;

   printf("\n\nFound %d areas:", result[0]);
   for(i=1; i <= result[0]; i++)
   {
      printf("\n%d: X: %d   Y: %d", i, result[i*2-1], result[i*2]);
   }
   printf("\n\n");   



   // ----- Convert filtered data to writable format -----
   for(i=0; i<rows*cols; i++)
   {
      temp_b[i] = 0;
      temp_g[i] = 0;
      if(bit_pic->buf[i] > 0)
         temp_r[i] = 255;
      else
         temp_r[i] = 0;
   }
   
   
   // ----- Mark found centerpoints to the picture -----
   for(i=1; i <= result[0]*2; i=i+2)
   {
      temp_r[result[i+1]*cols+result[i]] = 255;
      temp_g[result[i+1]*cols+result[i]] = 255;
      temp_b[result[i+1]*cols+result[i]] = 255;
   }
   
   
   // ----- Write picture -----
   begin = clock();
   bmp_write(argv[4], cols, rows, temp_r, temp_g, temp_b);
   end = clock();
   time_write = end - begin;



   // ----- Calculate time usage -----
   time_total = clock();
   printf("TIME USAGE: (clocks_per_sec=%ld) \n", (long)CLOCKS_PER_SEC);
   printf(" read:    %d%%  (%ld)\n", (int)(100 * (double)time_read / (double)time_total),
                                     (long)time_read);
   printf(" filter:  %d%%  (%ld)\n", (int)(100 * (double)time_filter / (double)time_total),
                                      (long)time_filter );
   printf(" search:  %d%%  (%ld)\n", (int)(100 * (double)time_search / (double)time_total),
                                      (long)time_search );
   printf(" write:   %d%%  (%ld)\n", (int)(100 * (double)time_write / (double)time_total),
                                      (long)time_write );


   /// ----- Free memory -----
   free(pic->buf);
   free(bit_pic->buf);
   free(pic);
   free(bit_pic);

   free(temp_r);
   free(temp_g);
   free(temp_b);

   return 1;
}
