1 #include "DMRecordTask.h" 2 #include "DMUtil.h" 3 #include "DMWriteTask.h" 4 #include "SkCommandLineFlags.h" 5 #include "SkRecord.h" 6 #include "SkRecordDraw.h" 7 #include "SkRecordOpts.h" 8 #include "SkRecorder.h" 9 10 DEFINE_bool(skr, true, "If true, run SKR tests."); 11 12 namespace DM { 13 14 RecordTask::RecordTask(const Task& parent, skiagm::GM* gm, SkBitmap reference, Mode mode) 15 : CpuTask(parent) 16 , fOptimize(mode == kOptimize_Mode) 17 , fName(UnderJoin(parent.name().c_str(), fOptimize ? "skr" : "skr-noopt")) 18 , fGM(gm) 19 , fReference(reference) 20 {} 21 22 RecordTask::RecordTask(const Task& parent, SkPicture* pic, SkBitmap reference, Mode mode) 23 : CpuTask(parent) 24 , fOptimize(mode == kOptimize_Mode) 25 , fName(UnderJoin(parent.name().c_str(), fOptimize ? "skr" : "skr-noopt")) 26 , fPicture(SkRef(pic)) 27 , fReference(reference) 28 {} 29 30 void RecordTask::draw() { 31 // Record into an SkRecord. 32 SkRecord record; 33 SkRecorder recorder(&record, fReference.width(), fReference.height()); 34 35 if (fGM.get()) { 36 recorder.concat(fGM->getInitialTransform()); 37 fGM->draw(&recorder); 38 } else { 39 fPicture->draw(&recorder); 40 } 41 42 43 if (fOptimize) { 44 SkRecordOptimize(&record); 45 } 46 47 // Draw the SkRecord back into a bitmap. 48 SkBitmap bitmap; 49 AllocatePixels(fReference, &bitmap); 50 SkCanvas target(bitmap); 51 SkRecordDraw(record, &target); 52 53 if (!BitmapsEqual(bitmap, fReference)) { 54 this->fail(); 55 this->spawnChild(SkNEW_ARGS(WriteTask, (*this, bitmap))); 56 } 57 } 58 59 bool RecordTask::shouldSkip() const { 60 return !FLAGS_skr; 61 } 62 63 } // namespace DM 64