C++程序  |  56行  |  1.55 KB

/*
 * 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 "SkRecord.h"
#include "SkCanvas.h"

// Draw an SkRecord into an SkCanvas.  A convenience wrapper around SkRecords::Draw.
void SkRecordDraw(const SkRecord&, SkCanvas*);

namespace SkRecords {

// This is an SkRecord visitor that will draw that SkRecord to an SkCanvas.
class Draw : SkNoncopyable {
public:
    explicit Draw(SkCanvas* canvas)
        : fInitialCTM(canvas->getTotalMatrix()), fCanvas(canvas), fIndex(0) {}

    unsigned index() const { return fIndex; }
    void next() { ++fIndex; }

    template <typename T> void operator()(const T& r) {
        if (!this->skip(r)) {
            this->draw(r);
        }
    }

private:
    // No base case, so we'll be compile-time checked that we implement all possibilities.
    template <typename T> void draw(const T&);

    // skip() should return true if we can skip this command, false if not.
    // It may update fIndex directly to skip more than just this one command.

    // Mostly we just blindly call fCanvas and let it handle quick rejects itself.
    template <typename T> bool skip(const T&) { return false; }

    // We add our own quick rejects for commands added by optimizations.
    bool skip(const PairedPushCull&);
    bool skip(const BoundedDrawPosTextH&);

    const SkMatrix fInitialCTM;
    SkCanvas* fCanvas;
    unsigned fIndex;
};

}  // namespace SkRecords

#endif//SkRecordDraw_DEFINED