rileya@google.com | 589708b | 2012-07-26 20:04:23 +0000 | [diff] [blame] | 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 | |
Mike Klein | c0bd9f9 | 2019-04-23 12:05:21 -0500 | [diff] [blame] | 8 | #include "src/core/SkRasterPipeline.h" |
| 9 | #include "src/core/SkReadBuffer.h" |
| 10 | #include "src/core/SkWriteBuffer.h" |
| 11 | #include "src/shaders/gradients/SkRadialGradient.h" |
rileya@google.com | 589708b | 2012-07-26 20:04:23 +0000 | [diff] [blame] | 12 | |
rileya@google.com | 589708b | 2012-07-26 20:04:23 +0000 | [diff] [blame] | 13 | namespace { |
| 14 | |
mtklein | cc695fe | 2014-12-10 10:29:19 -0800 | [diff] [blame] | 15 | SkMatrix rad_to_unit_matrix(const SkPoint& center, SkScalar radius) { |
rileya@google.com | 589708b | 2012-07-26 20:04:23 +0000 | [diff] [blame] | 16 | SkScalar inv = SkScalarInvert(radius); |
| 17 | |
mtklein | cc695fe | 2014-12-10 10:29:19 -0800 | [diff] [blame] | 18 | SkMatrix matrix; |
| 19 | matrix.setTranslate(-center.fX, -center.fY); |
| 20 | matrix.postScale(inv, inv); |
| 21 | return matrix; |
rileya@google.com | 589708b | 2012-07-26 20:04:23 +0000 | [diff] [blame] | 22 | } |
| 23 | |
commit-bot@chromium.org | 34150b4 | 2013-10-16 18:59:44 +0000 | [diff] [blame] | 24 | } // namespace |
| 25 | |
rileya@google.com | 98e8b6d | 2012-07-31 20:38:06 +0000 | [diff] [blame] | 26 | ///////////////////////////////////////////////////////////////////// |
| 27 | |
reed | addf2ed | 2014-08-11 08:28:24 -0700 | [diff] [blame] | 28 | SkRadialGradient::SkRadialGradient(const SkPoint& center, SkScalar radius, const Descriptor& desc) |
mtklein | cc695fe | 2014-12-10 10:29:19 -0800 | [diff] [blame] | 29 | : SkGradientShaderBase(desc, rad_to_unit_matrix(center, radius)) |
reed | addf2ed | 2014-08-11 08:28:24 -0700 | [diff] [blame] | 30 | , fCenter(center) |
mtklein | cc695fe | 2014-12-10 10:29:19 -0800 | [diff] [blame] | 31 | , fRadius(radius) { |
rileya@google.com | 589708b | 2012-07-26 20:04:23 +0000 | [diff] [blame] | 32 | } |
| 33 | |
rileya@google.com | 589708b | 2012-07-26 20:04:23 +0000 | [diff] [blame] | 34 | SkShader::GradientType SkRadialGradient::asAGradient(GradientInfo* info) const { |
| 35 | if (info) { |
| 36 | commonAsAGradient(info); |
| 37 | info->fPoint[0] = fCenter; |
| 38 | info->fRadius[0] = fRadius; |
| 39 | } |
| 40 | return kRadial_GradientType; |
| 41 | } |
| 42 | |
reed | 60c9b58 | 2016-04-03 09:11:13 -0700 | [diff] [blame] | 43 | sk_sp<SkFlattenable> SkRadialGradient::CreateProc(SkReadBuffer& buffer) { |
reed | 9fa60da | 2014-08-21 07:59:51 -0700 | [diff] [blame] | 44 | DescriptorScope desc; |
| 45 | if (!desc.unflatten(buffer)) { |
halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 46 | return nullptr; |
reed | 9fa60da | 2014-08-21 07:59:51 -0700 | [diff] [blame] | 47 | } |
| 48 | const SkPoint center = buffer.readPoint(); |
| 49 | const SkScalar radius = buffer.readScalar(); |
brianosman | e25d71c | 2016-09-28 11:27:28 -0700 | [diff] [blame] | 50 | return SkGradientShader::MakeRadial(center, radius, desc.fColors, std::move(desc.fColorSpace), |
| 51 | desc.fPos, desc.fCount, desc.fTileMode, desc.fGradFlags, |
| 52 | desc.fLocalMatrix); |
reed | 9fa60da | 2014-08-21 07:59:51 -0700 | [diff] [blame] | 53 | } |
rileya@google.com | 589708b | 2012-07-26 20:04:23 +0000 | [diff] [blame] | 54 | |
commit-bot@chromium.org | 8b0e8ac | 2014-01-30 18:58:24 +0000 | [diff] [blame] | 55 | void SkRadialGradient::flatten(SkWriteBuffer& buffer) const { |
rileya@google.com | 589708b | 2012-07-26 20:04:23 +0000 | [diff] [blame] | 56 | this->INHERITED::flatten(buffer); |
| 57 | buffer.writePoint(fCenter); |
| 58 | buffer.writeScalar(fRadius); |
| 59 | } |
| 60 | |
Florin Malita | 50b2084 | 2017-07-29 19:08:28 -0400 | [diff] [blame] | 61 | void SkRadialGradient::appendGradientStages(SkArenaAlloc*, SkRasterPipeline* p, |
| 62 | SkRasterPipeline*) const { |
Herb Derby | 090fbf8 | 2017-05-08 15:10:36 -0400 | [diff] [blame] | 63 | p->append(SkRasterPipeline::xy_to_radius); |
Herb Derby | 090fbf8 | 2017-05-08 15:10:36 -0400 | [diff] [blame] | 64 | } |
Michael Ludwig | afebe16 | 2018-09-12 15:24:34 -0400 | [diff] [blame] | 65 | |
Mike Klein | ce9e060 | 2020-01-29 09:47:44 -0600 | [diff] [blame] | 66 | skvm::F32 SkRadialGradient::transformT(skvm::Builder* p, skvm::Uniforms*, |
| 67 | skvm::F32 x, skvm::F32 y, skvm::I32* mask) const { |
Mike Reed | b6e7ef1 | 2020-04-03 13:34:26 -0400 | [diff] [blame] | 68 | return sqrt(x*x + y*y); |
Mike Klein | ba9da46 | 2020-01-28 14:25:09 -0600 | [diff] [blame] | 69 | } |
| 70 | |
Michael Ludwig | afebe16 | 2018-09-12 15:24:34 -0400 | [diff] [blame] | 71 | ///////////////////////////////////////////////////////////////////// |
| 72 | |
| 73 | #if SK_SUPPORT_GPU |
| 74 | |
Mike Klein | c0bd9f9 | 2019-04-23 12:05:21 -0500 | [diff] [blame] | 75 | #include "src/gpu/gradients/GrGradientShader.h" |
Michael Ludwig | afebe16 | 2018-09-12 15:24:34 -0400 | [diff] [blame] | 76 | |
| 77 | std::unique_ptr<GrFragmentProcessor> SkRadialGradient::asFragmentProcessor( |
| 78 | const GrFPArgs& args) const { |
| 79 | return GrGradientShader::MakeRadial(*this, args); |
| 80 | } |
| 81 | |
| 82 | #endif |