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