Line data Source code
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 :
8 : #ifndef SkLinearGradient_DEFINED
9 : #define SkLinearGradient_DEFINED
10 :
11 : #include "SkGradientShaderPriv.h"
12 : #include "SkNx.h"
13 :
14 : struct Sk4fStorage {
15 : float fArray[4];
16 :
17 1270 : operator Sk4f() const {
18 2540 : return Sk4f::Load(fArray);
19 : }
20 :
21 81 : Sk4fStorage& operator=(const Sk4f& src) {
22 81 : src.store(fArray);
23 81 : return *this;
24 : }
25 : };
26 :
27 75 : class SkLinearGradient : public SkGradientShaderBase {
28 : public:
29 : enum {
30 : // Temp flag for testing the 4f impl.
31 : kForce4fContext_PrivateFlag = 1 << 7,
32 : };
33 :
34 : SkLinearGradient(const SkPoint pts[2], const Descriptor&);
35 :
36 25 : class LinearGradientContext : public SkGradientShaderBase::GradientShaderBaseContext {
37 : public:
38 : LinearGradientContext(const SkLinearGradient&, const ContextRec&);
39 :
40 : void shadeSpan(int x, int y, SkPMColor dstC[], int count) override;
41 :
42 : struct Rec {
43 : Sk4fStorage fColor;
44 : float fPos;
45 : float fPosScale;
46 : };
47 : private:
48 : SkTDArray<Rec> fRecs;
49 : bool fApplyAlphaAfterInterp;
50 :
51 : void shade4_clamp(int x, int y, SkPMColor dstC[], int count);
52 : template <bool, bool> void shade4_dx_clamp(SkPMColor dstC[], int count, float fx, float dx,
53 : float invDx, const float dither[2]);
54 :
55 : typedef SkGradientShaderBase::GradientShaderBaseContext INHERITED;
56 : };
57 :
58 : GradientType asAGradient(GradientInfo* info) const override;
59 : #if SK_SUPPORT_GPU
60 : sk_sp<GrFragmentProcessor> asFragmentProcessor(const AsFPArgs&) const override;
61 : #endif
62 :
63 : SK_TO_STRING_OVERRIDE()
64 0 : SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLinearGradient)
65 :
66 : protected:
67 : SkLinearGradient(SkReadBuffer& buffer);
68 : void flatten(SkWriteBuffer& buffer) const override;
69 : Context* onMakeContext(const ContextRec&, SkArenaAlloc*) const override;
70 :
71 : bool onAppendStages(SkRasterPipeline*, SkColorSpace*, SkArenaAlloc*,
72 : const SkMatrix&, const SkPaint&, const SkMatrix*) const override;
73 :
74 : private:
75 : class LinearGradient4fContext;
76 :
77 : friend class SkGradientShader;
78 : typedef SkGradientShaderBase INHERITED;
79 : const SkPoint fStart;
80 : const SkPoint fEnd;
81 : };
82 :
83 : #endif
|