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