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 "SkBBoxHierarchy.h"
12 #include "SkCanvas.h"
13 #include "SkMatrix.h"
14 #include "SkRecord.h"
15 
16 class SkDrawable;
17 class SkLayerInfo;
18 
19 // Fill a BBH to be used by SkRecordDraw to accelerate playback.
20 void SkRecordFillBounds(const SkRect& cullRect, const SkRecord&, SkBBoxHierarchy*);
21 
22 void SkRecordComputeLayers(const SkRect& cullRect, const SkRecord& record,
23                            const SkPicture::SnapshotArray*,
24                            SkBBoxHierarchy* bbh, SkLayerInfo* data);
25 
26 // Draw an SkRecord into an SkCanvas.  A convenience wrapper around SkRecords::Draw.
27 void SkRecordDraw(const SkRecord&, SkCanvas*, SkPicture const* const drawablePicts[],
28                   SkDrawable* const drawables[], int drawableCount,
29                   const SkBBoxHierarchy*, SkPicture::AbortCallback*);
30 
31 // Draw a portion of an SkRecord into an SkCanvas.
32 // When drawing a portion of an SkRecord the CTM on the passed in canvas must be
33 // the composition of the replay matrix with the record-time CTM (for the portion
34 // of the record that is being replayed). For setMatrix calls to behave correctly
35 // the initialCTM parameter must set to just the replay matrix.
36 void SkRecordPartialDraw(const SkRecord&, SkCanvas*,
37                          SkPicture const* const drawablePicts[], int drawableCount,
38                          unsigned start, unsigned stop, const SkMatrix& initialCTM);
39 
40 namespace SkRecords {
41 
42 // This is an SkRecord visitor that will draw that SkRecord to an SkCanvas.
43 class Draw : SkNoncopyable {
44 public:
45     explicit Draw(SkCanvas* canvas, SkPicture const* const drawablePicts[],
46                   SkDrawable* const drawables[], int drawableCount,
47                   const SkMatrix* initialCTM = NULL)
48         : fInitialCTM(initialCTM ? *initialCTM : canvas->getTotalMatrix())
49         , fCanvas(canvas)
50         , fDrawablePicts(drawablePicts)
51         , fDrawables(drawables)
52         , fDrawableCount(drawableCount)
53     {}
54 
55     // This operator calls methods on the |canvas|. The various draw() wrapper
56     // methods around SkCanvas are defined by the DRAW() macro in
57     // SkRecordDraw.cpp.
operator()58     template <typename T> void operator()(const T& r) {
59         this->draw(r);
60     }
61 
62 protected:
drawablePicts()63     SkPicture const* const* drawablePicts() const { return fDrawablePicts; }
drawableCount()64     int drawableCount() const { return fDrawableCount; }
65 
66 private:
67     // No base case, so we'll be compile-time checked that we implement all possibilities.
68     template <typename T> void draw(const T&);
69 
70     const SkMatrix fInitialCTM;
71     SkCanvas* fCanvas;
72     SkPicture const* const* fDrawablePicts;
73     SkDrawable* const* fDrawables;
74     int fDrawableCount;
75 };
76 
77 }  // namespace SkRecords
78 
79 #endif//SkRecordDraw_DEFINED
80