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 "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.
     58     template <typename T> void operator()(const T& r) {
     59         this->draw(r);
     60     }
     61 
     62 protected:
     63     SkPicture const* const* drawablePicts() const { return fDrawablePicts; }
     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