Home | History | Annotate | Download | only in dm
      1 #include "DMPipeTask.h"
      2 #include "DMUtil.h"
      3 #include "DMWriteTask.h"
      4 
      5 #include "SamplePipeControllers.h"
      6 #include "SkCommandLineFlags.h"
      7 #include "SkGPipe.h"
      8 
      9 DEFINE_bool(pipe, true, "If true, check several pipe variants against the reference bitmap.");
     10 
     11 namespace DM {
     12 
     13 static uint32_t get_flags(PipeTask::Mode mode) {
     14     uint32_t flags = 0;
     15     if (mode != PipeTask::kInProcess_Mode) {
     16         flags |= SkGPipeWriter::kCrossProcess_Flag;
     17     }
     18     if (mode == PipeTask::kSharedAddress_Mode) {
     19         flags |= SkGPipeWriter::kSharedAddressSpace_Flag;
     20     }
     21     return flags;
     22 }
     23 
     24 static const char* get_name(const uint32_t flags) {
     25     if (flags & SkGPipeWriter::kCrossProcess_Flag &&
     26         flags & SkGPipeWriter::kSharedAddressSpace_Flag) {
     27         return "shared_address_space_pipe";
     28     } else if (flags & SkGPipeWriter::kCrossProcess_Flag) {
     29         return "cross_process_pipe";
     30     } else {
     31         return "pipe";
     32     }
     33 }
     34 
     35 PipeTask::PipeTask(const Task& parent,
     36                    skiagm::GM* gm,
     37                    SkBitmap reference,
     38                    Mode mode)
     39     : CpuTask(parent)
     40     , fFlags(get_flags(mode))
     41     , fName(UnderJoin(parent.name().c_str(), get_name(fFlags)))
     42     , fGM(gm)
     43     , fReference(reference)
     44     {}
     45 
     46 void PipeTask::draw() {
     47     SkBitmap bitmap;
     48     AllocatePixels(fReference, &bitmap);
     49 
     50     SkCanvas canvas(bitmap);
     51     PipeController pipeController(&canvas, &SkImageDecoder::DecodeMemory);
     52     SkGPipeWriter writer;
     53 
     54     SkCanvas* pipeCanvas = writer.startRecording(&pipeController,
     55                                                  fFlags,
     56                                                  bitmap.width(),
     57                                                  bitmap.height());
     58     pipeCanvas->concat(fGM->getInitialTransform());
     59     fGM->draw(pipeCanvas);
     60     writer.endRecording();
     61 
     62     if (!BitmapsEqual(bitmap, fReference)) {
     63         this->fail();
     64         this->spawnChild(SkNEW_ARGS(WriteTask, (*this, bitmap)));
     65     }
     66 }
     67 
     68 bool PipeTask::shouldSkip() const {
     69     if (!FLAGS_pipe) {
     70         return true;
     71     }
     72     if (fGM->getFlags() & skiagm::GM::kSkipPipe_Flag) {
     73         return true;
     74     }
     75     if (fFlags == SkGPipeWriter::kCrossProcess_Flag &&
     76         fGM->getFlags() & skiagm::GM::kSkipPipeCrossProcess_Flag) {
     77         return true;
     78     }
     79     return false;
     80 }
     81 
     82 }  // namespace DM
     83