11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkPictureRecord_DEFINED
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkPictureRecord_DEFINED
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkCanvas.h"
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkFlattenable.h"
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPathHeap.h"
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPicture.h"
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPictureFlat.h"
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkTemplates.h"
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkWriter32.h"
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkPictureRecord : public SkCanvas {
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPictureRecord(uint32_t recordFlags);
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual ~SkPictureRecord();
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual int save(SaveFlags) SK_OVERRIDE;
251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual int saveLayer(const SkRect* bounds, const SkPaint*, SaveFlags) SK_OVERRIDE;
261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void restore() SK_OVERRIDE;
271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE;
281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE;
291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool rotate(SkScalar degrees) SK_OVERRIDE;
301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool skew(SkScalar sx, SkScalar sy) SK_OVERRIDE;
311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool concat(const SkMatrix& matrix) SK_OVERRIDE;
321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void setMatrix(const SkMatrix& matrix) SK_OVERRIDE;
331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool clipRect(const SkRect&, SkRegion::Op, bool) SK_OVERRIDE;
341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool clipPath(const SkPath&, SkRegion::Op, bool) SK_OVERRIDE;
351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool clipRegion(const SkRegion& region, SkRegion::Op op) SK_OVERRIDE;
361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void clear(SkColor) SK_OVERRIDE;
371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE;
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawPoints(PointMode, size_t count, const SkPoint pts[],
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            const SkPaint&) SK_OVERRIDE;
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void drawRect(const SkRect& rect, const SkPaint&) SK_OVERRIDE;
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void drawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE;
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top,
431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            const SkPaint*) SK_OVERRIDE;
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawBitmapRect(const SkBitmap&, const SkIRect* src,
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                const SkRect& dst, const SkPaint*) SK_OVERRIDE;
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawBitmapMatrix(const SkBitmap&, const SkMatrix&,
471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                  const SkPaint*) SK_OVERRIDE;
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                const SkRect& dst, const SkPaint*) SK_OVERRIDE;
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawSprite(const SkBitmap&, int left, int top,
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            const SkPaint*) SK_OVERRIDE;
524f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    virtual void drawText(const void* text, size_t byteLength, SkScalar x,
531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          SkScalar y, const SkPaint&) SK_OVERRIDE;
544f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    virtual void drawPosText(const void* text, size_t byteLength,
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                             const SkPoint pos[], const SkPaint&) SK_OVERRIDE;
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawPosTextH(const void* text, size_t byteLength,
571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                      const SkScalar xpos[], SkScalar constY, const SkPaint&) SK_OVERRIDE;
584f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    virtual void drawTextOnPath(const void* text, size_t byteLength,
594f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                            const SkPath& path, const SkMatrix* matrix,
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                const SkPaint&) SK_OVERRIDE;
611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void drawPicture(SkPicture& picture) SK_OVERRIDE;
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawVertices(VertexMode, int vertexCount,
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          const SkPoint vertices[], const SkPoint texs[],
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          const SkColor colors[], SkXfermode*,
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          const uint16_t indices[], int indexCount,
661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                              const SkPaint&) SK_OVERRIDE;
671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void drawData(const void*, size_t) SK_OVERRIDE;
684f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    virtual bool isDrawingToLayer() const SK_OVERRIDE;
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
70717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger    void addFontMetricsTopBottom(const SkPaint& paint, SkScalar minY, SkScalar maxY);
71717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkTDArray<const SkFlatBitmap* >& getBitmaps() const {
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return fBitmaps;
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkTDArray<const SkFlatMatrix* >& getMatrices() const {
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return fMatrices;
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkTDArray<const SkFlatPaint* >& getPaints() const {
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return fPaints;
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkTDArray<SkPicture* >& getPictureRefs() const {
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return fPictureRefs;
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkTDArray<const SkFlatRegion* >& getRegions() const {
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return fRegions;
860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
874f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void reset();
890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkWriter32& writeStream() const {
910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return fWriter;
920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkTDArray<uint32_t> fRestoreOffsetStack;
964f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    int fFirstSavedLayerIndex;
974f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    enum {
984f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        kNoSavedLayerIndex = -1
994f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    };
1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void addDraw(DrawType drawType) {
1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG_TRACE
1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("add %s\n", DrawTypeToString(drawType));
1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fWriter.writeInt(drawType);
1064f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    }
1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void addInt(int value) {
1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fWriter.writeInt(value);
1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void addScalar(SkScalar scalar) {
1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fWriter.writeScalar(scalar);
1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1134f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void addBitmap(const SkBitmap& bitmap);
1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void addMatrix(const SkMatrix& matrix);
1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void addMatrixPtr(const SkMatrix* matrix);
1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void addPaint(const SkPaint& paint);
1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void addPaintPtr(const SkPaint* paint);
1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void addPath(const SkPath& path);
1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void addPicture(SkPicture& picture);
1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void addPoint(const SkPoint& point);
1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void addPoints(const SkPoint pts[], int count);
1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void addRect(const SkRect& rect);
1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void addRectPtr(const SkRect* rect);
1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void addIRect(const SkIRect& rect);
1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void addIRectPtr(const SkIRect* rect);
1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void addRegion(const SkRegion& region);
1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void addText(const void* text, size_t byteLength);
1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int find(SkTDArray<const SkFlatBitmap* >& bitmaps,
1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                   const SkBitmap& bitmap);
1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int find(SkTDArray<const SkFlatMatrix* >& matrices,
1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                   const SkMatrix* matrix);
1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int find(SkTDArray<const SkFlatPaint* >& paints, const SkPaint* paint);
1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int find(SkTDArray<const SkFlatRegion* >& regions, const SkRegion& region);
1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG_DUMP
1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void dumpMatrices();
1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void dumpPaints();
1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG_SIZE
1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
1454f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    size_t size() const;
1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int bitmaps(size_t* size) const;
1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int matrices(size_t* size) const;
1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int paints(size_t* size) const;
1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int paths(size_t* size) const;
1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int regions(size_t* size) const;
1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    size_t streamlen() const;
1524f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    size_t fPointBytes, fRectBytes, fTextBytes;
1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int fPointWrites, fRectWrites, fTextWrites;
1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG_VALIDATE
1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void validate() const;
1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void validateBitmaps() const;
1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void validateMatrices() const;
1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void validatePaints() const;
1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void validatePaths() const;
1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void validateRegions() const;
1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else
1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void validate() const {}
1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkChunkAlloc fHeap;
1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int fBitmapIndex;
1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkTDArray<const SkFlatBitmap* > fBitmaps;
1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int fMatrixIndex;
1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkTDArray<const SkFlatMatrix* > fMatrices;
1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int fPaintIndex;
1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkTDArray<const SkFlatPaint* > fPaints;
1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int fRegionIndex;
1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkTDArray<const SkFlatRegion* > fRegions;
1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPathHeap* fPathHeap;  // reference counted
1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkWriter32 fWriter;
1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
184a8c52de60de1d2471206b3c81e9243e2c76f2edbMike Reed    // we ref each item in these arrays
1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkTDArray<SkPicture*> fPictureRefs;
1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
18735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    SkRefCntSet fRCSet;
18835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    SkRefCntSet fTFSet;
1894f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    uint32_t fRecordFlags;
1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // helper function to handle save/restore culling offsets
1931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void recordOffsetForRestore(SkRegion::Op op);
1941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    friend class SkPicturePlayback;
1964f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    friend class SkPictureTester; // for unit testing
1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    typedef SkCanvas INHERITED;
1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
202