Index: ui/gfx/codec/png_codec.cc |
diff --git a/ui/gfx/codec/png_codec.cc b/ui/gfx/codec/png_codec.cc |
index ac386ad91d0b656e146776c8077694c881719e99..d6f49d1934f2ad916d27100d1c4d1ee9b3299203 100644 |
--- a/ui/gfx/codec/png_codec.cc |
+++ b/ui/gfx/codec/png_codec.cc |
@@ -328,22 +328,20 @@ class PngReadStructDestroyer { |
DISALLOW_COPY_AND_ASSIGN(PngReadStructDestroyer); |
}; |
-// Automatically destroys the given write structs on destruction to make |
-// cleanup and error handling code cleaner. |
-class PngWriteStructDestroyer { |
+// Holds png struct and info ensuring the proper destruction. |
+class PngWriteStructInfo { |
public: |
- explicit PngWriteStructDestroyer(png_struct** ps) : ps_(ps), pi_(0) { |
- } |
- ~PngWriteStructDestroyer() { |
- png_destroy_write_struct(ps_, pi_); |
+ explicit PngWriteStructInfo() : png_str_(0), info_ptr_(0) { |
Nico
2016/12/14 23:47:52
(minor nit: "str" means "string" for me, not struc
dcheng
2016/12/14 23:48:52
Minor nit: no explicit, and use nullptr
krasin1
2016/12/14 23:53:47
Done.
|
} |
- void SetInfoStruct(png_info** pi) { |
- pi_ = pi; |
+ |
+ ~PngWriteStructInfo() { |
+ png_destroy_write_struct(&png_str_, &info_ptr_); |
} |
+ |
+ png_struct* png_str_; |
+ png_info* info_ptr_; |
private: |
- png_struct** ps_; |
- png_info** pi_; |
- DISALLOW_COPY_AND_ASSIGN(PngWriteStructDestroyer); |
+ DISALLOW_COPY_AND_ASSIGN(PngWriteStructInfo); |
}; |
bool BuildPNGStruct(const unsigned char* input, size_t input_size, |
@@ -708,15 +706,15 @@ bool EncodeWithCompressionLevel(const unsigned char* input, |
// Row stride should be at least as long as the length of the data. |
DCHECK(input_color_components * size.width() <= row_byte_width); |
- png_struct* png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, |
- NULL, NULL, NULL); |
- if (!png_ptr) |
+ PngWriteStructInfo si; |
+ si.png_str_ = png_create_write_struct(PNG_LIBPNG_VER_STRING, |
+ NULL, NULL, NULL); |
+ if (!si.png_str_) |
return false; |
- PngWriteStructDestroyer destroyer(&png_ptr); |
- png_info* info_ptr = png_create_info_struct(png_ptr); |
- if (!info_ptr) |
+ |
+ si.info_ptr_ = png_create_info_struct(si.png_str_); |
+ if (!si.info_ptr_) |
return false; |
- destroyer.SetInfoStruct(&info_ptr); |
output->clear(); |