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 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 if (info) { | 213 if (info) { |
214 commonAsAGradient(info); | 214 commonAsAGradient(info); |
215 info->fPoint[0] = fCenter1; | 215 info->fPoint[0] = fCenter1; |
216 info->fPoint[1] = fCenter2; | 216 info->fPoint[1] = fCenter2; |
217 info->fRadius[0] = fRadius1; | 217 info->fRadius[0] = fRadius1; |
218 info->fRadius[1] = fRadius2; | 218 info->fRadius[1] = fRadius2; |
219 } | 219 } |
220 return kRadial2_GradientType; | 220 return kRadial2_GradientType; |
221 } | 221 } |
222 | 222 |
223 void SkTwoPointRadialGradient::shadeSpan(int x, int y, SkPMColor* dstCParam, | 223 size_t SkTwoPointRadialGradient::contextSize() const { |
224 int count) { | 224 return sizeof(TwoPointRadialGradientContext); |
| 225 } |
| 226 |
| 227 bool SkTwoPointRadialGradient::validContext(const SkBitmap& device, const SkPain
t& paint, |
| 228 const SkMatrix& matrix, SkMatrix* to
talInverse) const { |
| 229 // For now, we might have divided by zero, so detect that. |
| 230 if (0 == fDiffRadius) { |
| 231 return false; |
| 232 } |
| 233 |
| 234 return this->INHERITED::validContext(device, paint, matrix, totalInverse); |
| 235 } |
| 236 |
| 237 SkShader::Context* SkTwoPointRadialGradient::createContext( |
| 238 const SkBitmap& device, const SkPaint& paint, |
| 239 const SkMatrix& matrix, void* storage) const { |
| 240 if (!this->validContext(device, paint, matrix)) { |
| 241 return NULL; |
| 242 } |
| 243 |
| 244 return SkNEW_PLACEMENT_ARGS(storage, TwoPointRadialGradientContext, |
| 245 (*this, device, paint, matrix)); |
| 246 } |
| 247 |
| 248 SkTwoPointRadialGradient::TwoPointRadialGradientContext::TwoPointRadialGradientC
ontext( |
| 249 const SkTwoPointRadialGradient& shader, const SkBitmap& device, |
| 250 const SkPaint& paint, const SkMatrix& matrix) |
| 251 : INHERITED(shader, device, paint, matrix) |
| 252 { |
| 253 // we don't have a span16 proc |
| 254 fFlags &= ~kHasSpan16_Flag; |
| 255 } |
| 256 |
| 257 void SkTwoPointRadialGradient::TwoPointRadialGradientContext::shadeSpan( |
| 258 int x, int y, SkPMColor* dstCParam, int count) { |
225 SkASSERT(count > 0); | 259 SkASSERT(count > 0); |
226 | 260 |
| 261 const SkTwoPointRadialGradient& twoPointRadialGradient = |
| 262 static_cast<const SkTwoPointRadialGradient&>(fShader); |
| 263 |
227 SkPMColor* SK_RESTRICT dstC = dstCParam; | 264 SkPMColor* SK_RESTRICT dstC = dstCParam; |
228 | 265 |
229 // Zero difference between radii: fill with transparent black. | 266 // Zero difference between radii: fill with transparent black. |
230 if (fDiffRadius == 0) { | 267 if (twoPointRadialGradient.fDiffRadius == 0) { |
231 sk_bzero(dstC, count * sizeof(*dstC)); | 268 sk_bzero(dstC, count * sizeof(*dstC)); |
232 return; | 269 return; |
233 } | 270 } |
234 SkMatrix::MapXYProc dstProc = fDstToIndexProc; | 271 SkMatrix::MapXYProc dstProc = fDstToIndexProc; |
235 TileProc proc = fTileProc; | 272 TileProc proc = twoPointRadialGradient.fTileProc; |
236 const SkPMColor* SK_RESTRICT cache = this->getCache32(); | 273 const SkPMColor* SK_RESTRICT cache = fCache->getCache32(); |
237 | 274 |
238 SkScalar foura = fA * 4; | 275 SkScalar foura = twoPointRadialGradient.fA * 4; |
239 bool posRoot = fDiffRadius < 0; | 276 bool posRoot = twoPointRadialGradient.fDiffRadius < 0; |
240 if (fDstToIndexClass != kPerspective_MatrixClass) { | 277 if (fDstToIndexClass != kPerspective_MatrixClass) { |
241 SkPoint srcPt; | 278 SkPoint srcPt; |
242 dstProc(fDstToIndex, SkIntToScalar(x) + SK_ScalarHalf, | 279 dstProc(fDstToIndex, SkIntToScalar(x) + SK_ScalarHalf, |
243 SkIntToScalar(y) + SK_ScalarHalf, &srcPt); | 280 SkIntToScalar(y) + SK_ScalarHalf, &srcPt); |
244 SkScalar dx, fx = srcPt.fX; | 281 SkScalar dx, fx = srcPt.fX; |
245 SkScalar dy, fy = srcPt.fY; | 282 SkScalar dy, fy = srcPt.fY; |
246 | 283 |
247 if (fDstToIndexClass == kFixedStepInX_MatrixClass) { | 284 if (fDstToIndexClass == kFixedStepInX_MatrixClass) { |
248 SkFixed fixedX, fixedY; | 285 SkFixed fixedX, fixedY; |
249 (void)fDstToIndex.fixedStepInX(SkIntToScalar(y), &fixedX, &fixedY); | 286 (void)fDstToIndex.fixedStepInX(SkIntToScalar(y), &fixedX, &fixedY); |
250 dx = SkFixedToScalar(fixedX); | 287 dx = SkFixedToScalar(fixedX); |
251 dy = SkFixedToScalar(fixedY); | 288 dy = SkFixedToScalar(fixedY); |
252 } else { | 289 } else { |
253 SkASSERT(fDstToIndexClass == kLinear_MatrixClass); | 290 SkASSERT(fDstToIndexClass == kLinear_MatrixClass); |
254 dx = fDstToIndex.getScaleX(); | 291 dx = fDstToIndex.getScaleX(); |
255 dy = fDstToIndex.getSkewY(); | 292 dy = fDstToIndex.getSkewY(); |
256 } | 293 } |
257 SkScalar b = (SkScalarMul(fDiff.fX, fx) + | 294 SkScalar b = (SkScalarMul(twoPointRadialGradient.fDiff.fX, fx) + |
258 SkScalarMul(fDiff.fY, fy) - fStartRadius) * 2; | 295 SkScalarMul(twoPointRadialGradient.fDiff.fY, fy) - |
259 SkScalar db = (SkScalarMul(fDiff.fX, dx) + | 296 twoPointRadialGradient.fStartRadius) * 2; |
260 SkScalarMul(fDiff.fY, dy)) * 2; | 297 SkScalar db = (SkScalarMul(twoPointRadialGradient.fDiff.fX, dx) + |
| 298 SkScalarMul(twoPointRadialGradient.fDiff.fY, dy)) * 2; |
261 | 299 |
262 TwoPointRadialShadeProc shadeProc = shadeSpan_twopoint_repeat; | 300 TwoPointRadialShadeProc shadeProc = shadeSpan_twopoint_repeat; |
263 if (SkShader::kClamp_TileMode == fTileMode) { | 301 if (SkShader::kClamp_TileMode == twoPointRadialGradient.fTileMode) { |
264 shadeProc = shadeSpan_twopoint_clamp; | 302 shadeProc = shadeSpan_twopoint_clamp; |
265 } else if (SkShader::kMirror_TileMode == fTileMode) { | 303 } else if (SkShader::kMirror_TileMode == twoPointRadialGradient.fTileMod
e) { |
266 shadeProc = shadeSpan_twopoint_mirror; | 304 shadeProc = shadeSpan_twopoint_mirror; |
267 } else { | 305 } else { |
268 SkASSERT(SkShader::kRepeat_TileMode == fTileMode); | 306 SkASSERT(SkShader::kRepeat_TileMode == twoPointRadialGradient.fTileM
ode); |
269 } | 307 } |
270 (*shadeProc)(fx, dx, fy, dy, b, db, | 308 (*shadeProc)(fx, dx, fy, dy, b, db, |
271 fSr2D2, foura, fOneOverTwoA, posRoot, | 309 twoPointRadialGradient.fSr2D2, foura, |
| 310 twoPointRadialGradient.fOneOverTwoA, posRoot, |
272 dstC, cache, count); | 311 dstC, cache, count); |
273 } else { // perspective case | 312 } else { // perspective case |
274 SkScalar dstX = SkIntToScalar(x); | 313 SkScalar dstX = SkIntToScalar(x); |
275 SkScalar dstY = SkIntToScalar(y); | 314 SkScalar dstY = SkIntToScalar(y); |
276 for (; count > 0; --count) { | 315 for (; count > 0; --count) { |
277 SkPoint srcPt; | 316 SkPoint srcPt; |
278 dstProc(fDstToIndex, dstX, dstY, &srcPt); | 317 dstProc(fDstToIndex, dstX, dstY, &srcPt); |
279 SkScalar fx = srcPt.fX; | 318 SkScalar fx = srcPt.fX; |
280 SkScalar fy = srcPt.fY; | 319 SkScalar fy = srcPt.fY; |
281 SkScalar b = (SkScalarMul(fDiff.fX, fx) + | 320 SkScalar b = (SkScalarMul(twoPointRadialGradient.fDiff.fX, fx) + |
282 SkScalarMul(fDiff.fY, fy) - fStartRadius) * 2; | 321 SkScalarMul(twoPointRadialGradient.fDiff.fY, fy) - |
283 SkFixed t = two_point_radial(b, fx, fy, fSr2D2, foura, | 322 twoPointRadialGradient.fStartRadius) * 2; |
284 fOneOverTwoA, posRoot); | 323 SkFixed t = two_point_radial(b, fx, fy, twoPointRadialGradient.fSr2D
2, foura, |
| 324 twoPointRadialGradient.fOneOverTwoA, po
sRoot); |
285 SkFixed index = proc(t); | 325 SkFixed index = proc(t); |
286 SkASSERT(index <= 0xFFFF); | 326 SkASSERT(index <= 0xFFFF); |
287 *dstC++ = cache[index >> SkGradientShaderBase::kCache32Shift]; | 327 *dstC++ = cache[index >> SkGradientShaderBase::kCache32Shift]; |
288 dstX += SK_Scalar1; | 328 dstX += SK_Scalar1; |
289 } | 329 } |
290 } | 330 } |
291 } | 331 } |
292 | 332 |
293 bool SkTwoPointRadialGradient::setContext( const SkBitmap& device, | |
294 const SkPaint& paint, | |
295 const SkMatrix& matrix){ | |
296 // For now, we might have divided by zero, so detect that | |
297 if (0 == fDiffRadius) { | |
298 return false; | |
299 } | |
300 | |
301 if (!this->INHERITED::setContext(device, paint, matrix)) { | |
302 return false; | |
303 } | |
304 | |
305 // we don't have a span16 proc | |
306 fFlags &= ~kHasSpan16_Flag; | |
307 return true; | |
308 } | |
309 | |
310 #ifndef SK_IGNORE_TO_STRING | 333 #ifndef SK_IGNORE_TO_STRING |
311 void SkTwoPointRadialGradient::toString(SkString* str) const { | 334 void SkTwoPointRadialGradient::toString(SkString* str) const { |
312 str->append("SkTwoPointRadialGradient: ("); | 335 str->append("SkTwoPointRadialGradient: ("); |
313 | 336 |
314 str->append("center1: ("); | 337 str->append("center1: ("); |
315 str->appendScalar(fCenter1.fX); | 338 str->appendScalar(fCenter1.fX); |
316 str->append(", "); | 339 str->append(", "); |
317 str->appendScalar(fCenter1.fY); | 340 str->appendScalar(fCenter1.fY); |
318 str->append(") radius1: "); | 341 str->append(") radius1: "); |
319 str->appendScalar(fRadius1); | 342 str->appendScalar(fRadius1); |
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
682 } | 705 } |
683 | 706 |
684 #else | 707 #else |
685 | 708 |
686 GrEffectRef* SkTwoPointRadialGradient::asNewEffect(GrContext*, const SkPaint&) c
onst { | 709 GrEffectRef* SkTwoPointRadialGradient::asNewEffect(GrContext*, const SkPaint&) c
onst { |
687 SkDEBUGFAIL("Should not call in GPU-less build"); | 710 SkDEBUGFAIL("Should not call in GPU-less build"); |
688 return NULL; | 711 return NULL; |
689 } | 712 } |
690 | 713 |
691 #endif | 714 #endif |
OLD | NEW |