| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2012 Google Inc. | 3 * Copyright 2012 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 #include "SkTwoPointRadialGradient.h" | 9 #include "SkTwoPointRadialGradient.h" |
| 10 | 10 |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 160 *dstC++ = cache[index >> SkGradientShaderBase::kCache32Shift]; | 160 *dstC++ = cache[index >> SkGradientShaderBase::kCache32Shift]; |
| 161 fx += dx; | 161 fx += dx; |
| 162 fy += dy; | 162 fy += dy; |
| 163 b += db; | 163 b += db; |
| 164 } | 164 } |
| 165 } | 165 } |
| 166 } | 166 } |
| 167 | 167 |
| 168 ///////////////////////////////////////////////////////////////////// | 168 ///////////////////////////////////////////////////////////////////// |
| 169 | 169 |
| 170 static SkMatrix pts_to_unit(const SkPoint& start, SkScalar diffRadius) { |
| 171 SkScalar inv = diffRadius ? SkScalarInvert(diffRadius) : 0; |
| 172 SkMatrix matrix; |
| 173 matrix.setTranslate(-start.fX, -start.fY); |
| 174 matrix.postScale(inv, inv); |
| 175 return matrix; |
| 176 } |
| 177 |
| 170 SkTwoPointRadialGradient::SkTwoPointRadialGradient(const SkPoint& start, SkScala
r startRadius, | 178 SkTwoPointRadialGradient::SkTwoPointRadialGradient(const SkPoint& start, SkScala
r startRadius, |
| 171 const SkPoint& end, SkScalar
endRadius, | 179 const SkPoint& end, SkScalar
endRadius, |
| 172 const Descriptor& desc) | 180 const Descriptor& desc) |
| 173 : SkGradientShaderBase(desc) | 181 : SkGradientShaderBase(desc, pts_to_unit(start, endRadius - startRadius)) |
| 174 , fCenter1(start) | 182 , fCenter1(start) |
| 175 , fCenter2(end) | 183 , fCenter2(end) |
| 176 , fRadius1(startRadius) | 184 , fRadius1(startRadius) |
| 177 , fRadius2(endRadius) | 185 , fRadius2(endRadius) |
| 178 { | 186 { |
| 179 init(); | 187 fDiff = fCenter1 - fCenter2; |
| 188 fDiffRadius = fRadius2 - fRadius1; |
| 189 // hack to avoid zero-divide for now |
| 190 SkScalar inv = fDiffRadius ? SkScalarInvert(fDiffRadius) : 0; |
| 191 fDiff.fX = SkScalarMul(fDiff.fX, inv); |
| 192 fDiff.fY = SkScalarMul(fDiff.fY, inv); |
| 193 fStartRadius = SkScalarMul(fRadius1, inv); |
| 194 fSr2D2 = SkScalarSquare(fStartRadius); |
| 195 fA = SkScalarSquare(fDiff.fX) + SkScalarSquare(fDiff.fY) - SK_Scalar1; |
| 196 fOneOverTwoA = fA ? SkScalarInvert(fA * 2) : 0; |
| 180 } | 197 } |
| 181 | 198 |
| 182 SkShader::BitmapType SkTwoPointRadialGradient::asABitmap( | 199 SkShader::BitmapType SkTwoPointRadialGradient::asABitmap( |
| 183 SkBitmap* bitmap, | 200 SkBitmap* bitmap, |
| 184 SkMatrix* matrix, | 201 SkMatrix* matrix, |
| 185 SkShader::TileMode* xy) const { | 202 SkShader::TileMode* xy) const { |
| 186 if (bitmap) { | 203 if (bitmap) { |
| 187 this->getGradientTableBitmap(bitmap); | 204 this->getGradientTableBitmap(bitmap); |
| 188 } | 205 } |
| 189 SkScalar diffL = 0; // just to avoid gcc warning | 206 SkScalar diffL = 0; // just to avoid gcc warning |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 359 | 376 |
| 360 void SkTwoPointRadialGradient::flatten( | 377 void SkTwoPointRadialGradient::flatten( |
| 361 SkWriteBuffer& buffer) const { | 378 SkWriteBuffer& buffer) const { |
| 362 this->INHERITED::flatten(buffer); | 379 this->INHERITED::flatten(buffer); |
| 363 buffer.writePoint(fCenter1); | 380 buffer.writePoint(fCenter1); |
| 364 buffer.writePoint(fCenter2); | 381 buffer.writePoint(fCenter2); |
| 365 buffer.writeScalar(fRadius1); | 382 buffer.writeScalar(fRadius1); |
| 366 buffer.writeScalar(fRadius2); | 383 buffer.writeScalar(fRadius2); |
| 367 } | 384 } |
| 368 | 385 |
| 369 void SkTwoPointRadialGradient::init() { | |
| 370 fDiff = fCenter1 - fCenter2; | |
| 371 fDiffRadius = fRadius2 - fRadius1; | |
| 372 // hack to avoid zero-divide for now | |
| 373 SkScalar inv = fDiffRadius ? SkScalarInvert(fDiffRadius) : 0; | |
| 374 fDiff.fX = SkScalarMul(fDiff.fX, inv); | |
| 375 fDiff.fY = SkScalarMul(fDiff.fY, inv); | |
| 376 fStartRadius = SkScalarMul(fRadius1, inv); | |
| 377 fSr2D2 = SkScalarSquare(fStartRadius); | |
| 378 fA = SkScalarSquare(fDiff.fX) + SkScalarSquare(fDiff.fY) - SK_Scalar1; | |
| 379 fOneOverTwoA = fA ? SkScalarInvert(fA * 2) : 0; | |
| 380 | |
| 381 fPtsToUnit.setTranslate(-fCenter1.fX, -fCenter1.fY); | |
| 382 fPtsToUnit.postScale(inv, inv); | |
| 383 } | |
| 384 | |
| 385 ///////////////////////////////////////////////////////////////////// | 386 ///////////////////////////////////////////////////////////////////// |
| 386 | 387 |
| 387 #if SK_SUPPORT_GPU | 388 #if SK_SUPPORT_GPU |
| 388 | 389 |
| 389 #include "SkGr.h" | 390 #include "SkGr.h" |
| 390 #include "gl/builders/GrGLProgramBuilder.h" | 391 #include "gl/builders/GrGLProgramBuilder.h" |
| 391 | 392 |
| 392 // For brevity | 393 // For brevity |
| 393 typedef GrGLProgramDataManager::UniformHandle UniformHandle; | 394 typedef GrGLProgramDataManager::UniformHandle UniformHandle; |
| 394 | 395 |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 710 | 711 |
| 711 #else | 712 #else |
| 712 | 713 |
| 713 bool SkTwoPointRadialGradient::asFragmentProcessor(GrContext*, const SkPaint&, c
onst SkMatrix*, | 714 bool SkTwoPointRadialGradient::asFragmentProcessor(GrContext*, const SkPaint&, c
onst SkMatrix*, |
| 714 GrColor*, GrFragmentProcessor
**) const { | 715 GrColor*, GrFragmentProcessor
**) const { |
| 715 SkDEBUGFAIL("Should not call in GPU-less build"); | 716 SkDEBUGFAIL("Should not call in GPU-less build"); |
| 716 return false; | 717 return false; |
| 717 } | 718 } |
| 718 | 719 |
| 719 #endif | 720 #endif |
| OLD | NEW |