1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2018 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#ifndef SkSGGradient_DEFINED 9cb93a386Sopenharmony_ci#define SkSGGradient_DEFINED 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "modules/sksg/include/SkSGRenderEffect.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_ci#include "include/core/SkColor.h" 14cb93a386Sopenharmony_ci#include "include/core/SkPoint.h" 15cb93a386Sopenharmony_ci#include "include/core/SkScalar.h" 16cb93a386Sopenharmony_ci#include "include/core/SkShader.h" 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_ci#include <vector> 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_cinamespace sksg { 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_ci/** 23cb93a386Sopenharmony_ci * Gradient base class. 24cb93a386Sopenharmony_ci */ 25cb93a386Sopenharmony_ciclass Gradient : public Shader { 26cb93a386Sopenharmony_cipublic: 27cb93a386Sopenharmony_ci struct ColorStop { 28cb93a386Sopenharmony_ci SkScalar fPosition; 29cb93a386Sopenharmony_ci SkColor4f fColor; 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ci bool operator==(const ColorStop& other) const { 32cb93a386Sopenharmony_ci return fPosition == other.fPosition && fColor == other.fColor; 33cb93a386Sopenharmony_ci } 34cb93a386Sopenharmony_ci }; 35cb93a386Sopenharmony_ci 36cb93a386Sopenharmony_ci SG_ATTRIBUTE(ColorStops, std::vector<ColorStop>, fColorStops) 37cb93a386Sopenharmony_ci SG_ATTRIBUTE(TileMode , SkTileMode , fTileMode ) 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ciprotected: 40cb93a386Sopenharmony_ci sk_sp<SkShader> onRevalidateShader() final; 41cb93a386Sopenharmony_ci 42cb93a386Sopenharmony_ci virtual sk_sp<SkShader> onMakeShader(const std::vector<SkColor4f>& colors, 43cb93a386Sopenharmony_ci const std::vector<SkScalar >& positions) const = 0; 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ciprotected: 46cb93a386Sopenharmony_ci Gradient() = default; 47cb93a386Sopenharmony_ci 48cb93a386Sopenharmony_ciprivate: 49cb93a386Sopenharmony_ci std::vector<ColorStop> fColorStops; 50cb93a386Sopenharmony_ci SkTileMode fTileMode = SkTileMode::kClamp; 51cb93a386Sopenharmony_ci 52cb93a386Sopenharmony_ci using INHERITED = Shader; 53cb93a386Sopenharmony_ci}; 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_ciclass LinearGradient final : public Gradient { 56cb93a386Sopenharmony_cipublic: 57cb93a386Sopenharmony_ci static sk_sp<LinearGradient> Make() { 58cb93a386Sopenharmony_ci return sk_sp<LinearGradient>(new LinearGradient()); 59cb93a386Sopenharmony_ci } 60cb93a386Sopenharmony_ci 61cb93a386Sopenharmony_ci SG_ATTRIBUTE(StartPoint, SkPoint, fStartPoint) 62cb93a386Sopenharmony_ci SG_ATTRIBUTE(EndPoint , SkPoint, fEndPoint ) 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ciprotected: 65cb93a386Sopenharmony_ci sk_sp<SkShader> onMakeShader(const std::vector<SkColor4f>&, 66cb93a386Sopenharmony_ci const std::vector<SkScalar >&) const override; 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ciprivate: 69cb93a386Sopenharmony_ci LinearGradient() = default; 70cb93a386Sopenharmony_ci 71cb93a386Sopenharmony_ci SkPoint fStartPoint = SkPoint::Make(0, 0), 72cb93a386Sopenharmony_ci fEndPoint = SkPoint::Make(0, 0); 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_ci using INHERITED = Gradient; 75cb93a386Sopenharmony_ci}; 76cb93a386Sopenharmony_ci 77cb93a386Sopenharmony_ciclass RadialGradient final : public Gradient { 78cb93a386Sopenharmony_cipublic: 79cb93a386Sopenharmony_ci static sk_sp<RadialGradient> Make() { 80cb93a386Sopenharmony_ci return sk_sp<RadialGradient>(new RadialGradient()); 81cb93a386Sopenharmony_ci } 82cb93a386Sopenharmony_ci 83cb93a386Sopenharmony_ci SG_ATTRIBUTE(StartCenter, SkPoint , fStartCenter) 84cb93a386Sopenharmony_ci SG_ATTRIBUTE(EndCenter , SkPoint , fEndCenter ) 85cb93a386Sopenharmony_ci SG_ATTRIBUTE(StartRadius, SkScalar, fStartRadius) 86cb93a386Sopenharmony_ci SG_ATTRIBUTE(EndRadius , SkScalar, fEndRadius ) 87cb93a386Sopenharmony_ci 88cb93a386Sopenharmony_ciprotected: 89cb93a386Sopenharmony_ci sk_sp<SkShader> onMakeShader(const std::vector<SkColor4f>&, 90cb93a386Sopenharmony_ci const std::vector<SkScalar >&) const override; 91cb93a386Sopenharmony_ci 92cb93a386Sopenharmony_ciprivate: 93cb93a386Sopenharmony_ci RadialGradient() = default; 94cb93a386Sopenharmony_ci 95cb93a386Sopenharmony_ci SkPoint fStartCenter = SkPoint::Make(0, 0), 96cb93a386Sopenharmony_ci fEndCenter = SkPoint::Make(0, 0); 97cb93a386Sopenharmony_ci SkScalar fStartRadius = 0, 98cb93a386Sopenharmony_ci fEndRadius = 0; 99cb93a386Sopenharmony_ci 100cb93a386Sopenharmony_ci using INHERITED = Gradient; 101cb93a386Sopenharmony_ci}; 102cb93a386Sopenharmony_ci 103cb93a386Sopenharmony_ci} // namespace sksg 104cb93a386Sopenharmony_ci 105cb93a386Sopenharmony_ci#endif // SkSGGradient_DEFINED 106