SkGPipeWrite.cpp revision ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976e
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" 26b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 27b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.comstatic SkFlattenable* get_paintflat(const SkPaint& paint, unsigned paintFlat) { 28b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com SkASSERT(paintFlat < kCount_PaintFlats); 29b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com switch (paintFlat) { 30b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kColorFilter_PaintFlat: return paint.getColorFilter(); 310faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com case kDrawLooper_PaintFlat: return paint.getLooper(); 32b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kMaskFilter_PaintFlat: return paint.getMaskFilter(); 33b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kPathEffect_PaintFlat: return paint.getPathEffect(); 34b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kRasterizer_PaintFlat: return paint.getRasterizer(); 35b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kShader_PaintFlat: return paint.getShader(); 36b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kXfermode_PaintFlat: return paint.getXfermode(); 37b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 38b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com SkASSERT(!"never gets here"); 39b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com return NULL; 40b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com} 41bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 42acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.comstatic size_t estimateFlattenSize(const SkPath& path) { 43acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com int n = path.countPoints(); 44acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t bytes = 3 * sizeof(int32_t); 45acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com bytes += n * sizeof(SkPoint); 46acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com bytes += SkAlign4(n + 2); // verbs: add 2 for move/close extras 47acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 48acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com#ifdef SK_DEBUG 49acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com { 50acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com SkWriter32 writer(1024); 51acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com path.flatten(writer); 52acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com SkASSERT(writer.size() <= bytes); 53acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 54acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com#endif 55acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return bytes; 56acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com} 57acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 58f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.comstatic size_t writeTypeface(SkWriter32* writer, SkTypeface* typeface) { 59f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com SkASSERT(typeface); 60f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com SkDynamicMemoryWStream stream; 61f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com typeface->serialize(&stream); 62f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com size_t size = stream.getOffset(); 63f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (writer) { 64f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com writer->write32(size); 658a85d0c4938173476d037d7af0ee3b9436a1234ereed@google.com SkAutoDataUnref data(stream.copyToData()); 668a85d0c4938173476d037d7af0ee3b9436a1234ereed@google.com writer->write(data.data(), size); 67f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 68f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com return 4 + size; 69f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com} 70f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 71bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 72bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 73bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comclass SkGPipeCanvas : public SkCanvas { 74bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.compublic: 75dde0956375e87027df2fdd80d430dd819c217aacreed@google.com SkGPipeCanvas(SkGPipeController*, SkWriter32*, SkFactorySet*); 76bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual ~SkGPipeCanvas(); 77bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 78bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com void finish() { 79bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (!fDone) { 80dbccc88f84e5330ce6e52512fcefd375ee2eda49reed@google.com if (this->needOpBytes()) { 81dbccc88f84e5330ce6e52512fcefd375ee2eda49reed@google.com this->writeOp(kDone_DrawOp); 82dbccc88f84e5330ce6e52512fcefd375ee2eda49reed@google.com this->doNotify(); 83dbccc88f84e5330ce6e52512fcefd375ee2eda49reed@google.com } 84bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fDone = true; 85bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 86bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 87bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 88bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com // overrides from SkCanvas 89bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual int save(SaveFlags); 90bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual int saveLayer(const SkRect* bounds, const SkPaint*, SaveFlags); 91bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void restore(); 92bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual bool translate(SkScalar dx, SkScalar dy); 93bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual bool scale(SkScalar sx, SkScalar sy); 94bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual bool rotate(SkScalar degrees); 95bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual bool skew(SkScalar sx, SkScalar sy); 96bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual bool concat(const SkMatrix& matrix); 97bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void setMatrix(const SkMatrix& matrix); 98bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual bool clipRect(const SkRect& rect, SkRegion::Op op); 99bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual bool clipPath(const SkPath& path, SkRegion::Op op); 100bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual bool clipRegion(const SkRegion& region, SkRegion::Op op); 101bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void clear(SkColor); 102bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawPaint(const SkPaint& paint); 103bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawPoints(PointMode, size_t count, const SkPoint pts[], 104bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint&); 105bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawRect(const SkRect& rect, const SkPaint&); 106bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawPath(const SkPath& path, const SkPaint&); 107bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top, 108bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint*); 109bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawBitmapRect(const SkBitmap&, const SkIRect* src, 110bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkRect& dst, const SkPaint*); 111bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawBitmapMatrix(const SkBitmap&, const SkMatrix&, 112bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint*); 113bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawSprite(const SkBitmap&, int left, int top, 114bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint*); 115bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawText(const void* text, size_t byteLength, SkScalar x, 116bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkScalar y, const SkPaint&); 117bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawPosText(const void* text, size_t byteLength, 118bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint pos[], const SkPaint&); 119bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawPosTextH(const void* text, size_t byteLength, 120bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkScalar xpos[], SkScalar constY, const SkPaint&); 121bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawTextOnPath(const void* text, size_t byteLength, 122bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPath& path, const SkMatrix* matrix, 123bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint&); 124bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawPicture(SkPicture& picture); 125bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawVertices(VertexMode, int vertexCount, 126bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint vertices[], const SkPoint texs[], 127bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkColor colors[], SkXfermode*, 128bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const uint16_t indices[], int indexCount, 129bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint&); 130bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawData(const void*, size_t); 131bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 132bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comprivate: 133dde0956375e87027df2fdd80d430dd819c217aacreed@google.com SkFactorySet* fFactorySet; // optional, only used if cross-process 134acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com SkGPipeController* fController; 135bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkWriter32& fWriter; 136acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t fBlockSize; // amount allocated for writer 137acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t fBytesNotified; 138bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com bool fDone; 139bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 140f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com SkRefCntSet fTypefaceSet; 141f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 142f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com uint32_t getTypefaceID(SkTypeface*); 143f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 144acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com inline void writeOp(DrawOps op, unsigned flags, unsigned data) { 145bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fWriter.write32(DrawOp_packOpFlagData(op, flags, data)); 146bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 147bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 148acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com inline void writeOp(DrawOps op) { 149bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fWriter.write32(DrawOp_packOpFlagData(op, 0, 0)); 150bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 151acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 152acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com bool needOpBytes(size_t size = 0); 153acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 154acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com inline void doNotify() { 155acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (!fDone) { 156acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t bytes = fWriter.size() - fBytesNotified; 157acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fController->notifyWritten(bytes); 158acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fBytesNotified += bytes; 159acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 160acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 161b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 162b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com struct FlatData { 163b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com uint32_t fIndex; // always > 0 164b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com uint32_t fSize; 165b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 166b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com void* data() { return (char*)this + sizeof(*this); } 167b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 168b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com static int Compare(const FlatData* a, const FlatData* b) { 169b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com return memcmp(&a->fSize, &b->fSize, a->fSize + sizeof(a->fSize)); 170b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 171b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com }; 172b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com SkTDArray<FlatData*> fFlatArray; 173b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com int fCurrFlatIndex[kCount_PaintFlats]; 174b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com int flattenToIndex(SkFlattenable* obj, PaintFlats); 175b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 17631891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com SkPaint fPaint; 17731891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com void writePaint(const SkPaint&); 178bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 179acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com class AutoPipeNotify { 180acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com public: 181acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com AutoPipeNotify(SkGPipeCanvas* canvas) : fCanvas(canvas) {} 182acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com ~AutoPipeNotify() { fCanvas->doNotify(); } 183acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com private: 184acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com SkGPipeCanvas* fCanvas; 185acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com }; 186acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com friend class AutoPipeNotify; 187acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 188bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com typedef SkCanvas INHERITED; 189bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}; 190bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 191b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com// return 0 for NULL (or unflattenable obj), or index-base-1 192b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.comint SkGPipeCanvas::flattenToIndex(SkFlattenable* obj, PaintFlats paintflat) { 193b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com if (NULL == obj) { 194b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com return 0; 195b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 196b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 197b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com SkFlattenableWriteBuffer tmpWriter(1024); 1986bac947cd5bc460dd9166ada6310d678fd2e39f8reed@google.com tmpWriter.setFlags(SkFlattenableWriteBuffer::kInlineFactoryNames_Flag); 199dde0956375e87027df2fdd80d430dd819c217aacreed@google.com tmpWriter.setFactoryRecorder(fFactorySet); 200dde0956375e87027df2fdd80d430dd819c217aacreed@google.com 201b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com tmpWriter.writeFlattenable(obj); 202b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com size_t len = tmpWriter.size(); 203b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com size_t allocSize = len + sizeof(FlatData); 204b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 205b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com SkAutoSMalloc<1024> storage(allocSize); 206b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com FlatData* flat = (FlatData*)storage.get(); 207b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com flat->fSize = len; 208b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com tmpWriter.flatten(flat->data()); 209b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 210b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com int index = SkTSearch<FlatData>((const FlatData**)fFlatArray.begin(), 211b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com fFlatArray.count(), flat, sizeof(flat), 212b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com &FlatData::Compare); 213b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com if (index < 0) { 214b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com index = ~index; 215b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com FlatData* copy = (FlatData*)sk_malloc_throw(allocSize); 216b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com memcpy(copy, flat, allocSize); 217b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com *fFlatArray.insert(index) = copy; 218b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com // call this after the insert, so that count() will have been grown 219b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com copy->fIndex = fFlatArray.count(); 220b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com// SkDebugf("--- add flattenable[%d] size=%d index=%d\n", paintflat, len, copy->fIndex); 221b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 222b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com if (this->needOpBytes(len)) { 2230faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com this->writeOp(kDef_Flattenable_DrawOp, paintflat, copy->fIndex); 224b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com fWriter.write(copy->data(), len); 225b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 226b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 227b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com return fFlatArray[index]->fIndex; 228b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com} 229b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 230bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 231bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 232acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com#define MIN_BLOCK_SIZE (16 * 1024) 233bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 234acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.comSkGPipeCanvas::SkGPipeCanvas(SkGPipeController* controller, 235dde0956375e87027df2fdd80d430dd819c217aacreed@google.com SkWriter32* writer, SkFactorySet* fset) 23667908f2faee17a8bce4d074980617cc0d15fabf1reed@google.com : fWriter(*writer) { 23767908f2faee17a8bce4d074980617cc0d15fabf1reed@google.com fFactorySet = fset; 238acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fController = controller; 239bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fDone = false; 240acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fBlockSize = 0; // need first block from controller 241b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com sk_bzero(fCurrFlatIndex, sizeof(fCurrFlatIndex)); 242acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 243bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com // we need a device to limit our clip 244bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com // should the caller give us the bounds? 24506b4da16fd6ed63560d79116c6066534e953a43dyangsu@google.com // We don't allocate pixels for the bitmap 246bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com SkBitmap bitmap; 247bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com bitmap.setConfig(SkBitmap::kARGB_8888_Config, 32767, 32767); 24806b4da16fd6ed63560d79116c6066534e953a43dyangsu@google.com SkDevice* device = SkNEW_ARGS(SkDevice, (bitmap)); 249bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com this->setDevice(device)->unref(); 250bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 251bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 252bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comSkGPipeCanvas::~SkGPipeCanvas() { 253bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com this->finish(); 254bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 255b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com fFlatArray.freeAll(); 256bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 257bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 258acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.combool SkGPipeCanvas::needOpBytes(size_t needed) { 259acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (fDone) { 260acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return false; 261acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 262acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 263acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com needed += 4; // size of DrawOp atom 264acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (fWriter.size() + needed > fBlockSize) { 265acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com void* block = fController->requestBlock(MIN_BLOCK_SIZE, &fBlockSize); 266acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (NULL == block) { 267acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fDone = true; 268acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return false; 269acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 270acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.reset(block, fBlockSize); 271acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fBytesNotified = 0; 272acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 273acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return true; 274acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com} 275acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 276f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.comuint32_t SkGPipeCanvas::getTypefaceID(SkTypeface* face) { 277f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com uint32_t id = 0; // 0 means default/null typeface 278f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (face) { 279f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com id = fTypefaceSet.find(face); 280f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (0 == id) { 281f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com id = fTypefaceSet.add(face); 282f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com size_t size = writeTypeface(NULL, face); 283f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (this->needOpBytes(size)) { 284bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com this->writeOp(kDef_Typeface_DrawOp); 285f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com writeTypeface(&fWriter, face); 286f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 287f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 288f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 289f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com return id; 290f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com} 291f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 292bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 293bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 294acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com#define NOTIFY_SETUP(canvas) \ 295acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com AutoPipeNotify apn(canvas) 296acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 297bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comint SkGPipeCanvas::save(SaveFlags flags) { 298acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 299acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes()) { 300acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSave_DrawOp, 0, flags); 301acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 302bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::save(flags); 303bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 304bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 305bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comint SkGPipeCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint, 306bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SaveFlags saveFlags) { 307acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 308acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t size = 0; 309bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned opFlags = 0; 310acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 311bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (bounds) { 312bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com opFlags |= kSaveLayer_HasBounds_DrawOpFlag; 313acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += sizeof(SkRect); 314bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 315bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (paint) { 316bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com opFlags |= kSaveLayer_HasPaint_DrawOpFlag; 31731891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(*paint); 318bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 319bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 320acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(size)) { 321acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSaveLayer_DrawOp, opFlags, saveFlags); 322acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (bounds) { 323acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeRect(*bounds); 324acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 325bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 326bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 327bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com // we just pass on the save, so we don't create a layer 328bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::save(saveFlags); 329bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 330bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 331bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::restore() { 332acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 333acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes()) { 334acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kRestore_DrawOp); 335acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 336bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com this->INHERITED::restore(); 337bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 338bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 339bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::translate(SkScalar dx, SkScalar dy) { 340bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (dx || dy) { 341acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 342acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(2 * sizeof(SkScalar))) { 343acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kTranslate_DrawOp); 344acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(dx); 345acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(dy); 346acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 347bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 348bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::translate(dx, dy); 349bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 350bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 351bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::scale(SkScalar sx, SkScalar sy) { 352bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (sx || sy) { 353acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 354acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(2 * sizeof(SkScalar))) { 355acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kScale_DrawOp); 356acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(sx); 357acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(sy); 358acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 359bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 360bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::scale(sx, sy); 361bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 362bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 363bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::rotate(SkScalar degrees) { 364bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (degrees) { 365acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 366acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(sizeof(SkScalar))) { 367acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kRotate_DrawOp); 368acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(degrees); 369acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 370bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 371bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::rotate(degrees); 372bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 373bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 374bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::skew(SkScalar sx, SkScalar sy) { 375bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (sx || sy) { 376acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 377acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(2 * sizeof(SkScalar))) { 378acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSkew_DrawOp); 379acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(sx); 380acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(sy); 381acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 382bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 383bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::skew(sx, sy); 384bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 385bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 386bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::concat(const SkMatrix& matrix) { 387bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (!matrix.isIdentity()) { 388acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 389acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(matrix.flatten(NULL))) { 390acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kConcat_DrawOp); 391b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com SkWriteMatrix(&fWriter, matrix); 392acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 393bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 394bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::concat(matrix); 395bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 396bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 397bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::setMatrix(const SkMatrix& matrix) { 398acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 399acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(matrix.flatten(NULL))) { 400acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSetMatrix_DrawOp); 401b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com SkWriteMatrix(&fWriter, matrix); 402acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 403bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com this->INHERITED::setMatrix(matrix); 404bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 405bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 406bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::clipRect(const SkRect& rect, SkRegion::Op rgnOp) { 407acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 408acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(sizeof(SkRect))) { 409acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kClipRect_DrawOp, 0, rgnOp); 410acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeRect(rect); 411acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 412bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::clipRect(rect, rgnOp); 413bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 414bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 415bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::clipPath(const SkPath& path, SkRegion::Op rgnOp) { 416acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 417acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(estimateFlattenSize(path))) { 418acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kClipPath_DrawOp, 0, rgnOp); 419acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com path.flatten(fWriter); 420acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 421bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com // we just pass on the bounds of the path 422bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::clipRect(path.getBounds(), rgnOp); 423bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 424bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 425bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::clipRegion(const SkRegion& region, SkRegion::Op rgnOp) { 426acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 427acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(region.flatten(NULL))) { 428acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kClipRegion_DrawOp, 0, rgnOp); 429b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com SkWriteRegion(&fWriter, region); 430acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 431bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::clipRegion(region, rgnOp); 432bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 433bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 434bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 435bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 436bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::clear(SkColor color) { 437acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 438bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned flags = 0; 439bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (color) { 440bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kClear_HasColor_DrawOpFlag; 441bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 442acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(sizeof(SkColor))) { 443acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kDrawClear_DrawOp, flags, 0); 444acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (color) { 445acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(color); 446acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 447bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 448bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 449bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 450bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPaint(const SkPaint& paint) { 451acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 45231891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 453acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes()) { 45431891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPaint_DrawOp); 455acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 456bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 457bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 458bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPoints(PointMode mode, size_t count, 459bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint pts[], const SkPaint& paint) { 460bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (count) { 461acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 46231891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 463acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + count * sizeof(SkPoint))) { 46431891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPoints_DrawOp, mode, 0); 465acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(count); 466acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(pts, count * sizeof(SkPoint)); 467acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 468bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 469bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 470bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 471bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawRect(const SkRect& rect, const SkPaint& paint) { 472acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 47331891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 474acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(sizeof(SkRect))) { 47531891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawRect_DrawOp); 476acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeRect(rect); 477acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 478bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 479bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 480bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPath(const SkPath& path, const SkPaint& paint) { 481acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 48231891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 483acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(estimateFlattenSize(path))) { 48431891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPath_DrawOp); 485acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com path.flatten(fWriter); 486acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 487bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 488bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 489bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawBitmap(const SkBitmap&, SkScalar left, SkScalar top, 490bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint*) { 491bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com UNIMPLEMENTED 492bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 493bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 494bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawBitmapRect(const SkBitmap&, const SkIRect* src, 495bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkRect& dst, const SkPaint*) { 496bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com UNIMPLEMENTED 497bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 498bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 499bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawBitmapMatrix(const SkBitmap&, const SkMatrix&, 500bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint*) { 501bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com UNIMPLEMENTED 502bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 503bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 504bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawSprite(const SkBitmap&, int left, int top, 505bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint*) { 506bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com UNIMPLEMENTED 507bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 508bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 509bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawText(const void* text, size_t byteLength, SkScalar x, 510bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkScalar y, const SkPaint& paint) { 511bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 512acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 51331891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 514acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(byteLength) + 2 * sizeof(SkScalar))) { 51531891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawText_DrawOp); 516acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(byteLength); 517acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 518acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(x); 519acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(y); 520acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 521bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 522bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 523bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 524bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPosText(const void* text, size_t byteLength, 525bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint pos[], const SkPaint& paint) { 526bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 527acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 52831891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 529bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com int count = paint.textToGlyphs(text, byteLength, NULL); 530acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(byteLength) + 4 + count * sizeof(SkPoint))) { 53131891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPosText_DrawOp); 532acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(byteLength); 533acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 534acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(count); 535acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(pos, count * sizeof(SkPoint)); 536acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 537bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 538bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 539bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 540bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPosTextH(const void* text, size_t byteLength, 541bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkScalar xpos[], SkScalar constY, 542bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint& paint) { 543bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 544acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 54531891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 546bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com int count = paint.textToGlyphs(text, byteLength, NULL); 547acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(byteLength) + 4 + count * sizeof(SkScalar) + 4)) { 54831891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPosTextH_DrawOp); 549acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(byteLength); 550acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 551acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(count); 552acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(xpos, count * sizeof(SkScalar)); 553acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(constY); 554acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 555bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 556bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 557bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 558bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawTextOnPath(const void* text, size_t byteLength, 559bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPath& path, const SkMatrix* matrix, 560bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint& paint) { 561bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 562acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 563bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned flags = 0; 564acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t size = 4 + SkAlign4(byteLength) + estimateFlattenSize(path); 565bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (matrix) { 566bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawTextOnPath_HasMatrix_DrawOpFlag; 567acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += matrix->flatten(NULL); 568bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 56931891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 570acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(size)) { 57131891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawTextOnPath_DrawOp, flags, 0); 572bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 573acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(byteLength); 574acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 575bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 576acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com path.flatten(fWriter); 577acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (matrix) { 578b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com SkWriteMatrix(&fWriter, *matrix); 579acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 580bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 581bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 582bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 583bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 584bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPicture(SkPicture& picture) { 5850faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com // we want to playback the picture into individual draw calls 5860faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com this->INHERITED::drawPicture(picture); 587bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 588bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 589bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawVertices(VertexMode mode, int vertexCount, 590bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint vertices[], const SkPoint texs[], 591bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkColor colors[], SkXfermode*, 592bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const uint16_t indices[], int indexCount, 593bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint& paint) { 594bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (0 == vertexCount) { 595bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return; 596bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 597bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 598acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 599acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t size = 4 + vertexCount * sizeof(SkPoint); 60031891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 601bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned flags = 0; 602bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (texs) { 603bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawVertices_HasTexs_DrawOpFlag; 604acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += vertexCount * sizeof(SkPoint); 605bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 606bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (colors) { 607bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawVertices_HasColors_DrawOpFlag; 608acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += vertexCount * sizeof(SkColor); 609bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 610bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (indices && indexCount > 0) { 611bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawVertices_HasIndices_DrawOpFlag; 612acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += 4 + SkAlign4(indexCount * sizeof(uint16_t)); 613bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 614bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 615acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(size)) { 61631891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawVertices_DrawOp, flags, 0); 617acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(mode); 618acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(vertexCount); 619acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(vertices, vertexCount * sizeof(SkPoint)); 620acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (texs) { 621acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(texs, vertexCount * sizeof(SkPoint)); 622acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 623acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (colors) { 624acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(colors, vertexCount * sizeof(SkColor)); 625acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 626bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 627acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com // TODO: flatten xfermode 628bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 629acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (indices && indexCount > 0) { 630acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(indexCount); 631acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(indices, indexCount * sizeof(uint16_t)); 632acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 633bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 634bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 635bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 636acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.comvoid SkGPipeCanvas::drawData(const void* ptr, size_t size) { 637acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (size && ptr) { 638acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 639bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned data = 0; 640bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (size < (1 << DRAWOPS_DATA_BITS)) { 641bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com data = (unsigned)size; 642bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 643acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(size))) { 644acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kDrawData_DrawOp, 0, data); 645acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (0 == data) { 646acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(size); 647acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 648bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com fWriter.writePad(ptr, size); 649bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 650bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 651bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 652bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 653bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 654bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 655bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comtemplate <typename T> uint32_t castToU32(T value) { 656bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com union { 657bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com T fSrc; 658bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com uint32_t fDst; 659bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } data; 660bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com data.fSrc = value; 661bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return data.fDst; 662bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 663bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 66431891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.comvoid SkGPipeCanvas::writePaint(const SkPaint& paint) { 66531891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com SkPaint& base = fPaint; 666bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com uint32_t storage[32]; 667bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com uint32_t* ptr = storage; 668bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 669bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getFlags() != paint.getFlags()) { 670bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kFlags_PaintOp, paint.getFlags()); 671f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setFlags(paint.getFlags()); 672bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 673bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getColor() != paint.getColor()) { 674bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kColor_PaintOp); 675bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = paint.getColor(); 676f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setColor(paint.getColor()); 677bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 678bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStyle() != paint.getStyle()) { 679bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kStyle_PaintOp, paint.getStyle()); 680f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStyle(paint.getStyle()); 681bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 682bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeJoin() != paint.getStrokeJoin()) { 683bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kJoin_PaintOp, paint.getStrokeJoin()); 684f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeJoin(paint.getStrokeJoin()); 685bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 686bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeCap() != paint.getStrokeCap()) { 687bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kCap_PaintOp, paint.getStrokeCap()); 688f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeCap(paint.getStrokeCap()); 689bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 690bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeWidth() != paint.getStrokeWidth()) { 691bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kWidth_PaintOp); 692bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getStrokeWidth()); 693f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeWidth(paint.getStrokeWidth()); 694bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 695bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeMiter() != paint.getStrokeMiter()) { 696bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kMiter_PaintOp); 697bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getStrokeMiter()); 698f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeMiter(paint.getStrokeMiter()); 699bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 700bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextEncoding() != paint.getTextEncoding()) { 701bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kEncoding_PaintOp, paint.getTextEncoding()); 702f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextEncoding(paint.getTextEncoding()); 703bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 704bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getHinting() != paint.getHinting()) { 705bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kHinting_PaintOp, paint.getHinting()); 706f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setHinting(paint.getHinting()); 707bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 708bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextAlign() != paint.getTextAlign()) { 709bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kAlign_PaintOp, paint.getTextAlign()); 710f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextAlign(paint.getTextAlign()); 711bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 712bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextSize() != paint.getTextSize()) { 713bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kTextSize_PaintOp); 714bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getTextSize()); 715f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextSize(paint.getTextSize()); 716bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 717bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextScaleX() != paint.getTextScaleX()) { 718bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kTextScaleX_PaintOp); 719bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getTextScaleX()); 720f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextScaleX(paint.getTextScaleX()); 721bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 722bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextSkewX() != paint.getTextSkewX()) { 723bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kTextSkewX_PaintOp); 724bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getTextSkewX()); 725f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextSkewX(paint.getTextSkewX()); 726f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 727f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 728f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (!SkTypeface::Equal(base.getTypeface(), paint.getTypeface())) { 729f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com uint32_t id = this->getTypefaceID(paint.getTypeface()); 730f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com *ptr++ = PaintOp_packOpData(kTypeface_PaintOp, id); 731f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTypeface(paint.getTypeface()); 732bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 733bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 734b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com for (int i = 0; i < kCount_PaintFlats; i++) { 735b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com int index = this->flattenToIndex(get_paintflat(paint, i), (PaintFlats)i); 736b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com SkASSERT(index >= 0 && index <= fFlatArray.count()); 737b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com if (index != fCurrFlatIndex[i]) { 738b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com *ptr++ = PaintOp_packOpFlagData(kFlatIndex_PaintOp, i, index); 739b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com fCurrFlatIndex[i] = index; 740b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 741b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 742b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 743acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t size = (char*)ptr - (char*)storage; 744acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (size && this->needOpBytes(size)) { 745b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com this->writeOp(kPaintOp_DrawOp, 0, size); 746b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com fWriter.write(storage, size); 747bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com for (size_t i = 0; i < size/4; i++) { 748b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com// SkDebugf("[%d] %08X\n", i, storage[i]); 749bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 750bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 751bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 752bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 753bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 754bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 755bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkGPipe.h" 756bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 757acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.comSkGPipeWriter::SkGPipeWriter() : fWriter(0) { 758bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas = NULL; 759bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 760bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 761bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comSkGPipeWriter::~SkGPipeWriter() { 762acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->endRecording(); 763bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkSafeUnref(fCanvas); 764bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 765bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 766dde0956375e87027df2fdd80d430dd819c217aacreed@google.comSkCanvas* SkGPipeWriter::startRecording(SkGPipeController* controller, 767dde0956375e87027df2fdd80d430dd819c217aacreed@google.com uint32_t flags) { 768bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (NULL == fCanvas) { 769acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.reset(NULL, 0); 770dde0956375e87027df2fdd80d430dd819c217aacreed@google.com fFactorySet.reset(); 771dde0956375e87027df2fdd80d430dd819c217aacreed@google.com fCanvas = SkNEW_ARGS(SkGPipeCanvas, (controller, &fWriter, 772dde0956375e87027df2fdd80d430dd819c217aacreed@google.com (flags & kCrossProcess_Flag) ? 773dde0956375e87027df2fdd80d430dd819c217aacreed@google.com &fFactorySet : NULL)); 774bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 775bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return fCanvas; 776bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 777bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 778bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeWriter::endRecording() { 779bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (fCanvas) { 780bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas->finish(); 781bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas->unref(); 782bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas = NULL; 783bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 784bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 785bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 786