Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "Texture.h"
- #include <png.h>
- #include "utils.h"
- #include "Global.h"
- Texture::Texture()
- {
- }
- Texture::~Texture()
- {
- }
- bool Texture::load(char * filePath)
- {
- FILE *f;
- int is_png, bit_depth, color_type, row_bytes, i;
- png_infop info_ptr;
- png_uint_32 t_width, t_height;
- png_byte header[8], *image_data;
- png_bytepp row_pointers;
- png_structp png_ptr;
- int alpha;
- if (!(f = fopen(filePath, "rb")))
- return false;
- fread(header, 1, 8, f);
- is_png = !png_sig_cmp((png_const_bytep)header, 0, 8);
- if (!is_png) {
- printf("%s is not a png!\n", filePath);
- fclose(f);
- return false;
- }
- png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
- if (!png_ptr) {
- fclose(f);
- return false;
- }
- info_ptr = png_create_info_struct(png_ptr);
- if (!info_ptr) {
- png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
- fclose(f);
- return false;
- }
- if (setjmp(png_jmpbuf(png_ptr))) {
- png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
- fclose(f);
- return false;
- }
- png_init_io(png_ptr, f);
- png_set_sig_bytes(png_ptr, 8);
- png_read_info(png_ptr, info_ptr);
- png_get_IHDR(png_ptr, info_ptr, &t_width, &t_height, &bit_depth, &color_type, NULL, NULL, NULL);
- this->width = t_width;
- this->height = t_height;
- png_read_update_info(png_ptr, info_ptr);
- row_bytes = png_get_rowbytes(png_ptr, info_ptr);
- image_data = (png_bytep)malloc(row_bytes * t_height * sizeof(png_byte));
- if (!image_data) {
- png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
- fclose(f);
- return false;
- }
- row_pointers = (png_bytepp)malloc(t_height * sizeof(png_bytep));
- if (!row_pointers) {
- png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
- free(image_data);
- fclose(f);
- return false;
- }
- for (i = 0; i < t_height; i++) {
- row_pointers[t_height - 1 - i] = image_data + i * row_bytes;
- }
- png_read_image(png_ptr, row_pointers);
- png_read_end(png_ptr, info_ptr);
- switch (png_get_color_type(png_ptr, info_ptr)) {
- case PNG_COLOR_TYPE_RGBA:
- alpha = GL_RGBA;
- break;
- case PNG_COLOR_TYPE_RGB:
- alpha = GL_RGB;
- break;
- default:
- printf("Color type %d not supported!\n", png_get_color_type(png_ptr, info_ptr));
- png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
- return false;
- }
- glEnable(GL_TEXTURE_2D);
- glGenTextures(1, &this->texID);
- glBindTexture(GL_TEXTURE_2D, this->texID);
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, this->width, this->height, 0, alpha, GL_UNSIGNED_BYTE, image_data);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
- free(image_data);
- free(row_pointers);
- fclose(f);
- return true;
- }
- unsigned int Texture::getID() {
- return this->texID;
- }
- int Texture::getWidth() {
- return this->width;
- }
- int Texture::getHeight() {
- return this->height;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement