36 png_bytep *row_pointers;
39 if (SDL_MUSTLOCK(surface))
40 SDL_LockSurface(surface);
42 png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,
nullptr,
nullptr,
nullptr);
45 Log::info(
"Had trouble creating png_structp");
49 info_ptr = png_create_info_struct(png_ptr);
52 png_destroy_write_struct(&png_ptr, (png_infopp)
nullptr);
57 if (setjmp(png_jmpbuf(png_ptr)))
59 png_destroy_write_struct(&png_ptr, (png_infopp)
nullptr);
60 Log::info(
"problem writing to %s", filename.c_str());
64 FILE *fp = fopen(filename.c_str(),
"wb");
67 Log::info(
"could not open file %s for writing", filename.c_str());
71 png_init_io(png_ptr, fp);
73 colortype = (surface->format->BitsPerPixel == 24) ?
74 PNG_COLOR_TYPE_RGB : PNG_COLOR_TYPE_RGB_ALPHA;
76 png_set_IHDR(png_ptr, info_ptr, surface->w, surface->h, 8, colortype,
77 PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
79 png_write_info(png_ptr, info_ptr);
81 png_set_packing(png_ptr);
83 row_pointers =
new png_bytep[surface->h];
86 Log::info(
"Had trouble converting surface to row pointers");
91 for (
int i = 0; i < surface->h; i++)
93 row_pointers[i] = (png_bytep)(Uint8 *)surface->pixels + i * surface->pitch;
96 png_write_image(png_ptr, row_pointers);
97 png_write_end(png_ptr, info_ptr);
101 delete [] row_pointers;
103 png_destroy_write_struct(&png_ptr, (png_infopp)
nullptr);
105 if (SDL_MUSTLOCK(surface))
106 SDL_UnlockSurface(surface);