/*
 * Copyright 2017 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef SkSVGRadialGradient_DEFINED
#define SkSVGRadialGradient_DEFINED

#include "SkSVGGradient.h"
#include "SkSVGTypes.h"

class SkSVGRadialGradient final : public SkSVGGradient {
public:
    ~SkSVGRadialGradient() override = default;
    static sk_sp<SkSVGRadialGradient> Make() {
        return sk_sp<SkSVGRadialGradient>(new SkSVGRadialGradient());
    }

    void setCx(const SkSVGLength&);
    void setCy(const SkSVGLength&);
    void setR(const SkSVGLength&);
    void setFx(const SkSVGLength&);
    void setFy(const SkSVGLength&);

protected:
    void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;

    sk_sp<SkShader> onMakeShader(const SkSVGRenderContext&,
                                 const SkColor*, const SkScalar*, int count,
                                 SkShader::TileMode, const SkMatrix&) const override;
private:
    SkSVGRadialGradient();

    SkSVGLength fCx = SkSVGLength(50, SkSVGLength::Unit::kPercentage);
    SkSVGLength fCy = SkSVGLength(50, SkSVGLength::Unit::kPercentage);
    SkSVGLength fR  = SkSVGLength(50, SkSVGLength::Unit::kPercentage);
    SkTLazy<SkSVGLength> fFx;
    SkTLazy<SkSVGLength> fFy;


   typedef SkSVGGradient INHERITED;
};

#endif // SkSVGRadialGradient_DEFINED
