/* * Copyright 2014 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkRecordDraw_DEFINED #define SkRecordDraw_DEFINED #include "SkBBoxHierarchy.h" #include "SkBigPicture.h" #include "SkCanvas.h" #include "SkMatrix.h" #include "SkRecord.h" class SkDrawable; class SkLayerInfo; // Calculate conservative identity space bounds for each op in the record. void SkRecordFillBounds(const SkRect& cullRect, const SkRecord&, SkRect bounds[]); // SkRecordFillBounds(), and gathers information about saveLayers and stores it for later // use (e.g., layer hoisting). The gathered information is sufficient to determine // where each saveLayer will land and which ops in the picture it represents. void SkRecordComputeLayers(const SkRect& cullRect, const SkRecord&, SkRect bounds[], const SkBigPicture::SnapshotArray*, SkLayerInfo* data); // Draw an SkRecord into an SkCanvas. A convenience wrapper around SkRecords::Draw. void SkRecordDraw(const SkRecord&, SkCanvas*, SkPicture const* const drawablePicts[], SkDrawable* const drawables[], int drawableCount, const SkBBoxHierarchy*, SkPicture::AbortCallback*); // Draw a portion of an SkRecord into an SkCanvas. // When drawing a portion of an SkRecord the CTM on the passed in canvas must be // the composition of the replay matrix with the record-time CTM (for the portion // of the record that is being replayed). For setMatrix calls to behave correctly // the initialCTM parameter must set to just the replay matrix. void SkRecordPartialDraw(const SkRecord&, SkCanvas*, SkPicture const* const drawablePicts[], int drawableCount, int start, int stop, const SkMatrix& initialCTM); namespace SkRecords { // This is an SkRecord visitor that will draw that SkRecord to an SkCanvas. class Draw : SkNoncopyable { public: explicit Draw(SkCanvas* canvas, SkPicture const* const drawablePicts[], SkDrawable* const drawables[], int drawableCount, const SkMatrix* initialCTM = nullptr) : fInitialCTM(initialCTM ? *initialCTM : canvas->getTotalMatrix()) , fCanvas(canvas) , fDrawablePicts(drawablePicts) , fDrawables(drawables) , fDrawableCount(drawableCount) {} // This operator calls methods on the |canvas|. The various draw() wrapper // methods around SkCanvas are defined by the DRAW() macro in // SkRecordDraw.cpp. template <typename T> void operator()(const T& r) { this->draw(r); } protected: SkPicture const* const* drawablePicts() const { return fDrawablePicts; } int drawableCount() const { return fDrawableCount; } private: // No base case, so we'll be compile-time checked that we implement all possibilities. template <typename T> void draw(const T&); const SkMatrix fInitialCTM; SkCanvas* fCanvas; SkPicture const* const* fDrawablePicts; SkDrawable* const* fDrawables; int fDrawableCount; }; } // namespace SkRecords #endif//SkRecordDraw_DEFINED