17d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 2685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com/* 3685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * Copyright 2011 Google Inc. 4685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * 5685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * found in the LICENSE file. 77d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com */ 87d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 97d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 10ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com#include "SkBitmapHeap.h" 117d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com#include "SkCanvas.h" 127d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com#include "SkPaint.h" 1384204bcd081bb7824ec49cbced6849b827120b5creed@google.com#include "SkGPipe.h" 147d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com#include "SkGPipePriv.h" 157d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com#include "SkReader32.h" 1676061a60b1547ee2cd315ed3684aa782567e5922reed@google.com#include "SkStream.h" 17abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com 18abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com#include "SkColorFilter.h" 19abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com#include "SkDrawLooper.h" 20abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com#include "SkMaskFilter.h" 21d02e825bf79c38dad5fb7c02dfc301ad4dfabeaadjsollen@google.com#include "SkOrderedReadBuffer.h" 22abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com#include "SkPathEffect.h" 23abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com#include "SkRasterizer.h" 247a7e655343617093a5eea37c7a556602a1bb0576reed@google.com#include "SkRRect.h" 25abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com#include "SkShader.h" 2676061a60b1547ee2cd315ed3684aa782567e5922reed@google.com#include "SkTypeface.h" 27abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com#include "SkXfermode.h" 28abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com 29e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.comstatic void set_paintflat(SkPaint* paint, SkFlattenable* obj, unsigned paintFlat) { 30e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com SkASSERT(paintFlat < kCount_PaintFlats); 31e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com switch (paintFlat) { 32e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com case kColorFilter_PaintFlat: 33e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com paint->setColorFilter((SkColorFilter*)obj); 34e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com break; 354dbaefc11dba3a1dce43ab4177789a6fee978356reed@google.com case kDrawLooper_PaintFlat: 364dbaefc11dba3a1dce43ab4177789a6fee978356reed@google.com paint->setLooper((SkDrawLooper*)obj); 374dbaefc11dba3a1dce43ab4177789a6fee978356reed@google.com break; 38e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com case kMaskFilter_PaintFlat: 39e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com paint->setMaskFilter((SkMaskFilter*)obj); 40e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com break; 41e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com case kPathEffect_PaintFlat: 42e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com paint->setPathEffect((SkPathEffect*)obj); 43e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com break; 44e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com case kRasterizer_PaintFlat: 45e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com paint->setRasterizer((SkRasterizer*)obj); 46e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com break; 47e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com case kShader_PaintFlat: 48e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com paint->setShader((SkShader*)obj); 49e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com break; 50872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com case kImageFilter_PaintFlat: 51872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com paint->setImageFilter((SkImageFilter*)obj); 52872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com break; 53e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com case kXfermode_PaintFlat: 54e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com paint->setXfermode((SkXfermode*)obj); 55e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com break; 569ab3951aa71a78f43fb452754b531021b80830d8epoger@google.com case kAnnotation_PaintFlat: 579ab3951aa71a78f43fb452754b531021b80830d8epoger@google.com paint->setAnnotation((SkAnnotation*)obj); 589ab3951aa71a78f43fb452754b531021b80830d8epoger@google.com break; 59e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com default: 602d7de2d243beab591671dfaf535a637b5d305735tomhudson@google.com SkDEBUGFAIL("never gets here"); 61e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com } 62e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com} 63e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com 64abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.comtemplate <typename T> class SkRefCntTDArray : public SkTDArray<T> { 65abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.compublic: 66abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com ~SkRefCntTDArray() { this->unrefAll(); } 67abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com}; 687d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 69675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.comclass SkGPipeState : public SkBitmapHeapReader { 707d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.compublic: 717d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState(); 727d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com ~SkGPipeState(); 73abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com 749d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org void setSilent(bool silent) { 759d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org fSilent = silent; 769d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org } 779d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org 789d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org bool shouldDraw() { 799d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org return !fSilent; 809d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org } 819d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org 826c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com void setFlags(unsigned flags) { 836c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com if (fFlags != flags) { 846c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com fFlags = flags; 856c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com this->updateReader(); 866c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com } 876c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com } 886c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com 896c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com unsigned getFlags() const { 906c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com return fFlags; 916c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com } 926c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com 939ce78f26f529fd3e10a3eb4f044bc3f0037ead56djsollen@google.com void setReader(SkOrderedReadBuffer* reader) { 94734b8ad634b5fbd1e4d3b5319afb0e2d5e101119reed@google.com fReader = reader; 956c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com this->updateReader(); 96734b8ad634b5fbd1e4d3b5319afb0e2d5e101119reed@google.com } 97abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com 984b151113cc6939ba6bba66aae77779b82ec4a18creed@google.com const SkPaint& paint() const { return fPaint; } 994b151113cc6939ba6bba66aae77779b82ec4a18creed@google.com SkPaint* editPaint() { return &fPaint; } 100dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com 101e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com SkFlattenable* getFlat(unsigned index) const { 102e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com if (0 == index) { 103e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com return NULL; 104e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com } 105e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com return fFlatArray[index - 1]; 106e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com } 107e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com 108dca78908e4451feda399538618fb3ad83b014fd5reed@google.com void defFlattenable(PaintFlats pf, int index) { 1097bbea35d566ef85ee7b32d31a8197a19bb531cb2scroggo@google.com index--; 110e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com SkFlattenable* obj = fReader->readFlattenable(); 1117bbea35d566ef85ee7b32d31a8197a19bb531cb2scroggo@google.com if (fFlatArray.count() == index) { 1127bbea35d566ef85ee7b32d31a8197a19bb531cb2scroggo@google.com *fFlatArray.append() = obj; 1137bbea35d566ef85ee7b32d31a8197a19bb531cb2scroggo@google.com } else { 1147bbea35d566ef85ee7b32d31a8197a19bb531cb2scroggo@google.com SkSafeUnref(fFlatArray[index]); 1157bbea35d566ef85ee7b32d31a8197a19bb531cb2scroggo@google.com fFlatArray[index] = obj; 1167bbea35d566ef85ee7b32d31a8197a19bb531cb2scroggo@google.com } 117e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com } 118e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com 119179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com void defFactory(const char* name) { 120179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com SkFlattenable::Factory factory = SkFlattenable::NameToFactory(name); 121179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com if (factory) { 122179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com SkASSERT(fFactoryArray.find(factory) < 0); 123179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com *fFactoryArray.append() = factory; 124179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com } 125179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com } 126179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com 127693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com /** 128693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com * Add a bitmap to the array of bitmaps, or replace an existing one. 129693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com * This is only used when in cross process mode without a shared heap. 130693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com */ 131872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com void addBitmap(int index) { 132693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com SkASSERT(shouldFlattenBitmaps(fFlags)); 133dbc0c0b9ca6f4eb9c50862fe86eea3ebbc1012bbscroggo@google.com SkBitmap* bm; 134dbc0c0b9ca6f4eb9c50862fe86eea3ebbc1012bbscroggo@google.com if(fBitmaps.count() == index) { 135dbc0c0b9ca6f4eb9c50862fe86eea3ebbc1012bbscroggo@google.com bm = SkNEW(SkBitmap); 136dbc0c0b9ca6f4eb9c50862fe86eea3ebbc1012bbscroggo@google.com *fBitmaps.append() = bm; 137dbc0c0b9ca6f4eb9c50862fe86eea3ebbc1012bbscroggo@google.com } else { 138dbc0c0b9ca6f4eb9c50862fe86eea3ebbc1012bbscroggo@google.com bm = fBitmaps[index]; 139dbc0c0b9ca6f4eb9c50862fe86eea3ebbc1012bbscroggo@google.com } 140693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com fReader->readBitmap(bm); 141872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com } 142872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com 143675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com /** 144675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com * Override of SkBitmapHeapReader, so that SkOrderedReadBuffer can use 145693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com * these SkBitmaps for bitmap shaders. Used only in cross process mode 146693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com * without a shared heap. 147675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com */ 148675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com virtual SkBitmap* getBitmap(int32_t index) const SK_OVERRIDE { 149693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com SkASSERT(shouldFlattenBitmaps(fFlags)); 15076ffea1275cc772bfede0ec233c9578edad8eda8scroggo@google.com return fBitmaps[index]; 151872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com } 152872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com 153675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com /** 154675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com * Needed to be a non-abstract subclass of SkBitmapHeapReader. 155675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com */ 156675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com virtual void releaseRef(int32_t) SK_OVERRIDE {} 157675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com 158ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com void setSharedHeap(SkBitmapHeap* heap) { 159ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com SkASSERT(!shouldFlattenBitmaps(fFlags) || NULL == heap); 160ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com SkRefCnt_SafeAssign(fSharedHeap, heap); 161675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com this->updateReader(); 162ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com } 163ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com 164693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com /** 165693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com * Access the shared heap. Only used in the case when bitmaps are not 166693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com * flattened. 167693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com */ 168ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com SkBitmapHeap* getSharedHeap() const { 169693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com SkASSERT(!shouldFlattenBitmaps(fFlags)); 170ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com return fSharedHeap; 171ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com } 172ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com 173abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com void addTypeface() { 1749ce78f26f529fd3e10a3eb4f044bc3f0037ead56djsollen@google.com size_t size = fReader->read32(); 175abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com const void* data = fReader->skip(SkAlign4(size)); 17676061a60b1547ee2cd315ed3684aa782567e5922reed@google.com SkMemoryStream stream(data, size, false); 17776061a60b1547ee2cd315ed3684aa782567e5922reed@google.com *fTypefaces.append() = SkTypeface::Deserialize(&stream); 178dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com } 179ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com 180abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com void setTypeface(SkPaint* paint, unsigned id) { 181abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com paint->setTypeface(id ? fTypefaces[id - 1] : NULL); 182abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com } 183dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com 184e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.comprivate: 1856c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com void updateReader() { 1866c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com if (NULL == fReader) { 1876c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com return; 1886c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com } 1896c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com bool crossProcess = SkToBool(fFlags & SkGPipeWriter::kCrossProcess_Flag); 1906c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com fReader->setFlags(SkSetClearMask(fReader->getFlags(), crossProcess, 1916c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com SkFlattenableReadBuffer::kCrossProcess_Flag)); 1926c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com if (crossProcess) { 1936c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com fReader->setFactoryArray(&fFactoryArray); 1946c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com } else { 1956c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com fReader->setFactoryArray(NULL); 1966c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com } 197675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com 198675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com if (shouldFlattenBitmaps(fFlags)) { 199675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com fReader->setBitmapStorage(this); 200675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com } else { 201675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com fReader->setBitmapStorage(fSharedHeap); 202675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com } 2036c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com } 2049ce78f26f529fd3e10a3eb4f044bc3f0037ead56djsollen@google.com SkOrderedReadBuffer* fReader; 2054b151113cc6939ba6bba66aae77779b82ec4a18creed@google.com SkPaint fPaint; 2064b151113cc6939ba6bba66aae77779b82ec4a18creed@google.com SkTDArray<SkFlattenable*> fFlatArray; 2074b151113cc6939ba6bba66aae77779b82ec4a18creed@google.com SkTDArray<SkTypeface*> fTypefaces; 208734b8ad634b5fbd1e4d3b5319afb0e2d5e101119reed@google.com SkTDArray<SkFlattenable::Factory> fFactoryArray; 209872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com SkTDArray<SkBitmap*> fBitmaps; 2109d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org bool fSilent; 211ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com // Only used when sharing bitmaps with the writer. 212ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com SkBitmapHeap* fSharedHeap; 2136c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com unsigned fFlags; 2147d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}; 2157d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 2167d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com/////////////////////////////////////////////////////////////////////////////// 2177d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 2187d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comtemplate <typename T> const T* skip(SkReader32* reader, int count = 1) { 2197d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkASSERT(count >= 0); 2207d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com size_t size = sizeof(T) * count; 2217d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkASSERT(SkAlign4(size) == size); 2227d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com return reinterpret_cast<const T*>(reader->skip(size)); 2237d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 2247d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 2257d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comtemplate <typename T> const T* skipAlign(SkReader32* reader, int count = 1) { 2267d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkASSERT(count >= 0); 2277d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com size_t size = SkAlign4(sizeof(T) * count); 2287d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com return reinterpret_cast<const T*>(reader->skip(size)); 2297d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 2307d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 2317d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com/////////////////////////////////////////////////////////////////////////////// 2327d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com/////////////////////////////////////////////////////////////////////////////// 2337d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 2347d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void clipPath_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 2357d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 2367d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkPath path; 2376d537f88ab9f35cf16cfa2b7166fd829549d5783djsollen@google.com reader->readPath(&path); 238485049a8a60718fd8b59af6b87f0c3e645822d88scroggo@google.com bool doAA = SkToBool(DrawOp_unpackFlags(op32) & kClip_HasAntiAlias_DrawOpFlag); 239485049a8a60718fd8b59af6b87f0c3e645822d88scroggo@google.com canvas->clipPath(path, (SkRegion::Op)DrawOp_unpackData(op32), doAA); 2407d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 2417d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 2427d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void clipRegion_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 2437d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 2447d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkRegion rgn; 245d02e825bf79c38dad5fb7c02dfc301ad4dfabeaadjsollen@google.com reader->readRegion(&rgn); 2467d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com canvas->clipRegion(rgn, (SkRegion::Op)DrawOp_unpackData(op32)); 2477d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 2487d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 2497d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void clipRect_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 2507d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 251ba4a86b463c91e74c1f03276b9b4e6be98b84943scroggo@google.com const SkRect* rect = skip<SkRect>(reader); 252485049a8a60718fd8b59af6b87f0c3e645822d88scroggo@google.com bool doAA = SkToBool(DrawOp_unpackFlags(op32) & kClip_HasAntiAlias_DrawOpFlag); 253ba4a86b463c91e74c1f03276b9b4e6be98b84943scroggo@google.com canvas->clipRect(*rect, (SkRegion::Op)DrawOp_unpackData(op32), doAA); 2547d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 2557d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 2567a7e655343617093a5eea37c7a556602a1bb0576reed@google.comstatic void clipRRect_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 2577a7e655343617093a5eea37c7a556602a1bb0576reed@google.com SkGPipeState* state) { 2587a7e655343617093a5eea37c7a556602a1bb0576reed@google.com SkRRect rrect; 2597a7e655343617093a5eea37c7a556602a1bb0576reed@google.com reader->readRRect(&rrect); 2607a7e655343617093a5eea37c7a556602a1bb0576reed@google.com bool doAA = SkToBool(DrawOp_unpackFlags(op32) & kClip_HasAntiAlias_DrawOpFlag); 2617a7e655343617093a5eea37c7a556602a1bb0576reed@google.com canvas->clipRRect(rrect, (SkRegion::Op)DrawOp_unpackData(op32), doAA); 2627a7e655343617093a5eea37c7a556602a1bb0576reed@google.com} 2637a7e655343617093a5eea37c7a556602a1bb0576reed@google.com 2647d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com/////////////////////////////////////////////////////////////////////////////// 2657d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 2667d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void setMatrix_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 2677d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 2687d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkMatrix matrix; 269d02e825bf79c38dad5fb7c02dfc301ad4dfabeaadjsollen@google.com reader->readMatrix(&matrix); 2707d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com canvas->setMatrix(matrix); 2717d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 2727d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 2737d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void concat_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 2747d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 2757d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkMatrix matrix; 276d02e825bf79c38dad5fb7c02dfc301ad4dfabeaadjsollen@google.com reader->readMatrix(&matrix); 2777d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com canvas->concat(matrix); 2787d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 2797d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 2807d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void scale_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 2817d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 2827d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com const SkScalar* param = skip<SkScalar>(reader, 2); 2837d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com canvas->scale(param[0], param[1]); 2847d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 2857d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 2867d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void skew_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 2877d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 2887d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com const SkScalar* param = skip<SkScalar>(reader, 2); 2897d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com canvas->skew(param[0], param[1]); 2907d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 2917d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 2927d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void rotate_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 2937d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 2947d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com canvas->rotate(reader->readScalar()); 2957d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 2967d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 2977d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void translate_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 2987d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 2997d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com const SkScalar* param = skip<SkScalar>(reader, 2); 3007d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com canvas->translate(param[0], param[1]); 3017d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 3027d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 3037d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com/////////////////////////////////////////////////////////////////////////////// 3047d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 3057d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void save_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 3067d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 3077d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com canvas->save((SkCanvas::SaveFlags)DrawOp_unpackData(op32)); 3087d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 3097d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 3107d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void saveLayer_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 3117d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 31284204bcd081bb7824ec49cbced6849b827120b5creed@google.com unsigned flags = DrawOp_unpackFlags(op32); 31384204bcd081bb7824ec49cbced6849b827120b5creed@google.com SkCanvas::SaveFlags saveFlags = (SkCanvas::SaveFlags)DrawOp_unpackData(op32); 3147d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 3157d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com const SkRect* bounds = NULL; 3167d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com if (flags & kSaveLayer_HasBounds_DrawOpFlag) { 3177d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com bounds = skip<SkRect>(reader); 3187d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com } 3197d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com const SkPaint* paint = NULL; 3207d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com if (flags & kSaveLayer_HasPaint_DrawOpFlag) { 3214b151113cc6939ba6bba66aae77779b82ec4a18creed@google.com paint = &state->paint(); 3227d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com } 32384204bcd081bb7824ec49cbced6849b827120b5creed@google.com canvas->saveLayer(bounds, paint, saveFlags); 3247d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 3257d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 3267d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void restore_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 3277d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 3287d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com canvas->restore(); 3297d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 3307d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 3317d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com/////////////////////////////////////////////////////////////////////////////// 3327d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 3337d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawClear_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 3347d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 3357d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkColor color = 0; 3367d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com if (DrawOp_unpackFlags(op32) & kClear_HasColor_DrawOpFlag) { 3377d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com color = reader->readU32(); 3387d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com } 3397d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com canvas->clear(color); 3407d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 3417d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 3427d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawPaint_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 3437d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 3449d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org if (state->shouldDraw()) { 3459d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org canvas->drawPaint(state->paint()); 3469d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org } 3477d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 3487d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 3497d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawPoints_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 3507d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 3517d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkCanvas::PointMode mode = (SkCanvas::PointMode)DrawOp_unpackFlags(op32); 3527d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com size_t count = reader->readU32(); 3537d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com const SkPoint* pts = skip<SkPoint>(reader, count); 3549d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org if (state->shouldDraw()) { 3559d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org canvas->drawPoints(mode, count, pts, state->paint()); 3569d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org } 3577d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 3587d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 3597a7e655343617093a5eea37c7a556602a1bb0576reed@google.comstatic void drawOval_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 3607a7e655343617093a5eea37c7a556602a1bb0576reed@google.com SkGPipeState* state) { 3617a7e655343617093a5eea37c7a556602a1bb0576reed@google.com const SkRect* rect = skip<SkRect>(reader); 3627a7e655343617093a5eea37c7a556602a1bb0576reed@google.com if (state->shouldDraw()) { 3637a7e655343617093a5eea37c7a556602a1bb0576reed@google.com canvas->drawOval(*rect, state->paint()); 3647a7e655343617093a5eea37c7a556602a1bb0576reed@google.com } 3657a7e655343617093a5eea37c7a556602a1bb0576reed@google.com} 3667a7e655343617093a5eea37c7a556602a1bb0576reed@google.com 3677d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawRect_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 3687d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 3699d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org const SkRect* rect = skip<SkRect>(reader); 3709d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org if (state->shouldDraw()) { 3719d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org canvas->drawRect(*rect, state->paint()); 3729d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org } 3737d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 3747d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 3757a7e655343617093a5eea37c7a556602a1bb0576reed@google.comstatic void drawRRect_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 3767a7e655343617093a5eea37c7a556602a1bb0576reed@google.com SkGPipeState* state) { 3777a7e655343617093a5eea37c7a556602a1bb0576reed@google.com SkRRect rrect; 3787a7e655343617093a5eea37c7a556602a1bb0576reed@google.com reader->readRRect(&rrect); 3797a7e655343617093a5eea37c7a556602a1bb0576reed@google.com if (state->shouldDraw()) { 3807a7e655343617093a5eea37c7a556602a1bb0576reed@google.com canvas->drawRRect(rrect, state->paint()); 3817a7e655343617093a5eea37c7a556602a1bb0576reed@google.com } 3827a7e655343617093a5eea37c7a556602a1bb0576reed@google.com} 3837a7e655343617093a5eea37c7a556602a1bb0576reed@google.com 3847d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawPath_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 3857d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 3867d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkPath path; 3876d537f88ab9f35cf16cfa2b7166fd829549d5783djsollen@google.com reader->readPath(&path); 3889d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org if (state->shouldDraw()) { 3899d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org canvas->drawPath(path, state->paint()); 3909d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org } 3917d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 3927d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 3937d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawVertices_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 3947d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 3957d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com unsigned flags = DrawOp_unpackFlags(op32); 3967d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 3977d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkCanvas::VertexMode mode = (SkCanvas::VertexMode)reader->readU32(); 3987d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com int vertexCount = reader->readU32(); 3997d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com const SkPoint* verts = skip<SkPoint>(reader, vertexCount); 4007d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 4017d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com const SkPoint* texs = NULL; 4027d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com if (flags & kDrawVertices_HasTexs_DrawOpFlag) { 4037d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com texs = skip<SkPoint>(reader, vertexCount); 4047d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com } 4057d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 4067d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com const SkColor* colors = NULL; 4077d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com if (flags & kDrawVertices_HasColors_DrawOpFlag) { 4087d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com colors = skip<SkColor>(reader, vertexCount); 4097d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com } 4107d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 4117d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com // TODO: flatten/unflatten xfermodes 4127d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkXfermode* xfer = NULL; 4137d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 4147d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com int indexCount = 0; 4157d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com const uint16_t* indices = NULL; 4167d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com if (flags & kDrawVertices_HasIndices_DrawOpFlag) { 4177d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com indexCount = reader->readU32(); 4187d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com indices = skipAlign<uint16_t>(reader, indexCount); 4197d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com } 4209d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org if (state->shouldDraw()) { 4219d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org canvas->drawVertices(mode, vertexCount, verts, texs, colors, xfer, 4229d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org indices, indexCount, state->paint()); 4239d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org } 4247d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 4257d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 4267d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com/////////////////////////////////////////////////////////////////////////////// 4277d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 4287d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawText_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 4297d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 4307d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com size_t len = reader->readU32(); 4317d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com const void* text = reader->skip(SkAlign4(len)); 4327d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com const SkScalar* xy = skip<SkScalar>(reader, 2); 4339d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org if (state->shouldDraw()) { 4349d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org canvas->drawText(text, len, xy[0], xy[1], state->paint()); 4359d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org } 4367d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 4377d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 4387d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawPosText_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 4397d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 4407d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com size_t len = reader->readU32(); 4417d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com const void* text = reader->skip(SkAlign4(len)); 4427d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com size_t posCount = reader->readU32(); // compute by our writer 4437d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com const SkPoint* pos = skip<SkPoint>(reader, posCount); 4449d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org if (state->shouldDraw()) { 4459d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org canvas->drawPosText(text, len, pos, state->paint()); 4469d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org } 4477d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 4487d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 4497d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawPosTextH_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 4507d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 4517d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com size_t len = reader->readU32(); 4527d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com const void* text = reader->skip(SkAlign4(len)); 4537d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com size_t posCount = reader->readU32(); // compute by our writer 4547d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com const SkScalar* xpos = skip<SkScalar>(reader, posCount); 4557d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkScalar constY = reader->readScalar(); 4569d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org if (state->shouldDraw()) { 4579d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org canvas->drawPosTextH(text, len, xpos, constY, state->paint()); 4589d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org } 4597d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 4607d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 4617d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawTextOnPath_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 4627d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 4637d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com size_t len = reader->readU32(); 4647d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com const void* text = reader->skip(SkAlign4(len)); 4657d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 4667d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkPath path; 4676d537f88ab9f35cf16cfa2b7166fd829549d5783djsollen@google.com reader->readPath(&path); 4687d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 4697d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkMatrix matrixStorage; 4707d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com const SkMatrix* matrix = NULL; 4717d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com if (DrawOp_unpackFlags(op32) & kDrawTextOnPath_HasMatrix_DrawOpFlag) { 472d02e825bf79c38dad5fb7c02dfc301ad4dfabeaadjsollen@google.com reader->readMatrix(&matrixStorage); 4737d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com matrix = &matrixStorage; 4747d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com } 4759d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org if (state->shouldDraw()) { 4769d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org canvas->drawTextOnPath(text, len, path, matrix, state->paint()); 4779d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org } 4787d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 4797d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 4807d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com/////////////////////////////////////////////////////////////////////////////// 4817d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 4827549e37492896638598839fe3952e9d6823e2a92scroggo@google.comclass BitmapHolder : SkNoncopyable { 4837549e37492896638598839fe3952e9d6823e2a92scroggo@google.compublic: 4847549e37492896638598839fe3952e9d6823e2a92scroggo@google.com BitmapHolder(SkReader32* reader, uint32_t op32, SkGPipeState* state); 4857549e37492896638598839fe3952e9d6823e2a92scroggo@google.com ~BitmapHolder() { 486ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com if (fHeapEntry != NULL) { 487ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com fHeapEntry->releaseRef(); 4887549e37492896638598839fe3952e9d6823e2a92scroggo@google.com } 4897549e37492896638598839fe3952e9d6823e2a92scroggo@google.com } 4907549e37492896638598839fe3952e9d6823e2a92scroggo@google.com const SkBitmap* getBitmap() { 4917549e37492896638598839fe3952e9d6823e2a92scroggo@google.com return fBitmap; 4927549e37492896638598839fe3952e9d6823e2a92scroggo@google.com } 4937549e37492896638598839fe3952e9d6823e2a92scroggo@google.comprivate: 494ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com SkBitmapHeapEntry* fHeapEntry; 495ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com const SkBitmap* fBitmap; 49652a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com SkBitmap fBitmapStorage; 4977549e37492896638598839fe3952e9d6823e2a92scroggo@google.com}; 4987549e37492896638598839fe3952e9d6823e2a92scroggo@google.com 4997549e37492896638598839fe3952e9d6823e2a92scroggo@google.comBitmapHolder::BitmapHolder(SkReader32* reader, uint32_t op32, 5007549e37492896638598839fe3952e9d6823e2a92scroggo@google.com SkGPipeState* state) { 50152a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com const unsigned flags = state->getFlags(); 50252a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com const unsigned index = DrawOp_unpackData(op32); 50352a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com if (shouldFlattenBitmaps(flags)) { 504ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com fHeapEntry = NULL; 505ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com fBitmap = state->getBitmap(index); 5067549e37492896638598839fe3952e9d6823e2a92scroggo@google.com } else { 50752a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com SkBitmapHeapEntry* entry = state->getSharedHeap()->getEntry(index); 50852a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com if (SkToBool(flags & SkGPipeWriter::kSimultaneousReaders_Flag)) { 50952a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com // Make a shallow copy for thread safety. Each thread will point to the same SkPixelRef, 51052a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com // which is thread safe. 51152a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com fBitmapStorage = *entry->getBitmap(); 51252a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com fBitmap = &fBitmapStorage; 51352a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com // Release the ref on the bitmap now, since we made our own copy. 51452a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com entry->releaseRef(); 51552a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com fHeapEntry = NULL; 51652a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com } else { 51752a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com SkASSERT(!shouldFlattenBitmaps(flags)); 51852a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com SkASSERT(!SkToBool(flags & SkGPipeWriter::kSimultaneousReaders_Flag)); 51952a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com fHeapEntry = entry; 52052a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com fBitmap = fHeapEntry->getBitmap(); 52152a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com } 5226c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com } 5236c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com} 5246c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com 5257d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawBitmap_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 5267d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 5277549e37492896638598839fe3952e9d6823e2a92scroggo@google.com BitmapHolder holder(reader, op32, state); 528485049a8a60718fd8b59af6b87f0c3e645822d88scroggo@google.com bool hasPaint = SkToBool(DrawOp_unpackFlags(op32) & kDrawBitmap_HasPaint_DrawOpFlag); 529175f287b5ffa5f53219f5d5967ac5b926bbc461fscroggo@google.com SkScalar left = reader->readScalar(); 530175f287b5ffa5f53219f5d5967ac5b926bbc461fscroggo@google.com SkScalar top = reader->readScalar(); 5319d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org const SkBitmap* bitmap = holder.getBitmap(); 5329d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org if (state->shouldDraw()) { 5339d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org canvas->drawBitmap(*bitmap, left, top, hasPaint ? &state->paint() : NULL); 5349d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org } 5357d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 5367d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 5377d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawBitmapMatrix_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 5387d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 5396e29c75903762ed024c2e9b7cf0c397a6fee8bbcscroggo@google.com BitmapHolder holder(reader, op32, state); 540485049a8a60718fd8b59af6b87f0c3e645822d88scroggo@google.com bool hasPaint = SkToBool(DrawOp_unpackFlags(op32) & kDrawBitmap_HasPaint_DrawOpFlag); 5416e29c75903762ed024c2e9b7cf0c397a6fee8bbcscroggo@google.com SkMatrix matrix; 5426e29c75903762ed024c2e9b7cf0c397a6fee8bbcscroggo@google.com reader->readMatrix(&matrix); 5439d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org const SkBitmap* bitmap = holder.getBitmap(); 5449d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org if (state->shouldDraw()) { 5459d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org canvas->drawBitmapMatrix(*bitmap, matrix, 5469d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org hasPaint ? &state->paint() : NULL); 5479d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org } 5487d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 5497d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 550872508e82a19e552ef566da5e822023b93d5588fscroggo@google.comstatic void drawBitmapNine_rp(SkCanvas* canvas, SkReader32* reader, 551872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com uint32_t op32, SkGPipeState* state) { 5527549e37492896638598839fe3952e9d6823e2a92scroggo@google.com BitmapHolder holder(reader, op32, state); 553485049a8a60718fd8b59af6b87f0c3e645822d88scroggo@google.com bool hasPaint = SkToBool(DrawOp_unpackFlags(op32) & kDrawBitmap_HasPaint_DrawOpFlag); 554ba4a86b463c91e74c1f03276b9b4e6be98b84943scroggo@google.com const SkIRect* center = skip<SkIRect>(reader); 555872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com const SkRect* dst = skip<SkRect>(reader); 5569d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org const SkBitmap* bitmap = holder.getBitmap(); 5579d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org if (state->shouldDraw()) { 5589d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org canvas->drawBitmapNine(*bitmap, *center, *dst, 5599d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org hasPaint ? &state->paint() : NULL); 5609d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org } 561872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com} 562872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com 563872508e82a19e552ef566da5e822023b93d5588fscroggo@google.comstatic void drawBitmapRect_rp(SkCanvas* canvas, SkReader32* reader, 564872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com uint32_t op32, SkGPipeState* state) { 5657549e37492896638598839fe3952e9d6823e2a92scroggo@google.com BitmapHolder holder(reader, op32, state); 5666e29c75903762ed024c2e9b7cf0c397a6fee8bbcscroggo@google.com unsigned flags = DrawOp_unpackFlags(op32); 567485049a8a60718fd8b59af6b87f0c3e645822d88scroggo@google.com bool hasPaint = SkToBool(flags & kDrawBitmap_HasPaint_DrawOpFlag); 568485049a8a60718fd8b59af6b87f0c3e645822d88scroggo@google.com bool hasSrc = SkToBool(flags & kDrawBitmap_HasSrcRect_DrawOpFlag); 5693b4aeaece7522f100f25bcb2214214acaf7891e8reed@google.com const SkRect* src; 570872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com if (hasSrc) { 5713b4aeaece7522f100f25bcb2214214acaf7891e8reed@google.com src = skip<SkRect>(reader); 572ba4a86b463c91e74c1f03276b9b4e6be98b84943scroggo@google.com } else { 573ba4a86b463c91e74c1f03276b9b4e6be98b84943scroggo@google.com src = NULL; 574872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com } 575872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com const SkRect* dst = skip<SkRect>(reader); 5769d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org const SkBitmap* bitmap = holder.getBitmap(); 5779d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org if (state->shouldDraw()) { 5789d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org canvas->drawBitmapRectToRect(*bitmap, src, *dst, hasPaint ? &state->paint() : NULL); 5799d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org } 5807d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 5817d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 5827d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawSprite_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 5837d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 5847549e37492896638598839fe3952e9d6823e2a92scroggo@google.com BitmapHolder holder(reader, op32, state); 585485049a8a60718fd8b59af6b87f0c3e645822d88scroggo@google.com bool hasPaint = SkToBool(DrawOp_unpackFlags(op32) & kDrawBitmap_HasPaint_DrawOpFlag); 586ba4a86b463c91e74c1f03276b9b4e6be98b84943scroggo@google.com const SkIPoint* point = skip<SkIPoint>(reader); 5879d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org const SkBitmap* bitmap = holder.getBitmap(); 5889d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org if (state->shouldDraw()) { 5899d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org canvas->drawSprite(*bitmap, point->fX, point->fY, hasPaint ? &state->paint() : NULL); 5909d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org } 5917d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 5927d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 5937d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com/////////////////////////////////////////////////////////////////////////////// 5947d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 5957d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawData_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 5967d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 5977d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com // since we don't have a paint, we can use data for our (small) sizes 5987d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com size_t size = DrawOp_unpackData(op32); 5997d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com if (0 == size) { 6007d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com size = reader->readU32(); 6017d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com } 6027d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com const void* data = reader->skip(SkAlign4(size)); 6039d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org if (state->shouldDraw()) { 6049d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org canvas->drawData(data, size); 6059d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org } 6067d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 6077d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 6087d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawPicture_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 6097d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 6107d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com UNIMPLEMENTED 6117d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 6127d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 6137d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com/////////////////////////////////////////////////////////////////////////////// 6147d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 6157d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void paintOp_rp(SkCanvas*, SkReader32* reader, uint32_t op32, 6167d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkGPipeState* state) { 617e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com size_t offset = reader->offset(); 618e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com size_t stop = offset + PaintOp_unpackData(op32); 6194b151113cc6939ba6bba66aae77779b82ec4a18creed@google.com SkPaint* p = state->editPaint(); 6207d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 6217d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com do { 6227d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com uint32_t p32 = reader->readU32(); 6237d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com unsigned op = PaintOp_unpackOp(p32); 6247d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com unsigned data = PaintOp_unpackData(p32); 6257d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 626e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com// SkDebugf(" read %08X op=%d flags=%d data=%d\n", p32, op, done, data); 6277d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 6287d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com switch (op) { 6297d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com case kReset_PaintOp: p->reset(); break; 6307d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com case kFlags_PaintOp: p->setFlags(data); break; 6317d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com case kColor_PaintOp: p->setColor(reader->readU32()); break; 6327d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com case kStyle_PaintOp: p->setStyle((SkPaint::Style)data); break; 6337d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com case kJoin_PaintOp: p->setStrokeJoin((SkPaint::Join)data); break; 6347d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com case kCap_PaintOp: p->setStrokeCap((SkPaint::Cap)data); break; 6357d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com case kWidth_PaintOp: p->setStrokeWidth(reader->readScalar()); break; 6367d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com case kMiter_PaintOp: p->setStrokeMiter(reader->readScalar()); break; 6377d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com case kEncoding_PaintOp: 6387d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com p->setTextEncoding((SkPaint::TextEncoding)data); 6397d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com break; 6407d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com case kHinting_PaintOp: p->setHinting((SkPaint::Hinting)data); break; 6417d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com case kAlign_PaintOp: p->setTextAlign((SkPaint::Align)data); break; 6427d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com case kTextSize_PaintOp: p->setTextSize(reader->readScalar()); break; 6437d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com case kTextScaleX_PaintOp: p->setTextScaleX(reader->readScalar()); break; 6447d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com case kTextSkewX_PaintOp: p->setTextSkewX(reader->readScalar()); break; 645abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com 646e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com case kFlatIndex_PaintOp: { 647e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com PaintFlats pf = (PaintFlats)PaintOp_unpackFlags(p32); 648e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com unsigned index = data; 649e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com set_paintflat(p, state->getFlat(index), pf); 650e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com break; 651e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com } 652e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com 653bfe877afb55f9bc58737dd26f497bfcbec974fa0scroggo@google.com case kTypeface_PaintOp: 654bfe877afb55f9bc58737dd26f497bfcbec974fa0scroggo@google.com SkASSERT(SkToBool(state->getFlags() & 655bfe877afb55f9bc58737dd26f497bfcbec974fa0scroggo@google.com SkGPipeWriter::kCrossProcess_Flag)); 656bfe877afb55f9bc58737dd26f497bfcbec974fa0scroggo@google.com state->setTypeface(p, data); break; 6572d7de2d243beab591671dfaf535a637b5d305735tomhudson@google.com default: SkDEBUGFAIL("bad paintop"); return; 6587d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com } 659e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com SkASSERT(reader->offset() <= stop); 6604b151113cc6939ba6bba66aae77779b82ec4a18creed@google.com } while (reader->offset() < stop); 6617d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 6627d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 663bfe877afb55f9bc58737dd26f497bfcbec974fa0scroggo@google.comstatic void typeface_rp(SkCanvas*, SkReader32* reader, uint32_t, 664bfe877afb55f9bc58737dd26f497bfcbec974fa0scroggo@google.com SkGPipeState* state) { 665bfe877afb55f9bc58737dd26f497bfcbec974fa0scroggo@google.com SkASSERT(!SkToBool(state->getFlags() & SkGPipeWriter::kCrossProcess_Flag)); 666bfe877afb55f9bc58737dd26f497bfcbec974fa0scroggo@google.com SkPaint* p = state->editPaint(); 667bfe877afb55f9bc58737dd26f497bfcbec974fa0scroggo@google.com p->setTypeface(static_cast<SkTypeface*>(reader->readPtr())); 668bfe877afb55f9bc58737dd26f497bfcbec974fa0scroggo@google.com} 669bfe877afb55f9bc58737dd26f497bfcbec974fa0scroggo@google.com 670abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com/////////////////////////////////////////////////////////////////////////////// 671abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com 6724dbaefc11dba3a1dce43ab4177789a6fee978356reed@google.comstatic void def_Typeface_rp(SkCanvas*, SkReader32*, uint32_t, SkGPipeState* state) { 6734dbaefc11dba3a1dce43ab4177789a6fee978356reed@google.com state->addTypeface(); 6744dbaefc11dba3a1dce43ab4177789a6fee978356reed@google.com} 6754dbaefc11dba3a1dce43ab4177789a6fee978356reed@google.com 676e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.comstatic void def_PaintFlat_rp(SkCanvas*, SkReader32*, uint32_t op32, 677e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com SkGPipeState* state) { 678e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com PaintFlats pf = (PaintFlats)DrawOp_unpackFlags(op32); 679e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com unsigned index = DrawOp_unpackData(op32); 680e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com state->defFlattenable(pf, index); 681e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com} 682e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com 683872508e82a19e552ef566da5e822023b93d5588fscroggo@google.comstatic void def_Bitmap_rp(SkCanvas*, SkReader32*, uint32_t op32, 684872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com SkGPipeState* state) { 685872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com unsigned index = DrawOp_unpackData(op32); 686872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com state->addBitmap(index); 687872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com} 688872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com 689179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.comstatic void def_Factory_rp(SkCanvas*, SkReader32* reader, uint32_t, 690179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com SkGPipeState* state) { 691179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com state->defFactory(reader->readString()); 692179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com} 693179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com 6947d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com/////////////////////////////////////////////////////////////////////////////// 6957d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 69684204bcd081bb7824ec49cbced6849b827120b5creed@google.comstatic void skip_rp(SkCanvas*, SkReader32* reader, uint32_t op32, SkGPipeState*) { 69784204bcd081bb7824ec49cbced6849b827120b5creed@google.com size_t bytes = DrawOp_unpackData(op32); 69884204bcd081bb7824ec49cbced6849b827120b5creed@google.com (void)reader->skip(bytes); 69984204bcd081bb7824ec49cbced6849b827120b5creed@google.com} 70084204bcd081bb7824ec49cbced6849b827120b5creed@google.com 701ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.comstatic void reportFlags_rp(SkCanvas*, SkReader32*, uint32_t op32, 7026c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com SkGPipeState* state) { 7036c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com unsigned flags = DrawOp_unpackFlags(op32); 7046c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com state->setFlags(flags); 7056c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com} 7066c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com 7076497eeaa907a8f5acb17bd8829146107a713e4a9scroggo@google.comstatic void shareBitmapHeap_rp(SkCanvas*, SkReader32* reader, uint32_t, 708ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com SkGPipeState* state) { 709ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com state->setSharedHeap(static_cast<SkBitmapHeap*>(reader->readPtr())); 710ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com} 711ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com 7127d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void done_rp(SkCanvas*, SkReader32*, uint32_t, SkGPipeState*) {} 7137d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 7147d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comtypedef void (*ReadProc)(SkCanvas*, SkReader32*, uint32_t op32, SkGPipeState*); 7157d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 7167d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic const ReadProc gReadTable[] = { 71784204bcd081bb7824ec49cbced6849b827120b5creed@google.com skip_rp, 7187d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com clipPath_rp, 7197d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com clipRegion_rp, 7207d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com clipRect_rp, 7217a7e655343617093a5eea37c7a556602a1bb0576reed@google.com clipRRect_rp, 7227d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com concat_rp, 7237d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com drawBitmap_rp, 7247d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com drawBitmapMatrix_rp, 725872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com drawBitmapNine_rp, 7267d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com drawBitmapRect_rp, 7277d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com drawClear_rp, 7287d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com drawData_rp, 7297a7e655343617093a5eea37c7a556602a1bb0576reed@google.com drawOval_rp, 7307d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com drawPaint_rp, 7317d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com drawPath_rp, 7327d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com drawPicture_rp, 7337d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com drawPoints_rp, 7347d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com drawPosText_rp, 7357d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com drawPosTextH_rp, 7367d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com drawRect_rp, 7377a7e655343617093a5eea37c7a556602a1bb0576reed@google.com drawRRect_rp, 7387d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com drawSprite_rp, 7397d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com drawText_rp, 7407d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com drawTextOnPath_rp, 7417d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com drawVertices_rp, 7427d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com restore_rp, 7437d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com rotate_rp, 7447d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com save_rp, 7457d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com saveLayer_rp, 7467d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com scale_rp, 7477d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com setMatrix_rp, 7487d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com skew_rp, 7497d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com translate_rp, 7504dbaefc11dba3a1dce43ab4177789a6fee978356reed@google.com 7517d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com paintOp_rp, 752bfe877afb55f9bc58737dd26f497bfcbec974fa0scroggo@google.com typeface_rp, 753abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com def_Typeface_rp, 7544dbaefc11dba3a1dce43ab4177789a6fee978356reed@google.com def_PaintFlat_rp, 755872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com def_Bitmap_rp, 756179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com def_Factory_rp, 7574dbaefc11dba3a1dce43ab4177789a6fee978356reed@google.com 758ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com reportFlags_rp, 7596497eeaa907a8f5acb17bd8829146107a713e4a9scroggo@google.com shareBitmapHeap_rp, 7607d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com done_rp 7617d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}; 7627d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 7637d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com/////////////////////////////////////////////////////////////////////////////// 7647d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 765ebf86866ddd26b1a19eb94009407dcd19c276c72tomhudson@google.comSkGPipeState::SkGPipeState() 766ebf86866ddd26b1a19eb94009407dcd19c276c72tomhudson@google.com : fReader(0) 7679d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org , fSilent(false) 768ebf86866ddd26b1a19eb94009407dcd19c276c72tomhudson@google.com , fSharedHeap(NULL) 769ebf86866ddd26b1a19eb94009407dcd19c276c72tomhudson@google.com , fFlags(0) { 770ebf86866ddd26b1a19eb94009407dcd19c276c72tomhudson@google.com 771ebf86866ddd26b1a19eb94009407dcd19c276c72tomhudson@google.com} 7727d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 773e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.comSkGPipeState::~SkGPipeState() { 7744079b3b1a4e9d99740a245692f530600879aa7c5reed@google.com fTypefaces.safeUnrefAll(); 7754079b3b1a4e9d99740a245692f530600879aa7c5reed@google.com fFlatArray.safeUnrefAll(); 776872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com fBitmaps.deleteAll(); 777ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com SkSafeUnref(fSharedHeap); 7787d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 7797d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 7807d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com/////////////////////////////////////////////////////////////////////////////// 7817d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 7827d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com#include "SkGPipe.h" 7837d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 784d125c6e0f513a70d848ba892e7df512213ccc4acscroggo@google.comSkGPipeReader::SkGPipeReader() { 785d125c6e0f513a70d848ba892e7df512213ccc4acscroggo@google.com fCanvas = NULL; 786d125c6e0f513a70d848ba892e7df512213ccc4acscroggo@google.com fState = NULL; 787693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com fProc = NULL; 788d125c6e0f513a70d848ba892e7df512213ccc4acscroggo@google.com} 789d125c6e0f513a70d848ba892e7df512213ccc4acscroggo@google.com 7907d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comSkGPipeReader::SkGPipeReader(SkCanvas* target) { 791d125c6e0f513a70d848ba892e7df512213ccc4acscroggo@google.com fCanvas = NULL; 792d125c6e0f513a70d848ba892e7df512213ccc4acscroggo@google.com this->setCanvas(target); 7937d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com fState = NULL; 794693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com fProc = NULL; 7957d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 7967d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 797d125c6e0f513a70d848ba892e7df512213ccc4acscroggo@google.comvoid SkGPipeReader::setCanvas(SkCanvas *target) { 798d125c6e0f513a70d848ba892e7df512213ccc4acscroggo@google.com SkRefCnt_SafeAssign(fCanvas, target); 799d125c6e0f513a70d848ba892e7df512213ccc4acscroggo@google.com} 800d125c6e0f513a70d848ba892e7df512213ccc4acscroggo@google.com 8017d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comSkGPipeReader::~SkGPipeReader() { 8027d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkSafeUnref(fCanvas); 8037d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com delete fState; 8047d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 8057d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 80616f040c4e7eb6d8960ce68d40407afffe65201c4reed@google.comSkGPipeReader::Status SkGPipeReader::playback(const void* data, size_t length, 8079d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org uint32_t playbackFlags, size_t* bytesRead) { 8087d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com if (NULL == fCanvas) { 8097d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com return kError_Status; 8107d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com } 8117d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 8127d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com if (NULL == fState) { 8137d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com fState = new SkGPipeState; 8147d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com } 8157d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com 8169d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org fState->setSilent(playbackFlags & kSilent_PlaybackFlag); 8179d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org 8184dbaefc11dba3a1dce43ab4177789a6fee978356reed@google.com SkASSERT(SK_ARRAY_COUNT(gReadTable) == (kDone_DrawOp + 1)); 8194dbaefc11dba3a1dce43ab4177789a6fee978356reed@google.com 8207d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com const ReadProc* table = gReadTable; 821d02e825bf79c38dad5fb7c02dfc301ad4dfabeaadjsollen@google.com SkOrderedReadBuffer reader(data, length); 822693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com reader.setBitmapDecoder(fProc); 8237d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkCanvas* canvas = fCanvas; 82416f040c4e7eb6d8960ce68d40407afffe65201c4reed@google.com Status status = kEOF_Status; 825abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com 826abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com fState->setReader(&reader); 8277d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com while (!reader.eof()) { 8289ce78f26f529fd3e10a3eb4f044bc3f0037ead56djsollen@google.com uint32_t op32 = reader.readUInt(); 8297d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com unsigned op = DrawOp_unpackOp(op32); 830afdd736d7bfc19e42ed328f9ad33f54270679ce7caryclark@google.com // SkDEBUGCODE(DrawOps drawOp = (DrawOps)op;) 831dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com 8327d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com if (op >= SK_ARRAY_COUNT(gReadTable)) { 8337d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com SkDebugf("---- bad op during GPipeState::playback\n"); 83416f040c4e7eb6d8960ce68d40407afffe65201c4reed@google.com status = kError_Status; 83516f040c4e7eb6d8960ce68d40407afffe65201c4reed@google.com break; 8367d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com } 8377d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com if (kDone_DrawOp == op) { 83816f040c4e7eb6d8960ce68d40407afffe65201c4reed@google.com status = kDone_Status; 83916f040c4e7eb6d8960ce68d40407afffe65201c4reed@google.com break; 8407d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com } 841d02e825bf79c38dad5fb7c02dfc301ad4dfabeaadjsollen@google.com table[op](canvas, reader.getReader32(), op32, fState); 8429d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org if ((playbackFlags & kReadAtom_PlaybackFlag) && 8437f88298ebee4fc25a214febc93cb3bf9b2330925yangsu@google.com (table[op] != paintOp_rp && 8447f88298ebee4fc25a214febc93cb3bf9b2330925yangsu@google.com table[op] != def_Typeface_rp && 845872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com table[op] != def_PaintFlat_rp && 846872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com table[op] != def_Bitmap_rp 8477f88298ebee4fc25a214febc93cb3bf9b2330925yangsu@google.com )) { 8487f88298ebee4fc25a214febc93cb3bf9b2330925yangsu@google.com status = kReadAtom_Status; 8497f88298ebee4fc25a214febc93cb3bf9b2330925yangsu@google.com break; 8507f88298ebee4fc25a214febc93cb3bf9b2330925yangsu@google.com } 8517d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com } 85216f040c4e7eb6d8960ce68d40407afffe65201c4reed@google.com 85316f040c4e7eb6d8960ce68d40407afffe65201c4reed@google.com if (bytesRead) { 854b6f19aae21c1fcf876799a8f2b4fa2f97c750208reed@google.com *bytesRead = reader.offset(); 85516f040c4e7eb6d8960ce68d40407afffe65201c4reed@google.com } 85616f040c4e7eb6d8960ce68d40407afffe65201c4reed@google.com return status; 8577d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com} 858