blob: c0ba7f4dbf52b50f6793579ea38726327fc45389 [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
Florin Malita50b20842017-07-29 19:08:28 -040067 void appendGradientStages(SkArenaAlloc* alloc, SkRasterPipeline* tPipeline,
68 SkRasterPipeline* postPipeline) const final;
Mike Kleina3771842017-05-04 19:38:48 -040069
Florin Malitac86e4702017-01-20 08:41:34 -050070
Matt Sarett6cc6ae752017-04-18 18:29:12 -040071 sk_sp<SkShader> onMakeColorSpace(SkColorSpaceXformer* xformer) const override;
72
rileya@google.com589708b2012-07-26 20:04:23 +000073private:
fmalitabc590c02016-02-22 09:12:33 -080074 class LinearGradient4fContext;
75
reed9fa60da2014-08-21 07:59:51 -070076 friend class SkGradientShader;
rileya@google.com589708b2012-07-26 20:04:23 +000077 typedef SkGradientShaderBase INHERITED;
78 const SkPoint fStart;
79 const SkPoint fEnd;
80};
81
rileya@google.com589708b2012-07-26 20:04:23 +000082#endif