diff options
author | 2012-07-03 13:43:35 +0000 | |
---|---|---|
committer | 2012-07-03 13:43:35 +0000 | |
commit | 3e33258cd15faae4a2906ddcc586e4008ee20e68 (patch) | |
tree | f58144c5d7a953f095a2288a7aaffcdb5985895d /src/effects | |
parent | dbc5d28979bef1c92aa79e0dc1b5d27a41de5c9a (diff) |
Added GPU implementation of 2-point conical gradient.
Review URL: https://codereview.appspot.com/6354062
git-svn-id: http://skia.googlecode.com/svn/trunk@4442 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/effects')
-rw-r--r-- | src/effects/SkGradientShader.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/effects/SkGradientShader.cpp b/src/effects/SkGradientShader.cpp index b0badc5127..559e711cfe 100644 --- a/src/effects/SkGradientShader.cpp +++ b/src/effects/SkGradientShader.cpp @@ -2304,6 +2304,47 @@ public: return true; } + virtual BitmapType asABitmap(SkBitmap* bitmap, + SkMatrix* matrix, + TileMode* xy, + SkScalar* twoPointRadialParams) const { + + SkPoint diff = fCenter2 - fCenter1; + SkScalar diffRadius = fRadius2 - fRadius1; + SkScalar startRadius = fRadius1; + SkScalar diffLen = 0; + + if (bitmap) { + this->commonAsABitmap(bitmap); + } + if (matrix || twoPointRadialParams) { + diffLen = diff.length(); + } + if (matrix) { + if (diffLen) { + SkScalar invDiffLen = SkScalarInvert(diffLen); + // rotate to align circle centers with the x-axis + matrix->setSinCos(-SkScalarMul(invDiffLen, diff.fY), + SkScalarMul(invDiffLen, diff.fX)); + } else { + matrix->reset(); + } + matrix->preTranslate(-fCenter1.fX, -fCenter1.fY); + } + if (xy) { + xy[0] = fTileMode; + xy[1] = kClamp_TileMode; + } + if (NULL != twoPointRadialParams) { + twoPointRadialParams[0] = diffLen; + twoPointRadialParams[1] = startRadius; + twoPointRadialParams[2] = diffRadius; + } + + return kTwoPointConical_BitmapType; + } + + SkShader::GradientType asAGradient(GradientInfo* info) const SK_OVERRIDE { if (info) { commonAsAGradient(info); |