1bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com */
8bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
9bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
1010dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com#include "SkBitmapHeap.h"
11bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkCanvas.h"
12bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkPaint.h"
13acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com#include "SkGPipe.h"
14bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkGPipePriv.h"
15bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkReader32.h"
16f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com#include "SkStream.h"
17bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com
180cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com#include "SkAnnotation.h"
19bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com#include "SkColorFilter.h"
20bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com#include "SkDrawLooper.h"
21353482251e61971a8cf3a60bbb6910f482be634freed@google.com#include "SkImageFilter.h"
22bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com#include "SkMaskFilter.h"
238b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkReadBuffer.h"
24bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com#include "SkPathEffect.h"
25bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com#include "SkRasterizer.h"
264ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com#include "SkRRect.h"
27bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com#include "SkShader.h"
28f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com#include "SkTypeface.h"
29bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com#include "SkXfermode.h"
30bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com
31c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.orgstatic SkFlattenable::Type paintflat_to_flattype(PaintFlats pf) {
32353482251e61971a8cf3a60bbb6910f482be634freed@google.com    static const uint8_t gEffectTypesInPaintFlatsOrder[] = {
33c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org        SkFlattenable::kSkColorFilter_Type,
34c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org        SkFlattenable::kSkDrawLooper_Type,
35c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org        SkFlattenable::kSkImageFilter_Type,
36c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org        SkFlattenable::kSkMaskFilter_Type,
37c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org        SkFlattenable::kSkPathEffect_Type,
38c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org        SkFlattenable::kSkRasterizer_Type,
39c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org        SkFlattenable::kSkShader_Type,
40c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org        SkFlattenable::kSkXfermode_Type,
41353482251e61971a8cf3a60bbb6910f482be634freed@google.com    };
424677acc75915ebd32ee0efed5c7b41da2a9d047cskia.committer@gmail.com
43353482251e61971a8cf3a60bbb6910f482be634freed@google.com    SkASSERT((size_t)pf < SK_ARRAY_COUNT(gEffectTypesInPaintFlatsOrder));
44c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org    return (SkFlattenable::Type)gEffectTypesInPaintFlatsOrder[pf];
45353482251e61971a8cf3a60bbb6910f482be634freed@google.com}
46353482251e61971a8cf3a60bbb6910f482be634freed@google.com
47b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.comstatic void set_paintflat(SkPaint* paint, SkFlattenable* obj, unsigned paintFlat) {
48b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com    SkASSERT(paintFlat < kCount_PaintFlats);
49b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com    switch (paintFlat) {
50b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com        case kColorFilter_PaintFlat:
51b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com            paint->setColorFilter((SkColorFilter*)obj);
52b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com            break;
530faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com        case kDrawLooper_PaintFlat:
540faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com            paint->setLooper((SkDrawLooper*)obj);
550faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com            break;
56b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com        case kMaskFilter_PaintFlat:
57b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com            paint->setMaskFilter((SkMaskFilter*)obj);
58b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com            break;
59b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com        case kPathEffect_PaintFlat:
60b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com            paint->setPathEffect((SkPathEffect*)obj);
61b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com            break;
62b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com        case kRasterizer_PaintFlat:
63b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com            paint->setRasterizer((SkRasterizer*)obj);
64b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com            break;
65b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com        case kShader_PaintFlat:
66b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com            paint->setShader((SkShader*)obj);
67b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com            break;
6816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com        case kImageFilter_PaintFlat:
6916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com            paint->setImageFilter((SkImageFilter*)obj);
7016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com            break;
71b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com        case kXfermode_PaintFlat:
72b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com            paint->setXfermode((SkXfermode*)obj);
73b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com            break;
74b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com        default:
750c00f21fee3f5cfa3aa7e5d46ff94cb8cf340451tomhudson@google.com            SkDEBUGFAIL("never gets here");
76b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com    }
77b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com}
78b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com
79bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.comtemplate <typename T> class SkRefCntTDArray : public SkTDArray<T> {
80bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.compublic:
81bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com    ~SkRefCntTDArray() { this->unrefAll(); }
82bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com};
83bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
847ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.comclass SkGPipeState : public SkBitmapHeapReader {
85bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.compublic:
86bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    SkGPipeState();
87bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    ~SkGPipeState();
88bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com
89fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    void setSilent(bool silent) {
90fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org        fSilent = silent;
91fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    }
92fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org
93fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    bool shouldDraw() {
94fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org        return !fSilent;
95fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    }
96fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org
97565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com    void setFlags(unsigned flags) {
98565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com        if (fFlags != flags) {
99565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com            fFlags = flags;
100565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com            this->updateReader();
101565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com        }
102565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com    }
103565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com
104565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com    unsigned getFlags() const {
105565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com        return fFlags;
106565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com    }
107565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com
1088b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org    void setReader(SkReadBuffer* reader) {
109dde0956375e87027df2fdd80d430dd819c217aacreed@google.com        fReader = reader;
110565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com        this->updateReader();
111dde0956375e87027df2fdd80d430dd819c217aacreed@google.com    }
112bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com
11331891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com    const SkPaint& paint() const { return fPaint; }
11431891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com    SkPaint* editPaint() { return &fPaint; }
115d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
116b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com    SkFlattenable* getFlat(unsigned index) const {
117b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com        if (0 == index) {
118b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com            return NULL;
119b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com        }
120b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com        return fFlatArray[index - 1];
121b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com    }
122b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com
12367908f2faee17a8bce4d074980617cc0d15fabf1reed@google.com    void defFlattenable(PaintFlats pf, int index) {
124d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com        index--;
125c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org        SkFlattenable* obj = fReader->readFlattenable(paintflat_to_flattype(pf));
126d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com        if (fFlatArray.count() == index) {
127d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com            *fFlatArray.append() = obj;
128d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com        } else {
129d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com            SkSafeUnref(fFlatArray[index]);
130d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com            fFlatArray[index] = obj;
131d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com        }
132b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com    }
133b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com
1340c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com    void defFactory(const char* name) {
1350c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com        SkFlattenable::Factory factory = SkFlattenable::NameToFactory(name);
1360c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com        if (factory) {
1370c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com            SkASSERT(fFactoryArray.find(factory) < 0);
1380c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com            *fFactoryArray.append() = factory;
1390c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com        }
1400c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com    }
1410c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com
14274b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com    /**
14374b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com     * Add a bitmap to the array of bitmaps, or replace an existing one.
14474b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com     * This is only used when in cross process mode without a shared heap.
14574b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com     */
14616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com    void addBitmap(int index) {
14774b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com        SkASSERT(shouldFlattenBitmaps(fFlags));
1484dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com        SkBitmap* bm;
1494dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com        if(fBitmaps.count() == index) {
1504dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com            bm = SkNEW(SkBitmap);
1514dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com            *fBitmaps.append() = bm;
1524dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com        } else {
1534dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com            bm = fBitmaps[index];
1544dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com        }
15574b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com        fReader->readBitmap(bm);
15616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com    }
15716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com
1587ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com    /**
1598b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org     * Override of SkBitmapHeapReader, so that SkReadBuffer can use
16074b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com     * these SkBitmaps for bitmap shaders. Used only in cross process mode
16174b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com     * without a shared heap.
1627ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com     */
1637ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com    virtual SkBitmap* getBitmap(int32_t index) const SK_OVERRIDE {
16474b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com        SkASSERT(shouldFlattenBitmaps(fFlags));
1653e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com        return fBitmaps[index];
16616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com    }
16716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com
1687ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com    /**
1697ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com     * Needed to be a non-abstract subclass of SkBitmapHeapReader.
1707ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com     */
1717ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com    virtual void releaseRef(int32_t) SK_OVERRIDE {}
1727ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com
17310dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com    void setSharedHeap(SkBitmapHeap* heap) {
17410dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com        SkASSERT(!shouldFlattenBitmaps(fFlags) || NULL == heap);
17510dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com        SkRefCnt_SafeAssign(fSharedHeap, heap);
1767ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com        this->updateReader();
17710dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com    }
17810dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com
17974b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com    /**
18074b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com     * Access the shared heap. Only used in the case when bitmaps are not
18174b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com     * flattened.
18274b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com     */
18310dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com    SkBitmapHeap* getSharedHeap() const {
18474b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com        SkASSERT(!shouldFlattenBitmaps(fFlags));
18510dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com        return fSharedHeap;
18610dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com    }
18710dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com
188bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com    void addTypeface() {
189c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com        size_t size = fReader->read32();
190bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com        const void* data = fReader->skip(SkAlign4(size));
191f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com        SkMemoryStream stream(data, size, false);
192f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com        *fTypefaces.append() = SkTypeface::Deserialize(&stream);
193d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    }
19410dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com
195bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com    void setTypeface(SkPaint* paint, unsigned id) {
196bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com        paint->setTypeface(id ? fTypefaces[id - 1] : NULL);
197bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com    }
198d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
199b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.comprivate:
200565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com    void updateReader() {
201565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com        if (NULL == fReader) {
202565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com            return;
203565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com        }
204565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com        bool crossProcess = SkToBool(fFlags & SkGPipeWriter::kCrossProcess_Flag);
205565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com        fReader->setFlags(SkSetClearMask(fReader->getFlags(), crossProcess,
2068b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org                                         SkReadBuffer::kCrossProcess_Flag));
207565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com        if (crossProcess) {
208565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com            fReader->setFactoryArray(&fFactoryArray);
209565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com        } else {
210565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com            fReader->setFactoryArray(NULL);
211565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com        }
2127ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com
2137ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com        if (shouldFlattenBitmaps(fFlags)) {
2147ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com            fReader->setBitmapStorage(this);
2157ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com        } else {
2167ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com            fReader->setBitmapStorage(fSharedHeap);
2177ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com        }
218565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com    }
2198b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org    SkReadBuffer*             fReader;
22031891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com    SkPaint                   fPaint;
22131891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com    SkTDArray<SkFlattenable*> fFlatArray;
22231891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com    SkTDArray<SkTypeface*>    fTypefaces;
223dde0956375e87027df2fdd80d430dd819c217aacreed@google.com    SkTDArray<SkFlattenable::Factory> fFactoryArray;
22416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com    SkTDArray<SkBitmap*>      fBitmaps;
225fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    bool                      fSilent;
22610dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com    // Only used when sharing bitmaps with the writer.
22710dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com    SkBitmapHeap*             fSharedHeap;
228565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com    unsigned                  fFlags;
229bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com};
230bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
231bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com///////////////////////////////////////////////////////////////////////////////
232bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
233b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.orgtemplate <typename T> const T* skip(SkReader32* reader, size_t count = 1) {
234bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    size_t size = sizeof(T) * count;
235bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    SkASSERT(SkAlign4(size) == size);
236bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    return reinterpret_cast<const T*>(reader->skip(size));
237bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
238bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
239b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.orgtemplate <typename T> const T* skipAlign(SkReader32* reader, size_t count = 1) {
240bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    size_t size = SkAlign4(sizeof(T) * count);
241bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    return reinterpret_cast<const T*>(reader->skip(size));
242bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
243bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
244bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com///////////////////////////////////////////////////////////////////////////////
245bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com///////////////////////////////////////////////////////////////////////////////
246bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
247bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void clipPath_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
248bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                        SkGPipeState* state) {
249bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    SkPath path;
25094e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com    reader->readPath(&path);
251460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com    bool doAA = SkToBool(DrawOp_unpackFlags(op32) & kClip_HasAntiAlias_DrawOpFlag);
252460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com    canvas->clipPath(path, (SkRegion::Op)DrawOp_unpackData(op32), doAA);
253bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
254bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
255bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void clipRegion_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
256bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                          SkGPipeState* state) {
257bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    SkRegion rgn;
2582b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com    reader->readRegion(&rgn);
259bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    canvas->clipRegion(rgn, (SkRegion::Op)DrawOp_unpackData(op32));
260bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
261bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
262bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void clipRect_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
263bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                        SkGPipeState* state) {
264691703cdd4ab51b23c59798e7018dd7920a34be3scroggo@google.com    const SkRect* rect = skip<SkRect>(reader);
265460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com    bool doAA = SkToBool(DrawOp_unpackFlags(op32) & kClip_HasAntiAlias_DrawOpFlag);
266691703cdd4ab51b23c59798e7018dd7920a34be3scroggo@google.com    canvas->clipRect(*rect, (SkRegion::Op)DrawOp_unpackData(op32), doAA);
267bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
268bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
2694ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.comstatic void clipRRect_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
2704ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com                         SkGPipeState* state) {
2714ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    SkRRect rrect;
2724ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    reader->readRRect(&rrect);
2734ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    bool doAA = SkToBool(DrawOp_unpackFlags(op32) & kClip_HasAntiAlias_DrawOpFlag);
2744ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    canvas->clipRRect(rrect, (SkRegion::Op)DrawOp_unpackData(op32), doAA);
2754ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com}
2764ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com
277bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com///////////////////////////////////////////////////////////////////////////////
278bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
279bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void setMatrix_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
280bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                      SkGPipeState* state) {
281bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    SkMatrix matrix;
2822b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com    reader->readMatrix(&matrix);
283bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    canvas->setMatrix(matrix);
284bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
285bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
286bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void concat_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
287bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                      SkGPipeState* state) {
288bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    SkMatrix matrix;
2892b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com    reader->readMatrix(&matrix);
290bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    canvas->concat(matrix);
291bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
292bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
293bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void scale_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
294bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                      SkGPipeState* state) {
295bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    const SkScalar* param = skip<SkScalar>(reader, 2);
296bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    canvas->scale(param[0], param[1]);
297bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
298bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
299bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void skew_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
300bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                      SkGPipeState* state) {
301bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    const SkScalar* param = skip<SkScalar>(reader, 2);
302bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    canvas->skew(param[0], param[1]);
303bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
304bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
305bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void rotate_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
306bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                      SkGPipeState* state) {
307bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    canvas->rotate(reader->readScalar());
308bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
309bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
310bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void translate_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
311bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                      SkGPipeState* state) {
312bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    const SkScalar* param = skip<SkScalar>(reader, 2);
313bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    canvas->translate(param[0], param[1]);
314bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
315bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
316bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com///////////////////////////////////////////////////////////////////////////////
317bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
318bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void save_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
319bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                    SkGPipeState* state) {
320bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    canvas->save((SkCanvas::SaveFlags)DrawOp_unpackData(op32));
321bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
322bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
323bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void saveLayer_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
324bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                         SkGPipeState* state) {
325acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com    unsigned flags = DrawOp_unpackFlags(op32);
326acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com    SkCanvas::SaveFlags saveFlags = (SkCanvas::SaveFlags)DrawOp_unpackData(op32);
327bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
328bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    const SkRect* bounds = NULL;
329bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    if (flags & kSaveLayer_HasBounds_DrawOpFlag) {
330bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com        bounds = skip<SkRect>(reader);
331bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    }
332bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    const SkPaint* paint = NULL;
333bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    if (flags & kSaveLayer_HasPaint_DrawOpFlag) {
33431891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com        paint = &state->paint();
335bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    }
336acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com    canvas->saveLayer(bounds, paint, saveFlags);
337bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
338bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
339bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void restore_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
340bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                       SkGPipeState* state) {
341bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    canvas->restore();
342bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
343bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
344bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com///////////////////////////////////////////////////////////////////////////////
345bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
346bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawClear_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
347bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                         SkGPipeState* state) {
348bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    SkColor color = 0;
349bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    if (DrawOp_unpackFlags(op32) & kClear_HasColor_DrawOpFlag) {
350bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com        color = reader->readU32();
351bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    }
352bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    canvas->clear(color);
353bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
354bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
355bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawPaint_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
356bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                         SkGPipeState* state) {
357fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    if (state->shouldDraw()) {
358fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org        canvas->drawPaint(state->paint());
359fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    }
360bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
361bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
362bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawPoints_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
363bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                          SkGPipeState* state) {
364bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    SkCanvas::PointMode mode = (SkCanvas::PointMode)DrawOp_unpackFlags(op32);
365bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    size_t count = reader->readU32();
366bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    const SkPoint* pts = skip<SkPoint>(reader, count);
367fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    if (state->shouldDraw()) {
368fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org        canvas->drawPoints(mode, count, pts, state->paint());
369fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    }
370bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
371bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
3724ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.comstatic void drawOval_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
3734ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com                        SkGPipeState* state) {
3744ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    const SkRect* rect = skip<SkRect>(reader);
3754ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    if (state->shouldDraw()) {
3764ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com        canvas->drawOval(*rect, state->paint());
3774ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    }
3784ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com}
3794ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com
380bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawRect_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
381bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                        SkGPipeState* state) {
382fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    const SkRect* rect = skip<SkRect>(reader);
383fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    if (state->shouldDraw()) {
384fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org        canvas->drawRect(*rect, state->paint());
385fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    }
386bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
387bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
3884ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.comstatic void drawRRect_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
3894ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com                         SkGPipeState* state) {
3904ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    SkRRect rrect;
3914ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    reader->readRRect(&rrect);
3924ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    if (state->shouldDraw()) {
3934ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com        canvas->drawRRect(rrect, state->paint());
3944ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    }
3954ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com}
3964ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com
397ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.orgstatic void drawDRRect_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
398ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org                          SkGPipeState* state) {
399ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org    SkRRect outer, inner;
400ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org    reader->readRRect(&outer);
401ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org    reader->readRRect(&inner);
402ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org    if (state->shouldDraw()) {
403ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org        canvas->drawDRRect(outer, inner, state->paint());
404ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org    }
405ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org}
406ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org
407bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawPath_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
408bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                        SkGPipeState* state) {
409bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    SkPath path;
41094e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com    reader->readPath(&path);
411fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    if (state->shouldDraw()) {
412fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org        canvas->drawPath(path, state->paint());
413fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    }
414bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
415bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
416bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawVertices_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
417bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                            SkGPipeState* state) {
418bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    unsigned flags = DrawOp_unpackFlags(op32);
419bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
42085e143c33c214e54187aa28146aa7666961a0d17reed@google.com    SkCanvas::VertexMode vmode = (SkCanvas::VertexMode)reader->readU32();
421bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    int vertexCount = reader->readU32();
422bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    const SkPoint* verts = skip<SkPoint>(reader, vertexCount);
423bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
424bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    const SkPoint* texs = NULL;
425bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    if (flags & kDrawVertices_HasTexs_DrawOpFlag) {
426bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com        texs = skip<SkPoint>(reader, vertexCount);
427bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    }
428bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
429bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    const SkColor* colors = NULL;
430bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    if (flags & kDrawVertices_HasColors_DrawOpFlag) {
431bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com        colors = skip<SkColor>(reader, vertexCount);
432bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    }
433bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
43485e143c33c214e54187aa28146aa7666961a0d17reed@google.com    SkAutoTUnref<SkXfermode> xfer;
43585e143c33c214e54187aa28146aa7666961a0d17reed@google.com    if (flags & kDrawVertices_HasXfermode_DrawOpFlag) {
43685e143c33c214e54187aa28146aa7666961a0d17reed@google.com        SkXfermode::Mode mode = (SkXfermode::Mode)reader->readU32();
43785e143c33c214e54187aa28146aa7666961a0d17reed@google.com        xfer.reset(SkXfermode::Create(mode));
43885e143c33c214e54187aa28146aa7666961a0d17reed@google.com    }
439bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
440bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    int indexCount = 0;
441bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    const uint16_t* indices = NULL;
442bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    if (flags & kDrawVertices_HasIndices_DrawOpFlag) {
443bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com        indexCount = reader->readU32();
444bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com        indices = skipAlign<uint16_t>(reader, indexCount);
445bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    }
446fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    if (state->shouldDraw()) {
44785e143c33c214e54187aa28146aa7666961a0d17reed@google.com        canvas->drawVertices(vmode, vertexCount, verts, texs, colors, xfer,
448fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org                             indices, indexCount, state->paint());
449fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    }
450bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
451bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
452bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com///////////////////////////////////////////////////////////////////////////////
453bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
454bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawText_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
455bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                        SkGPipeState* state) {
456bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    size_t len = reader->readU32();
457bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    const void* text = reader->skip(SkAlign4(len));
458bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    const SkScalar* xy = skip<SkScalar>(reader, 2);
459fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    if (state->shouldDraw()) {
460fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org        canvas->drawText(text, len, xy[0], xy[1], state->paint());
461fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    }
462bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
463bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
464bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawPosText_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
465bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                        SkGPipeState* state) {
466bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    size_t len = reader->readU32();
467bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    const void* text = reader->skip(SkAlign4(len));
468bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    size_t posCount = reader->readU32();    // compute by our writer
469bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    const SkPoint* pos = skip<SkPoint>(reader, posCount);
470fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    if (state->shouldDraw()) {
471fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org        canvas->drawPosText(text, len, pos, state->paint());
472fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    }
473bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
474bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
475bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawPosTextH_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
476bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                        SkGPipeState* state) {
477bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    size_t len = reader->readU32();
478bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    const void* text = reader->skip(SkAlign4(len));
479bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    size_t posCount = reader->readU32();    // compute by our writer
480bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    const SkScalar* xpos = skip<SkScalar>(reader, posCount);
481bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    SkScalar constY = reader->readScalar();
482fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    if (state->shouldDraw()) {
483fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org        canvas->drawPosTextH(text, len, xpos, constY, state->paint());
484fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    }
485bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
486bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
487bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawTextOnPath_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
488bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                              SkGPipeState* state) {
489bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    size_t len = reader->readU32();
490bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    const void* text = reader->skip(SkAlign4(len));
491bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
492bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    SkPath path;
49394e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com    reader->readPath(&path);
494bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
495bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    SkMatrix matrixStorage;
496bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    const SkMatrix* matrix = NULL;
497bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    if (DrawOp_unpackFlags(op32) & kDrawTextOnPath_HasMatrix_DrawOpFlag) {
4982b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com        reader->readMatrix(&matrixStorage);
499bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com        matrix = &matrixStorage;
500bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    }
501fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    if (state->shouldDraw()) {
502fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org        canvas->drawTextOnPath(text, len, path, matrix, state->paint());
503fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    }
504bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
505bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
506bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com///////////////////////////////////////////////////////////////////////////////
507bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
508284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.comclass BitmapHolder : SkNoncopyable {
509284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.compublic:
510284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com    BitmapHolder(SkReader32* reader, uint32_t op32, SkGPipeState* state);
511284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com    ~BitmapHolder() {
51210dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com        if (fHeapEntry != NULL) {
51310dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com            fHeapEntry->releaseRef();
514284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com        }
515284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com    }
516284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com    const SkBitmap* getBitmap() {
517284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com        return fBitmap;
518284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com    }
519284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.comprivate:
52010dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com    SkBitmapHeapEntry* fHeapEntry;
52110dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com    const SkBitmap*    fBitmap;
52258b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com    SkBitmap           fBitmapStorage;
523284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com};
524284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com
525284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.comBitmapHolder::BitmapHolder(SkReader32* reader, uint32_t op32,
526284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com                           SkGPipeState* state) {
52758b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com    const unsigned flags = state->getFlags();
52858b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com    const unsigned index = DrawOp_unpackData(op32);
52958b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com    if (shouldFlattenBitmaps(flags)) {
53010dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com        fHeapEntry = NULL;
53110dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com        fBitmap = state->getBitmap(index);
532284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com    } else {
53358b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com        SkBitmapHeapEntry* entry = state->getSharedHeap()->getEntry(index);
53458b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com        if (SkToBool(flags & SkGPipeWriter::kSimultaneousReaders_Flag)) {
53558b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com            // Make a shallow copy for thread safety. Each thread will point to the same SkPixelRef,
53658b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com            // which is thread safe.
53758b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com            fBitmapStorage = *entry->getBitmap();
53858b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com            fBitmap = &fBitmapStorage;
53958b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com            // Release the ref on the bitmap now, since we made our own copy.
54058b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com            entry->releaseRef();
54158b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com            fHeapEntry = NULL;
54258b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com        } else {
54358b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com            SkASSERT(!shouldFlattenBitmaps(flags));
54458b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com            SkASSERT(!SkToBool(flags & SkGPipeWriter::kSimultaneousReaders_Flag));
54558b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com            fHeapEntry = entry;
54658b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com            fBitmap = fHeapEntry->getBitmap();
54758b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com        }
548565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com    }
549565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com}
550565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com
551bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawBitmap_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
552bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                          SkGPipeState* state) {
553284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com    BitmapHolder holder(reader, op32, state);
554460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com    bool hasPaint = SkToBool(DrawOp_unpackFlags(op32) & kDrawBitmap_HasPaint_DrawOpFlag);
5555a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com    SkScalar left = reader->readScalar();
5565a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com    SkScalar top = reader->readScalar();
557fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    const SkBitmap* bitmap = holder.getBitmap();
558fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    if (state->shouldDraw()) {
559fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org        canvas->drawBitmap(*bitmap, left, top, hasPaint ? &state->paint() : NULL);
560fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    }
561bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
562bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
563bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawBitmapMatrix_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
564bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                                SkGPipeState* state) {
56558be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com    BitmapHolder holder(reader, op32, state);
566460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com    bool hasPaint = SkToBool(DrawOp_unpackFlags(op32) & kDrawBitmap_HasPaint_DrawOpFlag);
56758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com    SkMatrix matrix;
56858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com    reader->readMatrix(&matrix);
569fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    const SkBitmap* bitmap = holder.getBitmap();
570fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    if (state->shouldDraw()) {
571fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org        canvas->drawBitmapMatrix(*bitmap, matrix,
572fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org                                 hasPaint ? &state->paint() : NULL);
573fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    }
574bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
575bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
57616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.comstatic void drawBitmapNine_rp(SkCanvas* canvas, SkReader32* reader,
57716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com                              uint32_t op32, SkGPipeState* state) {
578284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com    BitmapHolder holder(reader, op32, state);
579460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com    bool hasPaint = SkToBool(DrawOp_unpackFlags(op32) & kDrawBitmap_HasPaint_DrawOpFlag);
580691703cdd4ab51b23c59798e7018dd7920a34be3scroggo@google.com    const SkIRect* center = skip<SkIRect>(reader);
58116d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com    const SkRect* dst = skip<SkRect>(reader);
582fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    const SkBitmap* bitmap = holder.getBitmap();
583fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    if (state->shouldDraw()) {
584fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org        canvas->drawBitmapNine(*bitmap, *center, *dst,
585fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org                               hasPaint ? &state->paint() : NULL);
586fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    }
58716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com}
58816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com
58916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.comstatic void drawBitmapRect_rp(SkCanvas* canvas, SkReader32* reader,
59016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com                              uint32_t op32, SkGPipeState* state) {
591284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com    BitmapHolder holder(reader, op32, state);
59258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com    unsigned flags = DrawOp_unpackFlags(op32);
593460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com    bool hasPaint = SkToBool(flags & kDrawBitmap_HasPaint_DrawOpFlag);
594460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com    bool hasSrc = SkToBool(flags & kDrawBitmap_HasSrcRect_DrawOpFlag);
5957112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com    const SkRect* src;
59616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com    if (hasSrc) {
5977112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com        src = skip<SkRect>(reader);
598691703cdd4ab51b23c59798e7018dd7920a34be3scroggo@google.com    } else {
599691703cdd4ab51b23c59798e7018dd7920a34be3scroggo@google.com        src = NULL;
60016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com    }
60131acc11977815402e4ef2681350f8559285bec97robertphillips@google.com    SkCanvas::DrawBitmapRectFlags dbmrFlags = SkCanvas::kNone_DrawBitmapRectFlag;
602eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org    if (flags & kDrawBitmap_Bleed_DrawOpFlag) {
603eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org        dbmrFlags = (SkCanvas::DrawBitmapRectFlags)(dbmrFlags|SkCanvas::kBleed_DrawBitmapRectFlag);
604eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org    }
60516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com    const SkRect* dst = skip<SkRect>(reader);
606fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    const SkBitmap* bitmap = holder.getBitmap();
607fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    if (state->shouldDraw()) {
6087475811143e190e172bf83d13c4bdba85704b604skia.committer@gmail.com        canvas->drawBitmapRectToRect(*bitmap, src, *dst,
609eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org                                     hasPaint ? &state->paint() : NULL, dbmrFlags);
610fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    }
611bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
612bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
613bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawSprite_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
614bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                          SkGPipeState* state) {
615284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com    BitmapHolder holder(reader, op32, state);
616460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com    bool hasPaint = SkToBool(DrawOp_unpackFlags(op32) & kDrawBitmap_HasPaint_DrawOpFlag);
617691703cdd4ab51b23c59798e7018dd7920a34be3scroggo@google.com    const SkIPoint* point = skip<SkIPoint>(reader);
618fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    const SkBitmap* bitmap = holder.getBitmap();
619fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    if (state->shouldDraw()) {
620fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org        canvas->drawSprite(*bitmap, point->fX, point->fY, hasPaint ? &state->paint() : NULL);
621fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    }
622bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
623bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
624bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com///////////////////////////////////////////////////////////////////////////////
625bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
626bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawData_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
627bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                        SkGPipeState* state) {
628bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    // since we don't have a paint, we can use data for our (small) sizes
629bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    size_t size = DrawOp_unpackData(op32);
630bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    if (0 == size) {
631bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com        size = reader->readU32();
632bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    }
633bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    const void* data = reader->skip(SkAlign4(size));
634fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    if (state->shouldDraw()) {
635fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org        canvas->drawData(data, size);
636fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    }
637bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
638bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
639bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void drawPicture_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
640bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                           SkGPipeState* state) {
641bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    UNIMPLEMENTED
642bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
643bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
644bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com///////////////////////////////////////////////////////////////////////////////
645bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
646bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void paintOp_rp(SkCanvas*, SkReader32* reader, uint32_t op32,
647bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                       SkGPipeState* state) {
648b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com    size_t offset = reader->offset();
649b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com    size_t stop = offset + PaintOp_unpackData(op32);
65031891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com    SkPaint* p = state->editPaint();
651bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
652bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    do {
653bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com        uint32_t p32 = reader->readU32();
654bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com        unsigned op = PaintOp_unpackOp(p32);
655bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com        unsigned data = PaintOp_unpackData(p32);
656bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
657b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com//        SkDebugf(" read %08X op=%d flags=%d data=%d\n", p32, op, done, data);
658bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
659bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com        switch (op) {
660bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com            case kReset_PaintOp: p->reset(); break;
661bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com            case kFlags_PaintOp: p->setFlags(data); break;
662bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com            case kColor_PaintOp: p->setColor(reader->readU32()); break;
66385faf50875fcf6008880a98aaa05d12ae8dad343commit-bot@chromium.org            case kFilterLevel_PaintOp: p->setFilterLevel((SkPaint::FilterLevel)data); break;
664bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com            case kStyle_PaintOp: p->setStyle((SkPaint::Style)data); break;
665bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com            case kJoin_PaintOp: p->setStrokeJoin((SkPaint::Join)data); break;
666bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com            case kCap_PaintOp: p->setStrokeCap((SkPaint::Cap)data); break;
667bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com            case kWidth_PaintOp: p->setStrokeWidth(reader->readScalar()); break;
668bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com            case kMiter_PaintOp: p->setStrokeMiter(reader->readScalar()); break;
669bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com            case kEncoding_PaintOp:
670bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                p->setTextEncoding((SkPaint::TextEncoding)data);
671bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com                break;
672bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com            case kHinting_PaintOp: p->setHinting((SkPaint::Hinting)data); break;
673bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com            case kAlign_PaintOp: p->setTextAlign((SkPaint::Align)data); break;
674bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com            case kTextSize_PaintOp: p->setTextSize(reader->readScalar()); break;
675bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com            case kTextScaleX_PaintOp: p->setTextScaleX(reader->readScalar()); break;
676bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com            case kTextSkewX_PaintOp: p->setTextSkewX(reader->readScalar()); break;
677bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com
678b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com            case kFlatIndex_PaintOp: {
679b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com                PaintFlats pf = (PaintFlats)PaintOp_unpackFlags(p32);
680b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com                unsigned index = data;
681b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com                set_paintflat(p, state->getFlat(index), pf);
682b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com                break;
683b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com            }
684b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com
6853cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com            case kTypeface_PaintOp:
6863cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com                SkASSERT(SkToBool(state->getFlags() &
6873cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com                                  SkGPipeWriter::kCrossProcess_Flag));
6883cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com                state->setTypeface(p, data); break;
6890c00f21fee3f5cfa3aa7e5d46ff94cb8cf340451tomhudson@google.com            default: SkDEBUGFAIL("bad paintop"); return;
690bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com        }
691b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com        SkASSERT(reader->offset() <= stop);
69231891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com    } while (reader->offset() < stop);
693bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
694bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
6953cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.comstatic void typeface_rp(SkCanvas*, SkReader32* reader, uint32_t,
6963cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com                        SkGPipeState* state) {
6973cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com    SkASSERT(!SkToBool(state->getFlags() & SkGPipeWriter::kCrossProcess_Flag));
6983cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com    SkPaint* p = state->editPaint();
6993cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com    p->setTypeface(static_cast<SkTypeface*>(reader->readPtr()));
7003cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com}
7013cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com
7020cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.comstatic void annotation_rp(SkCanvas*, SkReader32* reader, uint32_t op32,
7030cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com                          SkGPipeState* state) {
7040cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com    SkPaint* p = state->editPaint();
705fbc58a305518fe611113a51649bf557c991ac8cfskia.committer@gmail.com
70689ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org    const size_t size = DrawOp_unpackData(op32);
70789ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org    if (size > 0) {
7088b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org        SkReadBuffer buffer(reader->skip(size), size);
709d957984c1efbd18f3b2bbeca78d282837c5a2ae1commit-bot@chromium.org        p->setAnnotation(SkAnnotation::Create(buffer))->unref();
71089ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org        SkASSERT(buffer.offset() == size);
7110cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com    } else {
7120cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com        p->setAnnotation(NULL);
7130cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com    }
7140cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com}
7150cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com
716bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com///////////////////////////////////////////////////////////////////////////////
717bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com
7180faac1e8579088a39f38d02ff675f14d7deb608dreed@google.comstatic void def_Typeface_rp(SkCanvas*, SkReader32*, uint32_t, SkGPipeState* state) {
7190faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com    state->addTypeface();
7200faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com}
7210faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com
722b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.comstatic void def_PaintFlat_rp(SkCanvas*, SkReader32*, uint32_t op32,
723b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com                             SkGPipeState* state) {
724b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com    PaintFlats pf = (PaintFlats)DrawOp_unpackFlags(op32);
725b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com    unsigned index = DrawOp_unpackData(op32);
726b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com    state->defFlattenable(pf, index);
727b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com}
728b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com
72916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.comstatic void def_Bitmap_rp(SkCanvas*, SkReader32*, uint32_t op32,
73016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com                          SkGPipeState* state) {
73116d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com    unsigned index = DrawOp_unpackData(op32);
73216d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com    state->addBitmap(index);
73316d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com}
73416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com
7350c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.comstatic void def_Factory_rp(SkCanvas*, SkReader32* reader, uint32_t,
7360c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com                           SkGPipeState* state) {
7370c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com    state->defFactory(reader->readString());
7380c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com}
7390c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com
740bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com///////////////////////////////////////////////////////////////////////////////
741bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
742acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.comstatic void skip_rp(SkCanvas*, SkReader32* reader, uint32_t op32, SkGPipeState*) {
743acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com    size_t bytes = DrawOp_unpackData(op32);
744acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com    (void)reader->skip(bytes);
745acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com}
746acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com
74710dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.comstatic void reportFlags_rp(SkCanvas*, SkReader32*, uint32_t op32,
748565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com                           SkGPipeState* state) {
749565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com    unsigned flags = DrawOp_unpackFlags(op32);
750565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com    state->setFlags(flags);
751565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com}
752565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com
753d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.comstatic void shareBitmapHeap_rp(SkCanvas*, SkReader32* reader, uint32_t,
75410dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com                           SkGPipeState* state) {
75510dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com    state->setSharedHeap(static_cast<SkBitmapHeap*>(reader->readPtr()));
75610dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com}
75710dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com
758bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic void done_rp(SkCanvas*, SkReader32*, uint32_t, SkGPipeState*) {}
759bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
760bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comtypedef void (*ReadProc)(SkCanvas*, SkReader32*, uint32_t op32, SkGPipeState*);
761bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
762bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comstatic const ReadProc gReadTable[] = {
763acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com    skip_rp,
764bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    clipPath_rp,
765bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    clipRegion_rp,
766bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    clipRect_rp,
7674ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    clipRRect_rp,
768bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    concat_rp,
769bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    drawBitmap_rp,
770bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    drawBitmapMatrix_rp,
77116d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com    drawBitmapNine_rp,
772bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    drawBitmapRect_rp,
773bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    drawClear_rp,
774bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    drawData_rp,
775ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org    drawDRRect_rp,
7764ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    drawOval_rp,
777bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    drawPaint_rp,
778bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    drawPath_rp,
779bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    drawPicture_rp,
780bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    drawPoints_rp,
781bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    drawPosText_rp,
782bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    drawPosTextH_rp,
783bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    drawRect_rp,
7844ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    drawRRect_rp,
785bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    drawSprite_rp,
786bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    drawText_rp,
787bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    drawTextOnPath_rp,
788bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    drawVertices_rp,
789bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    restore_rp,
790bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    rotate_rp,
791bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    save_rp,
792bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    saveLayer_rp,
793bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    scale_rp,
794bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    setMatrix_rp,
795bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    skew_rp,
796bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    translate_rp,
7970faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com
798bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    paintOp_rp,
7993cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com    typeface_rp,
8000cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com    annotation_rp,
8010cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com
802bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com    def_Typeface_rp,
8030faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com    def_PaintFlat_rp,
80416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com    def_Bitmap_rp,
8050c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com    def_Factory_rp,
8060faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com
80710dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com    reportFlags_rp,
808d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com    shareBitmapHeap_rp,
809bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    done_rp
810bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com};
811bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
812bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com///////////////////////////////////////////////////////////////////////////////
813bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
8148afae61a57f87e4a50578effce6c428031499301tomhudson@google.comSkGPipeState::SkGPipeState()
8158afae61a57f87e4a50578effce6c428031499301tomhudson@google.com    : fReader(0)
816fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    , fSilent(false)
8178afae61a57f87e4a50578effce6c428031499301tomhudson@google.com    , fSharedHeap(NULL)
8188afae61a57f87e4a50578effce6c428031499301tomhudson@google.com    , fFlags(0) {
8198afae61a57f87e4a50578effce6c428031499301tomhudson@google.com
8208afae61a57f87e4a50578effce6c428031499301tomhudson@google.com}
821bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
822b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.comSkGPipeState::~SkGPipeState() {
8236bac947cd5bc460dd9166ada6310d678fd2e39f8reed@google.com    fTypefaces.safeUnrefAll();
8246bac947cd5bc460dd9166ada6310d678fd2e39f8reed@google.com    fFlatArray.safeUnrefAll();
82516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com    fBitmaps.deleteAll();
82610dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com    SkSafeUnref(fSharedHeap);
827bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
828bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
829bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com///////////////////////////////////////////////////////////////////////////////
830bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
831bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkGPipe.h"
832bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
83372c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.comSkGPipeReader::SkGPipeReader() {
83472c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com    fCanvas = NULL;
83572c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com    fState = NULL;
83674b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com    fProc = NULL;
83772c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com}
83872c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com
839bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comSkGPipeReader::SkGPipeReader(SkCanvas* target) {
84072c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com    fCanvas = NULL;
84172c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com    this->setCanvas(target);
842bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    fState = NULL;
84374b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com    fProc = NULL;
844bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
845bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
84672c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.comvoid SkGPipeReader::setCanvas(SkCanvas *target) {
84772c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com    SkRefCnt_SafeAssign(fCanvas, target);
84872c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com}
84972c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com
850bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comSkGPipeReader::~SkGPipeReader() {
851bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    SkSafeUnref(fCanvas);
852bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    delete fState;
853bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
854bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
85580b09de87fadfa1fe45860124b157a01e03f760breed@google.comSkGPipeReader::Status SkGPipeReader::playback(const void* data, size_t length,
856fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org                                              uint32_t playbackFlags, size_t* bytesRead) {
857bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    if (NULL == fCanvas) {
858bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com        return kError_Status;
859bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    }
860bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
861bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    if (NULL == fState) {
862bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com        fState = new SkGPipeState;
863bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    }
864bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com
865fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    fState->setSilent(playbackFlags & kSilent_PlaybackFlag);
866fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org
8670faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com    SkASSERT(SK_ARRAY_COUNT(gReadTable) == (kDone_DrawOp + 1));
8680faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com
869bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    const ReadProc* table = gReadTable;
8708b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org    SkReadBuffer reader(data, length);
87174b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com    reader.setBitmapDecoder(fProc);
872bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    SkCanvas* canvas = fCanvas;
87380b09de87fadfa1fe45860124b157a01e03f760breed@google.com    Status status = kEOF_Status;
874bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com
875bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com    fState->setReader(&reader);
876bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    while (!reader.eof()) {
877c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com        uint32_t op32 = reader.readUInt();
878bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com        unsigned op = DrawOp_unpackOp(op32);
879920901da539ed8fca76d372abbef872d2cb31be5caryclark@google.com        // SkDEBUGCODE(DrawOps drawOp = (DrawOps)op;)
880d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
881bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com        if (op >= SK_ARRAY_COUNT(gReadTable)) {
882bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com            SkDebugf("---- bad op during GPipeState::playback\n");
88380b09de87fadfa1fe45860124b157a01e03f760breed@google.com            status = kError_Status;
88480b09de87fadfa1fe45860124b157a01e03f760breed@google.com            break;
885bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com        }
886bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com        if (kDone_DrawOp == op) {
88780b09de87fadfa1fe45860124b157a01e03f760breed@google.com            status = kDone_Status;
88880b09de87fadfa1fe45860124b157a01e03f760breed@google.com            break;
889bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com        }
8902b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com        table[op](canvas, reader.getReader32(), op32, fState);
891fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org        if ((playbackFlags & kReadAtom_PlaybackFlag) &&
8921bce0a585733a3e4e5cc1b79eae12b15deee122dyangsu@google.com            (table[op] != paintOp_rp &&
8931bce0a585733a3e4e5cc1b79eae12b15deee122dyangsu@google.com             table[op] != def_Typeface_rp &&
89416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com             table[op] != def_PaintFlat_rp &&
89516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com             table[op] != def_Bitmap_rp
8961bce0a585733a3e4e5cc1b79eae12b15deee122dyangsu@google.com             )) {
8971bce0a585733a3e4e5cc1b79eae12b15deee122dyangsu@google.com                status = kReadAtom_Status;
8981bce0a585733a3e4e5cc1b79eae12b15deee122dyangsu@google.com                break;
8991bce0a585733a3e4e5cc1b79eae12b15deee122dyangsu@google.com            }
900bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com    }
90180b09de87fadfa1fe45860124b157a01e03f760breed@google.com
90280b09de87fadfa1fe45860124b157a01e03f760breed@google.com    if (bytesRead) {
903ac45f00d5a2d2bbb065efbe67a786efc5ddb60c5reed@google.com        *bytesRead = reader.offset();
90480b09de87fadfa1fe45860124b157a01e03f760breed@google.com    }
90580b09de87fadfa1fe45860124b157a01e03f760breed@google.com    return status;
906bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}
907