Chromium Code Reviews| Index: dm/DM.cpp |
| diff --git a/dm/DM.cpp b/dm/DM.cpp |
| index c637edd9b9f9c62f902b6bb274bcaad97f69d836..8537313cf33e8697e831a219b48c86d93119e49d 100644 |
| --- a/dm/DM.cpp |
| +++ b/dm/DM.cpp |
| @@ -28,6 +28,12 @@ |
| #include "Timer.h" |
| #include "sk_tool_utils.h" |
| +#ifdef SKIA_PNG_PREFIXED |
| + // this must proceed png.h |
| + #include "pngprefix.h" |
| +#endif |
| +#include "png.h" |
| + |
| DEFINE_string(src, "tests gm skp image", "Source types to test."); |
| DEFINE_bool(nameByHash, false, |
| "If true, write to FLAGS_writePath[0]/<hash>.png instead of " |
| @@ -466,6 +472,70 @@ static void gather_sinks() { |
| } |
| } |
| +static bool dump_png(SkBitmap bitmap, const char* path, const char* md5) { |
| + const int w = bitmap.width(), |
| + h = bitmap.height(); |
| + |
| + // First get the bitmap into N32 color format. The next step will work only there. |
| + if (bitmap.colorType() != kN32_SkColorType) { |
| + SkBitmap n32; |
| + if (!bitmap.copyTo(&n32, kN32_SkColorType)) { |
| + return false; |
| + } |
| + bitmap = n32; |
| + } |
| + |
| + // Convert our N32 bitmap into unpremul RGBA for libpng. |
| + SkAutoTMalloc<uint32_t> rgba(w*h); |
| + if (!bitmap.readPixels(SkImageInfo::Make(w,h, kRGBA_8888_SkColorType, kUnpremul_SkAlphaType), |
| + rgba, 4*w, 0,0)) { |
| + return false; |
| + } |
| + |
| + // We don't need bitmap anymore. Might as well drop our ref. |
| + bitmap = SkBitmap(); |
|
hal.canary
2015/08/24 20:35:06
bitmap.reset();
|
| + |
| + FILE* f = fopen(path, "w"); |
| + if (!f) { return false; } |
| + |
| + png_structp png = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr); |
| + if (!png) { |
| + fclose(f); |
| + return false; |
| + } |
| + |
| + png_infop info = png_create_info_struct(png); |
| + if (!info) { |
| + png_destroy_write_struct(&png, &info); |
| + fclose(f); |
| + return false; |
| + } |
| + |
| + png_text text[2]; |
| + text[0].key = (png_charp)"Author"; |
| + text[0].text = (png_charp)"DM dump_png()"; |
| + text[0].compression = PNG_TEXT_COMPRESSION_NONE; |
| + text[1].key = (png_charp)"Description"; |
| + text[1].text = (png_charp)md5; |
| + text[1].compression = PNG_TEXT_COMPRESSION_NONE; |
| + png_set_text(png, info, text, 2); |
| + |
| + png_init_io(png, f); |
| + png_set_IHDR(png, info, (png_uint_32)w, (png_uint_32)h, 8, |
| + PNG_COLOR_TYPE_RGB_ALPHA, PNG_INTERLACE_NONE, |
| + PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); |
| + png_write_info(png, info); |
| + for (int j = 0; j < h; j++) { |
| + png_bytep row = (png_bytep)(rgba.get() + w*j); |
| + png_write_rows(png, &row, 1); |
| + } |
| + png_write_end(png, info); |
| + |
| + png_destroy_write_struct(&png, &info); |
| + fclose(f); |
| + return true; |
| +} |
| + |
| static bool match(const char* needle, const char* haystack) { |
| return 0 == strcmp("_", needle) || NULL != strstr(haystack, needle); |
| } |
| @@ -635,27 +705,17 @@ struct Task { |
| path.append(ext); |
| } |
| - SkFILEWStream file(path.c_str()); |
| - if (!file.isValid()) { |
| - fail(SkStringPrintf("Can't open %s for writing.\n", path.c_str())); |
| - return; |
| - } |
| - |
| if (bitmap) { |
| - // We can't encode A8 bitmaps as PNGs. Convert them to 8888 first. |
| - SkBitmap converted; |
| - if (bitmap->info().colorType() == kAlpha_8_SkColorType) { |
| - if (!bitmap->copyTo(&converted, kN32_SkColorType)) { |
| - fail("Can't convert A8 to 8888.\n"); |
| - return; |
| - } |
| - bitmap = &converted; |
| - } |
| - if (!SkImageEncoder::EncodeStream(&file, *bitmap, SkImageEncoder::kPNG_Type, 100)) { |
| + if (!dump_png(*bitmap, path.c_str(), result.md5.c_str())) { |
| fail(SkStringPrintf("Can't encode PNG to %s.\n", path.c_str())); |
| return; |
| } |
| } else { |
| + SkFILEWStream file(path.c_str()); |
| + if (!file.isValid()) { |
| + fail(SkStringPrintf("Can't open %s for writing.\n", path.c_str())); |
| + return; |
| + } |
| if (!file.writeStream(data, len)) { |
| fail(SkStringPrintf("Can't write to %s.\n", path.c_str())); |
| return; |