PNGReader.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include <lodepng/lodepng.h>
  2. #include "images/PNGReader.h"
  3. PNGReader::PNGReader()
  4. : width(0), height(0), channels(0), rawData(nullptr), data(nullptr) {
  5. }
  6. PNGReader::~PNGReader() {
  7. clean();
  8. }
  9. Error PNGReader::load(const char* path) {
  10. clean();
  11. Error error = loadIntern(path);
  12. if(error.has()) {
  13. clean();
  14. }
  15. return error;
  16. }
  17. Error PNGReader::loadIntern(const char* path) {
  18. size_t rawSize;
  19. unsigned int error = lodepng_load_file(&rawData, &rawSize, path);
  20. if(error) {
  21. Error e = {"cannot load file '"};
  22. e.message.append(path).append("': ").append(lodepng_error_text(error));
  23. return e;
  24. }
  25. LodePNGState state;
  26. lodepng_state_init(&state);
  27. state.decoder.color_convert = false;
  28. error = lodepng_decode(&data, &width, &height, &state, rawData, rawSize);
  29. if(error) {
  30. Error e = {"cannot decode file '"};
  31. e.message.append(path).append("'").append(lodepng_error_text(error));
  32. return e;
  33. }
  34. channels = lodepng_get_channels(&state.info_png.color);
  35. if(channels < 1 || channels > 4) {
  36. Error error = {"'"};
  37. error.message.append(path)
  38. .append("' has unsupported number of channels: ")
  39. .append(channels);
  40. return error;
  41. } else if(state.info_png.color.bitdepth != 8) {
  42. Error error = {"bit depth of '"};
  43. error.message.append(path).append("' is not 8");
  44. return error;
  45. }
  46. return {};
  47. }
  48. void PNGReader::clean() {
  49. free(rawData);
  50. free(data);
  51. rawData = nullptr;
  52. data = nullptr;
  53. width = 0;
  54. height = 0;
  55. channels = 0;
  56. }
  57. int PNGReader::getWidth() const {
  58. return width;
  59. }
  60. int PNGReader::getHeight() const {
  61. return height;
  62. }
  63. int PNGReader::getChannels() const {
  64. return channels;
  65. }
  66. const ColorChannel* PNGReader::getData() const {
  67. return data;
  68. }