17d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
2685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com/*
3685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * Copyright 2011 Google Inc.
4685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com *
5685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * found in the LICENSE file.
77d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com */
87d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
97d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
10ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com#include "SkBitmapHeap.h"
117d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com#include "SkCanvas.h"
127d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com#include "SkPaint.h"
1384204bcd081bb7824ec49cbced6849b827120b5creed@google.com#include "SkGPipe.h"
147d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com#include "SkGPipePriv.h"
157d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com#include "SkReader32.h"
1676061a60b1547ee2cd315ed3684aa782567e5922reed@google.com#include "SkStream.h"
17abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com
18abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com#include "SkColorFilter.h"
19abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com#include "SkDrawLooper.h"
20abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com#include "SkMaskFilter.h"
21d02e825bf79c38dad5fb7c02dfc301ad4dfabeaadjsollen@google.com#include "SkOrderedReadBuffer.h"
22abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com#include "SkPathEffect.h"
23abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com#include "SkRasterizer.h"
247a7e655343617093a5eea37c7a556602a1bb0576reed@google.com#include "SkRRect.h"
25abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com#include "SkShader.h"
2676061a60b1547ee2cd315ed3684aa782567e5922reed@google.com#include "SkTypeface.h"
27abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com#include "SkXfermode.h"
28abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com
29e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.comstatic void set_paintflat(SkPaint* paint, SkFlattenable* obj, unsigned paintFlat) {
30e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com    SkASSERT(paintFlat < kCount_PaintFlats);
31e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com    switch (paintFlat) {
32e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com        case kColorFilter_PaintFlat:
33e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com            paint->setColorFilter((SkColorFilter*)obj);
34e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com            break;
354dbaefc11dba3a1dce43ab4177789a6fee978356reed@google.com        case kDrawLooper_PaintFlat:
364dbaefc11dba3a1dce43ab4177789a6fee978356reed@google.com            paint->setLooper((SkDrawLooper*)obj);
374dbaefc11dba3a1dce43ab4177789a6fee978356reed@google.com            break;
38e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com        case kMaskFilter_PaintFlat:
39e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com            paint->setMaskFilter((SkMaskFilter*)obj);
40e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com            break;
41e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com        case kPathEffect_PaintFlat:
42e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com            paint->setPathEffect((SkPathEffect*)obj);
43e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com            break;
44e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com        case kRasterizer_PaintFlat:
45e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com            paint->setRasterizer((SkRasterizer*)obj);
46e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com            break;
47e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com        case kShader_PaintFlat:
48e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com            paint->setShader((SkShader*)obj);
49e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com            break;
50872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com        case kImageFilter_PaintFlat:
51872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com            paint->setImageFilter((SkImageFilter*)obj);
52872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com            break;
53e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com        case kXfermode_PaintFlat:
54e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com            paint->setXfermode((SkXfermode*)obj);
55e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com            break;
569ab3951aa71a78f43fb452754b531021b80830d8epoger@google.com        case kAnnotation_PaintFlat:
579ab3951aa71a78f43fb452754b531021b80830d8epoger@google.com            paint->setAnnotation((SkAnnotation*)obj);
589ab3951aa71a78f43fb452754b531021b80830d8epoger@google.com            break;
59e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com        default:
602d7de2d243beab591671dfaf535a637b5d305735tomhudson@google.com            SkDEBUGFAIL("never gets here");
61e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com    }
62e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com}
63e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com
64abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.comtemplate <typename T> class SkRefCntTDArray : public SkTDArray<T> {
65abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.compublic:
66abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com    ~SkRefCntTDArray() { this->unrefAll(); }
67abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com};
687d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
69675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.comclass SkGPipeState : public SkBitmapHeapReader {
707d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.compublic:
717d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    SkGPipeState();
727d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    ~SkGPipeState();
73abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com
749d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    void setSilent(bool silent) {
759d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org        fSilent = silent;
769d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    }
779d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org
789d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    bool shouldDraw() {
799d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org        return !fSilent;
809d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    }
819d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org
826c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com    void setFlags(unsigned flags) {
836c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com        if (fFlags != flags) {
846c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com            fFlags = flags;
856c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com            this->updateReader();
866c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com        }
876c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com    }
886c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com
896c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com    unsigned getFlags() const {
906c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com        return fFlags;
916c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com    }
926c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com
939ce78f26f529fd3e10a3eb4f044bc3f0037ead56djsollen@google.com    void setReader(SkOrderedReadBuffer* reader) {
94734b8ad634b5fbd1e4d3b5319afb0e2d5e101119reed@google.com        fReader = reader;
956c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com        this->updateReader();
96734b8ad634b5fbd1e4d3b5319afb0e2d5e101119reed@google.com    }
97abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com
984b151113cc6939ba6bba66aae77779b82ec4a18creed@google.com    const SkPaint& paint() const { return fPaint; }
994b151113cc6939ba6bba66aae77779b82ec4a18creed@google.com    SkPaint* editPaint() { return &fPaint; }
100dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com
101e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com    SkFlattenable* getFlat(unsigned index) const {
102e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com        if (0 == index) {
103e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com            return NULL;
104e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com        }
105e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com        return fFlatArray[index - 1];
106e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com    }
107e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com
108dca78908e4451feda399538618fb3ad83b014fd5reed@google.com    void defFlattenable(PaintFlats pf, int index) {
1097bbea35d566ef85ee7b32d31a8197a19bb531cb2scroggo@google.com        index--;
110e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com        SkFlattenable* obj = fReader->readFlattenable();
1117bbea35d566ef85ee7b32d31a8197a19bb531cb2scroggo@google.com        if (fFlatArray.count() == index) {
1127bbea35d566ef85ee7b32d31a8197a19bb531cb2scroggo@google.com            *fFlatArray.append() = obj;
1137bbea35d566ef85ee7b32d31a8197a19bb531cb2scroggo@google.com        } else {
1147bbea35d566ef85ee7b32d31a8197a19bb531cb2scroggo@google.com            SkSafeUnref(fFlatArray[index]);
1157bbea35d566ef85ee7b32d31a8197a19bb531cb2scroggo@google.com            fFlatArray[index] = obj;
1167bbea35d566ef85ee7b32d31a8197a19bb531cb2scroggo@google.com        }
117e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com    }
118e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com
119179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com    void defFactory(const char* name) {
120179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com        SkFlattenable::Factory factory = SkFlattenable::NameToFactory(name);
121179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com        if (factory) {
122179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com            SkASSERT(fFactoryArray.find(factory) < 0);
123179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com            *fFactoryArray.append() = factory;
124179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com        }
125179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com    }
126179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com
127693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com    /**
128693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com     * Add a bitmap to the array of bitmaps, or replace an existing one.
129693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com     * This is only used when in cross process mode without a shared heap.
130693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com     */
131872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com    void addBitmap(int index) {
132693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com        SkASSERT(shouldFlattenBitmaps(fFlags));
133dbc0c0b9ca6f4eb9c50862fe86eea3ebbc1012bbscroggo@google.com        SkBitmap* bm;
134dbc0c0b9ca6f4eb9c50862fe86eea3ebbc1012bbscroggo@google.com        if(fBitmaps.count() == index) {
135dbc0c0b9ca6f4eb9c50862fe86eea3ebbc1012bbscroggo@google.com            bm = SkNEW(SkBitmap);
136dbc0c0b9ca6f4eb9c50862fe86eea3ebbc1012bbscroggo@google.com            *fBitmaps.append() = bm;
137dbc0c0b9ca6f4eb9c50862fe86eea3ebbc1012bbscroggo@google.com        } else {
138dbc0c0b9ca6f4eb9c50862fe86eea3ebbc1012bbscroggo@google.com            bm = fBitmaps[index];
139dbc0c0b9ca6f4eb9c50862fe86eea3ebbc1012bbscroggo@google.com        }
140693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com        fReader->readBitmap(bm);
141872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com    }
142872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com
143675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com    /**
144675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com     * Override of SkBitmapHeapReader, so that SkOrderedReadBuffer can use
145693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com     * these SkBitmaps for bitmap shaders. Used only in cross process mode
146693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com     * without a shared heap.
147675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com     */
148675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com    virtual SkBitmap* getBitmap(int32_t index) const SK_OVERRIDE {
149693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com        SkASSERT(shouldFlattenBitmaps(fFlags));
15076ffea1275cc772bfede0ec233c9578edad8eda8scroggo@google.com        return fBitmaps[index];
151872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com    }
152872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com
153675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com    /**
154675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com     * Needed to be a non-abstract subclass of SkBitmapHeapReader.
155675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com     */
156675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com    virtual void releaseRef(int32_t) SK_OVERRIDE {}
157675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com
158ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com    void setSharedHeap(SkBitmapHeap* heap) {
159ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com        SkASSERT(!shouldFlattenBitmaps(fFlags) || NULL == heap);
160ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com        SkRefCnt_SafeAssign(fSharedHeap, heap);
161675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com        this->updateReader();
162ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com    }
163ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com
164693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com    /**
165693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com     * Access the shared heap. Only used in the case when bitmaps are not
166693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com     * flattened.
167693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com     */
168ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com    SkBitmapHeap* getSharedHeap() const {
169693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com        SkASSERT(!shouldFlattenBitmaps(fFlags));
170ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com        return fSharedHeap;
171ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com    }
172ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com
173abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com    void addTypeface() {
1749ce78f26f529fd3e10a3eb4f044bc3f0037ead56djsollen@google.com        size_t size = fReader->read32();
175abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com        const void* data = fReader->skip(SkAlign4(size));
17676061a60b1547ee2cd315ed3684aa782567e5922reed@google.com        SkMemoryStream stream(data, size, false);
17776061a60b1547ee2cd315ed3684aa782567e5922reed@google.com        *fTypefaces.append() = SkTypeface::Deserialize(&stream);
178dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com    }
179ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com
180abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com    void setTypeface(SkPaint* paint, unsigned id) {
181abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com        paint->setTypeface(id ? fTypefaces[id - 1] : NULL);
182abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com    }
183dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com
184e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.comprivate:
1856c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com    void updateReader() {
1866c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com        if (NULL == fReader) {
1876c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com            return;
1886c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com        }
1896c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com        bool crossProcess = SkToBool(fFlags & SkGPipeWriter::kCrossProcess_Flag);
1906c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com        fReader->setFlags(SkSetClearMask(fReader->getFlags(), crossProcess,
1916c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com                                         SkFlattenableReadBuffer::kCrossProcess_Flag));
1926c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com        if (crossProcess) {
1936c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com            fReader->setFactoryArray(&fFactoryArray);
1946c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com        } else {
1956c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com            fReader->setFactoryArray(NULL);
1966c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com        }
197675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com
198675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com        if (shouldFlattenBitmaps(fFlags)) {
199675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com            fReader->setBitmapStorage(this);
200675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com        } else {
201675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com            fReader->setBitmapStorage(fSharedHeap);
202675a2ad1788a9d101aa44c659b68c9a583a78f44scroggo@google.com        }
2036c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com    }
2049ce78f26f529fd3e10a3eb4f044bc3f0037ead56djsollen@google.com    SkOrderedReadBuffer*      fReader;
2054b151113cc6939ba6bba66aae77779b82ec4a18creed@google.com    SkPaint                   fPaint;
2064b151113cc6939ba6bba66aae77779b82ec4a18creed@google.com    SkTDArray<SkFlattenable*> fFlatArray;
2074b151113cc6939ba6bba66aae77779b82ec4a18creed@google.com    SkTDArray<SkTypeface*>    fTypefaces;
208734b8ad634b5fbd1e4d3b5319afb0e2d5e101119reed@google.com    SkTDArray<SkFlattenable::Factory> fFactoryArray;
209872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com    SkTDArray<SkBitmap*>      fBitmaps;
2109d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    bool                      fSilent;
211ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com    // Only used when sharing bitmaps with the writer.
212ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com    SkBitmapHeap*             fSharedHeap;
2136c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com    unsigned                  fFlags;
2147d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com};
2157d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
2167d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com///////////////////////////////////////////////////////////////////////////////
2177d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
2187d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comtemplate <typename T> const T* skip(SkReader32* reader, int count = 1) {
2197d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    SkASSERT(count >= 0);
2207d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    size_t size = sizeof(T) * count;
2217d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    SkASSERT(SkAlign4(size) == size);
2227d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    return reinterpret_cast<const T*>(reader->skip(size));
2237d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
2247d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
2257d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comtemplate <typename T> const T* skipAlign(SkReader32* reader, int count = 1) {
2267d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    SkASSERT(count >= 0);
2277d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    size_t size = SkAlign4(sizeof(T) * count);
2287d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    return reinterpret_cast<const T*>(reader->skip(size));
2297d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
2307d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
2317d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com///////////////////////////////////////////////////////////////////////////////
2327d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com///////////////////////////////////////////////////////////////////////////////
2337d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
2347d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void clipPath_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
2357d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                        SkGPipeState* state) {
2367d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    SkPath path;
2376d537f88ab9f35cf16cfa2b7166fd829549d5783djsollen@google.com    reader->readPath(&path);
238485049a8a60718fd8b59af6b87f0c3e645822d88scroggo@google.com    bool doAA = SkToBool(DrawOp_unpackFlags(op32) & kClip_HasAntiAlias_DrawOpFlag);
239485049a8a60718fd8b59af6b87f0c3e645822d88scroggo@google.com    canvas->clipPath(path, (SkRegion::Op)DrawOp_unpackData(op32), doAA);
2407d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
2417d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
2427d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void clipRegion_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
2437d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                          SkGPipeState* state) {
2447d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    SkRegion rgn;
245d02e825bf79c38dad5fb7c02dfc301ad4dfabeaadjsollen@google.com    reader->readRegion(&rgn);
2467d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    canvas->clipRegion(rgn, (SkRegion::Op)DrawOp_unpackData(op32));
2477d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
2487d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
2497d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void clipRect_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
2507d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                        SkGPipeState* state) {
251ba4a86b463c91e74c1f03276b9b4e6be98b84943scroggo@google.com    const SkRect* rect = skip<SkRect>(reader);
252485049a8a60718fd8b59af6b87f0c3e645822d88scroggo@google.com    bool doAA = SkToBool(DrawOp_unpackFlags(op32) & kClip_HasAntiAlias_DrawOpFlag);
253ba4a86b463c91e74c1f03276b9b4e6be98b84943scroggo@google.com    canvas->clipRect(*rect, (SkRegion::Op)DrawOp_unpackData(op32), doAA);
2547d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
2557d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
2567a7e655343617093a5eea37c7a556602a1bb0576reed@google.comstatic void clipRRect_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
2577a7e655343617093a5eea37c7a556602a1bb0576reed@google.com                         SkGPipeState* state) {
2587a7e655343617093a5eea37c7a556602a1bb0576reed@google.com    SkRRect rrect;
2597a7e655343617093a5eea37c7a556602a1bb0576reed@google.com    reader->readRRect(&rrect);
2607a7e655343617093a5eea37c7a556602a1bb0576reed@google.com    bool doAA = SkToBool(DrawOp_unpackFlags(op32) & kClip_HasAntiAlias_DrawOpFlag);
2617a7e655343617093a5eea37c7a556602a1bb0576reed@google.com    canvas->clipRRect(rrect, (SkRegion::Op)DrawOp_unpackData(op32), doAA);
2627a7e655343617093a5eea37c7a556602a1bb0576reed@google.com}
2637a7e655343617093a5eea37c7a556602a1bb0576reed@google.com
2647d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com///////////////////////////////////////////////////////////////////////////////
2657d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
2667d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void setMatrix_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
2677d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                      SkGPipeState* state) {
2687d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    SkMatrix matrix;
269d02e825bf79c38dad5fb7c02dfc301ad4dfabeaadjsollen@google.com    reader->readMatrix(&matrix);
2707d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    canvas->setMatrix(matrix);
2717d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
2727d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
2737d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void concat_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
2747d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                      SkGPipeState* state) {
2757d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    SkMatrix matrix;
276d02e825bf79c38dad5fb7c02dfc301ad4dfabeaadjsollen@google.com    reader->readMatrix(&matrix);
2777d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    canvas->concat(matrix);
2787d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
2797d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
2807d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void scale_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
2817d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                      SkGPipeState* state) {
2827d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    const SkScalar* param = skip<SkScalar>(reader, 2);
2837d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    canvas->scale(param[0], param[1]);
2847d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
2857d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
2867d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void skew_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
2877d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                      SkGPipeState* state) {
2887d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    const SkScalar* param = skip<SkScalar>(reader, 2);
2897d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    canvas->skew(param[0], param[1]);
2907d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
2917d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
2927d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void rotate_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
2937d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                      SkGPipeState* state) {
2947d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    canvas->rotate(reader->readScalar());
2957d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
2967d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
2977d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void translate_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
2987d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                      SkGPipeState* state) {
2997d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    const SkScalar* param = skip<SkScalar>(reader, 2);
3007d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    canvas->translate(param[0], param[1]);
3017d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
3027d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
3037d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com///////////////////////////////////////////////////////////////////////////////
3047d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
3057d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void save_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
3067d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                    SkGPipeState* state) {
3077d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    canvas->save((SkCanvas::SaveFlags)DrawOp_unpackData(op32));
3087d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
3097d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
3107d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void saveLayer_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
3117d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                         SkGPipeState* state) {
31284204bcd081bb7824ec49cbced6849b827120b5creed@google.com    unsigned flags = DrawOp_unpackFlags(op32);
31384204bcd081bb7824ec49cbced6849b827120b5creed@google.com    SkCanvas::SaveFlags saveFlags = (SkCanvas::SaveFlags)DrawOp_unpackData(op32);
3147d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
3157d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    const SkRect* bounds = NULL;
3167d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    if (flags & kSaveLayer_HasBounds_DrawOpFlag) {
3177d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com        bounds = skip<SkRect>(reader);
3187d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    }
3197d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    const SkPaint* paint = NULL;
3207d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    if (flags & kSaveLayer_HasPaint_DrawOpFlag) {
3214b151113cc6939ba6bba66aae77779b82ec4a18creed@google.com        paint = &state->paint();
3227d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    }
32384204bcd081bb7824ec49cbced6849b827120b5creed@google.com    canvas->saveLayer(bounds, paint, saveFlags);
3247d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
3257d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
3267d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void restore_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
3277d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                       SkGPipeState* state) {
3287d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    canvas->restore();
3297d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
3307d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
3317d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com///////////////////////////////////////////////////////////////////////////////
3327d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
3337d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawClear_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
3347d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                         SkGPipeState* state) {
3357d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    SkColor color = 0;
3367d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    if (DrawOp_unpackFlags(op32) & kClear_HasColor_DrawOpFlag) {
3377d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com        color = reader->readU32();
3387d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    }
3397d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    canvas->clear(color);
3407d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
3417d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
3427d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawPaint_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
3437d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                         SkGPipeState* state) {
3449d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    if (state->shouldDraw()) {
3459d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org        canvas->drawPaint(state->paint());
3469d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    }
3477d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
3487d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
3497d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawPoints_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
3507d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                          SkGPipeState* state) {
3517d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    SkCanvas::PointMode mode = (SkCanvas::PointMode)DrawOp_unpackFlags(op32);
3527d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    size_t count = reader->readU32();
3537d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    const SkPoint* pts = skip<SkPoint>(reader, count);
3549d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    if (state->shouldDraw()) {
3559d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org        canvas->drawPoints(mode, count, pts, state->paint());
3569d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    }
3577d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
3587d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
3597a7e655343617093a5eea37c7a556602a1bb0576reed@google.comstatic void drawOval_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
3607a7e655343617093a5eea37c7a556602a1bb0576reed@google.com                        SkGPipeState* state) {
3617a7e655343617093a5eea37c7a556602a1bb0576reed@google.com    const SkRect* rect = skip<SkRect>(reader);
3627a7e655343617093a5eea37c7a556602a1bb0576reed@google.com    if (state->shouldDraw()) {
3637a7e655343617093a5eea37c7a556602a1bb0576reed@google.com        canvas->drawOval(*rect, state->paint());
3647a7e655343617093a5eea37c7a556602a1bb0576reed@google.com    }
3657a7e655343617093a5eea37c7a556602a1bb0576reed@google.com}
3667a7e655343617093a5eea37c7a556602a1bb0576reed@google.com
3677d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawRect_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
3687d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                        SkGPipeState* state) {
3699d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    const SkRect* rect = skip<SkRect>(reader);
3709d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    if (state->shouldDraw()) {
3719d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org        canvas->drawRect(*rect, state->paint());
3729d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    }
3737d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
3747d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
3757a7e655343617093a5eea37c7a556602a1bb0576reed@google.comstatic void drawRRect_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
3767a7e655343617093a5eea37c7a556602a1bb0576reed@google.com                         SkGPipeState* state) {
3777a7e655343617093a5eea37c7a556602a1bb0576reed@google.com    SkRRect rrect;
3787a7e655343617093a5eea37c7a556602a1bb0576reed@google.com    reader->readRRect(&rrect);
3797a7e655343617093a5eea37c7a556602a1bb0576reed@google.com    if (state->shouldDraw()) {
3807a7e655343617093a5eea37c7a556602a1bb0576reed@google.com        canvas->drawRRect(rrect, state->paint());
3817a7e655343617093a5eea37c7a556602a1bb0576reed@google.com    }
3827a7e655343617093a5eea37c7a556602a1bb0576reed@google.com}
3837a7e655343617093a5eea37c7a556602a1bb0576reed@google.com
3847d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawPath_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
3857d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                        SkGPipeState* state) {
3867d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    SkPath path;
3876d537f88ab9f35cf16cfa2b7166fd829549d5783djsollen@google.com    reader->readPath(&path);
3889d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    if (state->shouldDraw()) {
3899d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org        canvas->drawPath(path, state->paint());
3909d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    }
3917d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
3927d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
3937d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawVertices_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
3947d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                            SkGPipeState* state) {
3957d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    unsigned flags = DrawOp_unpackFlags(op32);
3967d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
3977d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    SkCanvas::VertexMode mode = (SkCanvas::VertexMode)reader->readU32();
3987d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    int vertexCount = reader->readU32();
3997d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    const SkPoint* verts = skip<SkPoint>(reader, vertexCount);
4007d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
4017d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    const SkPoint* texs = NULL;
4027d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    if (flags & kDrawVertices_HasTexs_DrawOpFlag) {
4037d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com        texs = skip<SkPoint>(reader, vertexCount);
4047d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    }
4057d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
4067d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    const SkColor* colors = NULL;
4077d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    if (flags & kDrawVertices_HasColors_DrawOpFlag) {
4087d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com        colors = skip<SkColor>(reader, vertexCount);
4097d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    }
4107d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
4117d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    // TODO: flatten/unflatten xfermodes
4127d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    SkXfermode* xfer = NULL;
4137d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
4147d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    int indexCount = 0;
4157d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    const uint16_t* indices = NULL;
4167d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    if (flags & kDrawVertices_HasIndices_DrawOpFlag) {
4177d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com        indexCount = reader->readU32();
4187d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com        indices = skipAlign<uint16_t>(reader, indexCount);
4197d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    }
4209d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    if (state->shouldDraw()) {
4219d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org        canvas->drawVertices(mode, vertexCount, verts, texs, colors, xfer,
4229d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org                             indices, indexCount, state->paint());
4239d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    }
4247d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
4257d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
4267d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com///////////////////////////////////////////////////////////////////////////////
4277d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
4287d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawText_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
4297d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                        SkGPipeState* state) {
4307d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    size_t len = reader->readU32();
4317d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    const void* text = reader->skip(SkAlign4(len));
4327d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    const SkScalar* xy = skip<SkScalar>(reader, 2);
4339d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    if (state->shouldDraw()) {
4349d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org        canvas->drawText(text, len, xy[0], xy[1], state->paint());
4359d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    }
4367d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
4377d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
4387d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawPosText_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
4397d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                        SkGPipeState* state) {
4407d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    size_t len = reader->readU32();
4417d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    const void* text = reader->skip(SkAlign4(len));
4427d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    size_t posCount = reader->readU32();    // compute by our writer
4437d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    const SkPoint* pos = skip<SkPoint>(reader, posCount);
4449d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    if (state->shouldDraw()) {
4459d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org        canvas->drawPosText(text, len, pos, state->paint());
4469d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    }
4477d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
4487d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
4497d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawPosTextH_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
4507d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                        SkGPipeState* state) {
4517d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    size_t len = reader->readU32();
4527d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    const void* text = reader->skip(SkAlign4(len));
4537d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    size_t posCount = reader->readU32();    // compute by our writer
4547d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    const SkScalar* xpos = skip<SkScalar>(reader, posCount);
4557d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    SkScalar constY = reader->readScalar();
4569d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    if (state->shouldDraw()) {
4579d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org        canvas->drawPosTextH(text, len, xpos, constY, state->paint());
4589d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    }
4597d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
4607d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
4617d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawTextOnPath_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
4627d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                              SkGPipeState* state) {
4637d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    size_t len = reader->readU32();
4647d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    const void* text = reader->skip(SkAlign4(len));
4657d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
4667d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    SkPath path;
4676d537f88ab9f35cf16cfa2b7166fd829549d5783djsollen@google.com    reader->readPath(&path);
4687d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
4697d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    SkMatrix matrixStorage;
4707d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    const SkMatrix* matrix = NULL;
4717d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    if (DrawOp_unpackFlags(op32) & kDrawTextOnPath_HasMatrix_DrawOpFlag) {
472d02e825bf79c38dad5fb7c02dfc301ad4dfabeaadjsollen@google.com        reader->readMatrix(&matrixStorage);
4737d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com        matrix = &matrixStorage;
4747d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    }
4759d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    if (state->shouldDraw()) {
4769d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org        canvas->drawTextOnPath(text, len, path, matrix, state->paint());
4779d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    }
4787d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
4797d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
4807d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com///////////////////////////////////////////////////////////////////////////////
4817d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
4827549e37492896638598839fe3952e9d6823e2a92scroggo@google.comclass BitmapHolder : SkNoncopyable {
4837549e37492896638598839fe3952e9d6823e2a92scroggo@google.compublic:
4847549e37492896638598839fe3952e9d6823e2a92scroggo@google.com    BitmapHolder(SkReader32* reader, uint32_t op32, SkGPipeState* state);
4857549e37492896638598839fe3952e9d6823e2a92scroggo@google.com    ~BitmapHolder() {
486ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com        if (fHeapEntry != NULL) {
487ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com            fHeapEntry->releaseRef();
4887549e37492896638598839fe3952e9d6823e2a92scroggo@google.com        }
4897549e37492896638598839fe3952e9d6823e2a92scroggo@google.com    }
4907549e37492896638598839fe3952e9d6823e2a92scroggo@google.com    const SkBitmap* getBitmap() {
4917549e37492896638598839fe3952e9d6823e2a92scroggo@google.com        return fBitmap;
4927549e37492896638598839fe3952e9d6823e2a92scroggo@google.com    }
4937549e37492896638598839fe3952e9d6823e2a92scroggo@google.comprivate:
494ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com    SkBitmapHeapEntry* fHeapEntry;
495ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com    const SkBitmap*    fBitmap;
49652a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com    SkBitmap           fBitmapStorage;
4977549e37492896638598839fe3952e9d6823e2a92scroggo@google.com};
4987549e37492896638598839fe3952e9d6823e2a92scroggo@google.com
4997549e37492896638598839fe3952e9d6823e2a92scroggo@google.comBitmapHolder::BitmapHolder(SkReader32* reader, uint32_t op32,
5007549e37492896638598839fe3952e9d6823e2a92scroggo@google.com                           SkGPipeState* state) {
50152a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com    const unsigned flags = state->getFlags();
50252a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com    const unsigned index = DrawOp_unpackData(op32);
50352a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com    if (shouldFlattenBitmaps(flags)) {
504ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com        fHeapEntry = NULL;
505ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com        fBitmap = state->getBitmap(index);
5067549e37492896638598839fe3952e9d6823e2a92scroggo@google.com    } else {
50752a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com        SkBitmapHeapEntry* entry = state->getSharedHeap()->getEntry(index);
50852a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com        if (SkToBool(flags & SkGPipeWriter::kSimultaneousReaders_Flag)) {
50952a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com            // Make a shallow copy for thread safety. Each thread will point to the same SkPixelRef,
51052a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com            // which is thread safe.
51152a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com            fBitmapStorage = *entry->getBitmap();
51252a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com            fBitmap = &fBitmapStorage;
51352a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com            // Release the ref on the bitmap now, since we made our own copy.
51452a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com            entry->releaseRef();
51552a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com            fHeapEntry = NULL;
51652a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com        } else {
51752a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com            SkASSERT(!shouldFlattenBitmaps(flags));
51852a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com            SkASSERT(!SkToBool(flags & SkGPipeWriter::kSimultaneousReaders_Flag));
51952a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com            fHeapEntry = entry;
52052a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com            fBitmap = fHeapEntry->getBitmap();
52152a3a1c62cf655be958d668508d736890e99a5fcscroggo@google.com        }
5226c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com    }
5236c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com}
5246c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com
5257d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawBitmap_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
5267d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                          SkGPipeState* state) {
5277549e37492896638598839fe3952e9d6823e2a92scroggo@google.com    BitmapHolder holder(reader, op32, state);
528485049a8a60718fd8b59af6b87f0c3e645822d88scroggo@google.com    bool hasPaint = SkToBool(DrawOp_unpackFlags(op32) & kDrawBitmap_HasPaint_DrawOpFlag);
529175f287b5ffa5f53219f5d5967ac5b926bbc461fscroggo@google.com    SkScalar left = reader->readScalar();
530175f287b5ffa5f53219f5d5967ac5b926bbc461fscroggo@google.com    SkScalar top = reader->readScalar();
5319d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    const SkBitmap* bitmap = holder.getBitmap();
5329d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    if (state->shouldDraw()) {
5339d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org        canvas->drawBitmap(*bitmap, left, top, hasPaint ? &state->paint() : NULL);
5349d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    }
5357d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
5367d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
5377d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawBitmapMatrix_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
5387d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                                SkGPipeState* state) {
5396e29c75903762ed024c2e9b7cf0c397a6fee8bbcscroggo@google.com    BitmapHolder holder(reader, op32, state);
540485049a8a60718fd8b59af6b87f0c3e645822d88scroggo@google.com    bool hasPaint = SkToBool(DrawOp_unpackFlags(op32) & kDrawBitmap_HasPaint_DrawOpFlag);
5416e29c75903762ed024c2e9b7cf0c397a6fee8bbcscroggo@google.com    SkMatrix matrix;
5426e29c75903762ed024c2e9b7cf0c397a6fee8bbcscroggo@google.com    reader->readMatrix(&matrix);
5439d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    const SkBitmap* bitmap = holder.getBitmap();
5449d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    if (state->shouldDraw()) {
5459d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org        canvas->drawBitmapMatrix(*bitmap, matrix,
5469d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org                                 hasPaint ? &state->paint() : NULL);
5479d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    }
5487d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
5497d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
550872508e82a19e552ef566da5e822023b93d5588fscroggo@google.comstatic void drawBitmapNine_rp(SkCanvas* canvas, SkReader32* reader,
551872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com                              uint32_t op32, SkGPipeState* state) {
5527549e37492896638598839fe3952e9d6823e2a92scroggo@google.com    BitmapHolder holder(reader, op32, state);
553485049a8a60718fd8b59af6b87f0c3e645822d88scroggo@google.com    bool hasPaint = SkToBool(DrawOp_unpackFlags(op32) & kDrawBitmap_HasPaint_DrawOpFlag);
554ba4a86b463c91e74c1f03276b9b4e6be98b84943scroggo@google.com    const SkIRect* center = skip<SkIRect>(reader);
555872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com    const SkRect* dst = skip<SkRect>(reader);
5569d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    const SkBitmap* bitmap = holder.getBitmap();
5579d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    if (state->shouldDraw()) {
5589d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org        canvas->drawBitmapNine(*bitmap, *center, *dst,
5599d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org                               hasPaint ? &state->paint() : NULL);
5609d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    }
561872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com}
562872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com
563872508e82a19e552ef566da5e822023b93d5588fscroggo@google.comstatic void drawBitmapRect_rp(SkCanvas* canvas, SkReader32* reader,
564872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com                              uint32_t op32, SkGPipeState* state) {
5657549e37492896638598839fe3952e9d6823e2a92scroggo@google.com    BitmapHolder holder(reader, op32, state);
5666e29c75903762ed024c2e9b7cf0c397a6fee8bbcscroggo@google.com    unsigned flags = DrawOp_unpackFlags(op32);
567485049a8a60718fd8b59af6b87f0c3e645822d88scroggo@google.com    bool hasPaint = SkToBool(flags & kDrawBitmap_HasPaint_DrawOpFlag);
568485049a8a60718fd8b59af6b87f0c3e645822d88scroggo@google.com    bool hasSrc = SkToBool(flags & kDrawBitmap_HasSrcRect_DrawOpFlag);
5693b4aeaece7522f100f25bcb2214214acaf7891e8reed@google.com    const SkRect* src;
570872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com    if (hasSrc) {
5713b4aeaece7522f100f25bcb2214214acaf7891e8reed@google.com        src = skip<SkRect>(reader);
572ba4a86b463c91e74c1f03276b9b4e6be98b84943scroggo@google.com    } else {
573ba4a86b463c91e74c1f03276b9b4e6be98b84943scroggo@google.com        src = NULL;
574872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com    }
575872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com    const SkRect* dst = skip<SkRect>(reader);
5769d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    const SkBitmap* bitmap = holder.getBitmap();
5779d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    if (state->shouldDraw()) {
5789d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org        canvas->drawBitmapRectToRect(*bitmap, src, *dst, hasPaint ? &state->paint() : NULL);
5799d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    }
5807d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
5817d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
5827d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawSprite_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
5837d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                          SkGPipeState* state) {
5847549e37492896638598839fe3952e9d6823e2a92scroggo@google.com    BitmapHolder holder(reader, op32, state);
585485049a8a60718fd8b59af6b87f0c3e645822d88scroggo@google.com    bool hasPaint = SkToBool(DrawOp_unpackFlags(op32) & kDrawBitmap_HasPaint_DrawOpFlag);
586ba4a86b463c91e74c1f03276b9b4e6be98b84943scroggo@google.com    const SkIPoint* point = skip<SkIPoint>(reader);
5879d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    const SkBitmap* bitmap = holder.getBitmap();
5889d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    if (state->shouldDraw()) {
5899d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org        canvas->drawSprite(*bitmap, point->fX, point->fY, hasPaint ? &state->paint() : NULL);
5909d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    }
5917d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
5927d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
5937d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com///////////////////////////////////////////////////////////////////////////////
5947d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
5957d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawData_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
5967d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                        SkGPipeState* state) {
5977d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    // since we don't have a paint, we can use data for our (small) sizes
5987d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    size_t size = DrawOp_unpackData(op32);
5997d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    if (0 == size) {
6007d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com        size = reader->readU32();
6017d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    }
6027d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    const void* data = reader->skip(SkAlign4(size));
6039d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    if (state->shouldDraw()) {
6049d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org        canvas->drawData(data, size);
6059d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    }
6067d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
6077d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
6087d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void drawPicture_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
6097d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                           SkGPipeState* state) {
6107d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    UNIMPLEMENTED
6117d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
6127d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
6137d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com///////////////////////////////////////////////////////////////////////////////
6147d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
6157d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void paintOp_rp(SkCanvas*, SkReader32* reader, uint32_t op32,
6167d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                       SkGPipeState* state) {
617e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com    size_t offset = reader->offset();
618e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com    size_t stop = offset + PaintOp_unpackData(op32);
6194b151113cc6939ba6bba66aae77779b82ec4a18creed@google.com    SkPaint* p = state->editPaint();
6207d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
6217d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    do {
6227d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com        uint32_t p32 = reader->readU32();
6237d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com        unsigned op = PaintOp_unpackOp(p32);
6247d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com        unsigned data = PaintOp_unpackData(p32);
6257d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
626e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com//        SkDebugf(" read %08X op=%d flags=%d data=%d\n", p32, op, done, data);
6277d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
6287d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com        switch (op) {
6297d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com            case kReset_PaintOp: p->reset(); break;
6307d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com            case kFlags_PaintOp: p->setFlags(data); break;
6317d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com            case kColor_PaintOp: p->setColor(reader->readU32()); break;
6327d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com            case kStyle_PaintOp: p->setStyle((SkPaint::Style)data); break;
6337d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com            case kJoin_PaintOp: p->setStrokeJoin((SkPaint::Join)data); break;
6347d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com            case kCap_PaintOp: p->setStrokeCap((SkPaint::Cap)data); break;
6357d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com            case kWidth_PaintOp: p->setStrokeWidth(reader->readScalar()); break;
6367d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com            case kMiter_PaintOp: p->setStrokeMiter(reader->readScalar()); break;
6377d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com            case kEncoding_PaintOp:
6387d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                p->setTextEncoding((SkPaint::TextEncoding)data);
6397d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com                break;
6407d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com            case kHinting_PaintOp: p->setHinting((SkPaint::Hinting)data); break;
6417d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com            case kAlign_PaintOp: p->setTextAlign((SkPaint::Align)data); break;
6427d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com            case kTextSize_PaintOp: p->setTextSize(reader->readScalar()); break;
6437d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com            case kTextScaleX_PaintOp: p->setTextScaleX(reader->readScalar()); break;
6447d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com            case kTextSkewX_PaintOp: p->setTextSkewX(reader->readScalar()); break;
645abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com
646e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com            case kFlatIndex_PaintOp: {
647e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com                PaintFlats pf = (PaintFlats)PaintOp_unpackFlags(p32);
648e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com                unsigned index = data;
649e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com                set_paintflat(p, state->getFlat(index), pf);
650e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com                break;
651e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com            }
652e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com
653bfe877afb55f9bc58737dd26f497bfcbec974fa0scroggo@google.com            case kTypeface_PaintOp:
654bfe877afb55f9bc58737dd26f497bfcbec974fa0scroggo@google.com                SkASSERT(SkToBool(state->getFlags() &
655bfe877afb55f9bc58737dd26f497bfcbec974fa0scroggo@google.com                                  SkGPipeWriter::kCrossProcess_Flag));
656bfe877afb55f9bc58737dd26f497bfcbec974fa0scroggo@google.com                state->setTypeface(p, data); break;
6572d7de2d243beab591671dfaf535a637b5d305735tomhudson@google.com            default: SkDEBUGFAIL("bad paintop"); return;
6587d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com        }
659e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com        SkASSERT(reader->offset() <= stop);
6604b151113cc6939ba6bba66aae77779b82ec4a18creed@google.com    } while (reader->offset() < stop);
6617d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
6627d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
663bfe877afb55f9bc58737dd26f497bfcbec974fa0scroggo@google.comstatic void typeface_rp(SkCanvas*, SkReader32* reader, uint32_t,
664bfe877afb55f9bc58737dd26f497bfcbec974fa0scroggo@google.com                        SkGPipeState* state) {
665bfe877afb55f9bc58737dd26f497bfcbec974fa0scroggo@google.com    SkASSERT(!SkToBool(state->getFlags() & SkGPipeWriter::kCrossProcess_Flag));
666bfe877afb55f9bc58737dd26f497bfcbec974fa0scroggo@google.com    SkPaint* p = state->editPaint();
667bfe877afb55f9bc58737dd26f497bfcbec974fa0scroggo@google.com    p->setTypeface(static_cast<SkTypeface*>(reader->readPtr()));
668bfe877afb55f9bc58737dd26f497bfcbec974fa0scroggo@google.com}
669bfe877afb55f9bc58737dd26f497bfcbec974fa0scroggo@google.com
670abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com///////////////////////////////////////////////////////////////////////////////
671abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com
6724dbaefc11dba3a1dce43ab4177789a6fee978356reed@google.comstatic void def_Typeface_rp(SkCanvas*, SkReader32*, uint32_t, SkGPipeState* state) {
6734dbaefc11dba3a1dce43ab4177789a6fee978356reed@google.com    state->addTypeface();
6744dbaefc11dba3a1dce43ab4177789a6fee978356reed@google.com}
6754dbaefc11dba3a1dce43ab4177789a6fee978356reed@google.com
676e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.comstatic void def_PaintFlat_rp(SkCanvas*, SkReader32*, uint32_t op32,
677e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com                             SkGPipeState* state) {
678e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com    PaintFlats pf = (PaintFlats)DrawOp_unpackFlags(op32);
679e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com    unsigned index = DrawOp_unpackData(op32);
680e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com    state->defFlattenable(pf, index);
681e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com}
682e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.com
683872508e82a19e552ef566da5e822023b93d5588fscroggo@google.comstatic void def_Bitmap_rp(SkCanvas*, SkReader32*, uint32_t op32,
684872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com                          SkGPipeState* state) {
685872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com    unsigned index = DrawOp_unpackData(op32);
686872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com    state->addBitmap(index);
687872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com}
688872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com
689179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.comstatic void def_Factory_rp(SkCanvas*, SkReader32* reader, uint32_t,
690179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com                           SkGPipeState* state) {
691179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com    state->defFactory(reader->readString());
692179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com}
693179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com
6947d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com///////////////////////////////////////////////////////////////////////////////
6957d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
69684204bcd081bb7824ec49cbced6849b827120b5creed@google.comstatic void skip_rp(SkCanvas*, SkReader32* reader, uint32_t op32, SkGPipeState*) {
69784204bcd081bb7824ec49cbced6849b827120b5creed@google.com    size_t bytes = DrawOp_unpackData(op32);
69884204bcd081bb7824ec49cbced6849b827120b5creed@google.com    (void)reader->skip(bytes);
69984204bcd081bb7824ec49cbced6849b827120b5creed@google.com}
70084204bcd081bb7824ec49cbced6849b827120b5creed@google.com
701ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.comstatic void reportFlags_rp(SkCanvas*, SkReader32*, uint32_t op32,
7026c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com                           SkGPipeState* state) {
7036c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com    unsigned flags = DrawOp_unpackFlags(op32);
7046c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com    state->setFlags(flags);
7056c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com}
7066c6c379603a72ec87bd1fc51b40a01a9332e8febscroggo@google.com
7076497eeaa907a8f5acb17bd8829146107a713e4a9scroggo@google.comstatic void shareBitmapHeap_rp(SkCanvas*, SkReader32* reader, uint32_t,
708ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com                           SkGPipeState* state) {
709ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com    state->setSharedHeap(static_cast<SkBitmapHeap*>(reader->readPtr()));
710ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com}
711ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com
7127d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic void done_rp(SkCanvas*, SkReader32*, uint32_t, SkGPipeState*) {}
7137d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
7147d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comtypedef void (*ReadProc)(SkCanvas*, SkReader32*, uint32_t op32, SkGPipeState*);
7157d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
7167d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comstatic const ReadProc gReadTable[] = {
71784204bcd081bb7824ec49cbced6849b827120b5creed@google.com    skip_rp,
7187d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    clipPath_rp,
7197d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    clipRegion_rp,
7207d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    clipRect_rp,
7217a7e655343617093a5eea37c7a556602a1bb0576reed@google.com    clipRRect_rp,
7227d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    concat_rp,
7237d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    drawBitmap_rp,
7247d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    drawBitmapMatrix_rp,
725872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com    drawBitmapNine_rp,
7267d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    drawBitmapRect_rp,
7277d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    drawClear_rp,
7287d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    drawData_rp,
7297a7e655343617093a5eea37c7a556602a1bb0576reed@google.com    drawOval_rp,
7307d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    drawPaint_rp,
7317d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    drawPath_rp,
7327d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    drawPicture_rp,
7337d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    drawPoints_rp,
7347d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    drawPosText_rp,
7357d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    drawPosTextH_rp,
7367d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    drawRect_rp,
7377a7e655343617093a5eea37c7a556602a1bb0576reed@google.com    drawRRect_rp,
7387d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    drawSprite_rp,
7397d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    drawText_rp,
7407d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    drawTextOnPath_rp,
7417d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    drawVertices_rp,
7427d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    restore_rp,
7437d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    rotate_rp,
7447d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    save_rp,
7457d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    saveLayer_rp,
7467d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    scale_rp,
7477d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    setMatrix_rp,
7487d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    skew_rp,
7497d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    translate_rp,
7504dbaefc11dba3a1dce43ab4177789a6fee978356reed@google.com
7517d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    paintOp_rp,
752bfe877afb55f9bc58737dd26f497bfcbec974fa0scroggo@google.com    typeface_rp,
753abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com    def_Typeface_rp,
7544dbaefc11dba3a1dce43ab4177789a6fee978356reed@google.com    def_PaintFlat_rp,
755872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com    def_Bitmap_rp,
756179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com    def_Factory_rp,
7574dbaefc11dba3a1dce43ab4177789a6fee978356reed@google.com
758ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com    reportFlags_rp,
7596497eeaa907a8f5acb17bd8829146107a713e4a9scroggo@google.com    shareBitmapHeap_rp,
7607d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    done_rp
7617d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com};
7627d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
7637d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com///////////////////////////////////////////////////////////////////////////////
7647d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
765ebf86866ddd26b1a19eb94009407dcd19c276c72tomhudson@google.comSkGPipeState::SkGPipeState()
766ebf86866ddd26b1a19eb94009407dcd19c276c72tomhudson@google.com    : fReader(0)
7679d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    , fSilent(false)
768ebf86866ddd26b1a19eb94009407dcd19c276c72tomhudson@google.com    , fSharedHeap(NULL)
769ebf86866ddd26b1a19eb94009407dcd19c276c72tomhudson@google.com    , fFlags(0) {
770ebf86866ddd26b1a19eb94009407dcd19c276c72tomhudson@google.com
771ebf86866ddd26b1a19eb94009407dcd19c276c72tomhudson@google.com}
7727d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
773e9e28149d8b8547fe9a65093dd1faecd1526a96areed@google.comSkGPipeState::~SkGPipeState() {
7744079b3b1a4e9d99740a245692f530600879aa7c5reed@google.com    fTypefaces.safeUnrefAll();
7754079b3b1a4e9d99740a245692f530600879aa7c5reed@google.com    fFlatArray.safeUnrefAll();
776872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com    fBitmaps.deleteAll();
777ae0891cf0a0d8210caee404ebc844510244a41cfscroggo@google.com    SkSafeUnref(fSharedHeap);
7787d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
7797d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
7807d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com///////////////////////////////////////////////////////////////////////////////
7817d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
7827d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com#include "SkGPipe.h"
7837d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
784d125c6e0f513a70d848ba892e7df512213ccc4acscroggo@google.comSkGPipeReader::SkGPipeReader() {
785d125c6e0f513a70d848ba892e7df512213ccc4acscroggo@google.com    fCanvas = NULL;
786d125c6e0f513a70d848ba892e7df512213ccc4acscroggo@google.com    fState = NULL;
787693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com    fProc = NULL;
788d125c6e0f513a70d848ba892e7df512213ccc4acscroggo@google.com}
789d125c6e0f513a70d848ba892e7df512213ccc4acscroggo@google.com
7907d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comSkGPipeReader::SkGPipeReader(SkCanvas* target) {
791d125c6e0f513a70d848ba892e7df512213ccc4acscroggo@google.com    fCanvas = NULL;
792d125c6e0f513a70d848ba892e7df512213ccc4acscroggo@google.com    this->setCanvas(target);
7937d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    fState = NULL;
794693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com    fProc = NULL;
7957d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
7967d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
797d125c6e0f513a70d848ba892e7df512213ccc4acscroggo@google.comvoid SkGPipeReader::setCanvas(SkCanvas *target) {
798d125c6e0f513a70d848ba892e7df512213ccc4acscroggo@google.com    SkRefCnt_SafeAssign(fCanvas, target);
799d125c6e0f513a70d848ba892e7df512213ccc4acscroggo@google.com}
800d125c6e0f513a70d848ba892e7df512213ccc4acscroggo@google.com
8017d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.comSkGPipeReader::~SkGPipeReader() {
8027d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    SkSafeUnref(fCanvas);
8037d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    delete fState;
8047d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
8057d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
80616f040c4e7eb6d8960ce68d40407afffe65201c4reed@google.comSkGPipeReader::Status SkGPipeReader::playback(const void* data, size_t length,
8079d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org                                              uint32_t playbackFlags, size_t* bytesRead) {
8087d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    if (NULL == fCanvas) {
8097d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com        return kError_Status;
8107d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    }
8117d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
8127d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    if (NULL == fState) {
8137d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com        fState = new SkGPipeState;
8147d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    }
8157d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com
8169d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org    fState->setSilent(playbackFlags & kSilent_PlaybackFlag);
8179d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org
8184dbaefc11dba3a1dce43ab4177789a6fee978356reed@google.com    SkASSERT(SK_ARRAY_COUNT(gReadTable) == (kDone_DrawOp + 1));
8194dbaefc11dba3a1dce43ab4177789a6fee978356reed@google.com
8207d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    const ReadProc* table = gReadTable;
821d02e825bf79c38dad5fb7c02dfc301ad4dfabeaadjsollen@google.com    SkOrderedReadBuffer reader(data, length);
822693f5bebea6812e37c1dba62ba172f4f63568bb8scroggo@google.com    reader.setBitmapDecoder(fProc);
8237d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    SkCanvas* canvas = fCanvas;
82416f040c4e7eb6d8960ce68d40407afffe65201c4reed@google.com    Status status = kEOF_Status;
825abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com
826abc7e34a8964b4e467e58b26c3f1ff1c32a530c8reed@google.com    fState->setReader(&reader);
8277d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    while (!reader.eof()) {
8289ce78f26f529fd3e10a3eb4f044bc3f0037ead56djsollen@google.com        uint32_t op32 = reader.readUInt();
8297d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com        unsigned op = DrawOp_unpackOp(op32);
830afdd736d7bfc19e42ed328f9ad33f54270679ce7caryclark@google.com        // SkDEBUGCODE(DrawOps drawOp = (DrawOps)op;)
831dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com
8327d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com        if (op >= SK_ARRAY_COUNT(gReadTable)) {
8337d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com            SkDebugf("---- bad op during GPipeState::playback\n");
83416f040c4e7eb6d8960ce68d40407afffe65201c4reed@google.com            status = kError_Status;
83516f040c4e7eb6d8960ce68d40407afffe65201c4reed@google.com            break;
8367d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com        }
8377d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com        if (kDone_DrawOp == op) {
83816f040c4e7eb6d8960ce68d40407afffe65201c4reed@google.com            status = kDone_Status;
83916f040c4e7eb6d8960ce68d40407afffe65201c4reed@google.com            break;
8407d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com        }
841d02e825bf79c38dad5fb7c02dfc301ad4dfabeaadjsollen@google.com        table[op](canvas, reader.getReader32(), op32, fState);
8429d604e0f4ad86813267882e61bed236e153d52c7junov@chromium.org        if ((playbackFlags & kReadAtom_PlaybackFlag) &&
8437f88298ebee4fc25a214febc93cb3bf9b2330925yangsu@google.com            (table[op] != paintOp_rp &&
8447f88298ebee4fc25a214febc93cb3bf9b2330925yangsu@google.com             table[op] != def_Typeface_rp &&
845872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com             table[op] != def_PaintFlat_rp &&
846872508e82a19e552ef566da5e822023b93d5588fscroggo@google.com             table[op] != def_Bitmap_rp
8477f88298ebee4fc25a214febc93cb3bf9b2330925yangsu@google.com             )) {
8487f88298ebee4fc25a214febc93cb3bf9b2330925yangsu@google.com                status = kReadAtom_Status;
8497f88298ebee4fc25a214febc93cb3bf9b2330925yangsu@google.com                break;
8507f88298ebee4fc25a214febc93cb3bf9b2330925yangsu@google.com            }
8517d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com    }
85216f040c4e7eb6d8960ce68d40407afffe65201c4reed@google.com
85316f040c4e7eb6d8960ce68d40407afffe65201c4reed@google.com    if (bytesRead) {
854b6f19aae21c1fcf876799a8f2b4fa2f97c750208reed@google.com        *bytesRead = reader.offset();
85516f040c4e7eb6d8960ce68d40407afffe65201c4reed@google.com    }
85616f040c4e7eb6d8960ce68d40407afffe65201c4reed@google.com    return status;
8577d4b5f3bb0d2df8ddc2cb42174c69f1b309b874creed@google.com}
858