/** Dato il path, carica la texture e restituisce l'id */ unsigned GlCanvas::loadTexture(char *path) { /* Carica l'immagine png in memoria, usando la libreria pnglite */ png_t png; unsigned int id; png_init(malloc, free); if(png_open_file_read(&png, path) != PNG_NO_ERROR) return 0; unsigned char *data = (unsigned char *) malloc(png.width * png.height * png.bpp); png_get_data(&png, (unsigned char *) data); /* Crea la texture in opengl */ glGenTextures(1, &id); glBindTexture(GL_TEXTURE_2D, id); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, png.bpp, png.width, png.height, 0, GL_RGB, GL_UNSIGNED_BYTE, data); /* Libera la risorsa png */ png_close_file(&png); free(data); /* Restituisce l'id della texture */ return id; }
static void LoadTexture() { png_t gandhi; unsigned char* data; GLuint textureHandle; png_init(0, 0); png_open_file_read(&gandhi, "../demo/Gandhi.png"); data = (unsigned char*) malloc(gandhi.width * gandhi.height * gandhi.bpp); png_get_data(&gandhi, data); glGenTextures(1, &textureHandle); glBindTexture(GL_TEXTURE_2D, textureHandle); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, gandhi.width, gandhi.height, 0, GL_RGB, GL_UNSIGNED_BYTE, data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); png_close_file(&gandhi); free(data); }
static Colour *buffer_from_png(const char *filename, int *width, int *height) { unsigned char *data; Colour *buffer; png_t png; png_init(NULL, NULL); if (png_open_file_read(&png, filename) != PNG_NO_ERROR) { printf("Couldn't open file %s\n", filename); return NULL; } *width = png.width; *height = png.height; assert(png.bpp == 4 || png.bpp == 3); data = calloc(png.width * png.height * png.bpp, 1); int ret = png_get_data(&png, data); if (ret != PNG_NO_ERROR) { printf("%d\n", ret); free(data); printf("Error getting data from png %s\n", filename); return NULL; } if (png.bpp == 4) buffer = colour_buffer_from_rgba(data, png.width, png.height); else buffer = colour_buffer_from_rgb(data, png.width, png.height); free(data); return buffer; }