#include "Png_Funcs.h"

/*
void read_row_callback(png_ptr ptr, png_uint_32 row,
int pass);
{
}
*/

//unsigned char *Legend_Texture_Data;

int Open_Convert_Legend(unsigned char *Image, char *filename){
//int Load_Terrain(struct image_attr *ia, char *filename){
	//const char *filename = "legend.png";
	FILE *fp = fopen(filename, "rb");
	if(!fp){
		printf("Error opening file: %s\n", filename);
		return 1;
	}
	char header[8];
	fread(&header, 1, 8, fp);
	int is_png = !png_sig_cmp((png_bytep)&header, 0, 8);
	if(!is_png){
		return 1;
	}
	//printf("here 1\n");
	//png_set_sig_bytes_read() 

	png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
	if(!png_ptr){
		printf("Error creating png read structure!\n");
		return 1;
	}
	png_infop info_ptr = png_create_info_struct(png_ptr);
	if(!info_ptr){
		printf("Error creating png info struct\n");
		png_destroy_read_struct(&png_ptr,(png_infopp)NULL, (png_infopp)NULL);
		return 1;
	}
	//printf("here 2\n");
	//png_uint_32 height = png_get_image_height (png_structp png_ptr, png_infop info_ptr);
	//png_uint_32 width = png_get_image_width (png_structp png_ptr, png_infop info_ptr); 
	png_set_sig_bytes(png_ptr, 8);

	png_init_io(png_ptr, fp);
	//png_set_read_status_fn(png_ptr, read_row_callback);


	png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
	png_uint_32 height = png_get_image_height( (png_structp)png_ptr, (png_infop)info_ptr);
	png_uint_32 width = png_get_image_width( (png_structp)png_ptr, (png_infop)info_ptr);


	png_destroy_read_struct(&png_ptr,(png_infopp)NULL, (png_infopp)NULL);
	fclose(fp);

	//printf("here 3\n");
	fp = fopen(filename, "rb");
    if(!fp){
        printf("Error opening file: %s\n", filename);
        return 1;
    }
    //char header[8];
    fread(&header, 1, 8, fp);
    is_png = !png_sig_cmp((png_bytep)&header, 0, 8);
    if(!is_png){
        return 1;
    }

    //png_set_sig_bytes_read() 

    png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    if(!png_ptr){
        printf("Error creating png read structure!\n");
        return 1;
    }
    info_ptr = png_create_info_struct(png_ptr);
    if(!info_ptr){
        printf("Error creating png info struct\n");
        png_destroy_read_struct(&png_ptr,(png_infopp)NULL, (png_infopp)NULL);
        return 1;
    }
    //png_uint_32 height = png_get_image_height (png_structp png_ptr, png_infop info_ptr);
    //png_uint_32 width = png_get_image_width (png_structp png_ptr, png_infop info_ptr); 
 
    png_set_sig_bytes(png_ptr, 8);
    png_init_io(png_ptr, fp);

	//printf("here 4\n");

//	char **row_pointers = malloc(sizeof(char *)*height);
	//struct image_attr *ia

	//texture = malloc(sizeof(unsigned char)*height*width*3);

//	int count1;
//	for(count1=0; count1<height; count1++){
//		row_pointers[count1] = &ia->image[count1*width];
//	}

	int pixel_size = 3;
	int i;

	if (height > PNG_UINT_32_MAX/png_sizeof(png_byte))
		png_error (png_ptr,"Image is too tall to process in memory");
	if (width > PNG_UINT_32_MAX/pixel_size)
		png_error (png_ptr,"Image is too wide to process in memory");

	//png_bytep *row_pointers = (png_bytep *)malloc( sizeof(png_bytep) * height);




	png_bytepp row_pointers = png_malloc(png_ptr, height*png_sizeof(png_bytep) );
	for (i=0; i<height; i++)
		row_pointers[i]=&Image[i*width*3];
		//row_pointers[i]=png_malloc(png_ptr,width*pixel_size);
	png_set_rows(png_ptr, info_ptr, row_pointers);

	//printf("here 5\n");

	png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
	//printf("here 6\n");
	row_pointers = png_get_rows(png_ptr, info_ptr);

	//png_read_info()
	//png_read_image(png_ptr, (png_bytepp)row_pointers);
	//png_read_end()
//    for(i = 0; i < height; i++)
  //  {
    //    free(row_pointers[i]);
    //}
    //free(row_pointers);
 

	free(row_pointers);

	//printf("here 6\n");
    //height = png_get_image_height( (png_structp)png_ptr, (png_infop)info_ptr);
    //width = png_get_image_width( (png_structp)png_ptr, (png_infop)info_ptr);
	printf("png loaded: w: %d h: %d\n", (int)width, (int)height);

	//ia->width = width;
	//ia->height = height;
	fclose(fp);

	return 0;
}