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 10DEFINE_bool(skr, true, "If true, run SKR tests."); 11 12namespace DM { 13 14RecordTask::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 22RecordTask::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 30void 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 59bool RecordTask::shouldSkip() const { 60 return !FLAGS_skr; 61} 62 63} // namespace DM 64