Home | History | Annotate | Download | only in core
      1 /*
      2  * Copyright 2014 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #ifndef SkRecordDraw_DEFINED
      9 #define SkRecordDraw_DEFINED
     10 
     11 #include "SkRecord.h"
     12 #include "SkCanvas.h"
     13 
     14 // Draw an SkRecord into an SkCanvas.  A convenience wrapper around SkRecords::Draw.
     15 void SkRecordDraw(const SkRecord&, SkCanvas*);
     16 
     17 namespace SkRecords {
     18 
     19 // This is an SkRecord visitor that will draw that SkRecord to an SkCanvas.
     20 class Draw : SkNoncopyable {
     21 public:
     22     explicit Draw(SkCanvas* canvas)
     23         : fInitialCTM(canvas->getTotalMatrix()), fCanvas(canvas), fIndex(0) {}
     24 
     25     unsigned index() const { return fIndex; }
     26     void next() { ++fIndex; }
     27 
     28     template <typename T> void operator()(const T& r) {
     29         if (!this->skip(r)) {
     30             this->draw(r);
     31         }
     32     }
     33 
     34 private:
     35     // No base case, so we'll be compile-time checked that we implement all possibilities.
     36     template <typename T> void draw(const T&);
     37 
     38     // skip() should return true if we can skip this command, false if not.
     39     // It may update fIndex directly to skip more than just this one command.
     40 
     41     // Mostly we just blindly call fCanvas and let it handle quick rejects itself.
     42     template <typename T> bool skip(const T&) { return false; }
     43 
     44     // We add our own quick rejects for commands added by optimizations.
     45     bool skip(const PairedPushCull&);
     46     bool skip(const BoundedDrawPosTextH&);
     47 
     48     const SkMatrix fInitialCTM;
     49     SkCanvas* fCanvas;
     50     unsigned fIndex;
     51 };
     52 
     53 }  // namespace SkRecords
     54 
     55 #endif//SkRecordDraw_DEFINED
     56