SkTwoPointConicalGradient.h revision ce56d965069c1649afe14319cb239e6ad670682a
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. 16struct 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 40class SkTwoPointConicalGradient : public SkGradientShaderBase { 41 TwoPtRadial fRec; 42 void init(); 43 44public: 45 SkTwoPointConicalGradient(const SkPoint& start, SkScalar startRadius, 46 const SkPoint& end, SkScalar endRadius, 47 bool flippedGrad, const Descriptor&, 48 const SkMatrix* localMatrix); 49 50 51 virtual size_t contextSize() const SK_OVERRIDE; 52 53 class TwoPointConicalGradientContext : public SkGradientShaderBase::GradientShaderBaseContext { 54 public: 55 TwoPointConicalGradientContext(const SkTwoPointConicalGradient&, const ContextRec&); 56 ~TwoPointConicalGradientContext() {} 57 58 virtual void shadeSpan(int x, int y, SkPMColor dstC[], int count) SK_OVERRIDE; 59 60 private: 61 typedef SkGradientShaderBase::GradientShaderBaseContext INHERITED; 62 }; 63 64 virtual BitmapType asABitmap(SkBitmap* bitmap, 65 SkMatrix* matrix, 66 TileMode* xy) const; 67 virtual SkShader::GradientType asAGradient(GradientInfo* info) const SK_OVERRIDE; 68 virtual GrEffectRef* asNewEffect(GrContext* context, const SkPaint& paint) 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 82protected: 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 87private: 88 SkPoint fCenter1; 89 SkPoint fCenter2; 90 SkScalar fRadius1; 91 SkScalar fRadius2; 92 bool fFlippedGrad; 93 94 typedef SkGradientShaderBase INHERITED; 95}; 96 97#endif 98