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