Index: dm/DM.cpp |
diff --git a/dm/DM.cpp b/dm/DM.cpp |
index ecf231ed63b73bc378b36b6f7096765cb1035228..58cb773e032a5f1bb9182dc3db4b0b08043fb8c6 100644 |
--- a/dm/DM.cpp |
+++ b/dm/DM.cpp |
@@ -17,6 +17,7 @@ |
#include "SkColorPriv.h" |
#include "SkCommonFlags.h" |
#include "SkCommonFlagsConfig.h" |
+#include "SkData.h" |
#include "SkFontMgr.h" |
#include "SkGraphics.h" |
#include "SkHalf.h" |
@@ -30,6 +31,7 @@ |
#include "SkThreadUtils.h" |
#include "Test.h" |
#include "Timer.h" |
+#include "picture_utils.h" |
#include "sk_tool_utils.h" |
#ifdef SK_PDF_IMAGE_STATS |
@@ -924,72 +926,12 @@ static void gather_sinks() { |
static bool dump_png(SkBitmap bitmap, const char* path, const char* md5) { |
const int w = bitmap.width(), |
h = bitmap.height(); |
- // PNG wants unpremultiplied 8-bit RGBA pixels (16-bit could work fine too). |
- // We leave the gamma of these bytes unspecified, to continue the status quo, |
- // which we think generally is to interpret them as sRGB. |
- |
- SkAutoTMalloc<uint32_t> rgba(w*h); |
- |
- if (bitmap. colorType() == kN32_SkColorType && |
- bitmap.profileType() == kSRGB_SkColorProfileType) { |
- // These are premul sRGB 8-bit pixels in SkPMColor order. |
- // We want unpremul sRGB 8-bit pixels in RGBA order. We'll get there via floats. |
- bitmap.lockPixels(); |
- auto px = (const uint32_t*)bitmap.getPixels(); |
- if (!px) { |
- return false; |
- } |
- for (int i = 0; i < w*h; i++) { |
- Sk4f fs = Sk4f_fromS32(px[i]); // Convert up to linear floats. |
- #if defined(SK_PMCOLOR_IS_BGRA) |
- fs = SkNx_shuffle<2,1,0,3>(fs); // Shuffle to RGBA, if not there already. |
- #endif |
- float invA = 1.0f / fs[3]; |
- fs = fs * Sk4f(invA, invA, invA, 1); // Unpremultiply. |
- rgba[i] = Sk4f_toS32(fs); // Pack down to sRGB bytes. |
- } |
- |
- } else if (bitmap.colorType() == kRGBA_F16_SkColorType) { |
- // These are premul linear half-float pixels in RGBA order. |
- // We want unpremul sRGB 8-bit pixels in RGBA order. We'll get there via floats. |
- bitmap.lockPixels(); |
- auto px = (const uint64_t*)bitmap.getPixels(); |
- if (!px) { |
- return false; |
- } |
- for (int i = 0; i < w*h; i++) { |
- // Convert up to linear floats. |
- Sk4f fs(SkHalfToFloat(static_cast<SkHalf>(px[i] >> (0 * 16))), |
- SkHalfToFloat(static_cast<SkHalf>(px[i] >> (1 * 16))), |
- SkHalfToFloat(static_cast<SkHalf>(px[i] >> (2 * 16))), |
- SkHalfToFloat(static_cast<SkHalf>(px[i] >> (3 * 16)))); |
- fs = Sk4f::Max(0.0f, Sk4f::Min(fs, 1.0f)); // Clamp |
- float invA = 1.0f / fs[3]; |
- fs = fs * Sk4f(invA, invA, invA, 1); // Unpremultiply. |
- rgba[i] = Sk4f_toS32(fs); // Pack down to sRGB bytes. |
- } |
- |
- } else { |
- // We "should" gamma correct in here but we don't. |
- // We want Gold to show exactly what our clients are seeing, broken gamma. |
- |
- // Convert smaller formats up to premul linear 8-bit (in SkPMColor order). |
- if (bitmap.colorType() != kN32_SkColorType) { |
- SkBitmap n32; |
- if (!bitmap.copyTo(&n32, kN32_SkColorType)) { |
- return false; |
- } |
- bitmap = n32; |
- } |
- |
- // Convert premul linear 8-bit to unpremul linear 8-bit RGBA. |
- if (!bitmap.readPixels(SkImageInfo::Make(w,h, kRGBA_8888_SkColorType, |
- kUnpremul_SkAlphaType), |
- rgba, 4*w, 0,0)) { |
- return false; |
- } |
+ sk_sp<SkData> encodedBitmap = sk_tools::encode_bitmap_for_png(bitmap); |
+ if (encodedBitmap.get() == nullptr) { |
+ return false; |
} |
+ uint32_t* rgba = static_cast<uint32_t*>(encodedBitmap.get()->writable_data()); |
// We don't need bitmap anymore. Might as well drop our ref. |
bitmap.reset(); |
@@ -1036,7 +978,7 @@ static bool dump_png(SkBitmap bitmap, const char* path, const char* md5) { |
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_bytep row = (png_bytep)(rgba + w*j); |
png_write_rows(png, &row, 1); |
} |
png_write_end(png, info); |