aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--dm/DM.cpp92
-rw-r--r--gyp/dm.gypi1
-rw-r--r--gyp/libpng.gyp39
3 files changed, 98 insertions, 34 deletions
diff --git a/dm/DM.cpp b/dm/DM.cpp
index c637edd9b9..8537313cf3 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();
+
+ 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;
diff --git a/gyp/dm.gypi b/gyp/dm.gypi
index 9dd3228957..4ce2b4b580 100644
--- a/gyp/dm.gypi
+++ b/gyp/dm.gypi
@@ -22,6 +22,7 @@
'etc1.gyp:libetc1',
'flags.gyp:flags',
'jsoncpp.gyp:jsoncpp',
+ 'libpng.gyp:libpng_static_when_possible',
'skia_lib.gyp:skia_lib',
'svg.gyp:svg',
'tools.gyp:crash_handler',
diff --git a/gyp/libpng.gyp b/gyp/libpng.gyp
index d918f2d403..45be5f7180 100644
--- a/gyp/libpng.gyp
+++ b/gyp/libpng.gyp
@@ -12,23 +12,26 @@
'target_name': 'libpng',
'type': 'none',
'conditions': [
- [ 'skia_os == "android"',
- {
- 'dependencies': [
- 'android_deps.gyp:png',
- ],
- 'export_dependent_settings': [
- 'android_deps.gyp:png',
- ],
- }, { # skia_os != "android"
- 'dependencies': [
- 'libpng.gyp:libpng_static',
- ],
- 'export_dependent_settings': [
- 'libpng.gyp:libpng_static',
- ],
- }
- ]
+ [ 'skia_os == "android"', {
+ 'dependencies': [ 'android_deps.gyp:png' ],
+ 'export_dependent_settings': [ 'android_deps.gyp:png' ],
+ },{
+ 'dependencies': [ 'libpng.gyp:libpng_static' ],
+ 'export_dependent_settings': [ 'libpng.gyp:libpng_static' ],
+ }]
+ ]
+ },
+ {
+ 'target_name': 'libpng_static_when_possible',
+ 'type': 'none',
+ 'conditions': [
+ [ 'skia_android_framework', {
+ 'dependencies': [ 'android_deps.gyp:png' ],
+ 'export_dependent_settings': [ 'android_deps.gyp:png' ],
+ },{
+ 'dependencies': [ 'libpng.gyp:libpng_static' ],
+ 'export_dependent_settings': [ 'libpng.gyp:libpng_static' ],
+ }]
]
},
{
@@ -83,7 +86,7 @@
'defines': [
'PNG_ARM_NEON_OPT=0',
],
- }, { # skia_os != "ios"
+ }, { # skia_os != "ios"
'dependencies': [
'libpng.gyp:libpng_static_neon',
],