Home | History | Annotate | Download | only in dm
      1 #include "DMSerializeTask.h"
      2 #include "DMUtil.h"
      3 #include "DMWriteTask.h"
      4 
      5 #include "SkCommandLineFlags.h"
      6 #include "SkPicture.h"
      7 #include "SkPixelRef.h"
      8 
      9 DEFINE_bool(serialize,     true, "If true, run picture serialization tests via SkPictureData.");
     10 DEFINE_bool(serialize_skr, true, "If true, run picture serialization tests via SkRecord.");
     11 
     12 static const char* kSuffixes[] = { "serialize", "serialize-skr" };
     13 static const bool* kEnabled[]  = { &FLAGS_serialize, &FLAGS_serialize_skr };
     14 
     15 namespace DM {
     16 
     17 SerializeTask::SerializeTask(const Task& parent,
     18                              skiagm::GM* gm,
     19                              SkBitmap reference,
     20                              SerializeTask::Mode mode)
     21     : CpuTask(parent)
     22     , fMode(mode)
     23     , fName(UnderJoin(parent.name().c_str(), kSuffixes[mode]))
     24     , fGM(gm)
     25     , fReference(reference)
     26     {}
     27 
     28 void SerializeTask::draw() {
     29     SkAutoTUnref<SkPicture> recorded(
     30         RecordPicture(fGM.get(), NULL/*no BBH*/, kSkRecord_Mode == fMode));
     31 
     32     SkDynamicMemoryWStream wStream;
     33     recorded->serialize(&wStream, NULL);
     34     SkAutoTUnref<SkStream> rStream(wStream.detachAsStream());
     35     SkAutoTUnref<SkPicture> reconstructed(SkPicture::CreateFromStream(rStream));
     36 
     37     SkBitmap bitmap;
     38     AllocatePixels(fReference, &bitmap);
     39     DrawPicture(*reconstructed, &bitmap);
     40     if (!BitmapsEqual(bitmap, fReference)) {
     41         this->fail();
     42         this->spawnChild(SkNEW_ARGS(WriteTask, (*this, "GM", bitmap)));
     43     }
     44 }
     45 
     46 bool SerializeTask::shouldSkip() const {
     47     if (fGM->getFlags() & skiagm::GM::kSkipPicture_Flag) {
     48         return true;
     49     }
     50     return !*kEnabled[fMode];
     51 }
     52 
     53 }  // namespace DM
     54