1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2011 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifndef SkPictureRecord_DEFINED 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define SkPictureRecord_DEFINED 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkFlattenable.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPicture.h" 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPictureData.h" 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTArray.h" 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTDArray.h" 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTHash.h" 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkVertices.h" 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkWriter32.h" 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// These macros help with packing and unpacking a single byte value and 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// a 3 byte value into/out of a uint32_t 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define MASK_24 0x00FFFFFF 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define UNPACK_8_24(combined, small, large) \ 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot small = (combined >> 24) & 0xFF; \ 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot large = combined & MASK_24; 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define PACK_8_24(small, large) ((small << 24) | large) 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkPictureRecord : public SkCanvas { 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPictureRecord(const SkISize& dimensions, uint32_t recordFlags); 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ~SkPictureRecord() override; 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkTDArray<const SkPicture* >& getPictureRefs() const { 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fPictureRefs; 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkTDArray<SkDrawable* >& getDrawableRefs() const { 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fDrawableRefs; 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkTDArray<const SkTextBlob* >& getTextBlobRefs() const { 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fTextBlobRefs; 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkTDArray<const SkVertices* >& getVerticesRefs() const { 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fVerticesRefs; 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkTDArray<const SkImage* >& getImageRefs() const { 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fImageRefs; 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkData> opData() const { 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->validate(fWriter.bytesWritten(), 0); 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fWriter.bytesWritten() == 0) { 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkData::MakeEmpty(); 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fWriter.snapshotAsData(); 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void setFlags(uint32_t recordFlags) { 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRecordFlags = recordFlags; 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkWriter32& writeStream() const { 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fWriter; 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void beginRecording(); 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void endRecording(); 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void addNoOp(); 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void handleOptimization(int opt); 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot size_t recordRestoreOffsetPlaceholder(SkClipOp); 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void fillRestoreOffsetPlaceholdersForCurrentStackLevel(uint32_t restoreOffset); 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTDArray<int32_t> fRestoreOffsetStack; 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTDArray<uint32_t> fCullOffsetStack; 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /* 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Write the 'drawType' operation and chunk size to the skp. 'size' 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * can potentially be increased if the chunk size needs its own storage 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * location (i.e., it overflows 24 bits). 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Returns the start offset of the chunk. This is the location at which 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * the opcode & size are stored. 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * TODO: since we are handing the size into here we could call reserve 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * and then return a pointer to the memory storage. This could decrease 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * allocation overhead but could lead to more wasted space (the tail 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * end of blocks could go unused). Possibly add a second addDraw that 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * operates in this manner. 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot size_t addDraw(DrawType drawType, size_t* size) { 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot size_t offset = fWriter.bytesWritten(); 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->predrawNotify(); 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(0 != *size); 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(((uint8_t) drawType) == drawType); 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (0 != (*size & ~MASK_24) || *size == MASK_24) { 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fWriter.writeInt(PACK_8_24(drawType, MASK_24)); 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *size += 1; 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fWriter.writeInt(SkToU32(*size)); 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else { 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fWriter.writeInt(PACK_8_24(drawType, SkToU32(*size))); 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return offset; 116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void addInt(int value) { 119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fWriter.writeInt(value); 120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void addScalar(SkScalar scalar) { 122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fWriter.writeScalar(scalar); 123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void addImage(const SkImage*); 126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void addMatrix(const SkMatrix& matrix); 127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void addPaint(const SkPaint& paint) { this->addPaintPtr(&paint); } 128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void addPaintPtr(const SkPaint* paint); 129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void addPatch(const SkPoint cubics[12]); 130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void addPath(const SkPath& path); 131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void addPicture(const SkPicture* picture); 132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void addDrawable(SkDrawable* picture); 133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void addPoint(const SkPoint& point); 134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void addPoints(const SkPoint pts[], int count); 135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void addRect(const SkRect& rect); 136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void addRectPtr(const SkRect* rect); 137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void addIRect(const SkIRect& rect); 138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void addIRectPtr(const SkIRect* rect); 139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void addRRect(const SkRRect&); 140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void addRegion(const SkRegion& region); 141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void addText(const void* text, size_t byteLength); 142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void addTextBlob(const SkTextBlob* blob); 143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void addVertices(const SkVertices*); 144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int find(const SkBitmap& bitmap); 146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void validate(size_t initialOffset, size_t size) const { 149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(fWriter.bytesWritten() == initialOffset + size); 150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkSurface> onNewSurface(const SkImageInfo&, const SkSurfaceProps&) override; 153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool onPeekPixels(SkPixmap*) override { return false; } 154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onFlush() override; 156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void willSave() override; 158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SaveLayerStrategy getSaveLayerStrategy(const SaveLayerRec&) override; 159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void willRestore() override; 160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void didConcat(const SkMatrix&) override; 162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void didSetMatrix(const SkMatrix&) override; 163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override; 165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawText(const void* text, size_t, SkScalar x, SkScalar y, const SkPaint&) override; 167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawPosText(const void* text, size_t, const SkPoint pos[], const SkPaint&) override; 168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawPosTextH(const void* text, size_t, const SkScalar xpos[], SkScalar constY, 169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkPaint&) override; 170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path, 171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkMatrix* matrix, const SkPaint&) override; 172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawTextRSXform(const void* text, size_t byteLength, const SkRSXform xform[], 173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkRect* cull, const SkPaint&) override; 174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, 175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkPaint& paint) override; 176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], 178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkPoint texCoords[4], SkBlendMode, const SkPaint& paint) override; 179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawAtlas(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[], int, 180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode, const SkRect*, const SkPaint*) override; 181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 182fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawPaint(const SkPaint&) override; 183fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint&) override; 184fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawRect(const SkRect&, const SkPaint&) override; 185fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawRegion(const SkRegion&, const SkPaint&) override; 186fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawOval(const SkRect&, const SkPaint&) override; 187fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawArc(const SkRect&, SkScalar, SkScalar, bool, const SkPaint&) override; 188fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawRRect(const SkRRect&, const SkPaint&) override; 189fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawPath(const SkPath&, const SkPaint&) override; 190fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawImage(const SkImage*, SkScalar left, SkScalar top, const SkPaint*) override; 191fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawImageRect(const SkImage*, const SkRect* src, const SkRect& dst, 192fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkPaint*, SrcRectConstraint) override; 193fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawImageNine(const SkImage*, const SkIRect& center, const SkRect& dst, 194fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkPaint*) override; 195fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawImageLattice(const SkImage*, const SkCanvas::Lattice& lattice, const SkRect& dst, 196fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkPaint*) override; 197fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawShadowRec(const SkPath&, const SkDrawShadowRec&) override; 198fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawVerticesObject(const SkVertices*, SkBlendMode, const SkPaint&) override; 199fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 200fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onClipRect(const SkRect&, SkClipOp, ClipEdgeStyle) override; 201fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onClipRRect(const SkRRect&, SkClipOp, ClipEdgeStyle) override; 202fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onClipPath(const SkPath&, SkClipOp, ClipEdgeStyle) override; 203fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onClipRegion(const SkRegion&, SkClipOp) override; 204fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 205fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) override; 206fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 207fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawDrawable(SkDrawable*, const SkMatrix*) override; 208fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawAnnotation(const SkRect&, const char[], SkData*) override; 209fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 210fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int addPathToHeap(const SkPath& path); // does not write to ops stream 211fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 212fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // These entry points allow the writing of matrices, clips, saves & 213fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // restores to be deferred (e.g., if the MC state is being collapsed and 214fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // only written out as needed). 215fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void recordConcat(const SkMatrix& matrix); 216fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void recordTranslate(const SkMatrix& matrix); 217fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void recordScale(const SkMatrix& matrix); 218fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot size_t recordClipRect(const SkRect& rect, SkClipOp op, bool doAA); 219fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot size_t recordClipRRect(const SkRRect& rrect, SkClipOp op, bool doAA); 220fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot size_t recordClipPath(int pathID, SkClipOp op, bool doAA); 221fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot size_t recordClipRegion(const SkRegion& region, SkClipOp op); 222fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void recordSave(); 223fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void recordSaveLayer(const SaveLayerRec&); 224fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void recordRestore(bool fillInSkips = true); 225fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 226fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // SHOULD NEVER BE CALLED 227fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawBitmap(const SkBitmap&, SkScalar left, SkScalar top, const SkPaint*) override { 228fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SK_ABORT("not reached"); 229fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 230fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawBitmapRect(const SkBitmap&, const SkRect* src, const SkRect& dst, const SkPaint*, 231fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SrcRectConstraint) override { 232fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SK_ABORT("not reached"); 233fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 234fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect& dst, 235fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkPaint*) override { 236fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SK_ABORT("not reached"); 237fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 238fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawBitmapLattice(const SkBitmap&, const SkCanvas::Lattice& lattice, const SkRect& dst, 239fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkPaint*) override { 240fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SK_ABORT("not reached"); 241fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 242fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 243fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 244fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTArray<SkPaint> fPaints; 245fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 246fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot struct PathHash { 247fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot uint32_t operator()(const SkPath& p) { return p.getGenerationID(); } 248fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 249fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTHashMap<SkPath, int, PathHash> fPaths; 250fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 251fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkWriter32 fWriter; 252fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 253fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // we ref each item in these arrays 254fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTDArray<const SkImage*> fImageRefs; 255fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTDArray<const SkPicture*> fPictureRefs; 256fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTDArray<SkDrawable*> fDrawableRefs; 257fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTDArray<const SkTextBlob*> fTextBlobRefs; 258fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTDArray<const SkVertices*> fVerticesRefs; 259fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 260fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot uint32_t fRecordFlags; 261fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int fInitialSaveCount; 262fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 263fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot friend class SkPictureData; // for SkPictureData's SkPictureRecord-based constructor 264fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 265fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef SkCanvas INHERITED; 266fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 267fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 268fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif 269