Update rive-cpp to 2.0 version
[platform/core/uifw/rive-tizen.git] / submodule / skia / src / shaders / gradients / SkRadialGradient.cpp
1 /*
2  * Copyright 2012 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7
8 #include "src/shaders/gradients/SkRadialGradient.h"
9
10 #include "src/core/SkRasterPipeline.h"
11 #include "src/core/SkReadBuffer.h"
12 #include "src/core/SkWriteBuffer.h"
13
14 #ifdef SK_ENABLE_SKSL
15 #include "src/core/SkKeyHelpers.h"
16 #endif
17
18 namespace {
19
20 SkMatrix rad_to_unit_matrix(const SkPoint& center, SkScalar radius) {
21     SkScalar    inv = SkScalarInvert(radius);
22
23     SkMatrix matrix;
24     matrix.setTranslate(-center.fX, -center.fY);
25     matrix.postScale(inv, inv);
26     return matrix;
27 }
28
29 }  // namespace
30
31 /////////////////////////////////////////////////////////////////////
32
33 SkRadialGradient::SkRadialGradient(const SkPoint& center, SkScalar radius, const Descriptor& desc)
34     : SkGradientShaderBase(desc, rad_to_unit_matrix(center, radius))
35     , fCenter(center)
36     , fRadius(radius) {
37 }
38
39 SkShader::GradientType SkRadialGradient::asAGradient(GradientInfo* info) const {
40     if (info) {
41         commonAsAGradient(info);
42         info->fPoint[0] = fCenter;
43         info->fRadius[0] = fRadius;
44     }
45     return kRadial_GradientType;
46 }
47
48 sk_sp<SkFlattenable> SkRadialGradient::CreateProc(SkReadBuffer& buffer) {
49     DescriptorScope desc;
50     if (!desc.unflatten(buffer)) {
51         return nullptr;
52     }
53     const SkPoint center = buffer.readPoint();
54     const SkScalar radius = buffer.readScalar();
55     return SkGradientShader::MakeRadial(center, radius, desc.fColors, std::move(desc.fColorSpace),
56                                         desc.fPos, desc.fCount, desc.fTileMode, desc.fGradFlags,
57                                         desc.fLocalMatrix);
58 }
59
60 void SkRadialGradient::flatten(SkWriteBuffer& buffer) const {
61     this->INHERITED::flatten(buffer);
62     buffer.writePoint(fCenter);
63     buffer.writeScalar(fRadius);
64 }
65
66 void SkRadialGradient::appendGradientStages(SkArenaAlloc*, SkRasterPipeline* p,
67                                             SkRasterPipeline*) const {
68     p->append(SkRasterPipeline::xy_to_radius);
69 }
70
71 skvm::F32 SkRadialGradient::transformT(skvm::Builder* p, skvm::Uniforms*,
72                                        skvm::Coord coord, skvm::I32* mask) const {
73     return sqrt(coord.x*coord.x + coord.y*coord.y);
74 }
75
76 /////////////////////////////////////////////////////////////////////
77
78 #if SK_SUPPORT_GPU
79
80 #include "src/gpu/ganesh/gradients/GrGradientShader.h"
81
82 std::unique_ptr<GrFragmentProcessor> SkRadialGradient::asFragmentProcessor(
83         const GrFPArgs& args) const {
84     return GrGradientShader::MakeRadial(*this, args);
85 }
86
87 #endif
88
89 #ifdef SK_ENABLE_SKSL
90 void SkRadialGradient::addToKey(const SkKeyContext& keyContext,
91                                 SkPaintParamsKeyBuilder* builder,
92                                 SkPipelineDataGatherer* gatherer) const {
93     GradientShaderBlocks::GradientData data(kRadial_GradientType,
94                                             SkM44(this->getLocalMatrix()),
95                                             fCenter, { 0.0f, 0.0f },
96                                             fRadius, 0.0f,
97                                             0.0f, 0.0f,
98                                             fTileMode,
99                                             fColorCount,
100                                             fOrigColors4f,
101                                             fOrigPos);
102
103     GradientShaderBlocks::AddToKey(keyContext, builder, gatherer, data);
104 }
105 #endif