Index: dm/DM.cpp |
diff --git a/dm/DM.cpp b/dm/DM.cpp |
index 21e733408aad68845cf1718dd2bedcd4fa8fda29..7067e7452e36792c92a971f2ba3fa13877b3f872 100644 |
--- a/dm/DM.cpp |
+++ b/dm/DM.cpp |
@@ -27,12 +27,6 @@ |
#include "Test.h" |
#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, |
@@ -473,66 +467,6 @@ |
} |
} |
-static bool dump_png(SkBitmap bitmap, const char* path, const char* md5) { |
- // Covert whatever we've been passed to RGBA, to make unpremultiplying each row for PNG easy. |
- { |
- SkBitmap n32; |
- if (!bitmap.copyTo(&n32, kRGBA_8888_SkColorType)) { |
- return false; |
- } |
- bitmap = n32; |
- } |
- |
- 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)bitmap.width(), (png_uint_32)bitmap.height(), 8, |
- PNG_COLOR_TYPE_RGB_ALPHA, PNG_INTERLACE_NONE, |
- PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); |
- png_write_info(png, info); |
- |
- SkAutoLockPixels alp(bitmap); |
- SkAutoSTMalloc<1024, uint32_t> row(bitmap.width()); |
- for (int j = 0; j < bitmap.height(); j++) { |
- // Convert the row to unpremultiplied RGBA uint32_t. |
- const SkPMColor* pm = bitmap.getAddr32(0,j); |
- for (int i = 0; i < bitmap.width(); i++) { |
- row[i] = SkUnPreMultiply::UnPreMultiplyPreservingByteOrder(pm[i]); |
- } |
- |
- png_bytep row_ptr = (png_bytep)row.get(); |
- png_write_rows(png, &row_ptr, 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); |
} |
@@ -702,17 +636,27 @@ |
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) { |
- if (!dump_png(*bitmap, path.c_str(), result.md5.c_str())) { |
+ // 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)) { |
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; |