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