#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <string.h>

#include <sys/types.h>
#include <sys/stat.h>

#include "../include/ft2build.h"

#include "murmur3.h"            /* MurmurHash3_x64_128 header file */

#include <png.h>
#include <dlfcn.h>
#include <math.h>

#include FT_FREETYPE_H
#include FT_MODULE_H
#include FT_LCD_FILTER_H
#include FT_BITMAP_H

#define BITS_PER_PIXEL_RGBA 32
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define MIN(a, b) ((a) < (b) ? (a) : (b))

typedef struct {                /* To store 32bit Hash */
  FT_UInt32 hash;
}HASH_32;

typedef struct {                /* To store 128bit Hash */
  FT_UInt32 hash[4];
}HASH_128;

/* A 32-bit pixel */
typedef struct {
  unsigned char red;
  unsigned char green;
  unsigned char blue;
  unsigned char alpha;
} PIXEL;

/* A picture. */ 
typedef struct  {
  PIXEL* pixels;
  size_t width;
  size_t height;
} IMAGE;

/* Render modes */
enum render_modes
  { MONO, AA, RGB, BGR, VRGB, VBGR };    
/*-----------------------------------------------------------------*/

HASH_32* Generate_Hash_x86_32(FT_Bitmap* bitmap, HASH_32* murmur);
HASH_128* Generate_Hash_x86_128(FT_Bitmap* bitmap, HASH_128* murmur);
HASH_128* Generate_Hash_x64_128(FT_Bitmap* bitmap, HASH_128* murmur);

int Compare_Hash(HASH_128* hash_b, HASH_128* hash_t);

/*-----------------------------------------------------------------*/
/* Returns the render_mode */
int Get_Render_Mode(const char* mode);
/* Returns a pointer to pixel */
/* at (x,y) co-ordinate */
PIXEL* Pixel_At (IMAGE * bitmap, int x, int y);  
/*Render mode string to render_mode code */
void Make_PNG (FT_Bitmap* bitmap,IMAGE* fruit, int i,int render_mode);
/* Image to file */
int Generate_PNG (IMAGE *bitmap, const char *path,int render_mode);   
/* Read PNG */
void Read_PNG(char *filename, IMAGE * after_effect);
/* Add effects using two PNG images and generate an image*/
int Add_effect(IMAGE* base, IMAGE* test, IMAGE* out, int Effect_ID);
/* Stitch 2 PNG files */
void Stitch(IMAGE* left, IMAGE* right, IMAGE* result);
/* Finding the first non-empty (non-white) column */
int First_Column(IMAGE* input);
/* Finding the first non-empty (non-white) row */
int First_Row(IMAGE* input);
/* Appening white columns with image alignment */
IMAGE* Append_Columns(IMAGE* small, IMAGE* big);
/* Appening white columns with image alignment */
IMAGE* Append_Rows(IMAGE* small, IMAGE* big);
/* calculating the Pixel Differences */
int Image_Diff( IMAGE* base, IMAGE* test);
/* Print the row in list-view webpage */
void Print_Row( FILE* fp, int index, char* name, int diff );
/* Print the table-headers in list-view webpage */
void Print_Head( FILE* fp );
/* Returns the name of the font file without the extension */
char* Get_Font_File_Name(const char* font_file_full_name);
/* Returns the file extension of the font file */
char* Get_Font_File_Type(const char* font_file_full_name);
