Index: ui/gfx/codec/png_codec.cc |
diff --git a/ui/gfx/codec/png_codec.cc b/ui/gfx/codec/png_codec.cc |
index b3f4345343f0d15a49c0cfc9c759bed662cc4189..201b7a6b8a6ade309df1cffe4a380800450636b7 100644 |
--- a/ui/gfx/codec/png_codec.cc |
+++ b/ui/gfx/codec/png_codec.cc |
@@ -678,15 +678,29 @@ bool EncodeWithCompressionLevel(const unsigned char* input, |
break; |
case PNGCodec::FORMAT_SkBitmap: |
- input_color_components = 4; |
- if (discard_transparency) { |
- output_color_components = 3; |
- png_output_color_type = PNG_COLOR_TYPE_RGB; |
- converter = ConvertSkiatoRGB; |
+ // Compare row_byte_width and size.width() to detect the format of |
+ // SkBitmap. kA8_Config (1bpp) and kARGB_8888_Config (4bpp) are the two |
+ // supported formats |
Peter Kasting
2014/01/25 03:29:58
Nit: Trailing period
mfomitchev
2014/01/27 17:15:28
Done.
|
+ if (row_byte_width < 4 * size.width()) { |
+ // Not 4bpp, so must be 1bpp. |
+ // Ignore discard_transparency - it doesn't make sense in this context, |
+ // since alpha is the only thing we have and it needs to be used for |
+ // color intensity. |
+ input_color_components = 1; |
+ output_color_components = 1; |
+ png_output_color_type = PNG_COLOR_TYPE_GRAY; |
+ //converter = NULL; |
Peter Kasting
2014/01/25 03:29:58
Nit: Remove this line. If you need to explain tha
mfomitchev
2014/01/27 17:15:28
Done.
|
} else { |
- output_color_components = 4; |
- png_output_color_type = PNG_COLOR_TYPE_RGB_ALPHA; |
- converter = ConvertSkiatoRGBA; |
+ input_color_components = 4; |
+ if (discard_transparency) { |
+ output_color_components = 3; |
+ png_output_color_type = PNG_COLOR_TYPE_RGB; |
+ converter = ConvertSkiatoRGB; |
+ } else { |
+ output_color_components = 4; |
+ png_output_color_type = PNG_COLOR_TYPE_RGB_ALPHA; |
+ converter = ConvertSkiatoRGBA; |
+ } |
} |
break; |
@@ -719,12 +733,36 @@ bool EncodeWithCompressionLevel(const unsigned char* input, |
return success; |
} |
+bool InternalEncodeSkBitmap(const SkBitmap& input, |
+ int bpp, |
+ bool discard_transparency, |
+ int compression_level, |
+ std::vector<unsigned char>* output) { |
+ if (input.empty()) |
+ return false; |
+ DCHECK_EQ(input.bytesPerPixel(), bpp); |
Peter Kasting
2014/01/25 03:29:58
If these are always equal, why pass |bpp| at all?
mfomitchev
2014/01/27 17:15:28
Now EncodeA8SkBitmap() and EncodeBGRASkBitmap() ar
mfomitchev
2014/01/27 17:15:28
Now EncodeA8SkBitmap() and EncodeBGRASkBitmap() ar
|
+ DCHECK_GE(static_cast<int>(input.rowBytes()), input.width() * bpp); |
+ |
+ SkAutoLockPixels lock_input(input); |
+ return EncodeWithCompressionLevel( |
+ reinterpret_cast<unsigned char*>(input.getAddr32(0, 0)), |
+ PNGCodec::FORMAT_SkBitmap, |
+ Size(input.width(), input.height()), |
+ static_cast<int>(input.rowBytes()), |
+ discard_transparency, |
+ std::vector<PNGCodec::Comment>(), |
+ compression_level, |
+ output); |
+} |
+ |
} // namespace |
// static |
-bool PNGCodec::Encode(const unsigned char* input, ColorFormat format, |
- const Size& size, int row_byte_width, |
+bool PNGCodec::Encode(const unsigned char* input, |
+ ColorFormat format, |
+ const Size& size, |
+ int row_byte_width, |
bool discard_transparency, |
const std::vector<Comment>& comments, |
std::vector<unsigned char>* output) { |
@@ -742,37 +780,38 @@ bool PNGCodec::Encode(const unsigned char* input, ColorFormat format, |
bool PNGCodec::EncodeBGRASkBitmap(const SkBitmap& input, |
bool discard_transparency, |
std::vector<unsigned char>* output) { |
- static const int bbp = 4; |
+ static const int bpp = 4; |
- if (input.empty()) |
- return false; |
- DCHECK_EQ(input.bytesPerPixel(), bbp); |
- DCHECK_GE(static_cast<int>(input.rowBytes()), input.width() * bbp); |
+ return InternalEncodeSkBitmap(input, |
+ bpp, |
+ discard_transparency, |
+ Z_DEFAULT_COMPRESSION, |
+ output); |
+} |
- SkAutoLockPixels lock_input(input); |
- return Encode(reinterpret_cast<unsigned char*>(input.getAddr32(0, 0)), |
- FORMAT_SkBitmap, Size(input.width(), input.height()), |
- static_cast<int>(input.rowBytes()), discard_transparency, |
- std::vector<Comment>(), output); |
+// static |
+bool PNGCodec::EncodeA8SkBitmap(const SkBitmap& input, |
+ std::vector<unsigned char>* output) { |
Peter Kasting
2014/01/25 03:29:58
Nit: Fix indenting
mfomitchev
2014/01/27 17:15:28
Done.
|
+ static const int bpp = 1; |
+ |
+ return InternalEncodeSkBitmap(input, |
+ bpp, |
+ false, |
+ Z_DEFAULT_COMPRESSION, |
+ output); |
} |
// static |
bool PNGCodec::FastEncodeBGRASkBitmap(const SkBitmap& input, |
bool discard_transparency, |
std::vector<unsigned char>* output) { |
- static const int bbp = 4; |
+ static const int bpp = 4; |
- if (input.empty()) |
- return false; |
- DCHECK_EQ(input.bytesPerPixel(), bbp); |
- DCHECK_GE(static_cast<int>(input.rowBytes()), input.width() * bbp); |
- |
- SkAutoLockPixels lock_input(input); |
- return EncodeWithCompressionLevel( |
- reinterpret_cast<unsigned char*>(input.getAddr32(0, 0)), |
- FORMAT_SkBitmap, Size(input.width(), input.height()), |
- static_cast<int>(input.rowBytes()), discard_transparency, |
- std::vector<Comment>(), Z_BEST_SPEED, output); |
+ return InternalEncodeSkBitmap(input, |
+ bpp, |
+ discard_transparency, |
+ Z_BEST_SPEED, |
+ output); |
} |
PNGCodec::Comment::Comment(const std::string& k, const std::string& t) |