| 232 | } |
| 233 | |
| 234 | bool PNGFileLoader(RGBA8Image* image, const char* filename, std::FILE* fp) |
| 235 | { |
| 236 | png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr); |
| 237 | if (!png_ptr) |
| 238 | return false; |
| 239 | |
| 240 | png_infop info_ptr = png_create_info_struct(png_ptr); |
| 241 | if (!info_ptr) |
| 242 | { |
| 243 | png_destroy_read_struct(&png_ptr, nullptr, nullptr); |
| 244 | return false; |
| 245 | } |
| 246 | |
| 247 | ScopedGuard cleanup([&png_ptr, &info_ptr]() { png_destroy_read_struct(&png_ptr, &info_ptr, nullptr); }); |
| 248 | |
| 249 | std::vector<u32> new_data; |
| 250 | std::vector<png_bytep> row_pointers; |
| 251 | |
| 252 | if (setjmp(png_jmpbuf(png_ptr))) |
| 253 | return false; |
| 254 | |
| 255 | png_set_read_fn(png_ptr, fp, [](png_structp png_ptr, png_bytep data_ptr, png_size_t size) { |
| 256 | std::FILE* fp = static_cast<std::FILE*>(png_get_io_ptr(png_ptr)); |
| 257 | if (std::fread(data_ptr, size, 1, fp) != 1) |
| 258 | png_error(png_ptr, "Read error"); |
| 259 | }); |
| 260 | |
| 261 | return PNGCommonLoader(image, png_ptr, info_ptr, new_data, row_pointers); |
| 262 | } |
| 263 | |
| 264 | bool PNGBufferLoader(RGBA8Image* image, const void* buffer, size_t buffer_size) |
| 265 | { |
nothing calls this directly
no test coverage detected