#include <stdio.h>
#include <stdlib.h>
//#include <string.h>
#include <gd.h>

struct my_colors{
	int red;
	int green;
	int blue;
};

int main(int argc, char **argv){
	//gdImagePtr im_piece;
	//gdImagePtr im_puzzle;
	//gdImagePtr im_out;
	FILE *piece;
	FILE *puzzle;
	FILE *out;
	int width_out, height_out;
	int counter1, counter2;
	int color_index_a;
	int color_index_b;
	int **color_array;
	//int alpha;
	int red, green, blue;
	//int set_color = gdImageColorAllocate(im_out, 0, 0, 255);

	piece  = fopen("IMG_1283.JPG", "rb");
	puzzle = fopen("IMG_1286.JPG", "rb");
	gdImagePtr im_piece  = gdImageCreateFromJpeg(piece);
	gdImagePtr im_puzzle = gdImageCreateFromJpeg(puzzle);

	width_out = gdImageSX(im_puzzle);
	height_out = gdImageSY(im_puzzle);

	struct my_colors **colors;

	//colors = malloc(width_out * height_out * sizeof(struct my_colors) );
	colors = (struct my_colors **)malloc(width_out * sizeof(struct my_colors *) );
	for(counter1=0; counter1<width_out; counter1++){
		colors[counter1] = (struct my_colors *)malloc( sizeof(struct my_colors) * height_out);
	}

	gdImagePtr im_out = gdImageCreateTrueColor(width_out, height_out);

	int set_color = gdImageColorAllocate(im_out, 0, 0, 255);

//	int red_p    = gdImageColorAllocate(im_out, 0, 0, 255);
//	int green_p  =
//	int orange_p =
//	int blue_p   =
//	int yellow_p =


	color_array = (int **)malloc(sizeof(int *) * width_out);
	for(counter1=0; counter1<width_out; counter1++){
		color_array[counter1] = (int *)malloc(sizeof(int) * height_out);
	}

	for(counter1=0; counter1<width_out; counter1++){
		for(counter2=0; counter2<height_out; counter2++){

			//color value being returned, not color index
			color_index_a = gdImageGetPixel(im_puzzle, counter1, counter2);
//printf("%d\n", color_index_a);
			//color_array[counter1][counter2] = color_index_a; 
			red = gdImageRed(im_puzzle,color_index_a);
			green = gdImageGreen(im_puzzle,color_index_a);
			blue = gdImageBlue(im_puzzle,color_index_a);
			colors[counter1][counter2].red = gdImageRed(im_puzzle,color_index_a);
			colors[counter1][counter2].green = gdImageGreen(im_puzzle,color_index_a);
			colors[counter1][counter2].blue = gdImageBlue(im_puzzle,color_index_a);

//if(colors[counter1][counter2].red < 128 && colors[counter1][counter2].green < 128 && colors[counter1][counter2].blue < 128){

/*
if(red < 128 && green + blue < 128){
	color_array[counter1][counter2] = 0;
}else if(green < 128 && red + blue < 128){
	color_array[counter1][counter2] = 0;
}else if(blue < 128 && red + green < 128){
	color_array[counter1][counter2] = 0;
}else if(blue > 200 && red > 200 && green > 200){
	color_array[counter1][counter2] = 0;
}else{
	color_array[counter1][counter2] = color_index_a;
}
*/
//red:    r 245 - 255 g 100 - 120 b 80 - 128
//green:  r 54 - 128 g 116 - 196 b 64 - 128
//blue:   r 64 - 128 g 100 - 164 b 136 - 232
//orange: r 255 g 100 - 164 b 56 - 112
//yellow: r 255 g 200 - 245 b 50 - 112

if(red > 250){
	if(green > 100 && green < 121 && blue > 79 && blue < 129){
		color_array[counter1][counter2] = color_index_a;
	}else if(green > 100 && green < 165 && blue > 55 && blue < 113){
		color_array[counter1][counter2] = color_index_a;
	}else if(green > 200 && green < 246 && blue > 49 && blue < 113){
		color_array[counter1][counter2] = color_index_a;
	}else{
		color_array[counter1][counter2] = 0;
	}
}else{
	if(red > 53 && red < 129 && green >115 && green < 197 && blue > 63 && blue < 129){
		color_array[counter1][counter2] = color_index_a;
	}else if(red > 63 && red < 129 && green > 99 && green < 165 && blue > 135 && blue < 233){
		color_array[counter1][counter2] = color_index_a;
	}else{
		color_array[counter1][counter2] = 0;
	}
}

//printf("r: %d g: %d b: %d\n", gdImageRed(im_puzzle,color_index_a), gdImageGreen(im_puzzle,color_index_a), 
//gdImageBlue(im_puzzle,color_index_a) );
			//alpha = gdImageAlpha(im_puzzle, color_index);
			//red   = im_puzzle->red[color_index];
			//green = im_puzzle->green[color_index];
			//blue  = im_puzzle->blue[color_index];
			//color_index_b = gdImageGetPixel(im_out, counter1, counter2);
			//printf("here 1\n");
			//gdImageColorDeallocate(im_out, set_color);
			//set_color = gdImageColorAllocate(im_out, red, green, blue);
			//gdImageSetPixel(im_out, counter1, counter2, color_index_a);
	
			//im_out->red[color_index]   = red;
			//im_out->green[color_index] = green;
			//im_out->blue[color_index]  = blue;
			//im_out->alpha[color_index] = alpha;
		}
	}
//goto end;
	printf("here 1\n");
	for(counter1=0; counter1<width_out; counter1++){
		for(counter2=0; counter2<height_out; counter2++){
//			gdImageColorDeallocate(im_out, set_color);
//set_color = gdImageColorAllocate(im_out, colors[counter1][counter2].red, colors[counter1][counter2].green, colors[counter1][counter2].blue);

			gdImageSetPixel(im_out, counter1, counter2, color_array[counter1][counter2]);
		}
	}
//	end:
	printf("here 2\n");
	out = fopen("output.png", "wb");
	//gdImageJpeg(im_out, out, 1);
	//gdImageInterlace(im_out, 1);
	gdImagePng(im_out, out);


	fclose(out);
	fclose(piece);
	fclose(puzzle);
	gdImageDestroy(im_out);
	gdImageDestroy(im_piece);
	gdImageDestroy(im_puzzle);
	return 0;
}
