diff options
Diffstat (limited to 'dm')
-rw-r--r-- | dm/DMComparisonTask.cpp | 2 | ||||
-rw-r--r-- | dm/DMCpuTask.cpp | 23 | ||||
-rw-r--r-- | dm/DMGpuTask.cpp | 4 | ||||
-rw-r--r-- | dm/DMReplayTask.cpp | 42 | ||||
-rw-r--r-- | dm/DMReplayTask.h | 6 | ||||
-rw-r--r-- | dm/DMSerializeTask.cpp | 53 | ||||
-rw-r--r-- | dm/DMSerializeTask.h | 34 | ||||
-rw-r--r-- | dm/DMUtil.cpp | 37 | ||||
-rw-r--r-- | dm/DMUtil.h | 22 | ||||
-rw-r--r-- | dm/DMWriteTask.cpp | 2 | ||||
-rw-r--r-- | dm/README | 1 |
11 files changed, 164 insertions, 62 deletions
diff --git a/dm/DMComparisonTask.cpp b/dm/DMComparisonTask.cpp index 24976f011d..bb4e656754 100644 --- a/dm/DMComparisonTask.cpp +++ b/dm/DMComparisonTask.cpp @@ -13,7 +13,7 @@ ComparisonTask::ComparisonTask(const Task& parent, {} void ComparisonTask::draw() { - if (!meetsExpectations(fExpectations, fBitmap)) { + if (!MeetsExpectations(fExpectations, fBitmap)) { this->fail(); } } diff --git a/dm/DMCpuTask.cpp b/dm/DMCpuTask.cpp index 316f3412c5..f6edf23407 100644 --- a/dm/DMCpuTask.cpp +++ b/dm/DMCpuTask.cpp @@ -1,11 +1,8 @@ #include "DMCpuTask.h" #include "DMReplayTask.h" +#include "DMSerializeTask.h" #include "DMUtil.h" #include "DMWriteTask.h" -#include "SkCommandLineFlags.h" - -DEFINE_bool(replay, false, "If true, run replay tests for each CpuTask."); -// TODO(mtklein): add the other various options namespace DM { @@ -18,30 +15,26 @@ CpuTask::CpuTask(const char* name, : Task(reporter, taskRunner) , fGMFactory(gmFactory) , fGM(fGMFactory(NULL)) - , fName(underJoin(fGM->shortName(), name)) - , fExpectations(expectations.get(png(fName).c_str())) + , fName(UnderJoin(fGM->shortName(), name)) + , fExpectations(expectations.get(Png(fName).c_str())) , fConfig(config) {} void CpuTask::draw() { SkBitmap bitmap; - bitmap.setConfig(fConfig, SkScalarCeilToInt(fGM->width()), SkScalarCeilToInt(fGM->height())); - bitmap.allocPixels(); - bitmap.eraseColor(0x00000000); - SkCanvas canvas(bitmap); + SetupBitmap(fConfig, fGM.get(), &bitmap); + SkCanvas canvas(bitmap); canvas.concat(fGM->getInitialTransform()); fGM->draw(&canvas); canvas.flush(); - if (!meetsExpectations(fExpectations, bitmap)) { + if (!MeetsExpectations(fExpectations, bitmap)) { this->fail(); } - if (FLAGS_replay) { - this->spawnChild(SkNEW_ARGS(ReplayTask, - ("replay", *this, fGMFactory(NULL), bitmap))); - } + this->spawnChild(SkNEW_ARGS(ReplayTask, (*this, fGMFactory(NULL), bitmap))); + this->spawnChild(SkNEW_ARGS(SerializeTask, (*this, fGMFactory(NULL), bitmap))); this->spawnChild(SkNEW_ARGS(WriteTask, (*this, bitmap))); } diff --git a/dm/DMGpuTask.cpp b/dm/DMGpuTask.cpp index a002b959d7..2aceb02b8a 100644 --- a/dm/DMGpuTask.cpp +++ b/dm/DMGpuTask.cpp @@ -19,8 +19,8 @@ GpuTask::GpuTask(const char* name, int sampleCount) : Task(reporter, taskRunner) , fGM(gmFactory(NULL)) - , fName(underJoin(fGM->shortName(), name)) - , fExpectations(expectations.get(png(fName).c_str())) + , fName(UnderJoin(fGM->shortName(), name)) + , fExpectations(expectations.get(Png(fName).c_str())) , fConfig(config) , fContextType(contextType) , fSampleCount(sampleCount) diff --git a/dm/DMReplayTask.cpp b/dm/DMReplayTask.cpp index 0d6780ef42..a0ecf5fadf 100644 --- a/dm/DMReplayTask.cpp +++ b/dm/DMReplayTask.cpp @@ -1,54 +1,38 @@ #include "DMReplayTask.h" +#include "DMWriteTask.h" #include "DMUtil.h" +#include "SkCommandLineFlags.h" #include "SkPicture.h" +DEFINE_bool(replay, false, "If true, run picture replay tests."); + namespace DM { -ReplayTask::ReplayTask(const char* suffix, - const Task& parent, +ReplayTask::ReplayTask(const Task& parent, skiagm::GM* gm, SkBitmap reference) : Task(parent) - , fName(underJoin(parent.name().c_str(), suffix)) + , fName(UnderJoin(parent.name().c_str(), "replay")) , fGM(gm) , fReference(reference) {} void ReplayTask::draw() { - SkPicture picture; - SkCanvas* canvas = picture.beginRecording(SkScalarCeilToInt(fGM->width()), - SkScalarCeilToInt(fGM->height()), - 0 /*flags*/); - - canvas->concat(fGM->getInitialTransform()); - fGM->draw(canvas); - canvas->flush(); - - picture.endRecording(); + SkPicture recorded; + RecordPicture(fGM.get(), &recorded); SkBitmap bitmap; - bitmap.setConfig(fReference.config(), - SkScalarCeilToInt(fGM->width()), - SkScalarCeilToInt(fGM->height())); - bitmap.allocPixels(); - bitmap.eraseColor(0x00000000); - - SkCanvas replay(bitmap); - replay.drawPicture(picture); - replay.flush(); - - const SkAutoLockPixels mine(bitmap), theirs(fReference); - if (bitmap.getSize() != fReference.getSize() || - 0 != memcmp(bitmap.getPixels(), fReference.getPixels(), bitmap.getSize())) - { + SetupBitmap(fReference.config(), fGM.get(), &bitmap); + DrawPicture(&recorded, &bitmap); + if (!BitmapsEqual(bitmap, fReference)) { this->fail(); + this->spawnChild(SkNEW_ARGS(WriteTask, (*this, bitmap))); } } bool ReplayTask::shouldSkip() const { - return fGM->getFlags() & skiagm::GM::kGPUOnly_Flag || - fGM->getFlags() & skiagm::GM::kSkipPicture_Flag; + return !FLAGS_replay || fGM->getFlags() & skiagm::GM::kSkipPicture_Flag; } } // namespace DM diff --git a/dm/DMReplayTask.h b/dm/DMReplayTask.h index 6a96373f72..bf90f72a0e 100644 --- a/dm/DMReplayTask.h +++ b/dm/DMReplayTask.h @@ -1,14 +1,11 @@ #ifndef DMReplayTask_DEFINED #define DMReplayTask_DEFINED -#include "DMReporter.h" #include "DMTask.h" -#include "DMTaskRunner.h" #include "SkBitmap.h" #include "SkString.h" #include "SkTemplates.h" #include "gm.h" -#include "gm_expectations.h" // Records a GM through an SkPicture, draws it, and compares against the reference bitmap. @@ -17,8 +14,7 @@ namespace DM { class ReplayTask : public Task { public: - ReplayTask(const char* name, - const Task& parent, + ReplayTask(const Task& parent, skiagm::GM*, SkBitmap reference); diff --git a/dm/DMSerializeTask.cpp b/dm/DMSerializeTask.cpp new file mode 100644 index 0000000000..d71dfdccfa --- /dev/null +++ b/dm/DMSerializeTask.cpp @@ -0,0 +1,53 @@ +#include "DMSerializeTask.h" +#include "DMUtil.h" +#include "DMWriteTask.h" + +#include "SkCommandLineFlags.h" +#include "SkPicture.h" +#include "SkPixelRef.h" + +DEFINE_bool(serialize, false, "If true, run picture serialization tests."); + +namespace DM { + +SerializeTask::SerializeTask(const Task& parent, + skiagm::GM* gm, + SkBitmap reference) + : Task(parent) + , fName(UnderJoin(parent.name().c_str(), "serialize")) + , fGM(gm) + , fReference(reference) + {} + +static SkData* trivial_bitmap_encoder(size_t* pixelRefOffset, const SkBitmap& bitmap) { + if (NULL == bitmap.pixelRef()) { + return NULL; + } + SkData* data = bitmap.pixelRef()->refEncodedData(); + *pixelRefOffset = bitmap.pixelRefOffset(); + return data; +} + +void SerializeTask::draw() { + SkPicture recorded; + RecordPicture(fGM.get(), &recorded); + + SkDynamicMemoryWStream wStream; + recorded.serialize(&wStream, &trivial_bitmap_encoder); + SkAutoTUnref<SkStream> rStream(wStream.detachAsStream()); + SkAutoTUnref<SkPicture> reconstructed(SkPicture::CreateFromStream(rStream)); + + SkBitmap bitmap; + SetupBitmap(fReference.config(), fGM.get(), &bitmap); + DrawPicture(reconstructed, &bitmap); + if (!BitmapsEqual(bitmap, fReference)) { + this->fail(); + this->spawnChild(SkNEW_ARGS(WriteTask, (*this, bitmap))); + } +} + +bool SerializeTask::shouldSkip() const { + return !FLAGS_serialize || fGM->getFlags() & skiagm::GM::kSkipPicture_Flag; +} + +} // namespace DM diff --git a/dm/DMSerializeTask.h b/dm/DMSerializeTask.h new file mode 100644 index 0000000000..30a4303b06 --- /dev/null +++ b/dm/DMSerializeTask.h @@ -0,0 +1,34 @@ +#ifndef DMSerializeTask_DEFINED +#define DMSerializeTask_DEFINED + +#include "DMTask.h" +#include "SkBitmap.h" +#include "SkString.h" +#include "SkTemplates.h" +#include "gm.h" + +// Record a picture, serialize it, deserialize it, then draw it and compare to reference bitmap. + +namespace DM { + +class SerializeTask : public Task { + +public: + SerializeTask(const Task& parent, + skiagm::GM*, + SkBitmap reference); + + virtual void draw() SK_OVERRIDE; + virtual bool usesGpu() const SK_OVERRIDE { return false; } + virtual bool shouldSkip() const SK_OVERRIDE; + virtual SkString name() const SK_OVERRIDE { return fName; } + +private: + const SkString fName; + SkAutoTDelete<skiagm::GM> fGM; + const SkBitmap fReference; +}; + +} // namespace DM + +#endif // DMSerializeTask_DEFINED diff --git a/dm/DMUtil.cpp b/dm/DMUtil.cpp index dc652ebdbe..a227ca8584 100644 --- a/dm/DMUtil.cpp +++ b/dm/DMUtil.cpp @@ -1,19 +1,21 @@ #include "DMUtil.h" +#include "SkPicture.h" + namespace DM { -SkString underJoin(const char* a, const char* b) { +SkString UnderJoin(const char* a, const char* b) { SkString s; s.appendf("%s_%s", a, b); return s; } -SkString png(SkString s) { +SkString Png(SkString s) { s.appendf(".png"); return s; } -bool meetsExpectations(const skiagm::Expectations& expectations, const SkBitmap bitmap) { +bool MeetsExpectations(const skiagm::Expectations& expectations, const SkBitmap bitmap) { if (expectations.ignoreFailure() || expectations.empty()) { return true; } @@ -21,4 +23,33 @@ bool meetsExpectations(const skiagm::Expectations& expectations, const SkBitmap return expectations.match(digest); } +void RecordPicture(skiagm::GM* gm, SkPicture* picture) { + SkCanvas* canvas = picture->beginRecording(SkScalarCeilToInt(gm->width()), + SkScalarCeilToInt(gm->height()), + 0 /*flags*/); + canvas->concat(gm->getInitialTransform()); + gm->draw(canvas); + canvas->flush(); + picture->endRecording(); +} + +void SetupBitmap(const SkBitmap::Config config, skiagm::GM* gm, SkBitmap* bitmap) { + bitmap->setConfig(config, SkScalarCeilToInt(gm->width()), SkScalarCeilToInt(gm->height())); + bitmap->allocPixels(); + bitmap->eraseColor(0x00000000); +} + +void DrawPicture(SkPicture* picture, SkBitmap* bitmap) { + SkASSERT(picture != NULL); + SkASSERT(bitmap != NULL); + SkCanvas canvas(*bitmap); + canvas.drawPicture(*picture); + canvas.flush(); +} + +bool BitmapsEqual(const SkBitmap& a, const SkBitmap& b) { + const SkAutoLockPixels lockA(a), lockB(b); + return a.getSize() == b.getSize() && 0 == memcmp(a.getPixels(), b.getPixels(), b.getSize()); +} + } // namespace DM diff --git a/dm/DMUtil.h b/dm/DMUtil.h index c95f93346a..4dd9dd83ae 100644 --- a/dm/DMUtil.h +++ b/dm/DMUtil.h @@ -9,14 +9,26 @@ namespace DM { -// underJoin("a", "b") -> "a_b" -SkString underJoin(const char* a, const char* b); +// UnderJoin("a", "b") -> "a_b" +SkString UnderJoin(const char* a, const char* b); -// png("a") -> "a.png" -SkString png(SkString s); +// Png("a") -> "a.png" +SkString Png(SkString s); // Roughly, expectations.match(GmResultDigest(bitmap)), but calculates the digest lazily. -bool meetsExpectations(const skiagm::Expectations& expectations, const SkBitmap bitmap); +bool MeetsExpectations(const skiagm::Expectations& expectations, const SkBitmap bitmap); + +// Draw gm to picture. +void RecordPicture(skiagm::GM* gm, SkPicture* picture); + +// Prepare bitmap to have gm draw into it with this config. +void SetupBitmap(const SkBitmap::Config config, skiagm::GM* gm, SkBitmap* bitmap); + +// Draw picture to bitmap. +void DrawPicture(SkPicture* picture, SkBitmap* bitmap); + +// Are these identical bitmaps? +bool BitmapsEqual(const SkBitmap& a, const SkBitmap& b); } // namespace DM diff --git a/dm/DMWriteTask.cpp b/dm/DMWriteTask.cpp index 21a9b55bc3..011b339540 100644 --- a/dm/DMWriteTask.cpp +++ b/dm/DMWriteTask.cpp @@ -27,7 +27,7 @@ void WriteTask::draw() { const SkString dir = SkOSPath::SkPathJoin(root, fConfig.c_str()); if (!sk_mkdir(root) || !sk_mkdir(dir.c_str()) || - !SkImageEncoder::EncodeFile(png(SkOSPath::SkPathJoin(dir.c_str(), fGmName.c_str())).c_str(), + !SkImageEncoder::EncodeFile(Png(SkOSPath::SkPathJoin(dir.c_str(), fGmName.c_str())).c_str(), fBitmap, SkImageEncoder::kPNG_Type, 100/*quality*/)) @@ -7,7 +7,6 @@ Current approximate list of missing features: --deferred / --pipe --rtree - --serialize --tiledGrid |