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