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