blob: abc3e0d6927132bfbb25e4037185cb7681e68ba7 [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
8#ifndef SkLinearGradient_DEFINED
9#define SkLinearGradient_DEFINED
10
11#include "SkGradientShaderPriv.h"
reedf3182eb2015-11-17 08:12:19 -080012#include "SkNx.h"
13
14struct Sk4fStorage {
15 float fArray[4];
16
17 operator Sk4f() const {
18 return Sk4f::Load(fArray);
19 }
20
21 Sk4fStorage& operator=(const Sk4f& src) {
22 src.store(fArray);
23 return *this;
24 }
25};
rileya@google.com589708b2012-07-26 20:04:23 +000026
27class SkLinearGradient : public SkGradientShaderBase {
28public:
reedaddf2ed2014-08-11 08:28:24 -070029 SkLinearGradient(const SkPoint pts[2], const Descriptor&);
rileya@google.com589708b2012-07-26 20:04:23 +000030
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +000031 class LinearGradientContext : public SkGradientShaderBase::GradientShaderBaseContext {
32 public:
commit-bot@chromium.orge901b6d2014-05-01 19:31:31 +000033 LinearGradientContext(const SkLinearGradient&, const ContextRec&);
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +000034
mtklein36352bf2015-03-25 18:17:31 -070035 void shadeSpan(int x, int y, SkPMColor dstC[], int count) override;
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +000036
reedf3182eb2015-11-17 08:12:19 -080037 struct Rec {
38 Sk4fStorage fColor;
39 float fPos;
40 float fPosScale;
41 };
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +000042 private:
reedf3182eb2015-11-17 08:12:19 -080043 SkTDArray<Rec> fRecs;
44 bool fApplyAlphaAfterInterp;
45
46 void shade4_clamp(int x, int y, SkPMColor dstC[], int count);
47 template <bool, bool> void shade4_dx_clamp(SkPMColor dstC[], int count, float fx, float dx,
48 float invDx, const float dither[2]);
49
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +000050 typedef SkGradientShaderBase::GradientShaderBaseContext INHERITED;
51 };
52
mtklein36352bf2015-03-25 18:17:31 -070053 GradientType asAGradient(GradientInfo* info) const override;
bsalomonc21b09e2015-08-28 18:46:56 -070054#if SK_SUPPORT_GPU
brianosman839345d2016-07-22 11:04:53 -070055 sk_sp<GrFragmentProcessor> asFragmentProcessor(const AsFPArgs&) const override;
bsalomonc21b09e2015-08-28 18:46:56 -070056#endif
rileya@google.com589708b2012-07-26 20:04:23 +000057
commit-bot@chromium.org0f10f7b2014-03-13 18:02:17 +000058 SK_TO_STRING_OVERRIDE()
rileya@google.com589708b2012-07-26 20:04:23 +000059 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLinearGradient)
60
61protected:
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000062 SkLinearGradient(SkReadBuffer& buffer);
mtklein36352bf2015-03-25 18:17:31 -070063 void flatten(SkWriteBuffer& buffer) const override;
Herb Derby83e939b2017-02-07 14:25:11 -050064 Context* onMakeContext(const ContextRec&, SkArenaAlloc*) const override;
Florin Malita47e55a52017-06-06 12:26:54 -040065 Context* onMakeBurstPipelineContext(const ContextRec&, SkArenaAlloc*) const override;
rileya@google.com589708b2012-07-26 20:04:23 +000066
Mike Kleina3771842017-05-04 19:38:48 -040067 bool adjustMatrixAndAppendStages(SkArenaAlloc* alloc,
68 SkMatrix* matrix,
Florin Malita2e409002017-06-28 14:46:54 -040069 SkRasterPipeline* tPipeline,
70 SkRasterPipeline* postPipeline) const final;
Mike Kleina3771842017-05-04 19:38:48 -040071
Florin Malitac86e4702017-01-20 08:41:34 -050072
Matt Sarett6cc6ae752017-04-18 18:29:12 -040073 sk_sp<SkShader> onMakeColorSpace(SkColorSpaceXformer* xformer) const override;
74
rileya@google.com589708b2012-07-26 20:04:23 +000075private:
fmalitabc590c02016-02-22 09:12:33 -080076 class LinearGradient4fContext;
77
reed9fa60da2014-08-21 07:59:51 -070078 friend class SkGradientShader;
rileya@google.com589708b2012-07-26 20:04:23 +000079 typedef SkGradientShaderBase INHERITED;
80 const SkPoint fStart;
81 const SkPoint fEnd;
82};
83
rileya@google.com589708b2012-07-26 20:04:23 +000084#endif