diff --git a/testing/image_diff/image_diff_png.cpp b/testing/image_diff/image_diff_png.cpp
index 9825e28..ef9d4aa 100644
--- a/testing/image_diff/image_diff_png.cpp
+++ b/testing/image_diff/image_diff_png.cpp
@@ -101,56 +101,47 @@
   }
 }
 
-}  // namespace
-
 // Decoder
 //
 // This code is based on WebKit libpng interface (PNGImageDecoder), which is
 // in turn based on the Mozilla png decoder.
 
-namespace {
-
 // Gamma constants: We assume we're on Windows which uses a gamma of 2.2.
-const double kMaxGamma = 21474.83;  // Maximum gamma accepted by png library.
-const double kDefaultGamma = 2.2;
-const double kInverseGamma = 1.0 / kDefaultGamma;
+constexpr double kDefaultGamma = 2.2;
+
+// Maximum gamma accepted by PNG library.
+constexpr double kMaxGamma = 21474.83;
+
+constexpr double kInverseGamma = 1.0 / kDefaultGamma;
 
 class PngDecoderState {
  public:
-  // Output is a vector<unsigned char>.
-  PngDecoderState(ColorFormat ofmt, std::vector<unsigned char>* o)
-      : output_format(ofmt),
-        output_channels(0),
-        is_opaque(true),
-        output(o),
-        row_converter(nullptr),
-        width(0),
-        height(0),
-        done(false) {}
+  PngDecoderState(ColorFormat ofmt, std::vector<unsigned char>* out)
+      : output_format(ofmt), output(out) {}
 
-  ColorFormat output_format;
-  int output_channels;
+  const ColorFormat output_format;
+  int output_channels = 0;
 
   // Used during the reading of an SkBitmap. Defaults to true until we see a
   // pixel with anything other than an alpha of 255.
-  bool is_opaque;
+  bool is_opaque = true;
 
   // An intermediary buffer for decode output.
-  std::vector<unsigned char>* output;
+  std::vector<unsigned char>* const output;
 
   // Called to convert a row from the library to the correct output format.
-  // When NULL, no conversion is necessary.
+  // When null, no conversion is necessary.
   void (*row_converter)(const unsigned char* in,
                         int w,
                         unsigned char* out,
-                        bool* is_opaque);
+                        bool* is_opaque) = nullptr;
 
   // Size of the image, set in the info callback.
-  int width;
-  int height;
+  int width = 0;
+  int height = 0;
 
   // Set to true when we've found the end of the data.
-  bool done;
+  bool done = false;
 };
 
 void ConvertRGBtoRGBA(const unsigned char* rgb,
@@ -304,7 +295,7 @@
     return;
   }
 
-  unsigned char* base = NULL;
+  unsigned char* base = nullptr;
   base = &state->output->front();
 
   unsigned char* dest = &base[state->width * state->output_channels * row_num];
@@ -328,7 +319,7 @@
 class PngReadStructDestroyer {
  public:
   PngReadStructDestroyer(png_struct** ps, png_info** pi) : ps_(ps), pi_(pi) {}
-  ~PngReadStructDestroyer() { png_destroy_read_struct(ps_, pi_, NULL); }
+  ~PngReadStructDestroyer() { png_destroy_read_struct(ps_, pi_, nullptr); }
 
  private:
   png_struct** ps_;
@@ -346,30 +337,28 @@
   if (png_sig_cmp(const_cast<unsigned char*>(input), 0, 8) != 0)
     return false;
 
-  *png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
+  *png_ptr =
+      png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
   if (!*png_ptr)
     return false;
 
   *info_ptr = png_create_info_struct(*png_ptr);
   if (!*info_ptr) {
-    png_destroy_read_struct(png_ptr, NULL, NULL);
+    png_destroy_read_struct(png_ptr, nullptr, nullptr);
     return false;
   }
 
   return true;
 }
 
-}  // namespace
-
-// static
 std::vector<unsigned char> Decode(const unsigned char* input,
                                   size_t input_size,
                                   ColorFormat format,
                                   int* w,
                                   int* h) {
   std::vector<unsigned char> output;
-  png_struct* png_ptr = NULL;
-  png_info* info_ptr = NULL;
+  png_struct* png_ptr = nullptr;
+  png_info* info_ptr = nullptr;
   if (!BuildPNGStruct(input, input_size, &png_ptr, &info_ptr))
     return output;
 
@@ -405,8 +394,6 @@
 // This section of the code is based on nsPNGEncoder.cpp in Mozilla
 // (Copyright 2005 Google Inc.)
 
-namespace {
-
 // Passed around as the io_ptr in the png structs so our callbacks know where
 // to write data.
 struct PngEncoderState {
@@ -518,7 +505,7 @@
 #ifdef PNG_TEXT_SUPPORTED
   CommentWriter comment_writer(comments);
 #endif
-  unsigned char* row_buffer = NULL;
+  unsigned char* row_buffer = nullptr;
 
   // Make sure to not declare any locals here -- locals in the presence
   // of setjmp() in C++ code makes gcc complain.
@@ -556,7 +543,7 @@
     // Needs conversion using a separate buffer.
     row_buffer = new unsigned char[width * output_color_components];
     for (int y = 0; y < height; y++) {
-      converter(&input[y * row_byte_width], width, row_buffer, NULL);
+      converter(&input[y * row_byte_width], width, row_buffer, nullptr);
       png_write_row(png_ptr, row_buffer);
     }
     delete[] row_buffer;
@@ -566,9 +553,6 @@
   return true;
 }
 
-}  // namespace
-
-// static
 std::vector<unsigned char> EncodeWithCompressionLevel(
     const unsigned char* input,
     ColorFormat format,
@@ -580,7 +564,7 @@
     int compression_level) {
   std::vector<unsigned char> output;
 
-  // Run to convert an input row into the output row format, NULL means no
+  // Run to convert an input row into the output row format, nullptr means no
   // conversion is necessary.
   FormatConverter converter = nullptr;
 
@@ -640,12 +624,12 @@
     return output;
 
   png_struct* png_ptr =
-      png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
+      png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
   if (!png_ptr)
     return output;
   png_info* info_ptr = png_create_info_struct(png_ptr);
   if (!info_ptr) {
-    png_destroy_write_struct(&png_ptr, NULL);
+    png_destroy_write_struct(&png_ptr, nullptr);
     return output;
   }
 
@@ -661,7 +645,6 @@
   return output;
 }
 
-// static
 std::vector<unsigned char> Encode(const unsigned char* input,
                                   ColorFormat format,
                                   const int width,
@@ -674,6 +657,8 @@
                                     comments, Z_DEFAULT_COMPRESSION);
 }
 
+}  // namespace
+
 std::vector<unsigned char> DecodePNG(const unsigned char* input,
                                      size_t input_size,
                                      int* width,
