// �摜��\�����邾��
// �㉺�t�ɂȂ��Ă܂��B
// �u�����h�w�肵�ĂȂ��̂ŃA���t�@�����ĂȂ��ł��B

#include <string>
//#include <stdlib.h>
#include "GL/glut.h"
#include "GL/freeglut_ext.h"
#include "png.h"

unsigned int id; // �e�N�X�`��ID

FILE            *fp;
png_structp     png_ptr;
png_infop       info_ptr;
unsigned int   width, height;
int             bit_depth, color_type, interlace_type;
unsigned char   *image;
int             i;

void display(void)
{
	glClear(GL_COLOR_BUFFER_BIT);

	glBindTexture(GL_TEXTURE_2D , id);

	glBegin(GL_POLYGON);
		glTexCoord2f(0 , 0); glVertex2f(-0.9 , -0.9);
		glTexCoord2f(0 , 1); glVertex2f(-0.9 , 0.9);
		glTexCoord2f(1 , 1); glVertex2f(0.9 , 0.9);
		glTexCoord2f(1 , 0); glVertex2f(0.9 , -0.9);
	glEnd();

	glFlush();
}

void init(void)
{
	glClearColor(0.0, 0.0, 1.0, 1.0);

	
	errno_t error;

	if ( (error = fopen_s(&fp,"texture_00.png","rb")) != 0 ) {
		// �G���[����
		printf("file not exists!");
		return;
	}

	png_ptr = png_create_read_struct(                       // png_ptr�\���̂��m�ہE�����܂�
	                PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
	info_ptr = png_create_info_struct(png_ptr);             // info_ptr�\���̂��m�ہE�����܂�

//	png_read_png(png_ptr,info_ptr,0,NULL);

	png_init_io(png_ptr, fp);                               // libpng��fp��m�点�܂�
	png_read_info(png_ptr, info_ptr);                       // PNG�t�@�C���̃w�b�_��ǂݍ��݂܂�
	png_get_IHDR(png_ptr, info_ptr, &width, &height,        // IHDR�`�����N�����擾���܂�
	                &bit_depth, &color_type, &interlace_type,
	                NULL, NULL);
	// �������̈�m��
    int rb = png_get_rowbytes(png_ptr, info_ptr);
    image = new unsigned char[height * rb];
    unsigned char **recv = new unsigned char*[height];
    for (int i = 0; i < height; i++)
        recv[i] = &image[i * rb];
    png_read_image(png_ptr, recv);
    png_read_end(png_ptr, info_ptr);
    png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
    fclose(fp);
    delete[] recv;

	//image = (png_bytepp)malloc(height * sizeof(png_bytep)); // �ȉ��R�s�͂Q�����z����m�ۂ��܂�
	//for (i = 0; i < height; i++)
	//        image[i] = (png_bytep)malloc(png_get_rowbytes(png_ptr, info_ptr));
	//png_read_image(png_ptr, image);                         // �摜�f�[�^��ǂݍ��݂܂�
	//
	//png_destroy_read_struct(                                // �Q�̍\���̂̃����������܂�
	//        &png_ptr, &info_ptr, (png_infopp)NULL);
	//fclose(fp);                                             // �t�@�C������܂�


	glEnable(GL_TEXTURE_2D);
	glGenTextures(1 , &id);

    // �e�N�X�`���ւ̓o�^
	glBindTexture(GL_TEXTURE_2D, id);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    
	glTexImage2D(
		GL_TEXTURE_2D , 0 , GL_RGBA , width , height ,
		0 , GL_RGBA , GL_UNSIGNED_BYTE , image
	);
	//gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height, GL_RGBA, GL_UNSIGNED_BYTE, image);

}

void release()
{
	//for (i = 0; i < height; i++) free(image[i]);            // �ȉ��Q�s�͂Q�����z������܂�
	free(image);

	glDeleteTextures(1 , &id);
}

int main(int argc, char *argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA);
	glutCreateWindow(argv[0]);
	init();
	glutDisplayFunc(display);
	glutMainLoop();
	return 0;
}

