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