• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
Draw(SkCanvas * canvas)22     explicit Draw(SkCanvas* canvas)
23         : fInitialCTM(canvas->getTotalMatrix()), fCanvas(canvas), fIndex(0) {}
24 
index()25     unsigned index() const { return fIndex; }
next()26     void next() { ++fIndex; }
27 
operator()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.
skip(const T &)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