Advertisement
Guest User

Untitled

a guest
Oct 18th, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.97 KB | None | 0 0
  1. #include "Texture.h"
  2. #include <png.h>
  3. #include "utils.h"
  4. #include "Global.h"
  5.  
  6. Texture::Texture()
  7. {
  8.  
  9. }
  10.  
  11.  
  12. Texture::~Texture()
  13. {
  14. }
  15.  
  16. bool Texture::load(char * filePath)
  17. {
  18.  
  19. FILE *f;
  20. int is_png, bit_depth, color_type, row_bytes, i;
  21.  
  22. png_infop info_ptr;
  23. png_uint_32 t_width, t_height;
  24. png_byte header[8], *image_data;
  25.  
  26. png_bytepp row_pointers;
  27. png_structp png_ptr;
  28. int alpha;
  29.  
  30.  
  31. if (!(f = fopen(filePath, "rb")))
  32. return false;
  33.  
  34. fread(header, 1, 8, f);
  35. is_png = !png_sig_cmp((png_const_bytep)header, 0, 8);
  36. if (!is_png) {
  37. printf("%s is not a png!\n", filePath);
  38. fclose(f);
  39. return false;
  40. }
  41.  
  42. png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
  43.  
  44. if (!png_ptr) {
  45. fclose(f);
  46. return false;
  47. }
  48.  
  49. info_ptr = png_create_info_struct(png_ptr);
  50.  
  51. if (!info_ptr) {
  52. png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
  53. fclose(f);
  54. return false;
  55. }
  56.  
  57.  
  58. if (setjmp(png_jmpbuf(png_ptr))) {
  59. png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
  60. fclose(f);
  61. return false;
  62. }
  63.  
  64. png_init_io(png_ptr, f);
  65. png_set_sig_bytes(png_ptr, 8);
  66. png_read_info(png_ptr, info_ptr);
  67. png_get_IHDR(png_ptr, info_ptr, &t_width, &t_height, &bit_depth, &color_type, NULL, NULL, NULL);
  68.  
  69. this->width = t_width;
  70. this->height = t_height;
  71.  
  72. png_read_update_info(png_ptr, info_ptr);
  73.  
  74. row_bytes = png_get_rowbytes(png_ptr, info_ptr);
  75. image_data = (png_bytep)malloc(row_bytes * t_height * sizeof(png_byte));
  76.  
  77. if (!image_data) {
  78. png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
  79. fclose(f);
  80. return false;
  81. }
  82.  
  83. row_pointers = (png_bytepp)malloc(t_height * sizeof(png_bytep));
  84.  
  85. if (!row_pointers) {
  86. png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
  87. free(image_data);
  88. fclose(f);
  89. return false;
  90. }
  91.  
  92. for (i = 0; i < t_height; i++) {
  93. row_pointers[t_height - 1 - i] = image_data + i * row_bytes;
  94. }
  95. png_read_image(png_ptr, row_pointers);
  96. png_read_end(png_ptr, info_ptr);
  97.  
  98. switch (png_get_color_type(png_ptr, info_ptr)) {
  99. case PNG_COLOR_TYPE_RGBA:
  100. alpha = GL_RGBA;
  101. break;
  102. case PNG_COLOR_TYPE_RGB:
  103. alpha = GL_RGB;
  104. break;
  105. default:
  106. printf("Color type %d not supported!\n", png_get_color_type(png_ptr, info_ptr));
  107. png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
  108. return false;
  109. }
  110. glEnable(GL_TEXTURE_2D);
  111. glGenTextures(1, &this->texID);
  112. glBindTexture(GL_TEXTURE_2D, this->texID);
  113. glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  114. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, this->width, this->height, 0, alpha, GL_UNSIGNED_BYTE, image_data);
  115. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  116. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  117.  
  118. png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
  119. free(image_data);
  120. free(row_pointers);
  121. fclose(f);
  122. return true;
  123. }
  124.  
  125. unsigned int Texture::getID() {
  126. return this->texID;
  127. }
  128.  
  129. int Texture::getWidth() {
  130. return this->width;
  131. }
  132.  
  133. int Texture::getHeight() {
  134. return this->height;
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement