SkGPipeWrite.cpp revision 5af9b2032b552516c9223d9fb22185b022b13c62
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" 1575a0972dd7d0dbc614b9fb81b4450a349c005325reed@google.com#include "SkPathEffect.h" 16acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com#include "SkGPipe.h" 17bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkGPipePriv.h" 1816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com#include "SkImageFilter.h" 19f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com#include "SkStream.h" 20b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com#include "SkTSearch.h" 21f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com#include "SkTypeface.h" 22bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkWriter32.h" 23b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com#include "SkColorFilter.h" 240faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com#include "SkDrawLooper.h" 25b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com#include "SkMaskFilter.h" 26b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com#include "SkRasterizer.h" 27b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com#include "SkShader.h" 282b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com#include "SkOrderedWriteBuffer.h" 29b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 30b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.comstatic SkFlattenable* get_paintflat(const SkPaint& paint, unsigned paintFlat) { 31b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com SkASSERT(paintFlat < kCount_PaintFlats); 32b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com switch (paintFlat) { 33b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kColorFilter_PaintFlat: return paint.getColorFilter(); 340faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com case kDrawLooper_PaintFlat: return paint.getLooper(); 35b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kMaskFilter_PaintFlat: return paint.getMaskFilter(); 36b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kPathEffect_PaintFlat: return paint.getPathEffect(); 37b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kRasterizer_PaintFlat: return paint.getRasterizer(); 38b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kShader_PaintFlat: return paint.getShader(); 3916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com case kImageFilter_PaintFlat: return paint.getImageFilter(); 40b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kXfermode_PaintFlat: return paint.getXfermode(); 41b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 420c00f21fee3f5cfa3aa7e5d46ff94cb8cf340451tomhudson@google.com SkDEBUGFAIL("never gets here"); 43b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com return NULL; 44b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com} 45bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 46acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.comstatic size_t estimateFlattenSize(const SkPath& path) { 47acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com int n = path.countPoints(); 48acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t bytes = 3 * sizeof(int32_t); 49acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com bytes += n * sizeof(SkPoint); 50acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com bytes += SkAlign4(n + 2); // verbs: add 2 for move/close extras 51acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 52acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com#ifdef SK_DEBUG 53acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com { 54acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com SkWriter32 writer(1024); 55acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com path.flatten(writer); 56acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com SkASSERT(writer.size() <= bytes); 57acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 58acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com#endif 59acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return bytes; 60acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com} 61acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 62f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.comstatic size_t writeTypeface(SkWriter32* writer, SkTypeface* typeface) { 63f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com SkASSERT(typeface); 64f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com SkDynamicMemoryWStream stream; 65f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com typeface->serialize(&stream); 66f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com size_t size = stream.getOffset(); 67f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (writer) { 68f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com writer->write32(size); 698a85d0c4938173476d037d7af0ee3b9436a1234ereed@google.com SkAutoDataUnref data(stream.copyToData()); 705af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com writer->writePad(data.data(), size); 71f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 725af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com return 4 + SkAlign4(size); 73f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com} 74f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 75bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 76bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 77bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comclass SkGPipeCanvas : public SkCanvas { 78bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.compublic: 79dde0956375e87027df2fdd80d430dd819c217aacreed@google.com SkGPipeCanvas(SkGPipeController*, SkWriter32*, SkFactorySet*); 80bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual ~SkGPipeCanvas(); 81bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 82bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com void finish() { 83bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (!fDone) { 84dbccc88f84e5330ce6e52512fcefd375ee2eda49reed@google.com if (this->needOpBytes()) { 85dbccc88f84e5330ce6e52512fcefd375ee2eda49reed@google.com this->writeOp(kDone_DrawOp); 86dbccc88f84e5330ce6e52512fcefd375ee2eda49reed@google.com this->doNotify(); 87dbccc88f84e5330ce6e52512fcefd375ee2eda49reed@google.com } 88bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fDone = true; 89bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 90bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 91bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 92bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com // overrides from SkCanvas 933b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual int save(SaveFlags) SK_OVERRIDE; 943b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual int saveLayer(const SkRect* bounds, const SkPaint*, 953b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com SaveFlags) SK_OVERRIDE; 963b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void restore() SK_OVERRIDE; 973b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE; 983b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE; 993b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual bool rotate(SkScalar degrees) SK_OVERRIDE; 1003b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual bool skew(SkScalar sx, SkScalar sy) SK_OVERRIDE; 1013b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual bool concat(const SkMatrix& matrix) SK_OVERRIDE; 1023b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void setMatrix(const SkMatrix& matrix) SK_OVERRIDE; 1033b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual bool clipRect(const SkRect& rect, SkRegion::Op op, 1043b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com bool doAntiAlias = false) SK_OVERRIDE; 1053b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual bool clipPath(const SkPath& path, SkRegion::Op op, 1063b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com bool doAntiAlias = false) SK_OVERRIDE; 1073b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual bool clipRegion(const SkRegion& region, SkRegion::Op op) SK_OVERRIDE; 1083b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void clear(SkColor) SK_OVERRIDE; 1093b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE; 110bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawPoints(PointMode, size_t count, const SkPoint pts[], 1113b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint&) SK_OVERRIDE; 1123b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void drawRect(const SkRect& rect, const SkPaint&) SK_OVERRIDE; 1133b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void drawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE; 114bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top, 1153b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint*) SK_OVERRIDE; 116bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawBitmapRect(const SkBitmap&, const SkIRect* src, 1173b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkRect& dst, const SkPaint*) SK_OVERRIDE; 118bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawBitmapMatrix(const SkBitmap&, const SkMatrix&, 1193b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint*) SK_OVERRIDE; 1205a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com virtual void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, 1215a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com const SkRect& dst, const SkPaint* paint = NULL) SK_OVERRIDE; 122bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawSprite(const SkBitmap&, int left, int top, 1233b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint*) SK_OVERRIDE; 12474b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org virtual void drawText(const void* text, size_t byteLength, SkScalar x, 1253b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com SkScalar y, const SkPaint&) SK_OVERRIDE; 12674b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org virtual void drawPosText(const void* text, size_t byteLength, 1273b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPoint pos[], const SkPaint&) SK_OVERRIDE; 128bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawPosTextH(const void* text, size_t byteLength, 1293b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkScalar xpos[], SkScalar constY, 1303b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint&) SK_OVERRIDE; 13174b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org virtual void drawTextOnPath(const void* text, size_t byteLength, 13274b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org const SkPath& path, const SkMatrix* matrix, 1333b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint&) SK_OVERRIDE; 1343b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void drawPicture(SkPicture& picture) SK_OVERRIDE; 135bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawVertices(VertexMode, int vertexCount, 136bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint vertices[], const SkPoint texs[], 137bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkColor colors[], SkXfermode*, 138bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const uint16_t indices[], int indexCount, 1393b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint&) SK_OVERRIDE; 1403b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void drawData(const void*, size_t) SK_OVERRIDE; 141bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 142bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comprivate: 143dde0956375e87027df2fdd80d430dd819c217aacreed@google.com SkFactorySet* fFactorySet; // optional, only used if cross-process 144acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com SkGPipeController* fController; 145bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkWriter32& fWriter; 146acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t fBlockSize; // amount allocated for writer 147acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t fBytesNotified; 148bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com bool fDone; 149bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 150f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com SkRefCntSet fTypefaceSet; 151f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 152f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com uint32_t getTypefaceID(SkTypeface*); 153f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 154acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com inline void writeOp(DrawOps op, unsigned flags, unsigned data) { 155bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fWriter.write32(DrawOp_packOpFlagData(op, flags, data)); 156bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 15774b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 158acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com inline void writeOp(DrawOps op) { 159bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fWriter.write32(DrawOp_packOpFlagData(op, 0, 0)); 160bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 161acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 162acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com bool needOpBytes(size_t size = 0); 163acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 164acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com inline void doNotify() { 165acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (!fDone) { 166acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t bytes = fWriter.size() - fBytesNotified; 16716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com if (bytes > 0) { 16816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fController->notifyWritten(bytes); 16916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fBytesNotified += bytes; 17016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 171acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 172acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 173b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 174b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com struct FlatData { 175b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com uint32_t fIndex; // always > 0 176b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com uint32_t fSize; 177b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 178b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com void* data() { return (char*)this + sizeof(*this); } 17974b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 180b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com static int Compare(const FlatData* a, const FlatData* b) { 181b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com return memcmp(&a->fSize, &b->fSize, a->fSize + sizeof(a->fSize)); 182b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 183b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com }; 18416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 18516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com SkTDArray<FlatData*> fBitmapArray; 18616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com int flattenToIndex(const SkBitmap&); 18716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 188b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com SkTDArray<FlatData*> fFlatArray; 189b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com int fCurrFlatIndex[kCount_PaintFlats]; 190b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com int flattenToIndex(SkFlattenable* obj, PaintFlats); 191b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 19231891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com SkPaint fPaint; 19331891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com void writePaint(const SkPaint&); 194bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 195acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com class AutoPipeNotify { 196acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com public: 197acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com AutoPipeNotify(SkGPipeCanvas* canvas) : fCanvas(canvas) {} 198acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com ~AutoPipeNotify() { fCanvas->doNotify(); } 199acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com private: 200acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com SkGPipeCanvas* fCanvas; 201acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com }; 202acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com friend class AutoPipeNotify; 203acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 204bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com typedef SkCanvas INHERITED; 205bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}; 206bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 20716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.comint SkGPipeCanvas::flattenToIndex(const SkBitmap & bitmap) { 20816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com SkOrderedWriteBuffer tmpWriter(1024); 20916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com // FIXME: Rather than forcing CrossProcess, we should create an SkRefCntSet 21016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com // so that we can store a pointer to a bitmap's pixels during flattening. 21116d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com tmpWriter.setFlags(SkFlattenableWriteBuffer::kCrossProcess_Flag); 21216d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com bitmap.flatten(tmpWriter); 21316d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 21416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com size_t len = tmpWriter.size(); 21516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com size_t allocSize = len + sizeof(FlatData); 21616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 21716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com SkAutoSMalloc<1024> storage(allocSize); 21816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com FlatData* flat = (FlatData*)storage.get(); 21916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com flat->fSize = len; 22016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com tmpWriter.flatten(flat->data()); 22116d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 22216d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com int index = SkTSearch<FlatData>((const FlatData**)fBitmapArray.begin(), 22316d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fBitmapArray.count(), flat, sizeof(flat), 22416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com &FlatData::Compare); 22516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com if (index < 0) { 22616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com index = ~index; 22716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com FlatData* copy = (FlatData*)sk_malloc_throw(allocSize); 22816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com memcpy(copy, flat, allocSize); 22916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com // For bitmaps, we can use zero based indices, since we will never ask 23016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com // for a NULL bitmap (unlike with paint flattenables). 23116d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com copy->fIndex = fBitmapArray.count(); 23216d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com *fBitmapArray.insert(index) = copy; 23316d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com if (this->needOpBytes(len + sizeof(uint32_t))) { 23416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com this->writeOp(kDef_Bitmap_DrawOp, 0, copy->fIndex); 23516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(len); 23616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write(copy->data(), len); 23716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 23816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 23916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com return fBitmapArray[index]->fIndex; 24016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com} 24116d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 242b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com// return 0 for NULL (or unflattenable obj), or index-base-1 243b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.comint SkGPipeCanvas::flattenToIndex(SkFlattenable* obj, PaintFlats paintflat) { 244b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com if (NULL == obj) { 245b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com return 0; 246b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 247b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 2482b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com SkOrderedWriteBuffer tmpWriter(1024); 2495a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com 2505a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com // Needs to be cross process so a bitmap shader will be preserved 2515a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com // FIXME: Rather than forcing CrossProcess, we should create an SkRefCntSet 2525a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com // so that we can store a pointer to a bitmap's pixels during flattening. 2535a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com tmpWriter.setFlags((SkFlattenableWriteBuffer::Flags) 2545a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com (SkFlattenableWriteBuffer::kInlineFactoryNames_Flag 2555a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com | SkFlattenableWriteBuffer::kCrossProcess_Flag)); 256dde0956375e87027df2fdd80d430dd819c217aacreed@google.com tmpWriter.setFactoryRecorder(fFactorySet); 257dde0956375e87027df2fdd80d430dd819c217aacreed@google.com 258b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com tmpWriter.writeFlattenable(obj); 259b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com size_t len = tmpWriter.size(); 260b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com size_t allocSize = len + sizeof(FlatData); 261b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 262b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com SkAutoSMalloc<1024> storage(allocSize); 263b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com FlatData* flat = (FlatData*)storage.get(); 264b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com flat->fSize = len; 265b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com tmpWriter.flatten(flat->data()); 266b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 267b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com int index = SkTSearch<FlatData>((const FlatData**)fFlatArray.begin(), 268b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com fFlatArray.count(), flat, sizeof(flat), 269b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com &FlatData::Compare); 270b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com if (index < 0) { 271b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com index = ~index; 272b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com FlatData* copy = (FlatData*)sk_malloc_throw(allocSize); 273b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com memcpy(copy, flat, allocSize); 274b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com *fFlatArray.insert(index) = copy; 275b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com // call this after the insert, so that count() will have been grown 276b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com copy->fIndex = fFlatArray.count(); 277b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com// SkDebugf("--- add flattenable[%d] size=%d index=%d\n", paintflat, len, copy->fIndex); 278b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 279b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com if (this->needOpBytes(len)) { 2800faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com this->writeOp(kDef_Flattenable_DrawOp, paintflat, copy->fIndex); 281b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com fWriter.write(copy->data(), len); 282b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 283b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 284b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com return fFlatArray[index]->fIndex; 285b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com} 286b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 287bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 288bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 289acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com#define MIN_BLOCK_SIZE (16 * 1024) 290bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 291acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.comSkGPipeCanvas::SkGPipeCanvas(SkGPipeController* controller, 292dde0956375e87027df2fdd80d430dd819c217aacreed@google.com SkWriter32* writer, SkFactorySet* fset) 29367908f2faee17a8bce4d074980617cc0d15fabf1reed@google.com : fWriter(*writer) { 29467908f2faee17a8bce4d074980617cc0d15fabf1reed@google.com fFactorySet = fset; 295acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fController = controller; 296bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fDone = false; 297acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fBlockSize = 0; // need first block from controller 2985a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com fBytesNotified = 0; 299b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com sk_bzero(fCurrFlatIndex, sizeof(fCurrFlatIndex)); 300acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 301bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com // we need a device to limit our clip 302bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com // should the caller give us the bounds? 30306b4da16fd6ed63560d79116c6066534e953a43dyangsu@google.com // We don't allocate pixels for the bitmap 304bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com SkBitmap bitmap; 305bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com bitmap.setConfig(SkBitmap::kARGB_8888_Config, 32767, 32767); 30606b4da16fd6ed63560d79116c6066534e953a43dyangsu@google.com SkDevice* device = SkNEW_ARGS(SkDevice, (bitmap)); 307bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com this->setDevice(device)->unref(); 308bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 309bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 310bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comSkGPipeCanvas::~SkGPipeCanvas() { 311bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com this->finish(); 312bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 313b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com fFlatArray.freeAll(); 31416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fBitmapArray.freeAll(); 315bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 316bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 317acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.combool SkGPipeCanvas::needOpBytes(size_t needed) { 318acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (fDone) { 319acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return false; 320acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 321acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 322acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com needed += 4; // size of DrawOp atom 323acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (fWriter.size() + needed > fBlockSize) { 3245a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com // Before we wipe out any data that has already been written, read it 3255a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com // out. 3265a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com this->doNotify(); 3275a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com size_t blockSize = SkMax32(MIN_BLOCK_SIZE, needed); 3285a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com void* block = fController->requestBlock(blockSize, &fBlockSize); 329acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (NULL == block) { 330acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fDone = true; 331acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return false; 332acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 333acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.reset(block, fBlockSize); 334acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fBytesNotified = 0; 335acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 336acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return true; 337acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com} 338acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 339f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.comuint32_t SkGPipeCanvas::getTypefaceID(SkTypeface* face) { 340f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com uint32_t id = 0; // 0 means default/null typeface 341f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (face) { 342f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com id = fTypefaceSet.find(face); 343f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (0 == id) { 344f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com id = fTypefaceSet.add(face); 345f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com size_t size = writeTypeface(NULL, face); 346f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (this->needOpBytes(size)) { 347bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com this->writeOp(kDef_Typeface_DrawOp); 348f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com writeTypeface(&fWriter, face); 349f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 350f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 351f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 352f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com return id; 353f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com} 354f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 355bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 356bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 357acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com#define NOTIFY_SETUP(canvas) \ 358acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com AutoPipeNotify apn(canvas) 359acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 360bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comint SkGPipeCanvas::save(SaveFlags flags) { 361acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 362acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes()) { 363acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSave_DrawOp, 0, flags); 364acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 365bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::save(flags); 366bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 367bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 368bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comint SkGPipeCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint, 369bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SaveFlags saveFlags) { 370acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 371acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t size = 0; 372bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned opFlags = 0; 37374b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 374bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (bounds) { 375bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com opFlags |= kSaveLayer_HasBounds_DrawOpFlag; 376acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += sizeof(SkRect); 377bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 378bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (paint) { 379bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com opFlags |= kSaveLayer_HasPaint_DrawOpFlag; 38031891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(*paint); 381bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 382bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 383acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(size)) { 384acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSaveLayer_DrawOp, opFlags, saveFlags); 385acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (bounds) { 386acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeRect(*bounds); 387acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 388bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 38974b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 390bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com // we just pass on the save, so we don't create a layer 391bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::save(saveFlags); 392bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 393bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 394bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::restore() { 395acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 396acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes()) { 397acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kRestore_DrawOp); 398acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 399bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com this->INHERITED::restore(); 400bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 401bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 402bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::translate(SkScalar dx, SkScalar dy) { 403bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (dx || dy) { 404acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 405acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(2 * sizeof(SkScalar))) { 406acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kTranslate_DrawOp); 407acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(dx); 408acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(dy); 409acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 410bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 411bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::translate(dx, dy); 412bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 413bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 414bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::scale(SkScalar sx, SkScalar sy) { 415bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (sx || sy) { 416acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 417acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(2 * sizeof(SkScalar))) { 418acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kScale_DrawOp); 419acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(sx); 420acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(sy); 421acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 422bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 423bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::scale(sx, sy); 424bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 425bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 426bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::rotate(SkScalar degrees) { 427bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (degrees) { 428acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 429acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(sizeof(SkScalar))) { 430acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kRotate_DrawOp); 431acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(degrees); 432acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 433bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 434bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::rotate(degrees); 435bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 436bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 437bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::skew(SkScalar sx, SkScalar sy) { 438bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (sx || sy) { 439acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 440acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(2 * sizeof(SkScalar))) { 441acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSkew_DrawOp); 442acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(sx); 443acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(sy); 444acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 445bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 446bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::skew(sx, sy); 447bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 448bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 449bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::concat(const SkMatrix& matrix) { 450bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (!matrix.isIdentity()) { 451acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 452acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(matrix.flatten(NULL))) { 453acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kConcat_DrawOp); 4542b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com fWriter.writeMatrix(matrix); 455acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 456bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 457bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::concat(matrix); 458bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 459bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 460bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::setMatrix(const SkMatrix& matrix) { 461acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 462acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(matrix.flatten(NULL))) { 463acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSetMatrix_DrawOp); 4642b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com fWriter.writeMatrix(matrix); 465acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 466bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com this->INHERITED::setMatrix(matrix); 467bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 468bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 4693b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.combool SkGPipeCanvas::clipRect(const SkRect& rect, SkRegion::Op rgnOp, 4703b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com bool doAntiAlias) { 471acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 4723b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com if (this->needOpBytes(sizeof(SkRect)) + sizeof(bool)) { 473acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kClipRect_DrawOp, 0, rgnOp); 474acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeRect(rect); 4753b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com fWriter.writeBool(doAntiAlias); 476acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 4773b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com return this->INHERITED::clipRect(rect, rgnOp, doAntiAlias); 478bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 479bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 4803b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.combool SkGPipeCanvas::clipPath(const SkPath& path, SkRegion::Op rgnOp, 4813b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com bool doAntiAlias) { 482acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 4833b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com if (this->needOpBytes(estimateFlattenSize(path)) + sizeof(bool)) { 484acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kClipPath_DrawOp, 0, rgnOp); 485acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com path.flatten(fWriter); 4863b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com fWriter.writeBool(doAntiAlias); 487acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 488bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com // we just pass on the bounds of the path 4893b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com return this->INHERITED::clipRect(path.getBounds(), rgnOp, doAntiAlias); 490bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 491bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 492bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::clipRegion(const SkRegion& region, SkRegion::Op rgnOp) { 493acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 494acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(region.flatten(NULL))) { 495acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kClipRegion_DrawOp, 0, rgnOp); 4962b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com fWriter.writeRegion(region); 497acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 498bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::clipRegion(region, rgnOp); 499bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 500bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 501bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 502bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 503bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::clear(SkColor color) { 504acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 505bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned flags = 0; 506bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (color) { 507bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kClear_HasColor_DrawOpFlag; 508bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 509acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(sizeof(SkColor))) { 510acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kDrawClear_DrawOp, flags, 0); 511acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (color) { 512acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(color); 513acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 514bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 515bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 516bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 517bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPaint(const SkPaint& paint) { 518acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 51931891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 520acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes()) { 52131891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPaint_DrawOp); 522acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 523bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 524bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 525bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPoints(PointMode mode, size_t count, 526bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint pts[], const SkPaint& paint) { 527bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (count) { 528acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 52931891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 530acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + count * sizeof(SkPoint))) { 53131891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPoints_DrawOp, mode, 0); 532acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(count); 533acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(pts, count * sizeof(SkPoint)); 534acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 535bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 536bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 537bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 538bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawRect(const SkRect& rect, const SkPaint& paint) { 539acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 54031891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 541acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(sizeof(SkRect))) { 54231891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawRect_DrawOp); 543acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeRect(rect); 544acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 545bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 546bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 547bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPath(const SkPath& path, const SkPaint& paint) { 548acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 54931891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 550acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(estimateFlattenSize(path))) { 55131891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPath_DrawOp); 552acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com path.flatten(fWriter); 553acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 554bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 555bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 5565a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.comvoid SkGPipeCanvas::drawBitmap(const SkBitmap& bm, SkScalar left, SkScalar top, 5575a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com const SkPaint* paint) { 5585a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com // This is the brute-force solution 5595a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com // TODO: add the notion of a shared, counted for large immutable resources 5605a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com NOTIFY_SETUP(this); 5615a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com if (paint) { 5625a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com this->writePaint(*paint); 5635a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com } 56416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 56516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com int bitmapIndex = this->flattenToIndex(bm); 5665a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com 56716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com if (this->needOpBytes(sizeof(SkScalar) * 2 + sizeof(bool))) { 56816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com this->writeOp(kDrawBitmap_DrawOp, 0, bitmapIndex); 5695a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com fWriter.writeBool(paint != NULL); 5705a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com fWriter.writeScalar(left); 5715a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com fWriter.writeScalar(top); 5725a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com } 573bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 574bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 57516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.comvoid SkGPipeCanvas::drawBitmapRect(const SkBitmap& bm, const SkIRect* src, 57616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com const SkRect& dst, const SkPaint* paint) { 57716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com NOTIFY_SETUP(this); 57816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com if (paint) { 57916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com this->writePaint(*paint); 58016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 58116d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 58216d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com int bitmapIndex = this->flattenToIndex(bm); 58316d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 58416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com size_t opBytesNeeded = sizeof(SkRect) + sizeof(bool) * 2; 58516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com bool hasSrc = src != NULL; 58616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com if (hasSrc) { 58716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com opBytesNeeded += sizeof(int32_t) * 4; 58816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 58916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com if (this->needOpBytes(opBytesNeeded)) { 59016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com this->writeOp(kDrawBitmapRect_DrawOp, 0, bitmapIndex); 59116d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.writeBool(paint != NULL); 59216d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.writeBool(hasSrc); 59316d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com if (hasSrc) { 59416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(src->fLeft); 59516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(src->fTop); 59616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(src->fRight); 59716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(src->fBottom); 59816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 59916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.writeRect(dst); 60016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 601bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 602bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 603bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawBitmapMatrix(const SkBitmap&, const SkMatrix&, 604bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint*) { 605bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com UNIMPLEMENTED 606bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 60716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 60816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.comvoid SkGPipeCanvas::drawBitmapNine(const SkBitmap& bm, const SkIRect& center, 6095a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com const SkRect& dst, const SkPaint* paint) { 61016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com NOTIFY_SETUP(this); 61116d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com if (paint) { 61216d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com this->writePaint(*paint); 61316d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 61416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com int bitmapIndex = this->flattenToIndex(bm); 61516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 61616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com if (this->needOpBytes(sizeof(int32_t) * 4 + sizeof(bool) 61716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com + sizeof(SkRect))) { 61816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com this->writeOp(kDrawBitmapNine_DrawOp, 0, bitmapIndex); 61916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.writeBool(paint != NULL); 62016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(center.fLeft); 62116d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(center.fTop); 62216d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(center.fRight); 62316d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(center.fBottom); 62416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.writeRect(dst); 62516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 6265a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com} 62716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 62816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.comvoid SkGPipeCanvas::drawSprite(const SkBitmap& bm, int left, int top, 62916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com const SkPaint* paint) { 63016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com NOTIFY_SETUP(this); 63116d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com if (paint) { 63216d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com this->writePaint(*paint); 63316d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 63416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com int bitmapIndex = this->flattenToIndex(bm); 63516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 63616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com if (this->needOpBytes(sizeof(int32_t) * 2 + sizeof(bool))) { 63716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com this->writeOp(kDrawSprite_DrawOp, 0, bitmapIndex); 63816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.writeBool(paint != NULL); 63916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(left); 64016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(top); 64116d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 642bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 643bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 64474b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.orgvoid SkGPipeCanvas::drawText(const void* text, size_t byteLength, SkScalar x, 645bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkScalar y, const SkPaint& paint) { 646bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 647acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 64831891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 649acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(byteLength) + 2 * sizeof(SkScalar))) { 65031891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawText_DrawOp); 651acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(byteLength); 652acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 653acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(x); 654acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(y); 655acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 656bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 657bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 658bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 65974b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.orgvoid SkGPipeCanvas::drawPosText(const void* text, size_t byteLength, 660bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint pos[], const SkPaint& paint) { 661bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 662acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 66331891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 664bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com int count = paint.textToGlyphs(text, byteLength, NULL); 665acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(byteLength) + 4 + count * sizeof(SkPoint))) { 66631891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPosText_DrawOp); 667acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(byteLength); 668acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 669acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(count); 670acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(pos, count * sizeof(SkPoint)); 671acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 672bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 673bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 674bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 675bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPosTextH(const void* text, size_t byteLength, 676bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkScalar xpos[], SkScalar constY, 677bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint& paint) { 678bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 679acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 68031891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 681bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com int count = paint.textToGlyphs(text, byteLength, NULL); 682acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(byteLength) + 4 + count * sizeof(SkScalar) + 4)) { 68331891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPosTextH_DrawOp); 684acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(byteLength); 685acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 686acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(count); 687acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(xpos, count * sizeof(SkScalar)); 688acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(constY); 689acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 690bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 691bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 692bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 69374b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.orgvoid SkGPipeCanvas::drawTextOnPath(const void* text, size_t byteLength, 69474b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org const SkPath& path, const SkMatrix* matrix, 695bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint& paint) { 696bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 697acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 698bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned flags = 0; 699acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t size = 4 + SkAlign4(byteLength) + estimateFlattenSize(path); 700bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (matrix) { 701bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawTextOnPath_HasMatrix_DrawOpFlag; 702acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += matrix->flatten(NULL); 703bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 70431891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 705acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(size)) { 70631891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawTextOnPath_DrawOp, flags, 0); 707bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 708acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(byteLength); 709acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 710bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 711acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com path.flatten(fWriter); 712acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (matrix) { 7132b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com fWriter.writeMatrix(*matrix); 714acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 715bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 716bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 717bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 718bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 719bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPicture(SkPicture& picture) { 7200faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com // we want to playback the picture into individual draw calls 7210faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com this->INHERITED::drawPicture(picture); 722bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 723bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 724bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawVertices(VertexMode mode, int vertexCount, 725bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint vertices[], const SkPoint texs[], 726bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkColor colors[], SkXfermode*, 727bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const uint16_t indices[], int indexCount, 728bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint& paint) { 729bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (0 == vertexCount) { 730bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return; 731bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 732bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 733acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 734acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t size = 4 + vertexCount * sizeof(SkPoint); 73531891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 736bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned flags = 0; 737bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (texs) { 738bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawVertices_HasTexs_DrawOpFlag; 739acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += vertexCount * sizeof(SkPoint); 740bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 741bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (colors) { 742bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawVertices_HasColors_DrawOpFlag; 743acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += vertexCount * sizeof(SkColor); 744bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 745bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (indices && indexCount > 0) { 746bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawVertices_HasIndices_DrawOpFlag; 747acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += 4 + SkAlign4(indexCount * sizeof(uint16_t)); 748bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 74974b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 750acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(size)) { 75131891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawVertices_DrawOp, flags, 0); 752acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(mode); 753acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(vertexCount); 754acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(vertices, vertexCount * sizeof(SkPoint)); 755acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (texs) { 756acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(texs, vertexCount * sizeof(SkPoint)); 757acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 758acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (colors) { 759acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(colors, vertexCount * sizeof(SkColor)); 760acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 761bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 762acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com // TODO: flatten xfermode 763bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 764acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (indices && indexCount > 0) { 765acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(indexCount); 766acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(indices, indexCount * sizeof(uint16_t)); 767acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 768bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 769bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 770bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 771acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.comvoid SkGPipeCanvas::drawData(const void* ptr, size_t size) { 772acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (size && ptr) { 773acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 774bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned data = 0; 775bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (size < (1 << DRAWOPS_DATA_BITS)) { 776bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com data = (unsigned)size; 777bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 778acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(size))) { 779acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kDrawData_DrawOp, 0, data); 780acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (0 == data) { 781acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(size); 782acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 783bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com fWriter.writePad(ptr, size); 784bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 785bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 786bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 787bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 788bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 789bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 790bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comtemplate <typename T> uint32_t castToU32(T value) { 791bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com union { 792bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com T fSrc; 793bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com uint32_t fDst; 794bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } data; 795bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com data.fSrc = value; 796bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return data.fDst; 797bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 798bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 79931891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.comvoid SkGPipeCanvas::writePaint(const SkPaint& paint) { 80031891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com SkPaint& base = fPaint; 801bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com uint32_t storage[32]; 802bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com uint32_t* ptr = storage; 803bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 804bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getFlags() != paint.getFlags()) { 805bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kFlags_PaintOp, paint.getFlags()); 806f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setFlags(paint.getFlags()); 807bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 808bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getColor() != paint.getColor()) { 809bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kColor_PaintOp); 810bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = paint.getColor(); 811f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setColor(paint.getColor()); 812bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 813bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStyle() != paint.getStyle()) { 814bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kStyle_PaintOp, paint.getStyle()); 815f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStyle(paint.getStyle()); 816bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 817bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeJoin() != paint.getStrokeJoin()) { 818bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kJoin_PaintOp, paint.getStrokeJoin()); 819f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeJoin(paint.getStrokeJoin()); 820bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 821bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeCap() != paint.getStrokeCap()) { 822bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kCap_PaintOp, paint.getStrokeCap()); 823f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeCap(paint.getStrokeCap()); 824bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 825bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeWidth() != paint.getStrokeWidth()) { 826bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kWidth_PaintOp); 827bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getStrokeWidth()); 828f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeWidth(paint.getStrokeWidth()); 829bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 830bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeMiter() != paint.getStrokeMiter()) { 831bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kMiter_PaintOp); 832bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getStrokeMiter()); 833f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeMiter(paint.getStrokeMiter()); 834bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 835bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextEncoding() != paint.getTextEncoding()) { 836bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kEncoding_PaintOp, paint.getTextEncoding()); 837f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextEncoding(paint.getTextEncoding()); 838bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 839bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getHinting() != paint.getHinting()) { 840bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kHinting_PaintOp, paint.getHinting()); 841f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setHinting(paint.getHinting()); 842bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 843bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextAlign() != paint.getTextAlign()) { 844bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kAlign_PaintOp, paint.getTextAlign()); 845f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextAlign(paint.getTextAlign()); 846bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 847bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextSize() != paint.getTextSize()) { 848bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kTextSize_PaintOp); 849bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getTextSize()); 850f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextSize(paint.getTextSize()); 851bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 852bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextScaleX() != paint.getTextScaleX()) { 853bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kTextScaleX_PaintOp); 854bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getTextScaleX()); 855f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextScaleX(paint.getTextScaleX()); 856bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 857bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextSkewX() != paint.getTextSkewX()) { 858bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kTextSkewX_PaintOp); 859bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getTextSkewX()); 860f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextSkewX(paint.getTextSkewX()); 861f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 862f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 863f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (!SkTypeface::Equal(base.getTypeface(), paint.getTypeface())) { 864f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com uint32_t id = this->getTypefaceID(paint.getTypeface()); 865f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com *ptr++ = PaintOp_packOpData(kTypeface_PaintOp, id); 866f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTypeface(paint.getTypeface()); 867bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 868bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 869b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com for (int i = 0; i < kCount_PaintFlats; i++) { 870b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com int index = this->flattenToIndex(get_paintflat(paint, i), (PaintFlats)i); 871b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com SkASSERT(index >= 0 && index <= fFlatArray.count()); 872b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com if (index != fCurrFlatIndex[i]) { 873b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com *ptr++ = PaintOp_packOpFlagData(kFlatIndex_PaintOp, i, index); 874b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com fCurrFlatIndex[i] = index; 875b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 876b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 877b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 878acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t size = (char*)ptr - (char*)storage; 879acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (size && this->needOpBytes(size)) { 880b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com this->writeOp(kPaintOp_DrawOp, 0, size); 881b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com fWriter.write(storage, size); 882bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com for (size_t i = 0; i < size/4; i++) { 883b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com// SkDebugf("[%d] %08X\n", i, storage[i]); 884bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 885bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 886bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 887bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 888bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 889bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 890bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkGPipe.h" 891bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 892acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.comSkGPipeWriter::SkGPipeWriter() : fWriter(0) { 893bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas = NULL; 894bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 895bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 896bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comSkGPipeWriter::~SkGPipeWriter() { 897acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->endRecording(); 898bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkSafeUnref(fCanvas); 899bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 900bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 901dde0956375e87027df2fdd80d430dd819c217aacreed@google.comSkCanvas* SkGPipeWriter::startRecording(SkGPipeController* controller, 902dde0956375e87027df2fdd80d430dd819c217aacreed@google.com uint32_t flags) { 903bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (NULL == fCanvas) { 904acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.reset(NULL, 0); 905dde0956375e87027df2fdd80d430dd819c217aacreed@google.com fFactorySet.reset(); 906dde0956375e87027df2fdd80d430dd819c217aacreed@google.com fCanvas = SkNEW_ARGS(SkGPipeCanvas, (controller, &fWriter, 907dde0956375e87027df2fdd80d430dd819c217aacreed@google.com (flags & kCrossProcess_Flag) ? 908dde0956375e87027df2fdd80d430dd819c217aacreed@google.com &fFactorySet : NULL)); 909bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 910bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return fCanvas; 911bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 912bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 913bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeWriter::endRecording() { 914bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (fCanvas) { 915bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas->finish(); 916bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas->unref(); 917bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas = NULL; 918bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 919bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 920bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 921