1 /*
2  * Copyright 2016 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 Sk4fGradientBase_DEFINED
9 #define Sk4fGradientBase_DEFINED
10 
11 #include "SkColor.h"
12 #include "SkGradientShaderPriv.h"
13 #include "SkMatrix.h"
14 #include "SkNx.h"
15 #include "SkPM4f.h"
16 #include "SkShader.h"
17 #include "SkTArray.h"
18 
19 class SkGradientShaderBase::
20 GradientShaderBase4fContext : public SkShader::Context {
21 public:
22     GradientShaderBase4fContext(const SkGradientShaderBase&,
23                                 const ContextRec&);
24 
getFlags()25     uint32_t getFlags() const override { return fFlags; }
26 
27 protected:
28     struct Interval {
29         Interval(SkPMColor c0, SkScalar p0,
30                  SkPMColor c1, SkScalar p1,
31                  const Sk4f& componentScale);
32         Interval(const Sk4f& c0, const Sk4f& dc,
33                  SkScalar p0, SkScalar p1);
34 
isZeroRampInterval35         bool isZeroRamp() const { return fZeroRamp; }
36 
37         // true when fx is in [p0,p1)
38         bool contains(SkScalar fx) const;
39 
40         SkPM4f   fC0, fDc;
41         SkScalar fP0, fP1;
42         bool     fZeroRamp;
43     };
44 
45     const Interval* findInterval(SkScalar fx) const;
46 
47     SkSTArray<8, Interval, true> fIntervals;
48     SkMatrix                     fDstToPos;
49     SkMatrix::MapXYProc          fDstToPosProc;
50     uint8_t                      fDstToPosClass;
51     uint8_t                      fFlags;
52     bool                         fDither;
53     bool                         fColorsArePremul;
54 
55 private:
56     using INHERITED = SkShader::Context;
57 
58     mutable const Interval*      fCachedInterval;
59 };
60 
61 #endif // Sk4fGradientBase_DEFINED
62