1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 776f10a3bd936af7dbe2b5873d5a7eedd73cdc5dareed@google.com 88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkPictureRecord_DEFINED 98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkPictureRecord_DEFINED 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCanvas.h" 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkFlattenable.h" 138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPathHeap.h" 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPicture.h" 15db539905bb3af7bd05839a7d2558e97d5cb51ca2robertphillips#include "SkPictureData.h" 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPictureFlat.h" 178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTemplates.h" 188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkWriter32.h" 198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 209f5898d31b91500e09a70c7f70265a2d813b2534rileya@google.comclass SkBBoxHierarchy; 218016f79cfc6b4e9b34049ecbccdb65ee222d537acommit-bot@chromium.orgclass SkPictureStateTree; 229f5898d31b91500e09a70c7f70265a2d813b2534rileya@google.com 232ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com// These macros help with packing and unpacking a single byte value and 242ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com// a 3 byte value into/out of a uint32_t 252ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com#define MASK_24 0x00FFFFFF 262ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com#define UNPACK_8_24(combined, small, large) \ 272ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com small = (combined >> 24) & 0xFF; \ 282ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com large = combined & MASK_24; 292ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com#define PACK_8_24(small, large) ((small << 24) | large) 302ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com 312ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com 328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkPictureRecord : public SkCanvas { 338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 340bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips SkPictureRecord(const SkISize& dimensions, uint32_t recordFlags); 358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual ~SkPictureRecord(); 368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 372d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com virtual void clear(SkColor) SK_OVERRIDE; 382d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE; 398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void drawPoints(PointMode, size_t count, const SkPoint pts[], 402d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com const SkPaint&) SK_OVERRIDE; 414ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com virtual void drawOval(const SkRect&, const SkPaint&) SK_OVERRIDE; 427ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.com virtual void drawRect(const SkRect&, const SkPaint&) SK_OVERRIDE; 434ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com virtual void drawRRect(const SkRRect&, const SkPaint&) SK_OVERRIDE; 447ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.com virtual void drawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE; 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top, 462d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com const SkPaint*) SK_OVERRIDE; 477112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com virtual void drawBitmapRectToRect(const SkBitmap&, const SkRect* src, 487475811143e190e172bf83d13c4bdba85704b604skia.committer@gmail.com const SkRect& dst, const SkPaint* paint, 49eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org DrawBitmapRectFlags flags) SK_OVERRIDE; 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void drawBitmapMatrix(const SkBitmap&, const SkMatrix&, 512d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com const SkPaint*) SK_OVERRIDE; 52f0b5e1190af9807a027c0adba2f1380663c8e910reed@google.com virtual void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, 532d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com const SkRect& dst, const SkPaint*) SK_OVERRIDE; 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void drawSprite(const SkBitmap&, int left, int top, 552d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com const SkPaint*) SK_OVERRIDE; 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void drawVertices(VertexMode, int vertexCount, 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkPoint vertices[], const SkPoint texs[], 588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkColor colors[], SkXfermode*, 598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const uint16_t indices[], int indexCount, 602d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com const SkPaint&) SK_OVERRIDE; 612d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com virtual void drawData(const void*, size_t) SK_OVERRIDE; 620a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com virtual void beginCommentGroup(const char* description) SK_OVERRIDE; 630a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com virtual void addComment(const char* kywd, const char* value) SK_OVERRIDE; 640a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com virtual void endCommentGroup() SK_OVERRIDE; 658f9ecbd3466d4330886b4c23b06e75b468c795adjunov@chromium.org virtual bool isDrawingToLayer() const SK_OVERRIDE; 668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 673f5ecd6cb417c7adf256e48ef3f336052d326b84junov@chromium.org void addFontMetricsTopBottom(const SkPaint& paint, const SkFlatData&, 684595426b553c0c721f41aa14d598caa5d9940207reed@google.com SkScalar minY, SkScalar maxY); 6974b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 709b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips const SkTDArray<const SkPicture* >& getPictureRefs() const { 718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return fPictureRefs; 728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 7374b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 74b7425173f96e93b090787e2386ba5f022b6c2869fmalita const SkTDArray<const SkTextBlob* >& getTextBlobRefs() const { 75b7425173f96e93b090787e2386ba5f022b6c2869fmalita return fTextBlobRefs; 76b7425173f96e93b090787e2386ba5f022b6c2869fmalita } 77b7425173f96e93b090787e2386ba5f022b6c2869fmalita 780bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips SkData* opData(bool deepCopy) const { 790bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips this->validate(fWriter.bytesWritten(), 0); 800bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips 810bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips if (fWriter.bytesWritten() == 0) { 820bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips return SkData::NewEmpty(); 830bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips } 840bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips 850bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips if (deepCopy) { 860bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips return SkData::NewWithCopy(fWriter.contiguousArray(), fWriter.bytesWritten()); 870bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips } 880bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips 890bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips return fWriter.snapshotAsData(); 900bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips } 910bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips 92e26e65e8f831f7a5626c92d11bbb8c2cec1f70derobertphillips const SkPathHeap* pathHeap() const { 93e26e65e8f831f7a5626c92d11bbb8c2cec1f70derobertphillips return fPathHeap.get(); 940bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips } 950bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips 960bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips const SkPictureContentInfo& contentInfo() const { 970bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips return fContentInfo; 980bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips } 990bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips 1004866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org void setFlags(uint32_t recordFlags) { 1014866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org fRecordFlags = recordFlags; 1024866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org } 1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkWriter32& writeStream() const { 1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return fWriter; 1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 108d86e7ab6044e4aba017cb126a26dd378eec9fcbareed@google.com void beginRecording(); 109a6c9e0e02be390d36b80f4872c628edb3594208ejunov@chromium.org void endRecording(); 110d86e7ab6044e4aba017cb126a26dd378eec9fcbareed@google.com 111e494dbdec36f0ffa4affeac1c3f405b58ac41220commit-bot@chromium.org void internalOnly_EnableOpts(bool optsEnabled) { 112e494dbdec36f0ffa4affeac1c3f405b58ac41220commit-bot@chromium.org fOptsEnabled = optsEnabled; 113e494dbdec36f0ffa4affeac1c3f405b58ac41220commit-bot@chromium.org } 114e494dbdec36f0ffa4affeac1c3f405b58ac41220commit-bot@chromium.org 11568250c8e7c2bf5d669397c849259c3bcad40237esenorblanco@chromium.orgprotected: 11668250c8e7c2bf5d669397c849259c3bcad40237esenorblanco@chromium.org void addNoOp(); 11768250c8e7c2bf5d669397c849259c3bcad40237esenorblanco@chromium.org 1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 1194b32bd53c63b245707822ae83e3215863303bf43commit-bot@chromium.org void handleOptimization(int opt); 120dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org size_t recordRestoreOffsetPlaceholder(SkRegion::Op); 1215a63f24558b84610e93c6d7b67d849b5ab435e51robertphillips@google.com void fillRestoreOffsetPlaceholdersForCurrentStackLevel(uint32_t restoreOffset); 122e3dbedb44cad6c7b7e5c9aae5224d0b0abec9bf4junov@chromium.org 123ffacd3c56d73c03d3fe53b47a49ea6be2ca4748freed@google.com SkTDArray<int32_t> fRestoreOffsetStack; 1248f9ecbd3466d4330886b4c23b06e75b468c795adjunov@chromium.org int fFirstSavedLayerIndex; 1258f9ecbd3466d4330886b4c23b06e75b468c795adjunov@chromium.org enum { 1268f9ecbd3466d4330886b4c23b06e75b468c795adjunov@chromium.org kNoSavedLayerIndex = -1 1278f9ecbd3466d4330886b4c23b06e75b468c795adjunov@chromium.org }; 1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 129210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.org SkTDArray<uint32_t> fCullOffsetStack; 130210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.org 1312ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com /* 1322ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com * Write the 'drawType' operation and chunk size to the skp. 'size' 133ce8343d7dde40e509317708de239be1fa72b28f9skia.committer@gmail.com * can potentially be increased if the chunk size needs its own storage 1342ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com * location (i.e., it overflows 24 bits). 1352ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com * Returns the start offset of the chunk. This is the location at which 1362ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com * the opcode & size are stored. 137ce8343d7dde40e509317708de239be1fa72b28f9skia.committer@gmail.com * TODO: since we are handing the size into here we could call reserve 1382ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com * and then return a pointer to the memory storage. This could decrease 1392ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com * allocation overhead but could lead to more wasted space (the tail 1402ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com * end of blocks could go unused). Possibly add a second addDraw that 1412ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com * operates in this manner. 1422ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com */ 143dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org size_t addDraw(DrawType drawType, size_t* size) { 1444469938e92d779dff05e745559e67907bbf21e78reed@google.com size_t offset = fWriter.bytesWritten(); 1452ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com 14697af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com this->predrawNotify(); 147afdada2eabdef47a59e08c884b2beb1af3f31aa5hendrikw fContentInfo.addOperation(); 14897af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com 1492ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com SkASSERT(0 != *size); 1502ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com SkASSERT(((uint8_t) drawType) == drawType); 1512ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com 1522ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com if (0 != (*size & ~MASK_24) || *size == MASK_24) { 1532ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com fWriter.writeInt(PACK_8_24(drawType, MASK_24)); 1542ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com *size += 1; 155dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org fWriter.writeInt(SkToU32(*size)); 1562ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com } else { 157dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org fWriter.writeInt(PACK_8_24(drawType, SkToU32(*size))); 1582ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com } 1592ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com 1602ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com return offset; 16174b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org } 1622ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com 1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void addInt(int value) { 1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fWriter.writeInt(value); 1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void addScalar(SkScalar scalar) { 1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fWriter.writeScalar(scalar); 1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 16974b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 1708016f79cfc6b4e9b34049ecbccdb65ee222d537acommit-bot@chromium.org // The command at 'offset' in the skp uses the specified bitmap 1718016f79cfc6b4e9b34049ecbccdb65ee222d537acommit-bot@chromium.org int addBitmap(const SkBitmap& bitmap); 1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void addMatrix(const SkMatrix& matrix); 173f3b1223e6d52b161dbc59a4119ba6a4161b10a54junov@chromium.org const SkFlatData* addPaint(const SkPaint& paint) { return this->addPaintPtr(&paint); } 174f3b1223e6d52b161dbc59a4119ba6a4161b10a54junov@chromium.org const SkFlatData* addPaintPtr(const SkPaint* paint); 175cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org void addFlatPaint(const SkFlatData* flatPaint); 176b3c9d1c33caf325aada244204215eb790c228c12dandov void addPatch(const SkPoint cubics[12]); 1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void addPath(const SkPath& path); 1789b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips void addPicture(const SkPicture* picture); 1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void addPoint(const SkPoint& point); 1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void addPoints(const SkPoint pts[], int count); 1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void addRect(const SkRect& rect); 1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void addRectPtr(const SkRect* rect); 183f0b5e1190af9807a027c0adba2f1380663c8e910reed@google.com void addIRect(const SkIRect& rect); 1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void addIRectPtr(const SkIRect* rect); 1854ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com void addRRect(const SkRRect&); 1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void addRegion(const SkRegion& region); 1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void addText(const void* text, size_t byteLength); 188b7425173f96e93b090787e2386ba5f022b6c2869fmalita void addTextBlob(const SkTextBlob* blob); 1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1904866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org int find(const SkBitmap& bitmap); 1914866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org 1926162af8d4c05354a160f6aa44d9c4440721c892arobertphillipsprotected: 193dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org void validate(size_t initialOffset, size_t size) const { 1944469938e92d779dff05e745559e67907bbf21e78reed@google.com SkASSERT(fWriter.bytesWritten() == initialOffset + size); 1952ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com } 1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1974a8126e7f81384526629b1e21bf89b632ea13cd9reed virtual SkSurface* onNewSurface(const SkImageInfo&, const SkSurfaceProps&) SK_OVERRIDE; 198c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org const void* onPeekPixels(SkImageInfo*, size_t*) SK_OVERRIDE { 199c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org return NULL; 200c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org } 201e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org 2025f6102d07982043542343ff0a6c67b1319ac9fc7Florin Malita virtual void willSave() SK_OVERRIDE; 203e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org virtual SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SaveFlags) SK_OVERRIDE; 204e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org virtual void willRestore() SK_OVERRIDE; 205e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org 20644c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org virtual void didConcat(const SkMatrix&) SK_OVERRIDE; 20744c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org virtual void didSetMatrix(const SkMatrix&) SK_OVERRIDE; 20844c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org 209ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) SK_OVERRIDE; 210210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.org virtual void onPushCull(const SkRect&) SK_OVERRIDE; 211210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.org virtual void onPopCull() SK_OVERRIDE; 21276f10a3bd936af7dbe2b5873d5a7eedd73cdc5dareed@google.com 213e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com virtual void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, 214e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com const SkPaint&) SK_OVERRIDE; 215e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com virtual void onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[], 216e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com const SkPaint&) SK_OVERRIDE; 217e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com virtual void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], 218e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com SkScalar constY, const SkPaint&) SK_OVERRIDE; 219e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com virtual void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path, 220e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com const SkMatrix* matrix, const SkPaint&) SK_OVERRIDE; 221b7425173f96e93b090787e2386ba5f022b6c2869fmalita virtual void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, 222b7425173f96e93b090787e2386ba5f022b6c2869fmalita const SkPaint& paint) SK_OVERRIDE; 223b3c9d1c33caf325aada244204215eb790c228c12dandov 224b3c9d1c33caf325aada244204215eb790c228c12dandov virtual void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], 225b3c9d1c33caf325aada244204215eb790c228c12dandov const SkPoint texCoords[4], SkXfermode* xmode, 226b3c9d1c33caf325aada244204215eb790c228c12dandov const SkPaint& paint) SK_OVERRIDE; 227e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com 2288f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com virtual void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE; 2298f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com virtual void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE; 2308f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com virtual void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE; 2318f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com virtual void onClipRegion(const SkRegion&, SkRegion::Op) SK_OVERRIDE; 2328f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com 233d5fa1a455aad61f3e99081fe7a9b065cb3b115c6reed virtual void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) SK_OVERRIDE; 2349b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips 235cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org // Return fontmetrics.fTop,fBottom in topbot[0,1], after they have been 236cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org // tweaked by paint.computeFastBounds(). 237cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org static void ComputeFontMetricsTopBottom(const SkPaint& paint, SkScalar topbot[2]); 238cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org 239cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org // Make sure that flat has fTopBot written. 240cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org static void WriteTopBot(const SkPaint& paint, const SkFlatData& flat) { 241cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org if (!flat.isTopBotWritten()) { 242cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org ComputeFontMetricsTopBottom(paint, flat.writableTopBot()); 243cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org SkASSERT(flat.isTopBotWritten()); 244cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org } 245cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org } 246cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org // Will return a cached version when possible. 247cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org const SkFlatData* getFlatPaintData(const SkPaint& paint); 248cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org /** 249cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org * SkBBoxRecord::drawPosTextH gets a flat paint and uses it, 250cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org * then it calls this, using the extra parameter, to avoid duplication. 251cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org */ 252cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org void drawPosTextHImpl(const void* text, size_t byteLength, 253cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org const SkScalar xpos[], SkScalar constY, 254cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org const SkPaint& paint, const SkFlatData* flatPaintData); 2559f5898d31b91500e09a70c7f70265a2d813b2534rileya@google.com 2565a63f24558b84610e93c6d7b67d849b5ab435e51robertphillips@google.com int addPathToHeap(const SkPath& path); // does not write to ops stream 2575a63f24558b84610e93c6d7b67d849b5ab435e51robertphillips@google.com 2581dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com // These entry points allow the writing of matrices, clips, saves & 2595a63f24558b84610e93c6d7b67d849b5ab435e51robertphillips@google.com // restores to be deferred (e.g., if the MC state is being collapsed and 2605a63f24558b84610e93c6d7b67d849b5ab435e51robertphillips@google.com // only written out as needed). 2615a63f24558b84610e93c6d7b67d849b5ab435e51robertphillips@google.com void recordConcat(const SkMatrix& matrix); 262d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org void recordTranslate(const SkMatrix& matrix); 263d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org void recordScale(const SkMatrix& matrix); 264dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org size_t recordClipRect(const SkRect& rect, SkRegion::Op op, bool doAA); 265dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org size_t recordClipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA); 266dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org size_t recordClipPath(int pathID, SkRegion::Op op, bool doAA); 267dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org size_t recordClipRegion(const SkRegion& region, SkRegion::Op op); 2685f6102d07982043542343ff0a6c67b1319ac9fc7Florin Malita void recordSave(); 2695a63f24558b84610e93c6d7b67d849b5ab435e51robertphillips@google.com void recordSaveLayer(const SkRect* bounds, const SkPaint* paint, SaveFlags flags); 270105a4a584c4c2c84c24e102112326b15683673f5robertphillips@google.com void recordRestore(bool fillInSkips = true); 2715a63f24558b84610e93c6d7b67d849b5ab435e51robertphillips@google.com 2729f5898d31b91500e09a70c7f70265a2d813b2534rileya@google.com // These are set to NULL in our constructor, but may be changed by 2739f5898d31b91500e09a70c7f70265a2d813b2534rileya@google.com // subclasses, in which case they will be SkSafeUnref'd in our destructor. 2749f5898d31b91500e09a70c7f70265a2d813b2534rileya@google.com SkBBoxHierarchy* fBoundingHierarchy; 2759f5898d31b91500e09a70c7f70265a2d813b2534rileya@google.com SkPictureStateTree* fStateTree; 2769f5898d31b91500e09a70c7f70265a2d813b2534rileya@google.com 277801cee1d4cad2c382059c0f367edd77298b05caarobertphillips@google.com // Allocated in the constructor and managed by this class. 278c9ab987efcb7e8b69237d565f73c28c137610232djsollen@google.com SkBitmapHeap* fBitmapHeap; 279801cee1d4cad2c382059c0f367edd77298b05caarobertphillips@google.com 280801cee1d4cad2c382059c0f367edd77298b05caarobertphillips@google.comprivate: 2810bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips SkPictureContentInfo fContentInfo; 2820bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips SkAutoTUnref<SkPathHeap> fPathHeap; 2830bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips 28421830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com SkChunkFlatController fFlattenableHeap; 2854866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org 286d2700eec7eb2e26beb206b88a0f0b6f3c5f49118djsollen@google.com SkPaintDictionary fPaints; 287d2700eec7eb2e26beb206b88a0f0b6f3c5f49118djsollen@google.com 2888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkWriter32 fWriter; 2898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 29009b84a00f79979142fbcfd691ccaeb5e5600922dreed@android.com // we ref each item in these arrays 291b7425173f96e93b090787e2386ba5f022b6c2869fmalita SkTDArray<const SkPicture*> fPictureRefs; 292b7425173f96e93b090787e2386ba5f022b6c2869fmalita SkTDArray<const SkTextBlob*> fTextBlobRefs; 2938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 294ae814c809e1c4e02a1876c39065775c8c7d00f96reed@android.com uint32_t fRecordFlags; 295e494dbdec36f0ffa4affeac1c3f405b58ac41220commit-bot@chromium.org bool fOptsEnabled; 296e494dbdec36f0ffa4affeac1c3f405b58ac41220commit-bot@chromium.org int fInitialSaveCount; 297ae814c809e1c4e02a1876c39065775c8c7d00f96reed@android.com 2986142609b22814283210f79d698182b651a93136crobertphillips friend class SkPictureData; // for SkPictureData's SkPictureRecord-based constructor 2991cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org friend class SkPictureTester; // for unit testing 3008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com typedef SkCanvas INHERITED; 3028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 3038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 305