summaryrefslogtreecommitdiffstats
path: root/ui/gfx
diff options
context:
space:
mode:
authornoel@chromium.org <noel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-25 09:05:01 +0000
committernoel@chromium.org <noel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-25 09:05:01 +0000
commitad7782462e64ceedfd717bf38e29954c9646df8f (patch)
treedc6827e1f7aab1907d5801a1436caa18b6bcf587 /ui/gfx
parenta22d69d9b0cde2161e7dfe83bc91218aaefea61c (diff)
downloadchromium_src-ad7782462e64ceedfd717bf38e29954c9646df8f.zip
chromium_src-ad7782462e64ceedfd717bf38e29954c9646df8f.tar.gz
chromium_src-ad7782462e64ceedfd717bf38e29954c9646df8f.tar.bz2
png_codec_unittest.cc leaks stl::vector row_pointers on encoding error.
Refactor the code to move the creation of the vector row_pointers ahead of the setjmp() point. Remove ScopedPNGStructs since 8 lines to replace 2 ain't worth it. BUG=171898 Review URL: https://chromiumcodereview.appspot.com/12035073 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@178788 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/gfx')
-rw-r--r--ui/gfx/codec/png_codec_unittest.cc52
1 files changed, 22 insertions, 30 deletions
diff --git a/ui/gfx/codec/png_codec_unittest.cc b/ui/gfx/codec/png_codec_unittest.cc
index ef21d38..c22e7b1 100644
--- a/ui/gfx/codec/png_codec_unittest.cc
+++ b/ui/gfx/codec/png_codec_unittest.cc
@@ -154,31 +154,7 @@ bool EncodeImage(const std::vector<unsigned char>& input,
const int interlace_type = PNG_INTERLACE_NONE,
std::vector<png_color>* palette = 0,
std::vector<unsigned char>* palette_alpha = 0) {
- struct ScopedPNGStructs {
- ScopedPNGStructs(png_struct** s, png_info** i) : s_(s), i_(i) {}
- ~ScopedPNGStructs() { png_destroy_write_struct(s_, i_); }
- png_struct** s_;
- png_info** i_;
- };
-
DCHECK(output);
- png_struct* png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,
- NULL, NULL, NULL);
- if (!png_ptr)
- return false;
-
- png_infop info_ptr = png_create_info_struct(png_ptr);
- if (!info_ptr) {
- png_destroy_write_struct(&png_ptr, NULL);
- return false;
- }
-
- ScopedPNGStructs scoped_png_structs(&png_ptr, &info_ptr);
-
- if (setjmp(png_jmpbuf(png_ptr)))
- return false;
-
- png_set_error_fn(png_ptr, NULL, LogLibPNGError, LogLibPNGWarning);
int input_rowbytes = 0;
int transforms = PNG_TRANSFORM_IDENTITY;
@@ -213,10 +189,27 @@ bool EncodeImage(const std::vector<unsigned char>& input,
break;
};
+ png_struct* png_ptr =
+ png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
+ if (!png_ptr)
+ return false;
+ png_infop info_ptr = png_create_info_struct(png_ptr);
+ if (!info_ptr) {
+ png_destroy_write_struct(&png_ptr, NULL);
+ return false;
+ }
+
std::vector<png_bytep> row_pointers(height);
- for (int y = 0 ; y < height; y++) {
+ for (int y = 0 ; y < height; ++y) {
row_pointers[y] = const_cast<unsigned char*>(&input[y * input_rowbytes]);
}
+
+ if (setjmp(png_jmpbuf(png_ptr))) {
+ png_destroy_write_struct(&png_ptr, &info_ptr);
+ return false;
+ }
+
+ png_set_error_fn(png_ptr, NULL, LogLibPNGError, LogLibPNGWarning);
png_set_rows(png_ptr, info_ptr, &row_pointers[0]);
png_set_write_fn(png_ptr, output, WriteImageData, FlushImageData);
png_set_IHDR(png_ptr, info_ptr, width, height, 8, output_color_type,
@@ -225,16 +218,15 @@ bool EncodeImage(const std::vector<unsigned char>& input,
if (output_color_type == COLOR_TYPE_PALETTE) {
png_set_PLTE(png_ptr, info_ptr, &palette->front(), palette->size());
if (palette_alpha) {
- png_set_tRNS(png_ptr,
- info_ptr,
- &palette_alpha->front(),
- palette_alpha->size(),
- NULL);
+ unsigned char* alpha_data = &palette_alpha->front();
+ size_t alpha_size = palette_alpha->size();
+ png_set_tRNS(png_ptr, info_ptr, alpha_data, alpha_size, NULL);
}
}
png_write_png(png_ptr, info_ptr, transforms, NULL);
+ png_destroy_write_struct(&png_ptr, &info_ptr);
return true;
}