gsdx:png: Fix gcc clobber warnings

Don't adjust 'image' and just use an additional offset.
'success' was kinda unnecessary when true or false could just be
directly returned.
Move 'compression' clamping out to GSPng::Save instead.

And throw in a whole bunch of const for good measure.
This commit is contained in:
Jonathan Li 2016-12-12 17:39:05 +00:00
parent 415090d249
commit d4a6e18c01
1 changed files with 12 additions and 12 deletions

View File

@ -41,19 +41,17 @@ struct {
namespace GSPng {
bool SaveFile(const string& file, Format fmt, uint8* image, uint8* row,
int width, int height, int pitch, int _compression,
bool rb_swapped = false, bool first_image = false)
bool SaveFile(const string& file, const Format fmt, const uint8* const image,
uint8* const row, const int width, const int height, const int pitch,
const int compression, const bool rb_swapped = false, const bool first_image = false)
{
int channel_bit_depth = pixel[fmt].channel_bit_depth;
int bytes_per_pixel_in = pixel[fmt].bytes_per_pixel_in;
const int channel_bit_depth = pixel[fmt].channel_bit_depth;
const int bytes_per_pixel_in = pixel[fmt].bytes_per_pixel_in;
const int type = first_image ? pixel[fmt].type : PNG_COLOR_TYPE_GRAY;
const int offset = first_image ? 0 : pixel[fmt].bytes_per_pixel_out;
const int bytes_per_pixel_out = first_image ? pixel[fmt].bytes_per_pixel_out : bytes_per_pixel_in - offset;
const int compression = (_compression < 0 || _compression > Z_BEST_COMPRESSION) ? Z_BEST_SPEED : _compression;
FILE *fp = fopen(file.c_str(), "wb");
if (fp == nullptr)
return false;
@ -61,7 +59,6 @@ namespace GSPng {
png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
png_infop info_ptr = nullptr;
bool success = false;
try {
if (png_ptr == nullptr)
throw GSDXRecoverableError();
@ -84,24 +81,24 @@ namespace GSPng {
if (rb_swapped && type != PNG_COLOR_TYPE_GRAY)
png_set_bgr(png_ptr);
for (int y = 0; y < height; ++y, image += pitch) {
for (int y = 0; y < height; ++y) {
for (int x = 0; x < width; ++x)
for (int i = 0; i < bytes_per_pixel_out; ++i)
row[bytes_per_pixel_out * x + i] = image[bytes_per_pixel_in * x + i + offset];
row[bytes_per_pixel_out * x + i] = image[y * pitch + bytes_per_pixel_in * x + i + offset];
png_write_row(png_ptr, row);
}
png_write_end(png_ptr, nullptr);
success = true;
} catch (GSDXRecoverableError&) {
fprintf(stderr, "Failed to write image %s\n", file.c_str());
return false;
}
if (png_ptr)
png_destroy_write_struct(&png_ptr, info_ptr ? &info_ptr : nullptr);
fclose(fp);
return success;
return true;
}
bool Save(GSPng::Format fmt, const string& file, uint8* image, int w, int h, int pitch, int compression, bool rb_swapped)
@ -111,6 +108,9 @@ namespace GSPng {
ASSERT(fmt >= Format::START && fmt < Format::COUNT);
if (compression < 0 || compression > Z_BEST_COMPRESSION)
compression = Z_BEST_SPEED;
std::unique_ptr<uint8[]> row(new uint8[pixel[fmt].bytes_per_pixel_out * w]);
std::string filename = root + pixel[fmt].extension[0];