Index: dm/DMWriteTask.cpp |
diff --git a/dm/DMWriteTask.cpp b/dm/DMWriteTask.cpp |
index 04479e94fbcda3a89f2de0af4e32d6fef64fc1ef..890a4bb052b719e096fd51bd15eb2212a22ce6b6 100644 |
--- a/dm/DMWriteTask.cpp |
+++ b/dm/DMWriteTask.cpp |
@@ -4,8 +4,9 @@ |
#include "SkColorPriv.h" |
#include "SkCommandLineFlags.h" |
#include "SkImageEncoder.h" |
-#include "SkString.h" |
+#include "SkMallocPixelRef.h" |
#include "SkStream.h" |
+#include "SkString.h" |
DEFINE_string2(writePath, w, "", "If set, write GMs here as .pngs."); |
@@ -38,6 +39,8 @@ void WriteTask::makeDirOrFail(SkString dir) { |
} |
} |
+namespace { |
+ |
// One file that first contains a .png of an SkBitmap, then its raw pixels. |
// We use this custom format to avoid premultiplied/unpremultiplied pixel conversions. |
struct PngAndRaw { |
@@ -54,42 +57,45 @@ struct PngAndRaw { |
return false; |
} |
+ // Pad out so the raw pixels start 4-byte aligned. |
+ const uint32_t maxPadding = 0; |
+ const size_t pos = stream.bytesWritten(); |
+ stream.write(&maxPadding, SkAlign4(pos) - pos); |
+ |
// Then write our secret raw pixels that only DM reads. |
SkAutoLockPixels lock(bitmap); |
return stream.write(bitmap.getPixels(), bitmap.getSize()); |
} |
// This assumes bitmap already has allocated pixels of the correct size. |
- static bool Decode(const char* path, SkBitmap* bitmap) { |
- SkAutoTUnref<SkStreamRewindable> stream(SkStream::NewFromFile(path)); |
- if (NULL == stream.get()) { |
+ static bool Decode(const char* path, SkImageInfo info, SkBitmap* bitmap) { |
+ SkAutoTUnref<SkData> data(SkData::NewFromFileName(path)); |
+ if (!data) { |
SkDebugf("Can't read %s.\n", path); |
return false; |
} |
- // The raw pixels are at the end of the stream. Seek ahead to skip beyond the encoded PNG. |
- const size_t bitmapBytes = bitmap->getSize(); |
- if (stream->getLength() < bitmapBytes) { |
+ // The raw pixels are at the end of the file. We'll skip the encoded PNG at the front. |
+ const size_t rowBytes = info.minRowBytes(); // Assume densely packed. |
+ const size_t bitmapBytes = info.getSafeSize(rowBytes); |
+ if (data->size() < bitmapBytes) { |
SkDebugf("%s is too small to contain the bitmap we're looking for.\n", path); |
return false; |
} |
- SkAssertResult(stream->seek(stream->getLength() - bitmapBytes)); |
- |
- // Read the raw pixels. |
- // TODO(mtklein): can we install a pixelref that just hangs onto the stream instead of |
- // copying into a malloc'd buffer? |
- SkAutoLockPixels lock(*bitmap); |
- if (bitmapBytes != stream->read(bitmap->getPixels(), bitmapBytes)) { |
- SkDebugf("Couldn't read raw bitmap from %s at %lu of %lu.\n", |
- path, stream->getPosition(), stream->getLength()); |
- return false; |
- } |
- SkASSERT(stream->isAtEnd()); |
+ const size_t offset = data->size() - bitmapBytes; |
+ SkAutoTUnref<SkPixelRef> pixels( |
+ SkMallocPixelRef::NewWithData(info, rowBytes, NULL/*ctable*/, data, offset)); |
+ SkASSERT(pixels); |
+ |
+ bitmap->setConfig(info, rowBytes); |
+ bitmap->setPixelRef(pixels); |
return true; |
} |
}; |
+} // namespace |
+ |
void WriteTask::draw() { |
SkString dir(FLAGS_writePath[0]); |
this->makeDirOrFail(dir); |
@@ -144,8 +150,7 @@ bool WriteTask::Expectations::check(const Task& task, SkBitmap bitmap) const { |
const SkString path = path_to_expected_image(fRoot, task); |
SkBitmap expected; |
- expected.allocPixels(bitmap.info()); |
- if (!PngAndRaw::Decode(path.c_str(), &expected)) { |
+ if (!PngAndRaw::Decode(path.c_str(), bitmap.info(), &expected)) { |
return false; |
} |