summaryrefslogtreecommitdiffstats
path: root/chromium/ui/gfx/codec/png_codec.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ui/gfx/codec/png_codec.cc')
-rw-r--r--chromium/ui/gfx/codec/png_codec.cc100
1 files changed, 66 insertions, 34 deletions
diff --git a/chromium/ui/gfx/codec/png_codec.cc b/chromium/ui/gfx/codec/png_codec.cc
index b3f4345343f..d098eb4ee18 100644
--- a/chromium/ui/gfx/codec/png_codec.cc
+++ b/chromium/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.
+ 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| is left as null
} 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,38 @@ bool EncodeWithCompressionLevel(const unsigned char* input,
return success;
}
+bool InternalEncodeSkBitmap(const SkBitmap& input,
+ bool discard_transparency,
+ int compression_level,
+ std::vector<unsigned char>* output) {
+ if (input.empty() || input.isNull())
+ return false;
+ int bpp = input.bytesPerPixel();
+ DCHECK(bpp == 1 || bpp == 4); // We support kA8_Config and kARGB_8888_Config.
+
+ SkAutoLockPixels lock_input(input);
+ unsigned char* inputAddr = bpp == 1 ?
+ reinterpret_cast<unsigned char*>(input.getAddr8(0, 0)) :
+ reinterpret_cast<unsigned char*>(input.getAddr32(0, 0)); // bpp = 4
+ return EncodeWithCompressionLevel(
+ inputAddr,
+ 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 +782,29 @@ 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;
-
- if (input.empty())
- return false;
- DCHECK_EQ(input.bytesPerPixel(), bbp);
- DCHECK_GE(static_cast<int>(input.rowBytes()), input.width() * bbp);
+ return InternalEncodeSkBitmap(input,
+ 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) {
+ return InternalEncodeSkBitmap(input,
+ 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;
-
- 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,
+ discard_transparency,
+ Z_BEST_SPEED,
+ output);
}
PNGCodec::Comment::Comment(const std::string& k, const std::string& t)