Home | History | Annotate | Download | only in gradients
      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     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 };
     26 
     27 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     size_t contextSize(const ContextRec&) const override;
     37 
     38     class LinearGradientContext : public SkGradientShaderBase::GradientShaderBaseContext {
     39     public:
     40         LinearGradientContext(const SkLinearGradient&, const ContextRec&);
     41 
     42         void shadeSpan(int x, int y, SkPMColor dstC[], int count) override;
     43 
     44         struct Rec {
     45             Sk4fStorage fColor;
     46             float       fPos;
     47             float       fPosScale;
     48         };
     49     private:
     50         SkTDArray<Rec>  fRecs;
     51         bool            fApplyAlphaAfterInterp;
     52 
     53         void shade4_clamp(int x, int y, SkPMColor dstC[], int count);
     54         template <bool, bool> void shade4_dx_clamp(SkPMColor dstC[], int count, float fx, float dx,
     55                                                    float invDx, const float dither[2]);
     56 
     57         typedef SkGradientShaderBase::GradientShaderBaseContext INHERITED;
     58     };
     59 
     60     GradientType asAGradient(GradientInfo* info) const override;
     61 #if SK_SUPPORT_GPU
     62     const GrFragmentProcessor* asFragmentProcessor(GrContext*,
     63                                                    const SkMatrix& viewM,
     64                                                    const SkMatrix*,
     65                                                    SkFilterQuality) const override;
     66 #endif
     67 
     68     SK_TO_STRING_OVERRIDE()
     69     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLinearGradient)
     70 
     71 protected:
     72     SkLinearGradient(SkReadBuffer& buffer);
     73     void flatten(SkWriteBuffer& buffer) const override;
     74     Context* onCreateContext(const ContextRec&, void* storage) const override;
     75 
     76 private:
     77     class LinearGradient4fContext;
     78 
     79     friend class SkGradientShader;
     80     typedef SkGradientShaderBase INHERITED;
     81     const SkPoint fStart;
     82     const SkPoint fEnd;
     83 };
     84 
     85 #endif
     86