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 struct TwoPtRadial { 15 enum { 16 kDontDrawT = 0x80000000 17 }; 18 19 float fCenterX, fCenterY; 20 float fDCenterX, fDCenterY; 21 float fRadius; 22 float fDRadius; 23 float fA; 24 float fRadius2; 25 float fRDR; 26 27 void init(const SkPoint& center0, SkScalar rad0, 28 const SkPoint& center1, SkScalar rad1); 29 30 // used by setup and nextT 31 float fRelX, fRelY, fIncX, fIncY; 32 float fB, fDB; 33 34 void setup(SkScalar fx, SkScalar fy, SkScalar dfx, SkScalar dfy); 35 SkFixed nextT(); 36 37 static bool DontDrawT(SkFixed t) { 38 return kDontDrawT == (uint32_t)t; 39 } 40 }; 41 42 43 class SkTwoPointConicalGradient : public SkGradientShaderBase { 44 TwoPtRadial fRec; 45 void init(); 46 47 public: 48 SkTwoPointConicalGradient(const SkPoint& start, SkScalar startRadius, 49 const SkPoint& end, SkScalar endRadius, 50 const Descriptor&); 51 52 virtual void shadeSpan(int x, int y, SkPMColor* dstCParam, 53 int count) SK_OVERRIDE; 54 virtual bool setContext(const SkBitmap& device, 55 const SkPaint& paint, 56 const SkMatrix& matrix) SK_OVERRIDE; 57 58 virtual BitmapType asABitmap(SkBitmap* bitmap, 59 SkMatrix* matrix, 60 TileMode* xy) const; 61 virtual SkShader::GradientType asAGradient(GradientInfo* info) const SK_OVERRIDE; 62 virtual GrEffectRef* asNewEffect(GrContext* context, const SkPaint& paint) const SK_OVERRIDE; 63 virtual bool isOpaque() const SK_OVERRIDE; 64 65 SkScalar getCenterX1() const { return SkPoint::Distance(fCenter1, fCenter2); } 66 SkScalar getStartRadius() const { return fRadius1; } 67 SkScalar getDiffRadius() const { return fRadius2 - fRadius1; } 68 69 SK_DEVELOPER_TO_STRING() 70 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkTwoPointConicalGradient) 71 72 protected: 73 SkTwoPointConicalGradient(SkFlattenableReadBuffer& buffer); 74 virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE; 75 76 private: 77 typedef SkGradientShaderBase INHERITED; 78 const SkPoint fCenter1; 79 const SkPoint fCenter2; 80 const SkScalar fRadius1; 81 const SkScalar fRadius2; 82 }; 83 84 #endif 85