SkGPipeWrite.cpp revision 5a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3
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 10ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 11bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkCanvas.h" 128a85d0c4938173476d037d7af0ee3b9436a1234ereed@google.com#include "SkData.h" 13bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com#include "SkDevice.h" 14bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkPaint.h" 15acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com#include "SkGPipe.h" 16bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkGPipePriv.h" 17f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com#include "SkStream.h" 18b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com#include "SkTSearch.h" 19f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com#include "SkTypeface.h" 20bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkWriter32.h" 21b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com#include "SkColorFilter.h" 220faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com#include "SkDrawLooper.h" 23b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com#include "SkMaskFilter.h" 24b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com#include "SkRasterizer.h" 25b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com#include "SkShader.h" 262b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com#include "SkOrderedWriteBuffer.h" 27b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 28b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.comstatic SkFlattenable* get_paintflat(const SkPaint& paint, unsigned paintFlat) { 29b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com SkASSERT(paintFlat < kCount_PaintFlats); 30b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com switch (paintFlat) { 31b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kColorFilter_PaintFlat: return paint.getColorFilter(); 320faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com case kDrawLooper_PaintFlat: return paint.getLooper(); 33b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kMaskFilter_PaintFlat: return paint.getMaskFilter(); 34b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kPathEffect_PaintFlat: return paint.getPathEffect(); 35b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kRasterizer_PaintFlat: return paint.getRasterizer(); 36b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kShader_PaintFlat: return paint.getShader(); 37b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kXfermode_PaintFlat: return paint.getXfermode(); 38b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 390c00f21fee3f5cfa3aa7e5d46ff94cb8cf340451tomhudson@google.com SkDEBUGFAIL("never gets here"); 40b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com return NULL; 41b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com} 42bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 43acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.comstatic size_t estimateFlattenSize(const SkPath& path) { 44acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com int n = path.countPoints(); 45acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t bytes = 3 * sizeof(int32_t); 46acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com bytes += n * sizeof(SkPoint); 47acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com bytes += SkAlign4(n + 2); // verbs: add 2 for move/close extras 48acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 49acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com#ifdef SK_DEBUG 50acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com { 51acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com SkWriter32 writer(1024); 52acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com path.flatten(writer); 53acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com SkASSERT(writer.size() <= bytes); 54acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 55acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com#endif 56acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return bytes; 57acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com} 58acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 59f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.comstatic size_t writeTypeface(SkWriter32* writer, SkTypeface* typeface) { 60f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com SkASSERT(typeface); 61f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com SkDynamicMemoryWStream stream; 62f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com typeface->serialize(&stream); 63f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com size_t size = stream.getOffset(); 64f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (writer) { 65f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com writer->write32(size); 668a85d0c4938173476d037d7af0ee3b9436a1234ereed@google.com SkAutoDataUnref data(stream.copyToData()); 678a85d0c4938173476d037d7af0ee3b9436a1234ereed@google.com writer->write(data.data(), size); 68f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 69f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com return 4 + size; 70f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com} 71f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 72bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 73bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 74bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comclass SkGPipeCanvas : public SkCanvas { 75bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.compublic: 76dde0956375e87027df2fdd80d430dd819c217aacreed@google.com SkGPipeCanvas(SkGPipeController*, SkWriter32*, SkFactorySet*); 77bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual ~SkGPipeCanvas(); 78bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 79bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com void finish() { 80bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (!fDone) { 81dbccc88f84e5330ce6e52512fcefd375ee2eda49reed@google.com if (this->needOpBytes()) { 82dbccc88f84e5330ce6e52512fcefd375ee2eda49reed@google.com this->writeOp(kDone_DrawOp); 83dbccc88f84e5330ce6e52512fcefd375ee2eda49reed@google.com this->doNotify(); 84dbccc88f84e5330ce6e52512fcefd375ee2eda49reed@google.com } 85bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fDone = true; 86bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 87bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 88bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 89bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com // overrides from SkCanvas 903b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual int save(SaveFlags) SK_OVERRIDE; 913b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual int saveLayer(const SkRect* bounds, const SkPaint*, 923b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com SaveFlags) SK_OVERRIDE; 933b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void restore() SK_OVERRIDE; 943b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE; 953b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE; 963b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual bool rotate(SkScalar degrees) SK_OVERRIDE; 973b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual bool skew(SkScalar sx, SkScalar sy) SK_OVERRIDE; 983b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual bool concat(const SkMatrix& matrix) SK_OVERRIDE; 993b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void setMatrix(const SkMatrix& matrix) SK_OVERRIDE; 1003b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual bool clipRect(const SkRect& rect, SkRegion::Op op, 1013b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com bool doAntiAlias = false) SK_OVERRIDE; 1023b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual bool clipPath(const SkPath& path, SkRegion::Op op, 1033b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com bool doAntiAlias = false) SK_OVERRIDE; 1043b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual bool clipRegion(const SkRegion& region, SkRegion::Op op) SK_OVERRIDE; 1053b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void clear(SkColor) SK_OVERRIDE; 1063b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE; 107bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawPoints(PointMode, size_t count, const SkPoint pts[], 1083b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint&) SK_OVERRIDE; 1093b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void drawRect(const SkRect& rect, const SkPaint&) SK_OVERRIDE; 1103b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void drawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE; 111bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top, 1123b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint*) SK_OVERRIDE; 113bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawBitmapRect(const SkBitmap&, const SkIRect* src, 1143b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkRect& dst, const SkPaint*) SK_OVERRIDE; 115bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawBitmapMatrix(const SkBitmap&, const SkMatrix&, 1163b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint*) SK_OVERRIDE; 1175a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com virtual void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, 1185a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com const SkRect& dst, const SkPaint* paint = NULL) SK_OVERRIDE; 119bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawSprite(const SkBitmap&, int left, int top, 1203b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint*) SK_OVERRIDE; 12174b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org virtual void drawText(const void* text, size_t byteLength, SkScalar x, 1223b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com SkScalar y, const SkPaint&) SK_OVERRIDE; 12374b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org virtual void drawPosText(const void* text, size_t byteLength, 1243b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPoint pos[], const SkPaint&) SK_OVERRIDE; 125bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawPosTextH(const void* text, size_t byteLength, 1263b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkScalar xpos[], SkScalar constY, 1273b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint&) SK_OVERRIDE; 12874b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org virtual void drawTextOnPath(const void* text, size_t byteLength, 12974b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org const SkPath& path, const SkMatrix* matrix, 1303b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint&) SK_OVERRIDE; 1313b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void drawPicture(SkPicture& picture) SK_OVERRIDE; 132bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawVertices(VertexMode, int vertexCount, 133bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint vertices[], const SkPoint texs[], 134bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkColor colors[], SkXfermode*, 135bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const uint16_t indices[], int indexCount, 1363b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint&) SK_OVERRIDE; 1373b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void drawData(const void*, size_t) SK_OVERRIDE; 138bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 139bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comprivate: 140dde0956375e87027df2fdd80d430dd819c217aacreed@google.com SkFactorySet* fFactorySet; // optional, only used if cross-process 141acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com SkGPipeController* fController; 142bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkWriter32& fWriter; 143acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t fBlockSize; // amount allocated for writer 144acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t fBytesNotified; 145bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com bool fDone; 146bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 147f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com SkRefCntSet fTypefaceSet; 148f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 149f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com uint32_t getTypefaceID(SkTypeface*); 150f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 151acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com inline void writeOp(DrawOps op, unsigned flags, unsigned data) { 152bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fWriter.write32(DrawOp_packOpFlagData(op, flags, data)); 153bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 15474b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 155acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com inline void writeOp(DrawOps op) { 156bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fWriter.write32(DrawOp_packOpFlagData(op, 0, 0)); 157bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 158acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 159acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com bool needOpBytes(size_t size = 0); 160acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 161acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com inline void doNotify() { 162acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (!fDone) { 163acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t bytes = fWriter.size() - fBytesNotified; 164acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fController->notifyWritten(bytes); 165acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fBytesNotified += bytes; 166acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 167acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 168b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 169b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com struct FlatData { 170b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com uint32_t fIndex; // always > 0 171b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com uint32_t fSize; 172b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 173b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com void* data() { return (char*)this + sizeof(*this); } 17474b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 175b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com static int Compare(const FlatData* a, const FlatData* b) { 176b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com return memcmp(&a->fSize, &b->fSize, a->fSize + sizeof(a->fSize)); 177b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 178b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com }; 179b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com SkTDArray<FlatData*> fFlatArray; 180b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com int fCurrFlatIndex[kCount_PaintFlats]; 181b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com int flattenToIndex(SkFlattenable* obj, PaintFlats); 182b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 18331891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com SkPaint fPaint; 18431891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com void writePaint(const SkPaint&); 185bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 186acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com class AutoPipeNotify { 187acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com public: 188acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com AutoPipeNotify(SkGPipeCanvas* canvas) : fCanvas(canvas) {} 189acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com ~AutoPipeNotify() { fCanvas->doNotify(); } 190acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com private: 191acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com SkGPipeCanvas* fCanvas; 192acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com }; 193acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com friend class AutoPipeNotify; 194acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 195bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com typedef SkCanvas INHERITED; 196bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}; 197bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 198b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com// return 0 for NULL (or unflattenable obj), or index-base-1 199b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.comint SkGPipeCanvas::flattenToIndex(SkFlattenable* obj, PaintFlats paintflat) { 200b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com if (NULL == obj) { 201b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com return 0; 202b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 203b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 2042b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com SkOrderedWriteBuffer tmpWriter(1024); 2055a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com 2065a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com // Needs to be cross process so a bitmap shader will be preserved 2075a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com // FIXME: Rather than forcing CrossProcess, we should create an SkRefCntSet 2085a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com // so that we can store a pointer to a bitmap's pixels during flattening. 2095a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com tmpWriter.setFlags((SkFlattenableWriteBuffer::Flags) 2105a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com (SkFlattenableWriteBuffer::kInlineFactoryNames_Flag 2115a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com | SkFlattenableWriteBuffer::kCrossProcess_Flag)); 212dde0956375e87027df2fdd80d430dd819c217aacreed@google.com tmpWriter.setFactoryRecorder(fFactorySet); 213dde0956375e87027df2fdd80d430dd819c217aacreed@google.com 214b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com tmpWriter.writeFlattenable(obj); 215b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com size_t len = tmpWriter.size(); 216b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com size_t allocSize = len + sizeof(FlatData); 217b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 218b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com SkAutoSMalloc<1024> storage(allocSize); 219b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com FlatData* flat = (FlatData*)storage.get(); 220b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com flat->fSize = len; 221b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com tmpWriter.flatten(flat->data()); 222b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 223b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com int index = SkTSearch<FlatData>((const FlatData**)fFlatArray.begin(), 224b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com fFlatArray.count(), flat, sizeof(flat), 225b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com &FlatData::Compare); 226b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com if (index < 0) { 227b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com index = ~index; 228b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com FlatData* copy = (FlatData*)sk_malloc_throw(allocSize); 229b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com memcpy(copy, flat, allocSize); 230b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com *fFlatArray.insert(index) = copy; 231b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com // call this after the insert, so that count() will have been grown 232b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com copy->fIndex = fFlatArray.count(); 233b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com// SkDebugf("--- add flattenable[%d] size=%d index=%d\n", paintflat, len, copy->fIndex); 234b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 235b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com if (this->needOpBytes(len)) { 2360faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com this->writeOp(kDef_Flattenable_DrawOp, paintflat, copy->fIndex); 237b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com fWriter.write(copy->data(), len); 238b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 239b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 240b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com return fFlatArray[index]->fIndex; 241b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com} 242b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 243bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 244bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 245acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com#define MIN_BLOCK_SIZE (16 * 1024) 246bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 247acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.comSkGPipeCanvas::SkGPipeCanvas(SkGPipeController* controller, 248dde0956375e87027df2fdd80d430dd819c217aacreed@google.com SkWriter32* writer, SkFactorySet* fset) 24967908f2faee17a8bce4d074980617cc0d15fabf1reed@google.com : fWriter(*writer) { 25067908f2faee17a8bce4d074980617cc0d15fabf1reed@google.com fFactorySet = fset; 251acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fController = controller; 252bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fDone = false; 253acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fBlockSize = 0; // need first block from controller 2545a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com fBytesNotified = 0; 255b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com sk_bzero(fCurrFlatIndex, sizeof(fCurrFlatIndex)); 256acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 257bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com // we need a device to limit our clip 258bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com // should the caller give us the bounds? 25906b4da16fd6ed63560d79116c6066534e953a43dyangsu@google.com // We don't allocate pixels for the bitmap 260bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com SkBitmap bitmap; 261bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com bitmap.setConfig(SkBitmap::kARGB_8888_Config, 32767, 32767); 26206b4da16fd6ed63560d79116c6066534e953a43dyangsu@google.com SkDevice* device = SkNEW_ARGS(SkDevice, (bitmap)); 263bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com this->setDevice(device)->unref(); 264bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 265bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 266bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comSkGPipeCanvas::~SkGPipeCanvas() { 267bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com this->finish(); 268bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 269b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com fFlatArray.freeAll(); 270bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 271bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 272acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.combool SkGPipeCanvas::needOpBytes(size_t needed) { 273acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (fDone) { 274acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return false; 275acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 276acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 277acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com needed += 4; // size of DrawOp atom 278acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (fWriter.size() + needed > fBlockSize) { 2795a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com // Before we wipe out any data that has already been written, read it 2805a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com // out. 2815a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com this->doNotify(); 2825a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com size_t blockSize = SkMax32(MIN_BLOCK_SIZE, needed); 2835a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com void* block = fController->requestBlock(blockSize, &fBlockSize); 284acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (NULL == block) { 285acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fDone = true; 286acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return false; 287acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 288acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.reset(block, fBlockSize); 289acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fBytesNotified = 0; 290acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 291acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return true; 292acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com} 293acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 294f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.comuint32_t SkGPipeCanvas::getTypefaceID(SkTypeface* face) { 295f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com uint32_t id = 0; // 0 means default/null typeface 296f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (face) { 297f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com id = fTypefaceSet.find(face); 298f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (0 == id) { 299f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com id = fTypefaceSet.add(face); 300f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com size_t size = writeTypeface(NULL, face); 301f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (this->needOpBytes(size)) { 302bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com this->writeOp(kDef_Typeface_DrawOp); 303f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com writeTypeface(&fWriter, face); 304f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 305f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 306f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 307f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com return id; 308f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com} 309f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 310bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 311bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 312acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com#define NOTIFY_SETUP(canvas) \ 313acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com AutoPipeNotify apn(canvas) 314acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 315bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comint SkGPipeCanvas::save(SaveFlags flags) { 316acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 317acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes()) { 318acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSave_DrawOp, 0, flags); 319acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 320bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::save(flags); 321bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 322bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 323bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comint SkGPipeCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint, 324bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SaveFlags saveFlags) { 325acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 326acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t size = 0; 327bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned opFlags = 0; 32874b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 329bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (bounds) { 330bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com opFlags |= kSaveLayer_HasBounds_DrawOpFlag; 331acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += sizeof(SkRect); 332bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 333bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (paint) { 334bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com opFlags |= kSaveLayer_HasPaint_DrawOpFlag; 33531891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(*paint); 336bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 337bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 338acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(size)) { 339acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSaveLayer_DrawOp, opFlags, saveFlags); 340acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (bounds) { 341acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeRect(*bounds); 342acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 343bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 34474b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 345bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com // we just pass on the save, so we don't create a layer 346bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::save(saveFlags); 347bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 348bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 349bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::restore() { 350acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 351acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes()) { 352acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kRestore_DrawOp); 353acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 354bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com this->INHERITED::restore(); 355bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 356bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 357bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::translate(SkScalar dx, SkScalar dy) { 358bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (dx || dy) { 359acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 360acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(2 * sizeof(SkScalar))) { 361acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kTranslate_DrawOp); 362acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(dx); 363acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(dy); 364acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 365bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 366bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::translate(dx, dy); 367bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 368bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 369bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::scale(SkScalar sx, SkScalar sy) { 370bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (sx || sy) { 371acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 372acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(2 * sizeof(SkScalar))) { 373acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kScale_DrawOp); 374acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(sx); 375acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(sy); 376acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 377bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 378bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::scale(sx, sy); 379bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 380bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 381bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::rotate(SkScalar degrees) { 382bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (degrees) { 383acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 384acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(sizeof(SkScalar))) { 385acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kRotate_DrawOp); 386acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(degrees); 387acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 388bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 389bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::rotate(degrees); 390bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 391bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 392bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::skew(SkScalar sx, SkScalar sy) { 393bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (sx || sy) { 394acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 395acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(2 * sizeof(SkScalar))) { 396acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSkew_DrawOp); 397acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(sx); 398acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(sy); 399acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 400bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 401bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::skew(sx, sy); 402bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 403bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 404bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::concat(const SkMatrix& matrix) { 405bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (!matrix.isIdentity()) { 406acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 407acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(matrix.flatten(NULL))) { 408acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kConcat_DrawOp); 4092b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com fWriter.writeMatrix(matrix); 410acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 411bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 412bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::concat(matrix); 413bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 414bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 415bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::setMatrix(const SkMatrix& matrix) { 416acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 417acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(matrix.flatten(NULL))) { 418acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSetMatrix_DrawOp); 4192b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com fWriter.writeMatrix(matrix); 420acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 421bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com this->INHERITED::setMatrix(matrix); 422bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 423bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 4243b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.combool SkGPipeCanvas::clipRect(const SkRect& rect, SkRegion::Op rgnOp, 4253b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com bool doAntiAlias) { 426acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 4273b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com if (this->needOpBytes(sizeof(SkRect)) + sizeof(bool)) { 428acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kClipRect_DrawOp, 0, rgnOp); 429acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeRect(rect); 4303b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com fWriter.writeBool(doAntiAlias); 431acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 4323b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com return this->INHERITED::clipRect(rect, rgnOp, doAntiAlias); 433bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 434bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 4353b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.combool SkGPipeCanvas::clipPath(const SkPath& path, SkRegion::Op rgnOp, 4363b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com bool doAntiAlias) { 437acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 4383b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com if (this->needOpBytes(estimateFlattenSize(path)) + sizeof(bool)) { 439acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kClipPath_DrawOp, 0, rgnOp); 440acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com path.flatten(fWriter); 4413b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com fWriter.writeBool(doAntiAlias); 442acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 443bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com // we just pass on the bounds of the path 4443b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com return this->INHERITED::clipRect(path.getBounds(), rgnOp, doAntiAlias); 445bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 446bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 447bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::clipRegion(const SkRegion& region, SkRegion::Op rgnOp) { 448acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 449acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(region.flatten(NULL))) { 450acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kClipRegion_DrawOp, 0, rgnOp); 4512b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com fWriter.writeRegion(region); 452acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 453bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::clipRegion(region, rgnOp); 454bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 455bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 456bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 457bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 458bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::clear(SkColor color) { 459acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 460bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned flags = 0; 461bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (color) { 462bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kClear_HasColor_DrawOpFlag; 463bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 464acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(sizeof(SkColor))) { 465acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kDrawClear_DrawOp, flags, 0); 466acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (color) { 467acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(color); 468acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 469bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 470bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 471bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 472bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPaint(const SkPaint& paint) { 473acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 47431891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 475acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes()) { 47631891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPaint_DrawOp); 477acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 478bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 479bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 480bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPoints(PointMode mode, size_t count, 481bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint pts[], const SkPaint& paint) { 482bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (count) { 483acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 48431891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 485acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + count * sizeof(SkPoint))) { 48631891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPoints_DrawOp, mode, 0); 487acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(count); 488acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(pts, count * sizeof(SkPoint)); 489acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 490bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 491bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 492bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 493bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawRect(const SkRect& rect, const SkPaint& paint) { 494acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 49531891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 496acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(sizeof(SkRect))) { 49731891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawRect_DrawOp); 498acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeRect(rect); 499acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 500bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 501bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 502bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPath(const SkPath& path, const SkPaint& paint) { 503acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 50431891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 505acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(estimateFlattenSize(path))) { 50631891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPath_DrawOp); 507acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com path.flatten(fWriter); 508acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 509bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 510bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 5115a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.comvoid SkGPipeCanvas::drawBitmap(const SkBitmap& bm, SkScalar left, SkScalar top, 5125a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com const SkPaint* paint) { 5135a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com // This is the brute-force solution 5145a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com // TODO: add the notion of a shared, counted for large immutable resources 5155a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com NOTIFY_SETUP(this); 5165a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com if (paint) { 5175a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com this->writePaint(*paint); 5185a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com } 5195a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com SkOrderedWriteBuffer writeBuffer(0); 5205a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com // FIXME: Rather than forcing CrossProcess, we should create an SkRefCntSet 5215a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com // so that we can store a pointer to a bitmap's pixels during flattening. 5225a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com writeBuffer.setFlags(SkFlattenableWriteBuffer::kCrossProcess_Flag); 5235a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com bm.flatten(writeBuffer); 5245a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com int size = writeBuffer.size(); 5255a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com 5265a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com if (this->needOpBytes(sizeof(uint32_t) + size + sizeof(SkScalar)*2) 5275a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com + sizeof(bool)) { 5285a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com // Record the act of drawing the bitmap 5295a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com this->writeOp(kDrawBitmap_DrawOp); 5305a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com fWriter.writeInt(size); 5315a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com void* ptr = (void*) fWriter.reserve(size); 5325a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com writeBuffer.flatten(ptr); 5335a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com fWriter.writeBool(paint != NULL); 5345a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com fWriter.writeScalar(left); 5355a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com fWriter.writeScalar(top); 5365a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com } 537bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 538bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 539bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawBitmapRect(const SkBitmap&, const SkIRect* src, 540bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkRect& dst, const SkPaint*) { 541bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com UNIMPLEMENTED 542bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 543bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 544bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawBitmapMatrix(const SkBitmap&, const SkMatrix&, 545bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint*) { 546bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com UNIMPLEMENTED 547bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 5485a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.comvoid SkGPipeCanvas::drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, 5495a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com const SkRect& dst, const SkPaint* paint) { 5505a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com UNIMPLEMENTED 5515a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com} 552bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawSprite(const SkBitmap&, int left, int top, 553bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint*) { 554bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com UNIMPLEMENTED 555bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 556bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 55774b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.orgvoid SkGPipeCanvas::drawText(const void* text, size_t byteLength, SkScalar x, 558bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkScalar y, const SkPaint& paint) { 559bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 560acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 56131891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 562acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(byteLength) + 2 * sizeof(SkScalar))) { 56331891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawText_DrawOp); 564acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(byteLength); 565acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 566acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(x); 567acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(y); 568acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 569bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 570bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 571bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 57274b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.orgvoid SkGPipeCanvas::drawPosText(const void* text, size_t byteLength, 573bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint pos[], const SkPaint& paint) { 574bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 575acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 57631891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 577bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com int count = paint.textToGlyphs(text, byteLength, NULL); 578acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(byteLength) + 4 + count * sizeof(SkPoint))) { 57931891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPosText_DrawOp); 580acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(byteLength); 581acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 582acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(count); 583acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(pos, count * sizeof(SkPoint)); 584acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 585bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 586bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 587bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 588bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPosTextH(const void* text, size_t byteLength, 589bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkScalar xpos[], SkScalar constY, 590bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint& paint) { 591bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 592acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 59331891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 594bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com int count = paint.textToGlyphs(text, byteLength, NULL); 595acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(byteLength) + 4 + count * sizeof(SkScalar) + 4)) { 59631891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPosTextH_DrawOp); 597acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(byteLength); 598acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 599acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(count); 600acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(xpos, count * sizeof(SkScalar)); 601acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(constY); 602acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 603bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 604bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 605bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 60674b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.orgvoid SkGPipeCanvas::drawTextOnPath(const void* text, size_t byteLength, 60774b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org const SkPath& path, const SkMatrix* matrix, 608bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint& paint) { 609bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 610acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 611bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned flags = 0; 612acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t size = 4 + SkAlign4(byteLength) + estimateFlattenSize(path); 613bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (matrix) { 614bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawTextOnPath_HasMatrix_DrawOpFlag; 615acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += matrix->flatten(NULL); 616bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 61731891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 618acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(size)) { 61931891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawTextOnPath_DrawOp, flags, 0); 620bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 621acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(byteLength); 622acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 623bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 624acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com path.flatten(fWriter); 625acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (matrix) { 6262b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com fWriter.writeMatrix(*matrix); 627acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 628bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 629bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 630bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 631bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 632bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPicture(SkPicture& picture) { 6330faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com // we want to playback the picture into individual draw calls 6340faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com this->INHERITED::drawPicture(picture); 635bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 636bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 637bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawVertices(VertexMode mode, int vertexCount, 638bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint vertices[], const SkPoint texs[], 639bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkColor colors[], SkXfermode*, 640bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const uint16_t indices[], int indexCount, 641bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint& paint) { 642bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (0 == vertexCount) { 643bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return; 644bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 645bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 646acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 647acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t size = 4 + vertexCount * sizeof(SkPoint); 64831891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 649bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned flags = 0; 650bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (texs) { 651bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawVertices_HasTexs_DrawOpFlag; 652acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += vertexCount * sizeof(SkPoint); 653bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 654bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (colors) { 655bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawVertices_HasColors_DrawOpFlag; 656acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += vertexCount * sizeof(SkColor); 657bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 658bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (indices && indexCount > 0) { 659bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawVertices_HasIndices_DrawOpFlag; 660acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += 4 + SkAlign4(indexCount * sizeof(uint16_t)); 661bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 66274b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 663acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(size)) { 66431891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawVertices_DrawOp, flags, 0); 665acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(mode); 666acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(vertexCount); 667acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(vertices, vertexCount * sizeof(SkPoint)); 668acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (texs) { 669acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(texs, vertexCount * sizeof(SkPoint)); 670acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 671acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (colors) { 672acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(colors, vertexCount * sizeof(SkColor)); 673acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 674bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 675acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com // TODO: flatten xfermode 676bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 677acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (indices && indexCount > 0) { 678acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(indexCount); 679acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(indices, indexCount * sizeof(uint16_t)); 680acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 681bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 682bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 683bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 684acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.comvoid SkGPipeCanvas::drawData(const void* ptr, size_t size) { 685acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (size && ptr) { 686acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 687bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned data = 0; 688bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (size < (1 << DRAWOPS_DATA_BITS)) { 689bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com data = (unsigned)size; 690bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 691acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(size))) { 692acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kDrawData_DrawOp, 0, data); 693acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (0 == data) { 694acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(size); 695acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 696bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com fWriter.writePad(ptr, size); 697bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 698bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 699bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 700bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 701bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 702bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 703bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comtemplate <typename T> uint32_t castToU32(T value) { 704bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com union { 705bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com T fSrc; 706bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com uint32_t fDst; 707bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } data; 708bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com data.fSrc = value; 709bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return data.fDst; 710bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 711bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 71231891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.comvoid SkGPipeCanvas::writePaint(const SkPaint& paint) { 71331891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com SkPaint& base = fPaint; 714bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com uint32_t storage[32]; 715bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com uint32_t* ptr = storage; 716bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 717bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getFlags() != paint.getFlags()) { 718bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kFlags_PaintOp, paint.getFlags()); 719f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setFlags(paint.getFlags()); 720bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 721bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getColor() != paint.getColor()) { 722bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kColor_PaintOp); 723bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = paint.getColor(); 724f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setColor(paint.getColor()); 725bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 726bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStyle() != paint.getStyle()) { 727bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kStyle_PaintOp, paint.getStyle()); 728f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStyle(paint.getStyle()); 729bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 730bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeJoin() != paint.getStrokeJoin()) { 731bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kJoin_PaintOp, paint.getStrokeJoin()); 732f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeJoin(paint.getStrokeJoin()); 733bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 734bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeCap() != paint.getStrokeCap()) { 735bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kCap_PaintOp, paint.getStrokeCap()); 736f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeCap(paint.getStrokeCap()); 737bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 738bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeWidth() != paint.getStrokeWidth()) { 739bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kWidth_PaintOp); 740bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getStrokeWidth()); 741f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeWidth(paint.getStrokeWidth()); 742bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 743bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeMiter() != paint.getStrokeMiter()) { 744bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kMiter_PaintOp); 745bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getStrokeMiter()); 746f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeMiter(paint.getStrokeMiter()); 747bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 748bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextEncoding() != paint.getTextEncoding()) { 749bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kEncoding_PaintOp, paint.getTextEncoding()); 750f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextEncoding(paint.getTextEncoding()); 751bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 752bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getHinting() != paint.getHinting()) { 753bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kHinting_PaintOp, paint.getHinting()); 754f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setHinting(paint.getHinting()); 755bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 756bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextAlign() != paint.getTextAlign()) { 757bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kAlign_PaintOp, paint.getTextAlign()); 758f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextAlign(paint.getTextAlign()); 759bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 760bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextSize() != paint.getTextSize()) { 761bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kTextSize_PaintOp); 762bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getTextSize()); 763f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextSize(paint.getTextSize()); 764bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 765bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextScaleX() != paint.getTextScaleX()) { 766bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kTextScaleX_PaintOp); 767bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getTextScaleX()); 768f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextScaleX(paint.getTextScaleX()); 769bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 770bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextSkewX() != paint.getTextSkewX()) { 771bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kTextSkewX_PaintOp); 772bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getTextSkewX()); 773f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextSkewX(paint.getTextSkewX()); 774f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 775f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 776f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (!SkTypeface::Equal(base.getTypeface(), paint.getTypeface())) { 777f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com uint32_t id = this->getTypefaceID(paint.getTypeface()); 778f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com *ptr++ = PaintOp_packOpData(kTypeface_PaintOp, id); 779f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTypeface(paint.getTypeface()); 780bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 781bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 782b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com for (int i = 0; i < kCount_PaintFlats; i++) { 783b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com int index = this->flattenToIndex(get_paintflat(paint, i), (PaintFlats)i); 784b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com SkASSERT(index >= 0 && index <= fFlatArray.count()); 785b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com if (index != fCurrFlatIndex[i]) { 786b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com *ptr++ = PaintOp_packOpFlagData(kFlatIndex_PaintOp, i, index); 787b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com fCurrFlatIndex[i] = index; 788b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 789b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 790b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 791acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t size = (char*)ptr - (char*)storage; 792acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (size && this->needOpBytes(size)) { 793b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com this->writeOp(kPaintOp_DrawOp, 0, size); 794b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com fWriter.write(storage, size); 795bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com for (size_t i = 0; i < size/4; i++) { 796b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com// SkDebugf("[%d] %08X\n", i, storage[i]); 797bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 798bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 799bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 800bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 801bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 802bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 803bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkGPipe.h" 804bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 805acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.comSkGPipeWriter::SkGPipeWriter() : fWriter(0) { 806bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas = NULL; 807bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 808bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 809bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comSkGPipeWriter::~SkGPipeWriter() { 810acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->endRecording(); 811bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkSafeUnref(fCanvas); 812bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 813bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 814dde0956375e87027df2fdd80d430dd819c217aacreed@google.comSkCanvas* SkGPipeWriter::startRecording(SkGPipeController* controller, 815dde0956375e87027df2fdd80d430dd819c217aacreed@google.com uint32_t flags) { 816bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (NULL == fCanvas) { 817acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.reset(NULL, 0); 818dde0956375e87027df2fdd80d430dd819c217aacreed@google.com fFactorySet.reset(); 819dde0956375e87027df2fdd80d430dd819c217aacreed@google.com fCanvas = SkNEW_ARGS(SkGPipeCanvas, (controller, &fWriter, 820dde0956375e87027df2fdd80d430dd819c217aacreed@google.com (flags & kCrossProcess_Flag) ? 821dde0956375e87027df2fdd80d430dd819c217aacreed@google.com &fFactorySet : NULL)); 822bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 823bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return fCanvas; 824bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 825bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 826bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeWriter::endRecording() { 827bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (fCanvas) { 828bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas->finish(); 829bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas->unref(); 830bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas = NULL; 831bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 832bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 833bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 834