ImageReader.cpp 1.1 KB

123456789101112131415161718192021222324252627282930313233343536
  1. #include <lodepng/lodepng.h>
  2. #include "images/ImageReader.h"
  3. #include "utils/Cleaner.h"
  4. static void cleanRawData(ColorChannel*& c) {
  5. free(c);
  6. }
  7. static void cleanState(LodePNGState& state) {
  8. lodepng_state_cleanup(&state);
  9. }
  10. Error ImageReader::load(Image& image, const char* path) {
  11. Cleaner<ColorChannel*, cleanRawData> rawData(nullptr);
  12. size_t rawSize;
  13. unsigned int error = lodepng_load_file(&rawData, &rawSize, path);
  14. if(error) {
  15. Error e{"cannot load file '"};
  16. e.message.append(path).append("': ").append(lodepng_error_text(error));
  17. return e;
  18. }
  19. Cleaner<LodePNGState, cleanState> state;
  20. lodepng_state_init(&state);
  21. state->decoder.color_convert = false;
  22. error = lodepng_decode(&image.data, &image.width, &image.height, &state,
  23. rawData, rawSize);
  24. if(error) {
  25. Error e{"cannot decode file '"};
  26. e.message.append(path).append("'").append(lodepng_error_text(error));
  27. return e;
  28. }
  29. image.channels = lodepng_get_channels(&state->info_png.color);
  30. image.bitdepth = state->info_png.color.bitdepth;
  31. return {};
  32. }