1 2 /* 3 * Copyright 2012 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 #ifndef SkTwoPointConicalGradient_DEFINED 10 #define SkTwoPointConicalGradient_DEFINED 11 12 #include "SkGradientShaderPriv.h" 13 14 // TODO(dominikg): Worth making it truly immutable (i.e. set values in constructor)? 15 // Should only be initialized once via init(). Immutable afterwards. 16 struct TwoPtRadial { 17 enum { 18 kDontDrawT = 0x80000000 19 }; 20 21 float fCenterX, fCenterY; 22 float fDCenterX, fDCenterY; 23 float fRadius; 24 float fDRadius; 25 float fA; 26 float fRadius2; 27 float fRDR; 28 bool fFlipped; 29 30 void init(const SkPoint& center0, SkScalar rad0, 31 const SkPoint& center1, SkScalar rad1, 32 bool flipped); 33 34 static bool DontDrawT(SkFixed t) { 35 return kDontDrawT == (uint32_t)t; 36 } 37 }; 38 39 40 class SkTwoPointConicalGradient : public SkGradientShaderBase { 41 TwoPtRadial fRec; 42 void init(); 43 44 public: 45 SkTwoPointConicalGradient(const SkPoint& start, SkScalar startRadius, 46 const SkPoint& end, SkScalar endRadius, 47 bool flippedGrad, const Descriptor&); 48 49 50 virtual size_t contextSize() const SK_OVERRIDE; 51 52 class TwoPointConicalGradientContext : public SkGradientShaderBase::GradientShaderBaseContext { 53 public: 54 TwoPointConicalGradientContext(const SkTwoPointConicalGradient&, const ContextRec&); 55 ~TwoPointConicalGradientContext() {} 56 57 virtual void shadeSpan(int x, int y, SkPMColor dstC[], int count) SK_OVERRIDE; 58 59 private: 60 typedef SkGradientShaderBase::GradientShaderBaseContext INHERITED; 61 }; 62 63 virtual BitmapType asABitmap(SkBitmap* bitmap, 64 SkMatrix* matrix, 65 TileMode* xy) const; 66 virtual SkShader::GradientType asAGradient(GradientInfo* info) const SK_OVERRIDE; 67 virtual bool asFragmentProcessor(GrContext*, const SkPaint&, const SkMatrix*, GrColor*, 68 GrFragmentProcessor**) const SK_OVERRIDE; 69 virtual bool isOpaque() const SK_OVERRIDE; 70 71 SkScalar getCenterX1() const { return SkPoint::Distance(fCenter1, fCenter2); } 72 SkScalar getStartRadius() const { return fRadius1; } 73 SkScalar getDiffRadius() const { return fRadius2 - fRadius1; } 74 const SkPoint& getStartCenter() const { return fCenter1; } 75 const SkPoint& getEndCenter() const { return fCenter2; } 76 SkScalar getEndRadius() const { return fRadius2; } 77 bool isFlippedGrad() const { return fFlippedGrad; } 78 79 SK_TO_STRING_OVERRIDE() 80 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkTwoPointConicalGradient) 81 82 protected: 83 SkTwoPointConicalGradient(SkReadBuffer& buffer); 84 virtual void flatten(SkWriteBuffer& buffer) const SK_OVERRIDE; 85 virtual Context* onCreateContext(const ContextRec&, void* storage) const SK_OVERRIDE; 86 87 private: 88 SkPoint fCenter1; 89 SkPoint fCenter2; 90 SkScalar fRadius1; 91 SkScalar fRadius2; 92 bool fFlippedGrad; 93 94 friend class SkGradientShader; 95 typedef SkGradientShaderBase INHERITED; 96 }; 97 98 #endif 99