| 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 "SkRadialGradient.h" | 9 #include "SkRadialGradient.h" |
| 10 #include "SkRadialGradient_Table.h" | 10 #include "SkRadialGradient_Table.h" |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 : SkGradientShaderBase(desc), | 150 : SkGradientShaderBase(desc), |
| 151 fCenter(center), | 151 fCenter(center), |
| 152 fRadius(radius) | 152 fRadius(radius) |
| 153 { | 153 { |
| 154 // make sure our table is insync with our current #define for kSQRT_TABLE_SI
ZE | 154 // make sure our table is insync with our current #define for kSQRT_TABLE_SI
ZE |
| 155 SkASSERT(sizeof(gSqrt8Table) == kSQRT_TABLE_SIZE); | 155 SkASSERT(sizeof(gSqrt8Table) == kSQRT_TABLE_SIZE); |
| 156 | 156 |
| 157 rad_to_unit_matrix(center, radius, &fPtsToUnit); | 157 rad_to_unit_matrix(center, radius, &fPtsToUnit); |
| 158 } | 158 } |
| 159 | 159 |
| 160 size_t SkRadialGradient::contextSize() const { | 160 void SkRadialGradient::shadeSpan16(int x, int y, uint16_t* dstCParam, |
| 161 return sizeof(RadialGradientContext); | 161 int count) { |
| 162 } | |
| 163 | |
| 164 SkShader::Context* SkRadialGradient::createContext(const SkBitmap& device, const
SkPaint& paint, | |
| 165 const SkMatrix& matrix, void*
storage) const { | |
| 166 if (!this->validContext(device, paint, matrix)) { | |
| 167 return NULL; | |
| 168 } | |
| 169 | |
| 170 return SkNEW_PLACEMENT_ARGS(storage, RadialGradientContext, (*this, device,
paint, matrix)); | |
| 171 } | |
| 172 | |
| 173 SkRadialGradient::RadialGradientContext::RadialGradientContext( | |
| 174 const SkRadialGradient& shader, const SkBitmap& device, | |
| 175 const SkPaint& paint, const SkMatrix& matrix) | |
| 176 : INHERITED(shader, device, paint, matrix) {} | |
| 177 | |
| 178 void SkRadialGradient::RadialGradientContext::shadeSpan16(int x, int y, uint16_t
* dstCParam, | |
| 179 int count) { | |
| 180 SkASSERT(count > 0); | 162 SkASSERT(count > 0); |
| 181 | 163 |
| 182 const SkRadialGradient& radialGradient = static_cast<const SkRadialGradient&
>(fShader); | |
| 183 | |
| 184 uint16_t* SK_RESTRICT dstC = dstCParam; | 164 uint16_t* SK_RESTRICT dstC = dstCParam; |
| 185 | 165 |
| 186 SkPoint srcPt; | 166 SkPoint srcPt; |
| 187 SkMatrix::MapXYProc dstProc = fDstToIndexProc; | 167 SkMatrix::MapXYProc dstProc = fDstToIndexProc; |
| 188 TileProc proc = radialGradient.fTileProc; | 168 TileProc proc = fTileProc; |
| 189 const uint16_t* SK_RESTRICT cache = fCache->getCache16(); | 169 const uint16_t* SK_RESTRICT cache = this->getCache16(); |
| 190 int toggle = init_dither_toggle16(x, y); | 170 int toggle = init_dither_toggle16(x, y); |
| 191 | 171 |
| 192 if (fDstToIndexClass != kPerspective_MatrixClass) { | 172 if (fDstToIndexClass != kPerspective_MatrixClass) { |
| 193 dstProc(fDstToIndex, SkIntToScalar(x) + SK_ScalarHalf, | 173 dstProc(fDstToIndex, SkIntToScalar(x) + SK_ScalarHalf, |
| 194 SkIntToScalar(y) + SK_ScalarHalf, &srcPt); | 174 SkIntToScalar(y) + SK_ScalarHalf, &srcPt); |
| 195 | 175 |
| 196 SkScalar sdx = fDstToIndex.getScaleX(); | 176 SkScalar sdx = fDstToIndex.getScaleX(); |
| 197 SkScalar sdy = fDstToIndex.getSkewY(); | 177 SkScalar sdy = fDstToIndex.getSkewY(); |
| 198 | 178 |
| 199 if (fDstToIndexClass == kFixedStepInX_MatrixClass) { | 179 if (fDstToIndexClass == kFixedStepInX_MatrixClass) { |
| 200 SkFixed storage[2]; | 180 SkFixed storage[2]; |
| 201 (void)fDstToIndex.fixedStepInX(SkIntToScalar(y), | 181 (void)fDstToIndex.fixedStepInX(SkIntToScalar(y), |
| 202 &storage[0], &storage[1]); | 182 &storage[0], &storage[1]); |
| 203 sdx = SkFixedToScalar(storage[0]); | 183 sdx = SkFixedToScalar(storage[0]); |
| 204 sdy = SkFixedToScalar(storage[1]); | 184 sdy = SkFixedToScalar(storage[1]); |
| 205 } else { | 185 } else { |
| 206 SkASSERT(fDstToIndexClass == kLinear_MatrixClass); | 186 SkASSERT(fDstToIndexClass == kLinear_MatrixClass); |
| 207 } | 187 } |
| 208 | 188 |
| 209 RadialShade16Proc shadeProc = shadeSpan16_radial_repeat; | 189 RadialShade16Proc shadeProc = shadeSpan16_radial_repeat; |
| 210 if (SkShader::kClamp_TileMode == radialGradient.fTileMode) { | 190 if (SkShader::kClamp_TileMode == fTileMode) { |
| 211 shadeProc = shadeSpan16_radial_clamp; | 191 shadeProc = shadeSpan16_radial_clamp; |
| 212 } else if (SkShader::kMirror_TileMode == radialGradient.fTileMode) { | 192 } else if (SkShader::kMirror_TileMode == fTileMode) { |
| 213 shadeProc = shadeSpan16_radial_mirror; | 193 shadeProc = shadeSpan16_radial_mirror; |
| 214 } else { | 194 } else { |
| 215 SkASSERT(SkShader::kRepeat_TileMode == radialGradient.fTileMode); | 195 SkASSERT(SkShader::kRepeat_TileMode == fTileMode); |
| 216 } | 196 } |
| 217 (*shadeProc)(srcPt.fX, sdx, srcPt.fY, sdy, dstC, | 197 (*shadeProc)(srcPt.fX, sdx, srcPt.fY, sdy, dstC, |
| 218 cache, toggle, count); | 198 cache, toggle, count); |
| 219 } else { // perspective case | 199 } else { // perspective case |
| 220 SkScalar dstX = SkIntToScalar(x); | 200 SkScalar dstX = SkIntToScalar(x); |
| 221 SkScalar dstY = SkIntToScalar(y); | 201 SkScalar dstY = SkIntToScalar(y); |
| 222 do { | 202 do { |
| 223 dstProc(fDstToIndex, dstX, dstY, &srcPt); | 203 dstProc(fDstToIndex, dstX, dstY, &srcPt); |
| 224 unsigned fi = proc(SkScalarToFixed(srcPt.length())); | 204 unsigned fi = proc(SkScalarToFixed(srcPt.length())); |
| 225 SkASSERT(fi <= 0xFFFF); | 205 SkASSERT(fi <= 0xFFFF); |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 402 } | 382 } |
| 403 | 383 |
| 404 void shadeSpan_radial_repeat(SkScalar fx, SkScalar dx, SkScalar fy, SkScalar dy, | 384 void shadeSpan_radial_repeat(SkScalar fx, SkScalar dx, SkScalar fy, SkScalar dy, |
| 405 SkPMColor* SK_RESTRICT dstC, const SkPMColor* SK_RE
STRICT cache, | 385 SkPMColor* SK_RESTRICT dstC, const SkPMColor* SK_RE
STRICT cache, |
| 406 int count, int toggle) { | 386 int count, int toggle) { |
| 407 shadeSpan_radial<repeat_tileproc_nonstatic>(fx, dx, fy, dy, dstC, cache, cou
nt, toggle); | 387 shadeSpan_radial<repeat_tileproc_nonstatic>(fx, dx, fy, dy, dstC, cache, cou
nt, toggle); |
| 408 } | 388 } |
| 409 | 389 |
| 410 } // namespace | 390 } // namespace |
| 411 | 391 |
| 412 void SkRadialGradient::RadialGradientContext::shadeSpan(int x, int y, | 392 void SkRadialGradient::shadeSpan(int x, int y, |
| 413 SkPMColor* SK_RESTRICT d
stC, int count) { | 393 SkPMColor* SK_RESTRICT dstC, int count) { |
| 414 SkASSERT(count > 0); | 394 SkASSERT(count > 0); |
| 415 | 395 |
| 416 const SkRadialGradient& radialGradient = static_cast<const SkRadialGradient&
>(fShader); | |
| 417 | |
| 418 SkPoint srcPt; | 396 SkPoint srcPt; |
| 419 SkMatrix::MapXYProc dstProc = fDstToIndexProc; | 397 SkMatrix::MapXYProc dstProc = fDstToIndexProc; |
| 420 TileProc proc = radialGradient.fTileProc; | 398 TileProc proc = fTileProc; |
| 421 const SkPMColor* SK_RESTRICT cache = fCache->getCache32(); | 399 const SkPMColor* SK_RESTRICT cache = this->getCache32(); |
| 422 int toggle = init_dither_toggle(x, y); | 400 int toggle = init_dither_toggle(x, y); |
| 423 | 401 |
| 424 if (fDstToIndexClass != kPerspective_MatrixClass) { | 402 if (fDstToIndexClass != kPerspective_MatrixClass) { |
| 425 dstProc(fDstToIndex, SkIntToScalar(x) + SK_ScalarHalf, | 403 dstProc(fDstToIndex, SkIntToScalar(x) + SK_ScalarHalf, |
| 426 SkIntToScalar(y) + SK_ScalarHalf, &srcPt); | 404 SkIntToScalar(y) + SK_ScalarHalf, &srcPt); |
| 427 SkScalar sdx = fDstToIndex.getScaleX(); | 405 SkScalar sdx = fDstToIndex.getScaleX(); |
| 428 SkScalar sdy = fDstToIndex.getSkewY(); | 406 SkScalar sdy = fDstToIndex.getSkewY(); |
| 429 | 407 |
| 430 if (fDstToIndexClass == kFixedStepInX_MatrixClass) { | 408 if (fDstToIndexClass == kFixedStepInX_MatrixClass) { |
| 431 SkFixed storage[2]; | 409 SkFixed storage[2]; |
| 432 (void)fDstToIndex.fixedStepInX(SkIntToScalar(y), | 410 (void)fDstToIndex.fixedStepInX(SkIntToScalar(y), |
| 433 &storage[0], &storage[1]); | 411 &storage[0], &storage[1]); |
| 434 sdx = SkFixedToScalar(storage[0]); | 412 sdx = SkFixedToScalar(storage[0]); |
| 435 sdy = SkFixedToScalar(storage[1]); | 413 sdy = SkFixedToScalar(storage[1]); |
| 436 } else { | 414 } else { |
| 437 SkASSERT(fDstToIndexClass == kLinear_MatrixClass); | 415 SkASSERT(fDstToIndexClass == kLinear_MatrixClass); |
| 438 } | 416 } |
| 439 | 417 |
| 440 RadialShadeProc shadeProc = shadeSpan_radial_repeat; | 418 RadialShadeProc shadeProc = shadeSpan_radial_repeat; |
| 441 if (SkShader::kClamp_TileMode == radialGradient.fTileMode) { | 419 if (SkShader::kClamp_TileMode == fTileMode) { |
| 442 shadeProc = shadeSpan_radial_clamp; | 420 shadeProc = shadeSpan_radial_clamp; |
| 443 } else if (SkShader::kMirror_TileMode == radialGradient.fTileMode) { | 421 } else if (SkShader::kMirror_TileMode == fTileMode) { |
| 444 shadeProc = shadeSpan_radial_mirror; | 422 shadeProc = shadeSpan_radial_mirror; |
| 445 } else { | 423 } else { |
| 446 SkASSERT(SkShader::kRepeat_TileMode == radialGradient.fTileMode); | 424 SkASSERT(SkShader::kRepeat_TileMode == fTileMode); |
| 447 } | 425 } |
| 448 (*shadeProc)(srcPt.fX, sdx, srcPt.fY, sdy, dstC, cache, count, toggle); | 426 (*shadeProc)(srcPt.fX, sdx, srcPt.fY, sdy, dstC, cache, count, toggle); |
| 449 } else { // perspective case | 427 } else { // perspective case |
| 450 SkScalar dstX = SkIntToScalar(x); | 428 SkScalar dstX = SkIntToScalar(x); |
| 451 SkScalar dstY = SkIntToScalar(y); | 429 SkScalar dstY = SkIntToScalar(y); |
| 452 do { | 430 do { |
| 453 dstProc(fDstToIndex, dstX, dstY, &srcPt); | 431 dstProc(fDstToIndex, dstX, dstY, &srcPt); |
| 454 unsigned fi = proc(SkScalarToFixed(srcPt.length())); | 432 unsigned fi = proc(SkScalarToFixed(srcPt.length())); |
| 455 SkASSERT(fi <= 0xFFFF); | 433 SkASSERT(fi <= 0xFFFF); |
| 456 *dstC++ = cache[fi >> SkGradientShaderBase::kCache32Shift]; | 434 *dstC++ = cache[fi >> SkGradientShaderBase::kCache32Shift]; |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 595 str->appendScalar(fCenter.fY); | 573 str->appendScalar(fCenter.fY); |
| 596 str->append(") radius: "); | 574 str->append(") radius: "); |
| 597 str->appendScalar(fRadius); | 575 str->appendScalar(fRadius); |
| 598 str->append(" "); | 576 str->append(" "); |
| 599 | 577 |
| 600 this->INHERITED::toString(str); | 578 this->INHERITED::toString(str); |
| 601 | 579 |
| 602 str->append(")"); | 580 str->append(")"); |
| 603 } | 581 } |
| 604 #endif | 582 #endif |
| OLD | NEW |