1589708bf7c706348b763e8277004cb160b202bdbrileya@google.com
2589708bf7c706348b763e8277004cb160b202bdbrileya@google.com/*
3589708bf7c706348b763e8277004cb160b202bdbrileya@google.com * Copyright 2012 Google Inc.
4589708bf7c706348b763e8277004cb160b202bdbrileya@google.com *
5589708bf7c706348b763e8277004cb160b202bdbrileya@google.com * Use of this source code is governed by a BSD-style license that can be
6589708bf7c706348b763e8277004cb160b202bdbrileya@google.com * found in the LICENSE file.
7589708bf7c706348b763e8277004cb160b202bdbrileya@google.com */
8589708bf7c706348b763e8277004cb160b202bdbrileya@google.com
9aa64fbfd349789f27b3cc35c1968d9dc0612cf8ecommit-bot@chromium.org#ifndef SkTwoPointConicalGradient_DEFINED
10aa64fbfd349789f27b3cc35c1968d9dc0612cf8ecommit-bot@chromium.org#define SkTwoPointConicalGradient_DEFINED
11589708bf7c706348b763e8277004cb160b202bdbrileya@google.com
12589708bf7c706348b763e8277004cb160b202bdbrileya@google.com#include "SkGradientShaderPriv.h"
13589708bf7c706348b763e8277004cb160b202bdbrileya@google.com
1487fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org// TODO(dominikg): Worth making it truly immutable (i.e. set values in constructor)?
1587fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org// Should only be initialized once via init(). Immutable afterwards.
16589708bf7c706348b763e8277004cb160b202bdbrileya@google.comstruct TwoPtRadial {
17589708bf7c706348b763e8277004cb160b202bdbrileya@google.com    enum {
18589708bf7c706348b763e8277004cb160b202bdbrileya@google.com        kDontDrawT  = 0x80000000
19589708bf7c706348b763e8277004cb160b202bdbrileya@google.com    };
20589708bf7c706348b763e8277004cb160b202bdbrileya@google.com
21589708bf7c706348b763e8277004cb160b202bdbrileya@google.com    float   fCenterX, fCenterY;
22589708bf7c706348b763e8277004cb160b202bdbrileya@google.com    float   fDCenterX, fDCenterY;
23589708bf7c706348b763e8277004cb160b202bdbrileya@google.com    float   fRadius;
24589708bf7c706348b763e8277004cb160b202bdbrileya@google.com    float   fDRadius;
25589708bf7c706348b763e8277004cb160b202bdbrileya@google.com    float   fA;
26589708bf7c706348b763e8277004cb160b202bdbrileya@google.com    float   fRadius2;
27589708bf7c706348b763e8277004cb160b202bdbrileya@google.com    float   fRDR;
2844d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org    bool    fFlipped;
29589708bf7c706348b763e8277004cb160b202bdbrileya@google.com
30589708bf7c706348b763e8277004cb160b202bdbrileya@google.com    void init(const SkPoint& center0, SkScalar rad0,
3144d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org              const SkPoint& center1, SkScalar rad1,
3244d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org              bool flipped);
33fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
34589708bf7c706348b763e8277004cb160b202bdbrileya@google.com    static bool DontDrawT(SkFixed t) {
35589708bf7c706348b763e8277004cb160b202bdbrileya@google.com        return kDontDrawT == (uint32_t)t;
36589708bf7c706348b763e8277004cb160b202bdbrileya@google.com    }
37589708bf7c706348b763e8277004cb160b202bdbrileya@google.com};
38589708bf7c706348b763e8277004cb160b202bdbrileya@google.com
39589708bf7c706348b763e8277004cb160b202bdbrileya@google.com
40589708bf7c706348b763e8277004cb160b202bdbrileya@google.comclass SkTwoPointConicalGradient : public SkGradientShaderBase {
41589708bf7c706348b763e8277004cb160b202bdbrileya@google.com    TwoPtRadial fRec;
42589708bf7c706348b763e8277004cb160b202bdbrileya@google.com    void init();
43589708bf7c706348b763e8277004cb160b202bdbrileya@google.com
44589708bf7c706348b763e8277004cb160b202bdbrileya@google.compublic:
45589708bf7c706348b763e8277004cb160b202bdbrileya@google.com    SkTwoPointConicalGradient(const SkPoint& start, SkScalar startRadius,
46589708bf7c706348b763e8277004cb160b202bdbrileya@google.com                              const SkPoint& end, SkScalar endRadius,
47addf2edf3da20f053daa3897cfe2c52d7369a7b1reed                              bool flippedGrad, const Descriptor&);
48fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
4987fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org
5087fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org    virtual size_t contextSize() const SK_OVERRIDE;
5187fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org
5287fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org    class TwoPointConicalGradientContext : public SkGradientShaderBase::GradientShaderBaseContext {
5387fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org    public:
54e901b6de3ef8dea842008a08fc81e92fb1478d61commit-bot@chromium.org        TwoPointConicalGradientContext(const SkTwoPointConicalGradient&, const ContextRec&);
5587fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org        ~TwoPointConicalGradientContext() {}
5687fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org
5787fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org        virtual void shadeSpan(int x, int y, SkPMColor dstC[], int count) SK_OVERRIDE;
5887fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org
5987fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org    private:
6087fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org        typedef SkGradientShaderBase::GradientShaderBaseContext INHERITED;
6187fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org    };
62589708bf7c706348b763e8277004cb160b202bdbrileya@google.com
63589708bf7c706348b763e8277004cb160b202bdbrileya@google.com    virtual BitmapType asABitmap(SkBitmap* bitmap,
64589708bf7c706348b763e8277004cb160b202bdbrileya@google.com                                 SkMatrix* matrix,
65589708bf7c706348b763e8277004cb160b202bdbrileya@google.com                                 TileMode* xy) const;
66589708bf7c706348b763e8277004cb160b202bdbrileya@google.com    virtual SkShader::GradientType asAGradient(GradientInfo* info) const  SK_OVERRIDE;
67b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    virtual bool asFragmentProcessor(GrContext*, const SkPaint&, const SkMatrix*, GrColor*,
68b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                     GrFragmentProcessor**) const SK_OVERRIDE;
693fbab82bd30158ccabc708a20419025923e08655commit-bot@chromium.org    virtual bool isOpaque() const SK_OVERRIDE;
70589708bf7c706348b763e8277004cb160b202bdbrileya@google.com
711c6d64b78b24083ee9fd7411dac8a4a7e2d03a3crileya@google.com    SkScalar getCenterX1() const { return SkPoint::Distance(fCenter1, fCenter2); }
721c6d64b78b24083ee9fd7411dac8a4a7e2d03a3crileya@google.com    SkScalar getStartRadius() const { return fRadius1; }
731c6d64b78b24083ee9fd7411dac8a4a7e2d03a3crileya@google.com    SkScalar getDiffRadius() const { return fRadius2 - fRadius1; }
742af1a2dbc46ea41e6208ad0c8681f98bd9b27bd8commit-bot@chromium.org    const SkPoint& getStartCenter() const { return fCenter1; }
752af1a2dbc46ea41e6208ad0c8681f98bd9b27bd8commit-bot@chromium.org    const SkPoint& getEndCenter() const { return fCenter2; }
762af1a2dbc46ea41e6208ad0c8681f98bd9b27bd8commit-bot@chromium.org    SkScalar getEndRadius() const { return fRadius2; }
7744d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org    bool isFlippedGrad() const { return fFlippedGrad; }
781c6d64b78b24083ee9fd7411dac8a4a7e2d03a3crileya@google.com
790f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org    SK_TO_STRING_OVERRIDE()
80589708bf7c706348b763e8277004cb160b202bdbrileya@google.com    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkTwoPointConicalGradient)
81fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
82589708bf7c706348b763e8277004cb160b202bdbrileya@google.comprotected:
838b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org    SkTwoPointConicalGradient(SkReadBuffer& buffer);
848b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org    virtual void flatten(SkWriteBuffer& buffer) const SK_OVERRIDE;
85ce56d965069c1649afe14319cb239e6ad670682acommit-bot@chromium.org    virtual Context* onCreateContext(const ContextRec&, void* storage) const SK_OVERRIDE;
86fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
87589708bf7c706348b763e8277004cb160b202bdbrileya@google.comprivate:
8844d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org    SkPoint fCenter1;
8944d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org    SkPoint fCenter2;
9044d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org    SkScalar fRadius1;
9144d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org    SkScalar fRadius2;
9244d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org    bool fFlippedGrad;
93d3b28e8847358460aeae745da44e474f6a7ab25dskia.committer@gmail.com
949fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed    friend class SkGradientShader;
9553783b026a00683c1fb504127c3398dabb61ea73commit-bot@chromium.org    typedef SkGradientShaderBase INHERITED;
96589708bf7c706348b763e8277004cb160b202bdbrileya@google.com};
97589708bf7c706348b763e8277004cb160b202bdbrileya@google.com
98589708bf7c706348b763e8277004cb160b202bdbrileya@google.com#endif
99