blob: 7209486ea09369c314f30f66b9e9c291a0094182 [file] [log] [blame]
rileya@google.com589708b2012-07-26 20:04:23 +00001/*
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 Sarett6cc6ae752017-04-18 18:29:12 -04008#include "SkColorSpaceXformer.h"
rileya@google.com589708b2012-07-26 20:04:23 +00009#include "SkRadialGradient.h"
Florin Malitad4e9ec82017-10-25 18:00:26 -040010#include "SkRasterPipeline.h"
11#include "SkReadBuffer.h"
12#include "SkWriteBuffer.h"
rileya@google.com589708b2012-07-26 20:04:23 +000013
rileya@google.com589708b2012-07-26 20:04:23 +000014namespace {
15
mtkleincc695fe2014-12-10 10:29:19 -080016SkMatrix rad_to_unit_matrix(const SkPoint& center, SkScalar radius) {
rileya@google.com589708b2012-07-26 20:04:23 +000017 SkScalar inv = SkScalarInvert(radius);
18
mtkleincc695fe2014-12-10 10:29:19 -080019 SkMatrix matrix;
20 matrix.setTranslate(-center.fX, -center.fY);
21 matrix.postScale(inv, inv);
22 return matrix;
rileya@google.com589708b2012-07-26 20:04:23 +000023}
24
commit-bot@chromium.org34150b42013-10-16 18:59:44 +000025} // namespace
26
rileya@google.com98e8b6d2012-07-31 20:38:06 +000027/////////////////////////////////////////////////////////////////////
28
reedaddf2ed2014-08-11 08:28:24 -070029SkRadialGradient::SkRadialGradient(const SkPoint& center, SkScalar radius, const Descriptor& desc)
mtkleincc695fe2014-12-10 10:29:19 -080030 : SkGradientShaderBase(desc, rad_to_unit_matrix(center, radius))
reedaddf2ed2014-08-11 08:28:24 -070031 , fCenter(center)
mtkleincc695fe2014-12-10 10:29:19 -080032 , fRadius(radius) {
rileya@google.com589708b2012-07-26 20:04:23 +000033}
34
rileya@google.com589708b2012-07-26 20:04:23 +000035SkShader::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
reed60c9b582016-04-03 09:11:13 -070044sk_sp<SkFlattenable> SkRadialGradient::CreateProc(SkReadBuffer& buffer) {
reed9fa60da2014-08-21 07:59:51 -070045 DescriptorScope desc;
46 if (!desc.unflatten(buffer)) {
halcanary96fcdcc2015-08-27 07:41:13 -070047 return nullptr;
reed9fa60da2014-08-21 07:59:51 -070048 }
49 const SkPoint center = buffer.readPoint();
50 const SkScalar radius = buffer.readScalar();
brianosmane25d71c2016-09-28 11:27:28 -070051 return SkGradientShader::MakeRadial(center, radius, desc.fColors, std::move(desc.fColorSpace),
52 desc.fPos, desc.fCount, desc.fTileMode, desc.fGradFlags,
53 desc.fLocalMatrix);
reed9fa60da2014-08-21 07:59:51 -070054}
rileya@google.com589708b2012-07-26 20:04:23 +000055
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000056void SkRadialGradient::flatten(SkWriteBuffer& buffer) const {
rileya@google.com589708b2012-07-26 20:04:23 +000057 this->INHERITED::flatten(buffer);
58 buffer.writePoint(fCenter);
59 buffer.writeScalar(fRadius);
60}
61
Matt Sarett6cc6ae752017-04-18 18:29:12 -040062sk_sp<SkShader> SkRadialGradient::onMakeColorSpace(SkColorSpaceXformer* xformer) const {
Florin Malita39d71de2017-10-31 11:33:49 -040063 const AutoXformColors xformedColors(*this, xformer);
64 return SkGradientShader::MakeRadial(fCenter, fRadius, xformedColors.fColors.get(), fOrigPos,
Matt Sarett6cc6ae752017-04-18 18:29:12 -040065 fColorCount, fTileMode, fGradFlags,
66 &this->getLocalMatrix());
67}
68
Florin Malita50b20842017-07-29 19:08:28 -040069void SkRadialGradient::appendGradientStages(SkArenaAlloc*, SkRasterPipeline* p,
70 SkRasterPipeline*) const {
Herb Derby090fbf82017-05-08 15:10:36 -040071 p->append(SkRasterPipeline::xy_to_radius);
Herb Derby090fbf82017-05-08 15:10:36 -040072}
Michael Ludwigafebe162018-09-12 15:24:34 -040073
74/////////////////////////////////////////////////////////////////////
75
76#if SK_SUPPORT_GPU
77
78#include "gradients/GrGradientShader.h"
79
80std::unique_ptr<GrFragmentProcessor> SkRadialGradient::asFragmentProcessor(
81 const GrFPArgs& args) const {
82 return GrGradientShader::MakeRadial(*this, args);
83}
84
85#endif