SkGPipeWrite.cpp revision acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2
1bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/* 2bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com Copyright 2011 Google Inc. 3bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 4bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com Licensed under the Apache License, Version 2.0 (the "License"); 5bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com you may not use this file except in compliance with the License. 6bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com You may obtain a copy of the License at 7bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 8bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com http://www.apache.org/licenses/LICENSE-2.0 9bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 10bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com Unless required by applicable law or agreed to in writing, software 11bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com distributed under the License is distributed on an "AS IS" BASIS, 12bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com See the License for the specific language governing permissions and 14bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com limitations under the License. 15bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com */ 16bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 17bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 18bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkCanvas.h" 19bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkPaint.h" 20acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com#include "SkGPipe.h" 21bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkGPipePriv.h" 22bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkWriter32.h" 23bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 24acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.comstatic size_t estimateFlattenSize(const SkPath& path) { 25acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com int n = path.countPoints(); 26acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t bytes = 3 * sizeof(int32_t); 27acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com bytes += n * sizeof(SkPoint); 28acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com bytes += SkAlign4(n + 2); // verbs: add 2 for move/close extras 29acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 30acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com#ifdef SK_DEBUG 31acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com { 32acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com SkWriter32 writer(1024); 33acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com path.flatten(writer); 34acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com SkASSERT(writer.size() <= bytes); 35acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 36acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com#endif 37acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return bytes; 38acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com} 39acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 40bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void writeRegion(SkWriter32* writer, const SkRegion& rgn) { 41bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com size_t size = rgn.flatten(NULL); 42bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkASSERT(SkAlign4(size) == size); 43bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com rgn.flatten(writer->reserve(size)); 44bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 45bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 46bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void writeMatrix(SkWriter32* writer, const SkMatrix& matrix) { 47bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com size_t size = matrix.flatten(NULL); 48bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkASSERT(SkAlign4(size) == size); 49bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com matrix.flatten(writer->reserve(size)); 50bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 51bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 52bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 53bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 54bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comclass SkGPipeCanvas : public SkCanvas { 55bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.compublic: 56acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com SkGPipeCanvas(SkGPipeController*, SkWriter32*); 57bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual ~SkGPipeCanvas(); 58bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 59bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com void finish() { 60bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (!fDone) { 61bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com this->writeOp(kDone_DrawOp); 62bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fDone = true; 63bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 64bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 65bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 66bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com // overrides from SkCanvas 67bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual int save(SaveFlags); 68bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual int saveLayer(const SkRect* bounds, const SkPaint*, SaveFlags); 69bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void restore(); 70bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual bool translate(SkScalar dx, SkScalar dy); 71bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual bool scale(SkScalar sx, SkScalar sy); 72bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual bool rotate(SkScalar degrees); 73bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual bool skew(SkScalar sx, SkScalar sy); 74bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual bool concat(const SkMatrix& matrix); 75bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void setMatrix(const SkMatrix& matrix); 76bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual bool clipRect(const SkRect& rect, SkRegion::Op op); 77bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual bool clipPath(const SkPath& path, SkRegion::Op op); 78bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual bool clipRegion(const SkRegion& region, SkRegion::Op op); 79bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void clear(SkColor); 80bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawPaint(const SkPaint& paint); 81bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawPoints(PointMode, size_t count, const SkPoint pts[], 82bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint&); 83bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawRect(const SkRect& rect, const SkPaint&); 84bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawPath(const SkPath& path, const SkPaint&); 85bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top, 86bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint*); 87bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawBitmapRect(const SkBitmap&, const SkIRect* src, 88bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkRect& dst, const SkPaint*); 89bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawBitmapMatrix(const SkBitmap&, const SkMatrix&, 90bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint*); 91bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawSprite(const SkBitmap&, int left, int top, 92bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint*); 93bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawText(const void* text, size_t byteLength, SkScalar x, 94bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkScalar y, const SkPaint&); 95bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawPosText(const void* text, size_t byteLength, 96bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint pos[], const SkPaint&); 97bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawPosTextH(const void* text, size_t byteLength, 98bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkScalar xpos[], SkScalar constY, const SkPaint&); 99bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawTextOnPath(const void* text, size_t byteLength, 100bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPath& path, const SkMatrix* matrix, 101bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint&); 102bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawPicture(SkPicture& picture); 103bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawShape(SkShape*); 104bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawVertices(VertexMode, int vertexCount, 105bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint vertices[], const SkPoint texs[], 106bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkColor colors[], SkXfermode*, 107bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const uint16_t indices[], int indexCount, 108bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint&); 109bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawData(const void*, size_t); 110bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 111bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comprivate: 112acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com SkGPipeController* fController; 113bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkWriter32& fWriter; 114acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t fBlockSize; // amount allocated for writer 115acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t fBytesNotified; 116bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com bool fDone; 117bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 118acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com inline void writeOp(DrawOps op, unsigned flags, unsigned data) { 119bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fWriter.write32(DrawOp_packOpFlagData(op, flags, data)); 120bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 121bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 122acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com inline void writeOp(DrawOps op) { 123bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fWriter.write32(DrawOp_packOpFlagData(op, 0, 0)); 124bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 125acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 126acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com bool needOpBytes(size_t size = 0); 127acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 128acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com inline void doNotify() { 129acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (!fDone) { 130acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t bytes = fWriter.size() - fBytesNotified; 131acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fController->notifyWritten(bytes); 132acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fBytesNotified += bytes; 133acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 134acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 135bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 136bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkTDArray<SkPaint*> fPaints; 137bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned writePaint(const SkPaint&); 138bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 139acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com class AutoPipeNotify { 140acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com public: 141acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com AutoPipeNotify(SkGPipeCanvas* canvas) : fCanvas(canvas) {} 142acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com ~AutoPipeNotify() { fCanvas->doNotify(); } 143acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com private: 144acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com SkGPipeCanvas* fCanvas; 145acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com }; 146acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com friend class AutoPipeNotify; 147acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 148bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com typedef SkCanvas INHERITED; 149bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}; 150bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 151bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 152bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 153acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com#define MIN_BLOCK_SIZE (16 * 1024) 154bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 155acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.comSkGPipeCanvas::SkGPipeCanvas(SkGPipeController* controller, 156acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com SkWriter32* writer) : fWriter(*writer) { 157acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fController = controller; 158bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fDone = false; 159acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fBlockSize = 0; // need first block from controller 160acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 161bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com // always begin with 1 default paint 162bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *fPaints.append() = SkNEW(SkPaint); 163bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 164bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 165bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comSkGPipeCanvas::~SkGPipeCanvas() { 166bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com this->finish(); 167bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 168bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fPaints.deleteAll(); 169bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 170bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 171acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.combool SkGPipeCanvas::needOpBytes(size_t needed) { 172acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (fDone) { 173acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return false; 174acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 175acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 176acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com needed += 4; // size of DrawOp atom 177acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (fWriter.size() + needed > fBlockSize) { 178acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com void* block = fController->requestBlock(MIN_BLOCK_SIZE, &fBlockSize); 179acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (NULL == block) { 180acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fDone = true; 181acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return false; 182acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 183acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.reset(block, fBlockSize); 184acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fBytesNotified = 0; 185acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 186acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return true; 187acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com} 188acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 189bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 190bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 191acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com#define NOTIFY_SETUP(canvas) \ 192acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com AutoPipeNotify apn(canvas) 193acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 194bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comint SkGPipeCanvas::save(SaveFlags flags) { 195acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 196acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes()) { 197acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSave_DrawOp, 0, flags); 198acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 199bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::save(flags); 200bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 201bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 202bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comint SkGPipeCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint, 203bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SaveFlags saveFlags) { 204acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 205acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t size = 0; 206bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned index = 0; // just to avoid the warning 207bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned opFlags = 0; 208acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 209bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (bounds) { 210bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com opFlags |= kSaveLayer_HasBounds_DrawOpFlag; 211acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += sizeof(SkRect); 212bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 213bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (paint) { 214bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com opFlags |= kSaveLayer_HasPaint_DrawOpFlag; 215bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com index = this->writePaint(*paint); 216acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += 4; 217bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 218bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 219acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(size)) { 220acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSaveLayer_DrawOp, opFlags, saveFlags); 221acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (bounds) { 222acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeRect(*bounds); 223acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 224acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (paint) { 225acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(index); 226acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 227bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 228bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 229bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com // we just pass on the save, so we don't create a layer 230bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::save(saveFlags); 231bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 232bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 233bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::restore() { 234acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 235acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes()) { 236acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kRestore_DrawOp); 237acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 238bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com this->INHERITED::restore(); 239bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 240bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 241bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::translate(SkScalar dx, SkScalar dy) { 242bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (dx || dy) { 243acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 244acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(2 * sizeof(SkScalar))) { 245acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kTranslate_DrawOp); 246acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(dx); 247acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(dy); 248acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 249bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 250bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::translate(dx, dy); 251bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 252bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 253bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::scale(SkScalar sx, SkScalar sy) { 254bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (sx || sy) { 255acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 256acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(2 * sizeof(SkScalar))) { 257acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kScale_DrawOp); 258acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(sx); 259acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(sy); 260acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 261bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 262bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::scale(sx, sy); 263bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 264bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 265bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::rotate(SkScalar degrees) { 266bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (degrees) { 267acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 268acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(sizeof(SkScalar))) { 269acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kRotate_DrawOp); 270acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(degrees); 271acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 272bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 273bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::rotate(degrees); 274bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 275bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 276bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::skew(SkScalar sx, SkScalar sy) { 277bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (sx || sy) { 278acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 279acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(2 * sizeof(SkScalar))) { 280acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSkew_DrawOp); 281acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(sx); 282acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(sy); 283acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 284bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 285bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::skew(sx, sy); 286bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 287bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 288bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::concat(const SkMatrix& matrix) { 289bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (!matrix.isIdentity()) { 290acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 291acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(matrix.flatten(NULL))) { 292acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kConcat_DrawOp); 293acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com writeMatrix(&fWriter, matrix); 294acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 295bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 296bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::concat(matrix); 297bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 298bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 299bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::setMatrix(const SkMatrix& matrix) { 300acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 301acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(matrix.flatten(NULL))) { 302acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSetMatrix_DrawOp); 303acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com writeMatrix(&fWriter, matrix); 304acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 305bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com this->INHERITED::setMatrix(matrix); 306bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 307bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 308bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::clipRect(const SkRect& rect, SkRegion::Op rgnOp) { 309acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 310acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(sizeof(SkRect))) { 311acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kClipRect_DrawOp, 0, rgnOp); 312acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeRect(rect); 313acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 314bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::clipRect(rect, rgnOp); 315bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 316bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 317bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::clipPath(const SkPath& path, SkRegion::Op rgnOp) { 318acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 319acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(estimateFlattenSize(path))) { 320acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kClipPath_DrawOp, 0, rgnOp); 321acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com path.flatten(fWriter); 322acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 323bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com // we just pass on the bounds of the path 324bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::clipRect(path.getBounds(), rgnOp); 325bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 326bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 327bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::clipRegion(const SkRegion& region, SkRegion::Op rgnOp) { 328acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 329acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(region.flatten(NULL))) { 330acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kClipRegion_DrawOp, 0, rgnOp); 331acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com writeRegion(&fWriter, region); 332acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 333bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::clipRegion(region, rgnOp); 334bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 335bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 336bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 337bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 338bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::clear(SkColor color) { 339acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 340bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned flags = 0; 341bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (color) { 342bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kClear_HasColor_DrawOpFlag; 343bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 344acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(sizeof(SkColor))) { 345acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kDrawClear_DrawOp, flags, 0); 346acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (color) { 347acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(color); 348acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 349bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 350bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 351bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 352bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPaint(const SkPaint& paint) { 353acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 354bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned paintIndex = this->writePaint(paint); 355acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes()) { 356acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kDrawPaint_DrawOp, 0, paintIndex); 357acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 358bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 359bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 360bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPoints(PointMode mode, size_t count, 361bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint pts[], const SkPaint& paint) { 362bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (count) { 363acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 364bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned paintIndex = this->writePaint(paint); 365acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + count * sizeof(SkPoint))) { 366acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kDrawPoints_DrawOp, mode, paintIndex); 367acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(count); 368acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(pts, count * sizeof(SkPoint)); 369acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 370bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 371bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 372bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 373bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawRect(const SkRect& rect, const SkPaint& paint) { 374acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 375bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned paintIndex = this->writePaint(paint); 376acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(sizeof(SkRect))) { 377acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kDrawRect_DrawOp, 0, paintIndex); 378acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeRect(rect); 379acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 380bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 381bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 382bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPath(const SkPath& path, const SkPaint& paint) { 383acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 384bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned paintIndex = this->writePaint(paint); 385acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(estimateFlattenSize(path))) { 386acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kDrawPath_DrawOp, 0, paintIndex); 387acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com path.flatten(fWriter); 388acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 389bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 390bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 391bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawBitmap(const SkBitmap&, SkScalar left, SkScalar top, 392bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint*) { 393bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com UNIMPLEMENTED 394bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 395bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 396bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawBitmapRect(const SkBitmap&, const SkIRect* src, 397bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkRect& dst, const SkPaint*) { 398bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com UNIMPLEMENTED 399bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 400bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 401bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawBitmapMatrix(const SkBitmap&, const SkMatrix&, 402bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint*) { 403bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com UNIMPLEMENTED 404bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 405bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 406bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawSprite(const SkBitmap&, int left, int top, 407bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint*) { 408bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com UNIMPLEMENTED 409bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 410bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 411bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawText(const void* text, size_t byteLength, SkScalar x, 412bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkScalar y, const SkPaint& paint) { 413bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 414acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 415bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned paintIndex = this->writePaint(paint); 416acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(byteLength) + 2 * sizeof(SkScalar))) { 417acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kDrawText_DrawOp, 0, paintIndex); 418acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(byteLength); 419acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 420acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(x); 421acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(y); 422acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 423bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 424bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 425bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 426bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPosText(const void* text, size_t byteLength, 427bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint pos[], const SkPaint& paint) { 428bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 429acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 430bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned paintIndex = this->writePaint(paint); 431bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com int count = paint.textToGlyphs(text, byteLength, NULL); 432acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(byteLength) + 4 + count * sizeof(SkPoint))) { 433acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kDrawPosText_DrawOp, 0, paintIndex); 434acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(byteLength); 435acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 436acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(count); 437acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(pos, count * sizeof(SkPoint)); 438acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 439bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 440bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 441bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 442bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPosTextH(const void* text, size_t byteLength, 443bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkScalar xpos[], SkScalar constY, 444bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint& paint) { 445bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 446acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 447bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned paintIndex = this->writePaint(paint); 448bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com int count = paint.textToGlyphs(text, byteLength, NULL); 449acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(byteLength) + 4 + count * sizeof(SkScalar) + 4)) { 450acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kDrawPosTextH_DrawOp, 0, paintIndex); 451acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(byteLength); 452acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 453acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(count); 454acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(xpos, count * sizeof(SkScalar)); 455acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(constY); 456acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 457bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 458bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 459bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 460bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawTextOnPath(const void* text, size_t byteLength, 461bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPath& path, const SkMatrix* matrix, 462bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint& paint) { 463bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 464acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 465bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned flags = 0; 466acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t size = 4 + SkAlign4(byteLength) + estimateFlattenSize(path); 467bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (matrix) { 468bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawTextOnPath_HasMatrix_DrawOpFlag; 469acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += matrix->flatten(NULL); 470bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 471bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned paintIndex = this->writePaint(paint); 472acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(size)) { 473acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kDrawTextOnPath_DrawOp, flags, paintIndex); 474bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 475acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(byteLength); 476acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 477bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 478acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com path.flatten(fWriter); 479acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (matrix) { 480acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com writeMatrix(&fWriter, *matrix); 481acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 482bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 483bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 484bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 485bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 486bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPicture(SkPicture& picture) { 487bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com UNIMPLEMENTED 488bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 489bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 490bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawShape(SkShape* shape) { 491bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com UNIMPLEMENTED 492bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 493bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 494bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawVertices(VertexMode mode, int vertexCount, 495bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint vertices[], const SkPoint texs[], 496bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkColor colors[], SkXfermode*, 497bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const uint16_t indices[], int indexCount, 498bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint& paint) { 499bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (0 == vertexCount) { 500bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return; 501bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 502bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 503acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 504acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t size = 4 + vertexCount * sizeof(SkPoint); 505bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned paintIndex = this->writePaint(paint); 506bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned flags = 0; 507bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (texs) { 508bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawVertices_HasTexs_DrawOpFlag; 509acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += vertexCount * sizeof(SkPoint); 510bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 511bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (colors) { 512bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawVertices_HasColors_DrawOpFlag; 513acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += vertexCount * sizeof(SkColor); 514bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 515bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (indices && indexCount > 0) { 516bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawVertices_HasIndices_DrawOpFlag; 517acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += 4 + SkAlign4(indexCount * sizeof(uint16_t)); 518bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 519bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 520acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(size)) { 521acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kDrawVertices_DrawOp, flags, paintIndex); 522acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(mode); 523acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(vertexCount); 524acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(vertices, vertexCount * sizeof(SkPoint)); 525acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (texs) { 526acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(texs, vertexCount * sizeof(SkPoint)); 527acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 528acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (colors) { 529acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(colors, vertexCount * sizeof(SkColor)); 530acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 531bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 532acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com // TODO: flatten xfermode 533bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 534acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (indices && indexCount > 0) { 535acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(indexCount); 536acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(indices, indexCount * sizeof(uint16_t)); 537acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 538bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 539bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 540bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 541acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.comvoid SkGPipeCanvas::drawData(const void* ptr, size_t size) { 542acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (size && ptr) { 543acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 544bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned data = 0; 545bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (size < (1 << DRAWOPS_DATA_BITS)) { 546bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com data = (unsigned)size; 547bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 548acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(size))) { 549acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kDrawData_DrawOp, 0, data); 550acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (0 == data) { 551acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(size); 552acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 553acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(ptr, size); 554bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 555bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 556bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 557bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 558bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 559bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 560bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comtemplate <typename T> uint32_t castToU32(T value) { 561bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com union { 562bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com T fSrc; 563bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com uint32_t fDst; 564bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } data; 565bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com data.fSrc = value; 566bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return data.fDst; 567bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 568bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 569bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comunsigned SkGPipeCanvas::writePaint(const SkPaint& paint) { 570bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint& base = *fPaints[0]; 571bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com uint32_t storage[32]; 572bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com uint32_t* ptr = storage; 573bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com uint32_t* last = NULL; 574bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 575bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getFlags() != paint.getFlags()) { 576bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com last = ptr; 577bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kFlags_PaintOp, paint.getFlags()); 578bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 579bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getColor() != paint.getColor()) { 580bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com last = ptr; 581bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kColor_PaintOp); 582bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = paint.getColor(); 583bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 584bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStyle() != paint.getStyle()) { 585bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com last = ptr; 586bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kStyle_PaintOp, paint.getStyle()); 587bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 588bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeJoin() != paint.getStrokeJoin()) { 589bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com last = ptr; 590bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kJoin_PaintOp, paint.getStrokeJoin()); 591bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 592bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeCap() != paint.getStrokeCap()) { 593bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com last = ptr; 594bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kCap_PaintOp, paint.getStrokeCap()); 595bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 596bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeWidth() != paint.getStrokeWidth()) { 597bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com last = ptr; 598bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kWidth_PaintOp); 599bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getStrokeWidth()); 600bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 601bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeMiter() != paint.getStrokeMiter()) { 602bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com last = ptr; 603bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kMiter_PaintOp); 604bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getStrokeMiter()); 605bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 606bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextEncoding() != paint.getTextEncoding()) { 607bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com last = ptr; 608bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kEncoding_PaintOp, paint.getTextEncoding()); 609bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 610bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getHinting() != paint.getHinting()) { 611bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com last = ptr; 612bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kHinting_PaintOp, paint.getHinting()); 613bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 614bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextAlign() != paint.getTextAlign()) { 615bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com last = ptr; 616bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kAlign_PaintOp, paint.getTextAlign()); 617bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 618bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextSize() != paint.getTextSize()) { 619bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com last = ptr; 620bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kTextSize_PaintOp); 621bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getTextSize()); 622bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 623bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextScaleX() != paint.getTextScaleX()) { 624bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com last = ptr; 625bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kTextScaleX_PaintOp); 626bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getTextScaleX()); 627bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 628bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextSkewX() != paint.getTextSkewX()) { 629bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com last = ptr; 630bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kTextSkewX_PaintOp); 631bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getTextSkewX()); 632bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 633bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 634acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t size = (char*)ptr - (char*)storage; 635acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (size && this->needOpBytes(size)) { 636acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com *fPaints[0] = paint; 637acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 638bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com this->writeOp(kPaintOp_DrawOp, 0, 0); 639bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com size_t size = (char*)ptr - (char*)storage; 640bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *last |= kLastOp_PaintOpFlag << PAINTOPS_DATA_BITS; 641bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fWriter.write(storage, (char*)ptr - (char*)storage); 642bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com for (size_t i = 0; i < size/4; i++) { 643bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkDebugf("[%d] %08X\n", i, storage[i]); 644bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 645bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 646bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return 0; 647bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 648bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 649bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 650bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 651bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkGPipe.h" 652bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 653acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.comSkGPipeWriter::SkGPipeWriter() : fWriter(0) { 654bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas = NULL; 655bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 656bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 657bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comSkGPipeWriter::~SkGPipeWriter() { 658acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->endRecording(); 659bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkSafeUnref(fCanvas); 660bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 661bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 662acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.comSkCanvas* SkGPipeWriter::startRecording(SkGPipeController* controller) { 663bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (NULL == fCanvas) { 664acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.reset(NULL, 0); 665acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fCanvas = SkNEW_ARGS(SkGPipeCanvas, (controller, &fWriter)); 666bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 667bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return fCanvas; 668bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 669bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 670bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeWriter::endRecording() { 671bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (fCanvas) { 672bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas->finish(); 673bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas->unref(); 674bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas = NULL; 675bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 676bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 677bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 678