ImageReader.cpp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #pragma GCC diagnostic push
  2. #pragma GCC diagnostic ignored "-Wmissing-declarations"
  3. #pragma GCC diagnostic ignored "-Wpadded"
  4. #include "libs/lodepng/lodepng.h"
  5. #pragma GCC diagnostic pop
  6. #include "io/ImageReader.h"
  7. #include "utils/Cleaner.h"
  8. static void cleanRawData(ColorChannel*& c) {
  9. free(c);
  10. }
  11. static void cleanState(LodePNGState& state) {
  12. lodepng_state_cleanup(&state);
  13. }
  14. ImageReader::Image::Image() : data(nullptr) {
  15. }
  16. Error ImageReader::load(Image& image, const char* path) {
  17. Cleaner<ColorChannel*, cleanRawData> rawData(nullptr);
  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. Cleaner<LodePNGState, cleanState> state;
  26. lodepng_state_init(&state);
  27. state->decoder.color_convert = false;
  28. error = lodepng_decode(&image.data, &image.width, &image.height, &state,
  29. rawData, rawSize);
  30. if(error) {
  31. Error e{"cannot decode file '"};
  32. e.message.append(path).append("'").append(lodepng_error_text(error));
  33. return e;
  34. }
  35. image.channels = lodepng_get_channels(&state->info_png.color);
  36. image.bitdepth = state->info_png.color.bitdepth;
  37. return {};
  38. }