1bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com */ 8bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 9bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1010dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com#include "SkBitmapHeap.h" 11bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkCanvas.h" 12bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkPaint.h" 13acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com#include "SkGPipe.h" 14bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkGPipePriv.h" 15bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkReader32.h" 16f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com#include "SkStream.h" 17bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com 180cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com#include "SkAnnotation.h" 19bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com#include "SkColorFilter.h" 20bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com#include "SkDrawLooper.h" 21353482251e61971a8cf3a60bbb6910f482be634freed@google.com#include "SkImageFilter.h" 22bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com#include "SkMaskFilter.h" 238b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkReadBuffer.h" 24bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com#include "SkPathEffect.h" 25bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com#include "SkRasterizer.h" 264ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com#include "SkRRect.h" 27bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com#include "SkShader.h" 28f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com#include "SkTypeface.h" 29bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com#include "SkXfermode.h" 30bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com 31c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.orgstatic SkFlattenable::Type paintflat_to_flattype(PaintFlats pf) { 32353482251e61971a8cf3a60bbb6910f482be634freed@google.com static const uint8_t gEffectTypesInPaintFlatsOrder[] = { 33c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org SkFlattenable::kSkColorFilter_Type, 34c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org SkFlattenable::kSkDrawLooper_Type, 35c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org SkFlattenable::kSkImageFilter_Type, 36c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org SkFlattenable::kSkMaskFilter_Type, 37c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org SkFlattenable::kSkPathEffect_Type, 38c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org SkFlattenable::kSkRasterizer_Type, 39c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org SkFlattenable::kSkShader_Type, 40c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org SkFlattenable::kSkXfermode_Type, 41353482251e61971a8cf3a60bbb6910f482be634freed@google.com }; 424677acc75915ebd32ee0efed5c7b41da2a9d047cskia.committer@gmail.com 43353482251e61971a8cf3a60bbb6910f482be634freed@google.com SkASSERT((size_t)pf < SK_ARRAY_COUNT(gEffectTypesInPaintFlatsOrder)); 44c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org return (SkFlattenable::Type)gEffectTypesInPaintFlatsOrder[pf]; 45353482251e61971a8cf3a60bbb6910f482be634freed@google.com} 46353482251e61971a8cf3a60bbb6910f482be634freed@google.com 47b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.comstatic void set_paintflat(SkPaint* paint, SkFlattenable* obj, unsigned paintFlat) { 48b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com SkASSERT(paintFlat < kCount_PaintFlats); 49b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com switch (paintFlat) { 50b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kColorFilter_PaintFlat: 51b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com paint->setColorFilter((SkColorFilter*)obj); 52b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com break; 530faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com case kDrawLooper_PaintFlat: 540faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com paint->setLooper((SkDrawLooper*)obj); 550faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com break; 56b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kMaskFilter_PaintFlat: 57b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com paint->setMaskFilter((SkMaskFilter*)obj); 58b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com break; 59b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kPathEffect_PaintFlat: 60b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com paint->setPathEffect((SkPathEffect*)obj); 61b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com break; 62b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kRasterizer_PaintFlat: 63b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com paint->setRasterizer((SkRasterizer*)obj); 64b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com break; 65b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kShader_PaintFlat: 66b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com paint->setShader((SkShader*)obj); 67b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com break; 6816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com case kImageFilter_PaintFlat: 6916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com paint->setImageFilter((SkImageFilter*)obj); 7016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com break; 71b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kXfermode_PaintFlat: 72b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com paint->setXfermode((SkXfermode*)obj); 73b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com break; 74b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com default: 750c00f21fee3f5cfa3aa7e5d46ff94cb8cf340451tomhudson@google.com SkDEBUGFAIL("never gets here"); 76b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 77b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com} 78b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 79bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.comtemplate <typename T> class SkRefCntTDArray : public SkTDArray<T> { 80bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.compublic: 81bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com ~SkRefCntTDArray() { this->unrefAll(); } 82bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com}; 83bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 847ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.comclass SkGPipeState : public SkBitmapHeapReader { 85bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.compublic: 86bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState(); 87bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com ~SkGPipeState(); 88bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com 89fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org void setSilent(bool silent) { 90fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org fSilent = silent; 91fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org } 92fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org 93fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org bool shouldDraw() { 94fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org return !fSilent; 95fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org } 96fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org 97565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com void setFlags(unsigned flags) { 98565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com if (fFlags != flags) { 99565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com fFlags = flags; 100565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com this->updateReader(); 101565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com } 102565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com } 103565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com 104565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com unsigned getFlags() const { 105565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com return fFlags; 106565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com } 107565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com 1088b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org void setReader(SkReadBuffer* reader) { 109dde0956375e87027df2fdd80d430dd819c217aacreed@google.com fReader = reader; 110565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com this->updateReader(); 111dde0956375e87027df2fdd80d430dd819c217aacreed@google.com } 112bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com 11331891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com const SkPaint& paint() const { return fPaint; } 11431891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com SkPaint* editPaint() { return &fPaint; } 115d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 116b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com SkFlattenable* getFlat(unsigned index) const { 117b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com if (0 == index) { 118b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com return NULL; 119b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 120b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com return fFlatArray[index - 1]; 121b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 122b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 12367908f2faee17a8bce4d074980617cc0d15fabf1reed@google.com void defFlattenable(PaintFlats pf, int index) { 124d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com index--; 125c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org SkFlattenable* obj = fReader->readFlattenable(paintflat_to_flattype(pf)); 126d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com if (fFlatArray.count() == index) { 127d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com *fFlatArray.append() = obj; 128d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com } else { 129d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com SkSafeUnref(fFlatArray[index]); 130d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com fFlatArray[index] = obj; 131d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com } 132b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 133b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 1340c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com void defFactory(const char* name) { 1350c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com SkFlattenable::Factory factory = SkFlattenable::NameToFactory(name); 1360c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com if (factory) { 1370c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com SkASSERT(fFactoryArray.find(factory) < 0); 1380c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com *fFactoryArray.append() = factory; 1390c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com } 1400c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com } 1410c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com 14274b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com /** 14374b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com * Add a bitmap to the array of bitmaps, or replace an existing one. 14474b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com * This is only used when in cross process mode without a shared heap. 14574b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com */ 14616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com void addBitmap(int index) { 14774b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com SkASSERT(shouldFlattenBitmaps(fFlags)); 1484dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com SkBitmap* bm; 1494dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com if(fBitmaps.count() == index) { 1504dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com bm = SkNEW(SkBitmap); 1514dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com *fBitmaps.append() = bm; 1524dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } else { 1534dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com bm = fBitmaps[index]; 1544dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 15574b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com fReader->readBitmap(bm); 15616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 15716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 1587ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com /** 1598b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org * Override of SkBitmapHeapReader, so that SkReadBuffer can use 16074b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com * these SkBitmaps for bitmap shaders. Used only in cross process mode 16174b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com * without a shared heap. 1627ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com */ 1637ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com virtual SkBitmap* getBitmap(int32_t index) const SK_OVERRIDE { 16474b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com SkASSERT(shouldFlattenBitmaps(fFlags)); 1653e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com return fBitmaps[index]; 16616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 16716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 1687ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com /** 1697ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com * Needed to be a non-abstract subclass of SkBitmapHeapReader. 1707ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com */ 1717ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com virtual void releaseRef(int32_t) SK_OVERRIDE {} 1727ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com 17310dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com void setSharedHeap(SkBitmapHeap* heap) { 17410dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com SkASSERT(!shouldFlattenBitmaps(fFlags) || NULL == heap); 17510dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com SkRefCnt_SafeAssign(fSharedHeap, heap); 1767ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com this->updateReader(); 17710dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com } 17810dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com 17974b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com /** 18074b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com * Access the shared heap. Only used in the case when bitmaps are not 18174b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com * flattened. 18274b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com */ 18310dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com SkBitmapHeap* getSharedHeap() const { 18474b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com SkASSERT(!shouldFlattenBitmaps(fFlags)); 18510dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com return fSharedHeap; 18610dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com } 18710dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com 188bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com void addTypeface() { 189c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com size_t size = fReader->read32(); 190bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com const void* data = fReader->skip(SkAlign4(size)); 191f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com SkMemoryStream stream(data, size, false); 192f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com *fTypefaces.append() = SkTypeface::Deserialize(&stream); 193d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com } 19410dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com 195bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com void setTypeface(SkPaint* paint, unsigned id) { 196bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com paint->setTypeface(id ? fTypefaces[id - 1] : NULL); 197bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com } 198d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 199b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.comprivate: 200565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com void updateReader() { 201565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com if (NULL == fReader) { 202565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com return; 203565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com } 204565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com bool crossProcess = SkToBool(fFlags & SkGPipeWriter::kCrossProcess_Flag); 205565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com fReader->setFlags(SkSetClearMask(fReader->getFlags(), crossProcess, 2068b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org SkReadBuffer::kCrossProcess_Flag)); 207565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com if (crossProcess) { 208565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com fReader->setFactoryArray(&fFactoryArray); 209565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com } else { 210565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com fReader->setFactoryArray(NULL); 211565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com } 2127ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com 2137ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com if (shouldFlattenBitmaps(fFlags)) { 2147ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com fReader->setBitmapStorage(this); 2157ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com } else { 2167ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com fReader->setBitmapStorage(fSharedHeap); 2177ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com } 218565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com } 2198b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org SkReadBuffer* fReader; 22031891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com SkPaint fPaint; 22131891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com SkTDArray<SkFlattenable*> fFlatArray; 22231891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com SkTDArray<SkTypeface*> fTypefaces; 223dde0956375e87027df2fdd80d430dd819c217aacreed@google.com SkTDArray<SkFlattenable::Factory> fFactoryArray; 22416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com SkTDArray<SkBitmap*> fBitmaps; 225fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org bool fSilent; 22610dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com // Only used when sharing bitmaps with the writer. 22710dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com SkBitmapHeap* fSharedHeap; 228565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com unsigned fFlags; 229bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}; 230bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 231bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 232bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 233b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.orgtemplate <typename T> const T* skip(SkReader32* reader, size_t count = 1) { 234bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com size_t size = sizeof(T) * count; 235bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkASSERT(SkAlign4(size) == size); 236bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return reinterpret_cast<const T*>(reader->skip(size)); 237bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 238bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 239b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.orgtemplate <typename T> const T* skipAlign(SkReader32* reader, size_t count = 1) { 240bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com size_t size = SkAlign4(sizeof(T) * count); 241bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return reinterpret_cast<const T*>(reader->skip(size)); 242bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 243bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 244bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 245bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 246bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 247bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void clipPath_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 248bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 249bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkPath path; 25094e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com reader->readPath(&path); 251460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com bool doAA = SkToBool(DrawOp_unpackFlags(op32) & kClip_HasAntiAlias_DrawOpFlag); 252460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com canvas->clipPath(path, (SkRegion::Op)DrawOp_unpackData(op32), doAA); 253bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 254bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 255bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void clipRegion_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 256bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 257bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkRegion rgn; 2582b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com reader->readRegion(&rgn); 259bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com canvas->clipRegion(rgn, (SkRegion::Op)DrawOp_unpackData(op32)); 260bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 261bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 262bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void clipRect_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 263bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 264691703cdd4ab51b23c59798e7018dd7920a34be3scroggo@google.com const SkRect* rect = skip<SkRect>(reader); 265460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com bool doAA = SkToBool(DrawOp_unpackFlags(op32) & kClip_HasAntiAlias_DrawOpFlag); 266691703cdd4ab51b23c59798e7018dd7920a34be3scroggo@google.com canvas->clipRect(*rect, (SkRegion::Op)DrawOp_unpackData(op32), doAA); 267bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 268bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 2694ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.comstatic void clipRRect_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 2704ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com SkGPipeState* state) { 2714ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com SkRRect rrect; 2724ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com reader->readRRect(&rrect); 2734ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com bool doAA = SkToBool(DrawOp_unpackFlags(op32) & kClip_HasAntiAlias_DrawOpFlag); 2744ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com canvas->clipRRect(rrect, (SkRegion::Op)DrawOp_unpackData(op32), doAA); 2754ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com} 2764ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com 277bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 278bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 279bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void setMatrix_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 280bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 281bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkMatrix matrix; 2822b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com reader->readMatrix(&matrix); 283bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com canvas->setMatrix(matrix); 284bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 285bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 286bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void concat_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 287bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 288bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkMatrix matrix; 2892b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com reader->readMatrix(&matrix); 290bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com canvas->concat(matrix); 291bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 292bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 293bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void scale_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 294bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 295bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkScalar* param = skip<SkScalar>(reader, 2); 296bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com canvas->scale(param[0], param[1]); 297bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 298bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 299bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void skew_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 300bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 301bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkScalar* param = skip<SkScalar>(reader, 2); 302bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com canvas->skew(param[0], param[1]); 303bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 304bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 305bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void rotate_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 306bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 307bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com canvas->rotate(reader->readScalar()); 308bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 309bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 310bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void translate_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 311bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 312bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkScalar* param = skip<SkScalar>(reader, 2); 313bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com canvas->translate(param[0], param[1]); 314bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 315bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 316bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 317bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 318bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void save_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 319bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 320bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com canvas->save((SkCanvas::SaveFlags)DrawOp_unpackData(op32)); 321bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 322bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 323bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void saveLayer_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 324bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 325acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com unsigned flags = DrawOp_unpackFlags(op32); 326acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com SkCanvas::SaveFlags saveFlags = (SkCanvas::SaveFlags)DrawOp_unpackData(op32); 327bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 328bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkRect* bounds = NULL; 329bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (flags & kSaveLayer_HasBounds_DrawOpFlag) { 330bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com bounds = skip<SkRect>(reader); 331bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 332bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint* paint = NULL; 333bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (flags & kSaveLayer_HasPaint_DrawOpFlag) { 33431891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com paint = &state->paint(); 335bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 336acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com canvas->saveLayer(bounds, paint, saveFlags); 337bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 338bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 339bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void restore_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 340bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 341bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com canvas->restore(); 342bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 343bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 344bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 345bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 346bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawClear_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 347bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 348bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkColor color = 0; 349bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (DrawOp_unpackFlags(op32) & kClear_HasColor_DrawOpFlag) { 350bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com color = reader->readU32(); 351bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 352bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com canvas->clear(color); 353bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 354bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 355bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawPaint_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 356bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 357fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org if (state->shouldDraw()) { 358fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org canvas->drawPaint(state->paint()); 359fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org } 360bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 361bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 362bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawPoints_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 363bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 364bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkCanvas::PointMode mode = (SkCanvas::PointMode)DrawOp_unpackFlags(op32); 365bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com size_t count = reader->readU32(); 366bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint* pts = skip<SkPoint>(reader, count); 367fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org if (state->shouldDraw()) { 368fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org canvas->drawPoints(mode, count, pts, state->paint()); 369fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org } 370bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 371bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 3724ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.comstatic void drawOval_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 3734ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com SkGPipeState* state) { 3744ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com const SkRect* rect = skip<SkRect>(reader); 3754ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com if (state->shouldDraw()) { 3764ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com canvas->drawOval(*rect, state->paint()); 3774ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com } 3784ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com} 3794ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com 380bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawRect_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 381bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 382fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org const SkRect* rect = skip<SkRect>(reader); 383fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org if (state->shouldDraw()) { 384fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org canvas->drawRect(*rect, state->paint()); 385fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org } 386bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 387bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 3884ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.comstatic void drawRRect_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 3894ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com SkGPipeState* state) { 3904ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com SkRRect rrect; 3914ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com reader->readRRect(&rrect); 3924ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com if (state->shouldDraw()) { 3934ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com canvas->drawRRect(rrect, state->paint()); 3944ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com } 3954ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com} 3964ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com 397ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.orgstatic void drawDRRect_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 398ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org SkGPipeState* state) { 399ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org SkRRect outer, inner; 400ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org reader->readRRect(&outer); 401ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org reader->readRRect(&inner); 402ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org if (state->shouldDraw()) { 403ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org canvas->drawDRRect(outer, inner, state->paint()); 404ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org } 405ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org} 406ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org 407bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawPath_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 408bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 409bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkPath path; 41094e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com reader->readPath(&path); 411fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org if (state->shouldDraw()) { 412fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org canvas->drawPath(path, state->paint()); 413fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org } 414bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 415bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 416bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawVertices_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 417bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 418bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned flags = DrawOp_unpackFlags(op32); 419bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 42085e143c33c214e54187aa28146aa7666961a0d17reed@google.com SkCanvas::VertexMode vmode = (SkCanvas::VertexMode)reader->readU32(); 421bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com int vertexCount = reader->readU32(); 422bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint* verts = skip<SkPoint>(reader, vertexCount); 423bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 424bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint* texs = NULL; 425bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (flags & kDrawVertices_HasTexs_DrawOpFlag) { 426bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com texs = skip<SkPoint>(reader, vertexCount); 427bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 428bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 429bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkColor* colors = NULL; 430bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (flags & kDrawVertices_HasColors_DrawOpFlag) { 431bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com colors = skip<SkColor>(reader, vertexCount); 432bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 433bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 43485e143c33c214e54187aa28146aa7666961a0d17reed@google.com SkAutoTUnref<SkXfermode> xfer; 43585e143c33c214e54187aa28146aa7666961a0d17reed@google.com if (flags & kDrawVertices_HasXfermode_DrawOpFlag) { 43685e143c33c214e54187aa28146aa7666961a0d17reed@google.com SkXfermode::Mode mode = (SkXfermode::Mode)reader->readU32(); 43785e143c33c214e54187aa28146aa7666961a0d17reed@google.com xfer.reset(SkXfermode::Create(mode)); 43885e143c33c214e54187aa28146aa7666961a0d17reed@google.com } 439bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 440bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com int indexCount = 0; 441bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const uint16_t* indices = NULL; 442bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (flags & kDrawVertices_HasIndices_DrawOpFlag) { 443bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com indexCount = reader->readU32(); 444bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com indices = skipAlign<uint16_t>(reader, indexCount); 445bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 446fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org if (state->shouldDraw()) { 44785e143c33c214e54187aa28146aa7666961a0d17reed@google.com canvas->drawVertices(vmode, vertexCount, verts, texs, colors, xfer, 448fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org indices, indexCount, state->paint()); 449fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org } 450bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 451bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 452bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 453bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 454bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawText_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 455bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 456bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com size_t len = reader->readU32(); 457bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const void* text = reader->skip(SkAlign4(len)); 458bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkScalar* xy = skip<SkScalar>(reader, 2); 459fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org if (state->shouldDraw()) { 460fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org canvas->drawText(text, len, xy[0], xy[1], state->paint()); 461fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org } 462bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 463bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 464bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawPosText_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 465bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 466bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com size_t len = reader->readU32(); 467bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const void* text = reader->skip(SkAlign4(len)); 468bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com size_t posCount = reader->readU32(); // compute by our writer 469bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint* pos = skip<SkPoint>(reader, posCount); 470fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org if (state->shouldDraw()) { 471fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org canvas->drawPosText(text, len, pos, state->paint()); 472fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org } 473bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 474bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 475bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawPosTextH_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 476bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 477bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com size_t len = reader->readU32(); 478bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const void* text = reader->skip(SkAlign4(len)); 479bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com size_t posCount = reader->readU32(); // compute by our writer 480bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkScalar* xpos = skip<SkScalar>(reader, posCount); 481bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkScalar constY = reader->readScalar(); 482fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org if (state->shouldDraw()) { 483fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org canvas->drawPosTextH(text, len, xpos, constY, state->paint()); 484fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org } 485bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 486bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 487bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawTextOnPath_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 488bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 489bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com size_t len = reader->readU32(); 490bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const void* text = reader->skip(SkAlign4(len)); 491bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 492bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkPath path; 49394e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com reader->readPath(&path); 494bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 495bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkMatrix matrixStorage; 496bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkMatrix* matrix = NULL; 497bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (DrawOp_unpackFlags(op32) & kDrawTextOnPath_HasMatrix_DrawOpFlag) { 4982b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com reader->readMatrix(&matrixStorage); 499bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com matrix = &matrixStorage; 500bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 501fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org if (state->shouldDraw()) { 502fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org canvas->drawTextOnPath(text, len, path, matrix, state->paint()); 503fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org } 504bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 505bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 506bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 507bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 508284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.comclass BitmapHolder : SkNoncopyable { 509284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.compublic: 510284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com BitmapHolder(SkReader32* reader, uint32_t op32, SkGPipeState* state); 511284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com ~BitmapHolder() { 51210dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com if (fHeapEntry != NULL) { 51310dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com fHeapEntry->releaseRef(); 514284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com } 515284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com } 516284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com const SkBitmap* getBitmap() { 517284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com return fBitmap; 518284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com } 519284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.comprivate: 52010dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com SkBitmapHeapEntry* fHeapEntry; 52110dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com const SkBitmap* fBitmap; 52258b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com SkBitmap fBitmapStorage; 523284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com}; 524284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com 525284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.comBitmapHolder::BitmapHolder(SkReader32* reader, uint32_t op32, 526284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com SkGPipeState* state) { 52758b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com const unsigned flags = state->getFlags(); 52858b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com const unsigned index = DrawOp_unpackData(op32); 52958b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com if (shouldFlattenBitmaps(flags)) { 53010dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com fHeapEntry = NULL; 53110dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com fBitmap = state->getBitmap(index); 532284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com } else { 53358b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com SkBitmapHeapEntry* entry = state->getSharedHeap()->getEntry(index); 53458b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com if (SkToBool(flags & SkGPipeWriter::kSimultaneousReaders_Flag)) { 53558b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com // Make a shallow copy for thread safety. Each thread will point to the same SkPixelRef, 53658b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com // which is thread safe. 53758b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com fBitmapStorage = *entry->getBitmap(); 53858b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com fBitmap = &fBitmapStorage; 53958b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com // Release the ref on the bitmap now, since we made our own copy. 54058b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com entry->releaseRef(); 54158b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com fHeapEntry = NULL; 54258b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com } else { 54358b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com SkASSERT(!shouldFlattenBitmaps(flags)); 54458b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com SkASSERT(!SkToBool(flags & SkGPipeWriter::kSimultaneousReaders_Flag)); 54558b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com fHeapEntry = entry; 54658b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com fBitmap = fHeapEntry->getBitmap(); 54758b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com } 548565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com } 549565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com} 550565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com 551bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawBitmap_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 552bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 553284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com BitmapHolder holder(reader, op32, state); 554460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com bool hasPaint = SkToBool(DrawOp_unpackFlags(op32) & kDrawBitmap_HasPaint_DrawOpFlag); 5555a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com SkScalar left = reader->readScalar(); 5565a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com SkScalar top = reader->readScalar(); 557fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org const SkBitmap* bitmap = holder.getBitmap(); 558fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org if (state->shouldDraw()) { 559fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org canvas->drawBitmap(*bitmap, left, top, hasPaint ? &state->paint() : NULL); 560fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org } 561bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 562bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 563bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawBitmapMatrix_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 564bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 56558be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com BitmapHolder holder(reader, op32, state); 566460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com bool hasPaint = SkToBool(DrawOp_unpackFlags(op32) & kDrawBitmap_HasPaint_DrawOpFlag); 56758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com SkMatrix matrix; 56858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com reader->readMatrix(&matrix); 569fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org const SkBitmap* bitmap = holder.getBitmap(); 570fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org if (state->shouldDraw()) { 571fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org canvas->drawBitmapMatrix(*bitmap, matrix, 572fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org hasPaint ? &state->paint() : NULL); 573fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org } 574bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 575bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 57616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.comstatic void drawBitmapNine_rp(SkCanvas* canvas, SkReader32* reader, 57716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com uint32_t op32, SkGPipeState* state) { 578284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com BitmapHolder holder(reader, op32, state); 579460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com bool hasPaint = SkToBool(DrawOp_unpackFlags(op32) & kDrawBitmap_HasPaint_DrawOpFlag); 580691703cdd4ab51b23c59798e7018dd7920a34be3scroggo@google.com const SkIRect* center = skip<SkIRect>(reader); 58116d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com const SkRect* dst = skip<SkRect>(reader); 582fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org const SkBitmap* bitmap = holder.getBitmap(); 583fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org if (state->shouldDraw()) { 584fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org canvas->drawBitmapNine(*bitmap, *center, *dst, 585fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org hasPaint ? &state->paint() : NULL); 586fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org } 58716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com} 58816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 58916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.comstatic void drawBitmapRect_rp(SkCanvas* canvas, SkReader32* reader, 59016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com uint32_t op32, SkGPipeState* state) { 591284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com BitmapHolder holder(reader, op32, state); 59258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com unsigned flags = DrawOp_unpackFlags(op32); 593460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com bool hasPaint = SkToBool(flags & kDrawBitmap_HasPaint_DrawOpFlag); 594460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com bool hasSrc = SkToBool(flags & kDrawBitmap_HasSrcRect_DrawOpFlag); 5957112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com const SkRect* src; 59616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com if (hasSrc) { 5977112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com src = skip<SkRect>(reader); 598691703cdd4ab51b23c59798e7018dd7920a34be3scroggo@google.com } else { 599691703cdd4ab51b23c59798e7018dd7920a34be3scroggo@google.com src = NULL; 60016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 60131acc11977815402e4ef2681350f8559285bec97robertphillips@google.com SkCanvas::DrawBitmapRectFlags dbmrFlags = SkCanvas::kNone_DrawBitmapRectFlag; 602eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org if (flags & kDrawBitmap_Bleed_DrawOpFlag) { 603eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org dbmrFlags = (SkCanvas::DrawBitmapRectFlags)(dbmrFlags|SkCanvas::kBleed_DrawBitmapRectFlag); 604eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org } 60516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com const SkRect* dst = skip<SkRect>(reader); 606fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org const SkBitmap* bitmap = holder.getBitmap(); 607fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org if (state->shouldDraw()) { 6087475811143e190e172bf83d13c4bdba85704b604skia.committer@gmail.com canvas->drawBitmapRectToRect(*bitmap, src, *dst, 609eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org hasPaint ? &state->paint() : NULL, dbmrFlags); 610fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org } 611bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 612bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 613bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawSprite_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 614bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 615284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com BitmapHolder holder(reader, op32, state); 616460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com bool hasPaint = SkToBool(DrawOp_unpackFlags(op32) & kDrawBitmap_HasPaint_DrawOpFlag); 617691703cdd4ab51b23c59798e7018dd7920a34be3scroggo@google.com const SkIPoint* point = skip<SkIPoint>(reader); 618fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org const SkBitmap* bitmap = holder.getBitmap(); 619fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org if (state->shouldDraw()) { 620fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org canvas->drawSprite(*bitmap, point->fX, point->fY, hasPaint ? &state->paint() : NULL); 621fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org } 622bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 623bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 624bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 625bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 626bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawData_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 627bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 628bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com // since we don't have a paint, we can use data for our (small) sizes 629bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com size_t size = DrawOp_unpackData(op32); 630bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (0 == size) { 631bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com size = reader->readU32(); 632bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 633bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const void* data = reader->skip(SkAlign4(size)); 634fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org if (state->shouldDraw()) { 635fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org canvas->drawData(data, size); 636fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org } 637bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 638bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 639bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawPicture_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 640bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 641bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com UNIMPLEMENTED 642bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 643bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 644bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 645bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 646bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void paintOp_rp(SkCanvas*, SkReader32* reader, uint32_t op32, 647bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkGPipeState* state) { 648b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com size_t offset = reader->offset(); 649b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com size_t stop = offset + PaintOp_unpackData(op32); 65031891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com SkPaint* p = state->editPaint(); 651bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 652bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com do { 653bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com uint32_t p32 = reader->readU32(); 654bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned op = PaintOp_unpackOp(p32); 655bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned data = PaintOp_unpackData(p32); 656bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 657b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com// SkDebugf(" read %08X op=%d flags=%d data=%d\n", p32, op, done, data); 658bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 659bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com switch (op) { 660bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com case kReset_PaintOp: p->reset(); break; 661bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com case kFlags_PaintOp: p->setFlags(data); break; 662bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com case kColor_PaintOp: p->setColor(reader->readU32()); break; 66385faf50875fcf6008880a98aaa05d12ae8dad343commit-bot@chromium.org case kFilterLevel_PaintOp: p->setFilterLevel((SkPaint::FilterLevel)data); break; 664bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com case kStyle_PaintOp: p->setStyle((SkPaint::Style)data); break; 665bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com case kJoin_PaintOp: p->setStrokeJoin((SkPaint::Join)data); break; 666bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com case kCap_PaintOp: p->setStrokeCap((SkPaint::Cap)data); break; 667bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com case kWidth_PaintOp: p->setStrokeWidth(reader->readScalar()); break; 668bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com case kMiter_PaintOp: p->setStrokeMiter(reader->readScalar()); break; 669bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com case kEncoding_PaintOp: 670bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com p->setTextEncoding((SkPaint::TextEncoding)data); 671bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com break; 672bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com case kHinting_PaintOp: p->setHinting((SkPaint::Hinting)data); break; 673bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com case kAlign_PaintOp: p->setTextAlign((SkPaint::Align)data); break; 674bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com case kTextSize_PaintOp: p->setTextSize(reader->readScalar()); break; 675bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com case kTextScaleX_PaintOp: p->setTextScaleX(reader->readScalar()); break; 676bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com case kTextSkewX_PaintOp: p->setTextSkewX(reader->readScalar()); break; 677bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com 678b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kFlatIndex_PaintOp: { 679b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com PaintFlats pf = (PaintFlats)PaintOp_unpackFlags(p32); 680b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com unsigned index = data; 681b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com set_paintflat(p, state->getFlat(index), pf); 682b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com break; 683b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 684b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 6853cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com case kTypeface_PaintOp: 6863cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com SkASSERT(SkToBool(state->getFlags() & 6873cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com SkGPipeWriter::kCrossProcess_Flag)); 6883cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com state->setTypeface(p, data); break; 6890c00f21fee3f5cfa3aa7e5d46ff94cb8cf340451tomhudson@google.com default: SkDEBUGFAIL("bad paintop"); return; 690bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 691b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com SkASSERT(reader->offset() <= stop); 69231891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com } while (reader->offset() < stop); 693bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 694bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 6953cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.comstatic void typeface_rp(SkCanvas*, SkReader32* reader, uint32_t, 6963cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com SkGPipeState* state) { 6973cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com SkASSERT(!SkToBool(state->getFlags() & SkGPipeWriter::kCrossProcess_Flag)); 6983cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com SkPaint* p = state->editPaint(); 6993cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com p->setTypeface(static_cast<SkTypeface*>(reader->readPtr())); 7003cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com} 7013cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com 7020cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.comstatic void annotation_rp(SkCanvas*, SkReader32* reader, uint32_t op32, 7030cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com SkGPipeState* state) { 7040cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com SkPaint* p = state->editPaint(); 705fbc58a305518fe611113a51649bf557c991ac8cfskia.committer@gmail.com 70689ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org const size_t size = DrawOp_unpackData(op32); 70789ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org if (size > 0) { 7088b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org SkReadBuffer buffer(reader->skip(size), size); 709d957984c1efbd18f3b2bbeca78d282837c5a2ae1commit-bot@chromium.org p->setAnnotation(SkAnnotation::Create(buffer))->unref(); 71089ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org SkASSERT(buffer.offset() == size); 7110cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com } else { 7120cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com p->setAnnotation(NULL); 7130cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com } 7140cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com} 7150cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com 716bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com/////////////////////////////////////////////////////////////////////////////// 717bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com 7180faac1e8579088a39f38d02ff675f14d7deb608dreed@google.comstatic void def_Typeface_rp(SkCanvas*, SkReader32*, uint32_t, SkGPipeState* state) { 7190faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com state->addTypeface(); 7200faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com} 7210faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com 722b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.comstatic void def_PaintFlat_rp(SkCanvas*, SkReader32*, uint32_t op32, 723b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com SkGPipeState* state) { 724b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com PaintFlats pf = (PaintFlats)DrawOp_unpackFlags(op32); 725b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com unsigned index = DrawOp_unpackData(op32); 726b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com state->defFlattenable(pf, index); 727b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com} 728b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 72916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.comstatic void def_Bitmap_rp(SkCanvas*, SkReader32*, uint32_t op32, 73016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com SkGPipeState* state) { 73116d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com unsigned index = DrawOp_unpackData(op32); 73216d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com state->addBitmap(index); 73316d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com} 73416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 7350c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.comstatic void def_Factory_rp(SkCanvas*, SkReader32* reader, uint32_t, 7360c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com SkGPipeState* state) { 7370c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com state->defFactory(reader->readString()); 7380c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com} 7390c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com 740bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 741bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 742acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.comstatic void skip_rp(SkCanvas*, SkReader32* reader, uint32_t op32, SkGPipeState*) { 743acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t bytes = DrawOp_unpackData(op32); 744acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com (void)reader->skip(bytes); 745acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com} 746acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 74710dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.comstatic void reportFlags_rp(SkCanvas*, SkReader32*, uint32_t op32, 748565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com SkGPipeState* state) { 749565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com unsigned flags = DrawOp_unpackFlags(op32); 750565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com state->setFlags(flags); 751565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com} 752565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com 753d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.comstatic void shareBitmapHeap_rp(SkCanvas*, SkReader32* reader, uint32_t, 75410dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com SkGPipeState* state) { 75510dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com state->setSharedHeap(static_cast<SkBitmapHeap*>(reader->readPtr())); 75610dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com} 75710dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com 758bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void done_rp(SkCanvas*, SkReader32*, uint32_t, SkGPipeState*) {} 759bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 760bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comtypedef void (*ReadProc)(SkCanvas*, SkReader32*, uint32_t op32, SkGPipeState*); 761bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 762bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic const ReadProc gReadTable[] = { 763acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com skip_rp, 764bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com clipPath_rp, 765bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com clipRegion_rp, 766bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com clipRect_rp, 7674ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com clipRRect_rp, 768bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com concat_rp, 769bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com drawBitmap_rp, 770bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com drawBitmapMatrix_rp, 77116d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com drawBitmapNine_rp, 772bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com drawBitmapRect_rp, 773bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com drawClear_rp, 774bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com drawData_rp, 775ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org drawDRRect_rp, 7764ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com drawOval_rp, 777bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com drawPaint_rp, 778bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com drawPath_rp, 779bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com drawPicture_rp, 780bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com drawPoints_rp, 781bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com drawPosText_rp, 782bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com drawPosTextH_rp, 783bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com drawRect_rp, 7844ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com drawRRect_rp, 785bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com drawSprite_rp, 786bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com drawText_rp, 787bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com drawTextOnPath_rp, 788bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com drawVertices_rp, 789bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com restore_rp, 790bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com rotate_rp, 791bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com save_rp, 792bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com saveLayer_rp, 793bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com scale_rp, 794bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com setMatrix_rp, 795bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com skew_rp, 796bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com translate_rp, 7970faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com 798bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com paintOp_rp, 7993cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com typeface_rp, 8000cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com annotation_rp, 8010cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com 802bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com def_Typeface_rp, 8030faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com def_PaintFlat_rp, 80416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com def_Bitmap_rp, 8050c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com def_Factory_rp, 8060faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com 80710dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com reportFlags_rp, 808d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com shareBitmapHeap_rp, 809bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com done_rp 810bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}; 811bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 812bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 813bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 8148afae61a57f87e4a50578effce6c428031499301tomhudson@google.comSkGPipeState::SkGPipeState() 8158afae61a57f87e4a50578effce6c428031499301tomhudson@google.com : fReader(0) 816fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org , fSilent(false) 8178afae61a57f87e4a50578effce6c428031499301tomhudson@google.com , fSharedHeap(NULL) 8188afae61a57f87e4a50578effce6c428031499301tomhudson@google.com , fFlags(0) { 8198afae61a57f87e4a50578effce6c428031499301tomhudson@google.com 8208afae61a57f87e4a50578effce6c428031499301tomhudson@google.com} 821bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 822b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.comSkGPipeState::~SkGPipeState() { 8236bac947cd5bc460dd9166ada6310d678fd2e39f8reed@google.com fTypefaces.safeUnrefAll(); 8246bac947cd5bc460dd9166ada6310d678fd2e39f8reed@google.com fFlatArray.safeUnrefAll(); 82516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fBitmaps.deleteAll(); 82610dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com SkSafeUnref(fSharedHeap); 827bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 828bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 829bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 830bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 831bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkGPipe.h" 832bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 83372c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.comSkGPipeReader::SkGPipeReader() { 83472c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com fCanvas = NULL; 83572c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com fState = NULL; 83674b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com fProc = NULL; 83772c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com} 83872c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com 839bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comSkGPipeReader::SkGPipeReader(SkCanvas* target) { 84072c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com fCanvas = NULL; 84172c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com this->setCanvas(target); 842bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fState = NULL; 84374b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com fProc = NULL; 844bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 845bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 84672c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.comvoid SkGPipeReader::setCanvas(SkCanvas *target) { 84772c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com SkRefCnt_SafeAssign(fCanvas, target); 84872c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com} 84972c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com 850bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comSkGPipeReader::~SkGPipeReader() { 851bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkSafeUnref(fCanvas); 852bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com delete fState; 853bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 854bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 85580b09de87fadfa1fe45860124b157a01e03f760breed@google.comSkGPipeReader::Status SkGPipeReader::playback(const void* data, size_t length, 856fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org uint32_t playbackFlags, size_t* bytesRead) { 857bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (NULL == fCanvas) { 858bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return kError_Status; 859bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 860bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 861bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (NULL == fState) { 862bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fState = new SkGPipeState; 863bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 864bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 865fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org fState->setSilent(playbackFlags & kSilent_PlaybackFlag); 866fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org 8670faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com SkASSERT(SK_ARRAY_COUNT(gReadTable) == (kDone_DrawOp + 1)); 8680faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com 869bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const ReadProc* table = gReadTable; 8708b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org SkReadBuffer reader(data, length); 87174b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com reader.setBitmapDecoder(fProc); 872bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkCanvas* canvas = fCanvas; 87380b09de87fadfa1fe45860124b157a01e03f760breed@google.com Status status = kEOF_Status; 874bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com 875bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com fState->setReader(&reader); 876bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com while (!reader.eof()) { 877c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com uint32_t op32 = reader.readUInt(); 878bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned op = DrawOp_unpackOp(op32); 879920901da539ed8fca76d372abbef872d2cb31be5caryclark@google.com // SkDEBUGCODE(DrawOps drawOp = (DrawOps)op;) 880d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 881bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (op >= SK_ARRAY_COUNT(gReadTable)) { 882bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkDebugf("---- bad op during GPipeState::playback\n"); 88380b09de87fadfa1fe45860124b157a01e03f760breed@google.com status = kError_Status; 88480b09de87fadfa1fe45860124b157a01e03f760breed@google.com break; 885bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 886bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (kDone_DrawOp == op) { 88780b09de87fadfa1fe45860124b157a01e03f760breed@google.com status = kDone_Status; 88880b09de87fadfa1fe45860124b157a01e03f760breed@google.com break; 889bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 8902b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com table[op](canvas, reader.getReader32(), op32, fState); 891fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org if ((playbackFlags & kReadAtom_PlaybackFlag) && 8921bce0a585733a3e4e5cc1b79eae12b15deee122dyangsu@google.com (table[op] != paintOp_rp && 8931bce0a585733a3e4e5cc1b79eae12b15deee122dyangsu@google.com table[op] != def_Typeface_rp && 89416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com table[op] != def_PaintFlat_rp && 89516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com table[op] != def_Bitmap_rp 8961bce0a585733a3e4e5cc1b79eae12b15deee122dyangsu@google.com )) { 8971bce0a585733a3e4e5cc1b79eae12b15deee122dyangsu@google.com status = kReadAtom_Status; 8981bce0a585733a3e4e5cc1b79eae12b15deee122dyangsu@google.com break; 8991bce0a585733a3e4e5cc1b79eae12b15deee122dyangsu@google.com } 900bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 90180b09de87fadfa1fe45860124b157a01e03f760breed@google.com 90280b09de87fadfa1fe45860124b157a01e03f760breed@google.com if (bytesRead) { 903ac45f00d5a2d2bbb065efbe67a786efc5ddb60c5reed@google.com *bytesRead = reader.offset(); 90480b09de87fadfa1fe45860124b157a01e03f760breed@google.com } 90580b09de87fadfa1fe45860124b157a01e03f760breed@google.com return status; 906bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 907