1add79ef7cb2ebd7b80bf0fd5e70281ec6ad5f079bsalomon/*
2add79ef7cb2ebd7b80bf0fd5e70281ec6ad5f079bsalomon * Copyright 2015 Google Inc.
3add79ef7cb2ebd7b80bf0fd5e70281ec6ad5f079bsalomon *
4add79ef7cb2ebd7b80bf0fd5e70281ec6ad5f079bsalomon * Use of this source code is governed by a BSD-style license that can be
5add79ef7cb2ebd7b80bf0fd5e70281ec6ad5f079bsalomon * found in the LICENSE file.
6add79ef7cb2ebd7b80bf0fd5e70281ec6ad5f079bsalomon */
7add79ef7cb2ebd7b80bf0fd5e70281ec6ad5f079bsalomon
882c263f6e4452227334c349430f85ea662962a2bBrian Salomon#ifndef GrDrawPathOp_DEFINED
982c263f6e4452227334c349430f85ea662962a2bBrian Salomon#define GrDrawPathOp_DEFINED
10add79ef7cb2ebd7b80bf0fd5e70281ec6ad5f079bsalomon
119afd371a8a66f992f98eb2a3fc75ae64bddc730bBrian Salomon#include "GrDrawOp.h"
12742e31de1599f3902810aecdf2e2e3eed3b40a09Brian Salomon#include "GrOpFlushState.h"
13add79ef7cb2ebd7b80bf0fd5e70281ec6ad5f079bsalomon#include "GrPath.h"
14add79ef7cb2ebd7b80bf0fd5e70281ec6ad5f079bsalomon#include "GrPathProcessor.h"
15742e31de1599f3902810aecdf2e2e3eed3b40a09Brian Salomon#include "GrPathRendering.h"
1654d212e1bfaea0be88c3c40820d0b1ae0daebecfBrian Salomon#include "GrProcessorSet.h"
17c633abbb342e3af0e56382e8cb7e7d9fed71e237csmartdalton#include "GrStencilSettings.h"
18add79ef7cb2ebd7b80bf0fd5e70281ec6ad5f079bsalomon
191fcc01c4158bd68c679569e6c7cfbb302d0ce170bsalomon#include "SkTLList.h"
201fcc01c4158bd68c679569e6c7cfbb302d0ce170bsalomon
2154d212e1bfaea0be88c3c40820d0b1ae0daebecfBrian Salomonclass GrPaint;
2254d212e1bfaea0be88c3c40820d0b1ae0daebecfBrian Salomon
2382c263f6e4452227334c349430f85ea662962a2bBrian Salomonclass GrDrawPathOpBase : public GrDrawOp {
241fcc01c4158bd68c679569e6c7cfbb302d0ce170bsalomonprotected:
2548d1b4c2b2c0f41a10376ed657cde043d8f11979Brian Salomon    GrDrawPathOpBase(uint32_t classID, const SkMatrix& viewMatrix, GrPaint&&,
2648d1b4c2b2c0f41a10376ed657cde043d8f11979Brian Salomon                     GrPathRendering::FillType, GrAAType);
27b493eebca14aefbd5f22fb5d45ba978b19db4b18Robert Phillips
2854d212e1bfaea0be88c3c40820d0b1ae0daebecfBrian Salomon    FixedFunctionFlags fixedFunctionFlags() const override {
2948d1b4c2b2c0f41a10376ed657cde043d8f11979Brian Salomon        if (GrAATypeIsHW(fAAType)) {
3048d1b4c2b2c0f41a10376ed657cde043d8f11979Brian Salomon            return FixedFunctionFlags::kUsesHWAA | FixedFunctionFlags::kUsesStencil;
3148d1b4c2b2c0f41a10376ed657cde043d8f11979Brian Salomon        }
3248d1b4c2b2c0f41a10376ed657cde043d8f11979Brian Salomon        return FixedFunctionFlags::kUsesStencil;
3354d212e1bfaea0be88c3c40820d0b1ae0daebecfBrian Salomon    }
349a725dd9485654155e2e4196c32d372360bcdb61Brian Osman    RequiresDstTexture finalize(const GrCaps& caps, const GrAppliedClip* clip,
359a725dd9485654155e2e4196c32d372360bcdb61Brian Osman                                GrPixelConfigIsClamped dstIsClamped) override {
369a725dd9485654155e2e4196c32d372360bcdb61Brian Osman        return this->doProcessorAnalysis(caps, clip, dstIsClamped).requiresDstTexture()
379a725dd9485654155e2e4196c32d372360bcdb61Brian Osman                ? RequiresDstTexture::kYes : RequiresDstTexture::kNo;
38c48af934608bbb65650641f66adb51f2102d4274Brian Salomon    }
392bf4b3a97b770811d9e0558dbbfbdb57cfafbdb7Brian Salomon
40f1748f5a9238a0d3e189d50fc5e57ae8b8ec087cRobert Phillips    void visitProxies(const VisitProxyFunc& func) const override {
41b493eebca14aefbd5f22fb5d45ba978b19db4b18Robert Phillips        fProcessorSet.visitProxies(func);
42b493eebca14aefbd5f22fb5d45ba978b19db4b18Robert Phillips    }
43b493eebca14aefbd5f22fb5d45ba978b19db4b18Robert Phillips
4492aee3d6857386f2b5b8e1148e680a7b58e9b1fcBrian Salomonprotected:
45f238469b0532cf28724b811d546c395a0361d7a0joshualitt    const SkMatrix& viewMatrix() const { return fViewMatrix; }
4648d1b4c2b2c0f41a10376ed657cde043d8f11979Brian Salomon    GrColor color() const { return fInputColor; }
47193d9cf8f2280cd4f8e509c6f3af6b47cea04935cdalton    GrPathRendering::FillType fillType() const { return fFillType; }
4854d212e1bfaea0be88c3c40820d0b1ae0daebecfBrian Salomon    const GrProcessorSet& processors() const { return fProcessorSet; }
4991326c34ee1f1531d62caa153746821b58e6e55dBrian Salomon    GrProcessorSet detachProcessors() { return std::move(fProcessorSet); }
50611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon    uint32_t pipelineSRGBFlags() const { return fPipelineSRGBFlags; }
51972b2f6041e0b591d9556fc874c24562733c50ceBrian Salomon    inline GrPipeline::InitArgs pipelineInitArgs(const GrOpFlushState&);
52a811b1200cc0b5e3819c89f62def23ec203d4b5aBrian Salomon    const GrProcessorSet::Analysis& doProcessorAnalysis(const GrCaps& caps,
539a725dd9485654155e2e4196c32d372360bcdb61Brian Osman                                                        const GrAppliedClip* clip,
549a725dd9485654155e2e4196c32d372360bcdb61Brian Osman                                                        GrPixelConfigIsClamped dstIsClamped) {
5548d1b4c2b2c0f41a10376ed657cde043d8f11979Brian Salomon        bool isMixedSamples = GrAAType::kMixedSamples == fAAType;
5648d1b4c2b2c0f41a10376ed657cde043d8f11979Brian Salomon        fAnalysis = fProcessorSet.finalize(fInputColor, GrProcessorAnalysisCoverage::kNone, clip,
579a725dd9485654155e2e4196c32d372360bcdb61Brian Osman                                           isMixedSamples, caps, dstIsClamped, &fInputColor);
5854d212e1bfaea0be88c3c40820d0b1ae0daebecfBrian Salomon        return fAnalysis;
5992aee3d6857386f2b5b8e1148e680a7b58e9b1fcBrian Salomon    }
60a811b1200cc0b5e3819c89f62def23ec203d4b5aBrian Salomon    const GrProcessorSet::Analysis& processorAnalysis() const {
6148d1b4c2b2c0f41a10376ed657cde043d8f11979Brian Salomon        SkASSERT(fAnalysis.isInitialized());
6254d212e1bfaea0be88c3c40820d0b1ae0daebecfBrian Salomon        return fAnalysis;
631fcc01c4158bd68c679569e6c7cfbb302d0ce170bsalomon    }
641fcc01c4158bd68c679569e6c7cfbb302d0ce170bsalomon
6554d212e1bfaea0be88c3c40820d0b1ae0daebecfBrian Salomonprivate:
6654d212e1bfaea0be88c3c40820d0b1ae0daebecfBrian Salomon    void onPrepare(GrOpFlushState*) final {}
67193d9cf8f2280cd4f8e509c6f3af6b47cea04935cdalton
6882c263f6e4452227334c349430f85ea662962a2bBrian Salomon    SkMatrix fViewMatrix;
6948d1b4c2b2c0f41a10376ed657cde043d8f11979Brian Salomon    GrColor fInputColor;
70a811b1200cc0b5e3819c89f62def23ec203d4b5aBrian Salomon    GrProcessorSet::Analysis fAnalysis;
7182c263f6e4452227334c349430f85ea662962a2bBrian Salomon    GrPathRendering::FillType fFillType;
7248d1b4c2b2c0f41a10376ed657cde043d8f11979Brian Salomon    GrAAType fAAType;
73611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon    uint32_t fPipelineSRGBFlags;
74611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon    GrProcessorSet fProcessorSet;
751fcc01c4158bd68c679569e6c7cfbb302d0ce170bsalomon
769afd371a8a66f992f98eb2a3fc75ae64bddc730bBrian Salomon    typedef GrDrawOp INHERITED;
771fcc01c4158bd68c679569e6c7cfbb302d0ce170bsalomon};
781fcc01c4158bd68c679569e6c7cfbb302d0ce170bsalomon
7982c263f6e4452227334c349430f85ea662962a2bBrian Salomonclass GrDrawPathOp final : public GrDrawPathOpBase {
80add79ef7cb2ebd7b80bf0fd5e70281ec6ad5f079bsalomonpublic:
8125a880960a9a689a745a01071ecba3fe494b5940Brian Salomon    DEFINE_OP_CLASS_ID
821b55a963a2374a14bb82eb887bb99ee91680f0ebreed
8348d1b4c2b2c0f41a10376ed657cde043d8f11979Brian Salomon    static std::unique_ptr<GrDrawOp> Make(const SkMatrix& viewMatrix, GrPaint&& paint,
8448d1b4c2b2c0f41a10376ed657cde043d8f11979Brian Salomon                                          GrAAType aaType, GrPath* path) {
8548d1b4c2b2c0f41a10376ed657cde043d8f11979Brian Salomon        return std::unique_ptr<GrDrawOp>(
8648d1b4c2b2c0f41a10376ed657cde043d8f11979Brian Salomon                new GrDrawPathOp(viewMatrix, std::move(paint), aaType, path));
87add79ef7cb2ebd7b80bf0fd5e70281ec6ad5f079bsalomon    }
88add79ef7cb2ebd7b80bf0fd5e70281ec6ad5f079bsalomon
89add79ef7cb2ebd7b80bf0fd5e70281ec6ad5f079bsalomon    const char* name() const override { return "DrawPath"; }
90add79ef7cb2ebd7b80bf0fd5e70281ec6ad5f079bsalomon
911fcc01c4158bd68c679569e6c7cfbb302d0ce170bsalomon    SkString dumpInfo() const override;
921fcc01c4158bd68c679569e6c7cfbb302d0ce170bsalomon
931fcc01c4158bd68c679569e6c7cfbb302d0ce170bsalomonprivate:
9448d1b4c2b2c0f41a10376ed657cde043d8f11979Brian Salomon    GrDrawPathOp(const SkMatrix& viewMatrix, GrPaint&& paint, GrAAType aaType, const GrPath* path)
9548d1b4c2b2c0f41a10376ed657cde043d8f11979Brian Salomon            : GrDrawPathOpBase(ClassID(), viewMatrix, std::move(paint), path->getFillType(), aaType)
9654d212e1bfaea0be88c3c40820d0b1ae0daebecfBrian Salomon            , fPath(path) {
9788cf17d099085b8085ab11571b5094163dbb2c84bsalomon        this->setTransformedBounds(path->getBounds(), viewMatrix, HasAABloat::kNo, IsZeroArea::kNo);
98add79ef7cb2ebd7b80bf0fd5e70281ec6ad5f079bsalomon    }
991dc172165b8186950fda4a269bd1b12c11947b14stephana
10025a880960a9a689a745a01071ecba3fe494b5940Brian Salomon    bool onCombineIfPossible(GrOp* t, const GrCaps& caps) override { return false; }
1011fcc01c4158bd68c679569e6c7cfbb302d0ce170bsalomon
1029e50f7b11e9a9d3dc23c924bbb0f0b85c6f1d6cbBrian Salomon    void onExecute(GrOpFlushState* state) override;
1031fcc01c4158bd68c679569e6c7cfbb302d0ce170bsalomon
1041fcc01c4158bd68c679569e6c7cfbb302d0ce170bsalomon    GrPendingIOResource<const GrPath, kRead_GrIOType> fPath;
1051dc172165b8186950fda4a269bd1b12c11947b14stephana
10682c263f6e4452227334c349430f85ea662962a2bBrian Salomon    typedef GrDrawPathOpBase INHERITED;
1071fcc01c4158bd68c679569e6c7cfbb302d0ce170bsalomon};
1081fcc01c4158bd68c679569e6c7cfbb302d0ce170bsalomon
1091fcc01c4158bd68c679569e6c7cfbb302d0ce170bsalomon// Template this if we decide to support index types other than 16bit
11082c263f6e4452227334c349430f85ea662962a2bBrian Salomonclass GrDrawPathRangeOp final : public GrDrawPathOpBase {
1111fcc01c4158bd68c679569e6c7cfbb302d0ce170bsalomonpublic:
112cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton    typedef GrPathRendering::PathTransformType TransformType;
113cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton
11425a880960a9a689a745a01071ecba3fe494b5940Brian Salomon    DEFINE_OP_CLASS_ID
1151b55a963a2374a14bb82eb887bb99ee91680f0ebreed
116f8334781914363caf537f22f012fcd5c03c60dadBrian Salomon    struct InstanceData : private ::SkNoncopyable {
117cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton    public:
118cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton        static InstanceData* Alloc(TransformType transformType, int reserveCnt) {
119cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton            int transformSize = GrPathRendering::PathTransformSize(transformType);
120cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton            uint8_t* ptr = (uint8_t*)sk_malloc_throw(Align32(sizeof(InstanceData)) +
121cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton                                                     Align32(reserveCnt * sizeof(uint16_t)) +
122cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton                                                     reserveCnt * transformSize * sizeof(float));
123cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton            InstanceData* instanceData = (InstanceData*)ptr;
124cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton            instanceData->fIndices = (uint16_t*)&ptr[Align32(sizeof(InstanceData))];
125cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton            instanceData->fTransformValues = (float*)&ptr[Align32(sizeof(InstanceData)) +
126cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton                                                          Align32(reserveCnt * sizeof(uint16_t))];
127cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton            instanceData->fTransformType = transformType;
128cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton            instanceData->fInstanceCount = 0;
129cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton            instanceData->fRefCnt = 1;
13082c263f6e4452227334c349430f85ea662962a2bBrian Salomon            SkDEBUGCODE(instanceData->fReserveCnt = reserveCnt);
131cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton            return instanceData;
132cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton        }
133cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton
134cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton        // Overload this method if we start using other transform types.
135cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton        void append(uint16_t index, float x, float y) {
136cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton            SkASSERT(GrPathRendering::kTranslate_PathTransformType == fTransformType);
137cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton            SkASSERT(fInstanceCount < fReserveCnt);
138cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton            fIndices[fInstanceCount] = index;
139cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton            fTransformValues[2 * fInstanceCount] = x;
140cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton            fTransformValues[2 * fInstanceCount + 1] = y;
141cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton            ++fInstanceCount;
142cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton        }
143cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton
144cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton        TransformType transformType() const { return fTransformType; }
145cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton        int count() const { return fInstanceCount; }
146cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton
147cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton        const uint16_t* indices() const { return fIndices; }
148cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton        uint16_t* indices() { return fIndices; }
149cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton
150cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton        const float* transformValues() const { return fTransformValues; }
151cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton        float* transformValues() { return fTransformValues; }
152cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton
153cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton        void ref() const { ++fRefCnt; }
154cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton
155cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton        void unref() const {
156cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton            if (0 == --fRefCnt) {
157cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton                sk_free(const_cast<InstanceData*>(this));
158cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton            }
159cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton        }
160cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton
161cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton    private:
162cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton        static int Align32(int sizeInBytes) { return (sizeInBytes + 3) & ~3; }
163cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton
164cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton        InstanceData() {}
165cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton        ~InstanceData() {}
166cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton
16782c263f6e4452227334c349430f85ea662962a2bBrian Salomon        uint16_t* fIndices;
16882c263f6e4452227334c349430f85ea662962a2bBrian Salomon        float* fTransformValues;
16982c263f6e4452227334c349430f85ea662962a2bBrian Salomon        TransformType fTransformType;
17082c263f6e4452227334c349430f85ea662962a2bBrian Salomon        int fInstanceCount;
17182c263f6e4452227334c349430f85ea662962a2bBrian Salomon        mutable int fRefCnt;
172cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton        SkDEBUGCODE(int fReserveCnt;)
173cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton    };
174cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton
175f8334781914363caf537f22f012fcd5c03c60dadBrian Salomon    static std::unique_ptr<GrDrawOp> Make(const SkMatrix& viewMatrix, SkScalar scale, SkScalar x,
17654d212e1bfaea0be88c3c40820d0b1ae0daebecfBrian Salomon                                          SkScalar y, GrPaint&& paint,
17748d1b4c2b2c0f41a10376ed657cde043d8f11979Brian Salomon                                          GrPathRendering::FillType fill, GrAAType aaType,
178f8334781914363caf537f22f012fcd5c03c60dadBrian Salomon                                          GrPathRange* range, const InstanceData* instanceData,
179f8334781914363caf537f22f012fcd5c03c60dadBrian Salomon                                          const SkRect& bounds) {
18048d1b4c2b2c0f41a10376ed657cde043d8f11979Brian Salomon        return std::unique_ptr<GrDrawOp>(new GrDrawPathRangeOp(viewMatrix, scale, x, y,
18148d1b4c2b2c0f41a10376ed657cde043d8f11979Brian Salomon                                                               std::move(paint), fill, aaType,
18248d1b4c2b2c0f41a10376ed657cde043d8f11979Brian Salomon                                                               range, instanceData, bounds));
183add79ef7cb2ebd7b80bf0fd5e70281ec6ad5f079bsalomon    }
184add79ef7cb2ebd7b80bf0fd5e70281ec6ad5f079bsalomon
1851fcc01c4158bd68c679569e6c7cfbb302d0ce170bsalomon    const char* name() const override { return "DrawPathRange"; }
1861fcc01c4158bd68c679569e6c7cfbb302d0ce170bsalomon
1871fcc01c4158bd68c679569e6c7cfbb302d0ce170bsalomon    SkString dumpInfo() const override;
1881fcc01c4158bd68c679569e6c7cfbb302d0ce170bsalomon
1891fcc01c4158bd68c679569e6c7cfbb302d0ce170bsalomonprivate:
19082c263f6e4452227334c349430f85ea662962a2bBrian Salomon    GrDrawPathRangeOp(const SkMatrix& viewMatrix, SkScalar scale, SkScalar x, SkScalar y,
19148d1b4c2b2c0f41a10376ed657cde043d8f11979Brian Salomon                      GrPaint&& paint, GrPathRendering::FillType fill, GrAAType aaType,
19248d1b4c2b2c0f41a10376ed657cde043d8f11979Brian Salomon                      GrPathRange* range, const InstanceData* instanceData, const SkRect& bounds);
193cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton
194cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton    TransformType transformType() const { return fDraws.head()->fInstanceData->transformType(); }
1951fcc01c4158bd68c679569e6c7cfbb302d0ce170bsalomon
19625a880960a9a689a745a01071ecba3fe494b5940Brian Salomon    bool onCombineIfPossible(GrOp* t, const GrCaps& caps) override;
197add79ef7cb2ebd7b80bf0fd5e70281ec6ad5f079bsalomon
1989e50f7b11e9a9d3dc23c924bbb0f0b85c6f1d6cbBrian Salomon    void onExecute(GrOpFlushState* state) override;
1991fcc01c4158bd68c679569e6c7cfbb302d0ce170bsalomon
200cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton    struct Draw {
201cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton        void set(const InstanceData* instanceData, SkScalar x, SkScalar y) {
202cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton            fInstanceData.reset(SkRef(instanceData));
203cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton            fX = x;
204cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton            fY = y;
205cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton        }
206cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton
207144caf55ffc692bcda77703a73bb9a894f7d024fHal Canary        sk_sp<const InstanceData> fInstanceData;
20882c263f6e4452227334c349430f85ea662962a2bBrian Salomon        SkScalar fX, fY;
209cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton    };
210cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton
2118585dd26bf74edf26a1cd1c31699c03347f78937cdalton    typedef GrPendingIOResource<const GrPathRange, kRead_GrIOType> PendingPathRange;
212cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton    typedef SkTLList<Draw, 4> DrawList;
213cdd4682f450b98bad71b8cb0772c02e0902aaa0dcdalton
21482c263f6e4452227334c349430f85ea662962a2bBrian Salomon    PendingPathRange fPathRange;
21582c263f6e4452227334c349430f85ea662962a2bBrian Salomon    DrawList fDraws;
21682c263f6e4452227334c349430f85ea662962a2bBrian Salomon    int fTotalPathCount;
21782c263f6e4452227334c349430f85ea662962a2bBrian Salomon    SkScalar fScale;
218add79ef7cb2ebd7b80bf0fd5e70281ec6ad5f079bsalomon
21982c263f6e4452227334c349430f85ea662962a2bBrian Salomon    typedef GrDrawPathOpBase INHERITED;
220add79ef7cb2ebd7b80bf0fd5e70281ec6ad5f079bsalomon};
221add79ef7cb2ebd7b80bf0fd5e70281ec6ad5f079bsalomon
222add79ef7cb2ebd7b80bf0fd5e70281ec6ad5f079bsalomon#endif
223