Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(168)

Side by Side Diff: src/effects/gradients/SkTwoPointRadialGradient.cpp

Issue 249643002: Revert of Extract most of the mutable state of SkShader into a separate Context object. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/effects/gradients/SkTwoPointRadialGradient.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 size_t SkTwoPointRadialGradient::contextSize() const { 223 void SkTwoPointRadialGradient::shadeSpan(int x, int y, SkPMColor* dstCParam,
224 return sizeof(TwoPointRadialGradientContext); 224 int count) {
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) {
259 SkASSERT(count > 0); 225 SkASSERT(count > 0);
260 226
261 const SkTwoPointRadialGradient& twoPointRadialGradient =
262 static_cast<const SkTwoPointRadialGradient&>(fShader);
263
264 SkPMColor* SK_RESTRICT dstC = dstCParam; 227 SkPMColor* SK_RESTRICT dstC = dstCParam;
265 228
266 // Zero difference between radii: fill with transparent black. 229 // Zero difference between radii: fill with transparent black.
267 if (twoPointRadialGradient.fDiffRadius == 0) { 230 if (fDiffRadius == 0) {
268 sk_bzero(dstC, count * sizeof(*dstC)); 231 sk_bzero(dstC, count * sizeof(*dstC));
269 return; 232 return;
270 } 233 }
271 SkMatrix::MapXYProc dstProc = fDstToIndexProc; 234 SkMatrix::MapXYProc dstProc = fDstToIndexProc;
272 TileProc proc = twoPointRadialGradient.fTileProc; 235 TileProc proc = fTileProc;
273 const SkPMColor* SK_RESTRICT cache = fCache->getCache32(); 236 const SkPMColor* SK_RESTRICT cache = this->getCache32();
274 237
275 SkScalar foura = twoPointRadialGradient.fA * 4; 238 SkScalar foura = fA * 4;
276 bool posRoot = twoPointRadialGradient.fDiffRadius < 0; 239 bool posRoot = fDiffRadius < 0;
277 if (fDstToIndexClass != kPerspective_MatrixClass) { 240 if (fDstToIndexClass != kPerspective_MatrixClass) {
278 SkPoint srcPt; 241 SkPoint srcPt;
279 dstProc(fDstToIndex, SkIntToScalar(x) + SK_ScalarHalf, 242 dstProc(fDstToIndex, SkIntToScalar(x) + SK_ScalarHalf,
280 SkIntToScalar(y) + SK_ScalarHalf, &srcPt); 243 SkIntToScalar(y) + SK_ScalarHalf, &srcPt);
281 SkScalar dx, fx = srcPt.fX; 244 SkScalar dx, fx = srcPt.fX;
282 SkScalar dy, fy = srcPt.fY; 245 SkScalar dy, fy = srcPt.fY;
283 246
284 if (fDstToIndexClass == kFixedStepInX_MatrixClass) { 247 if (fDstToIndexClass == kFixedStepInX_MatrixClass) {
285 SkFixed fixedX, fixedY; 248 SkFixed fixedX, fixedY;
286 (void)fDstToIndex.fixedStepInX(SkIntToScalar(y), &fixedX, &fixedY); 249 (void)fDstToIndex.fixedStepInX(SkIntToScalar(y), &fixedX, &fixedY);
287 dx = SkFixedToScalar(fixedX); 250 dx = SkFixedToScalar(fixedX);
288 dy = SkFixedToScalar(fixedY); 251 dy = SkFixedToScalar(fixedY);
289 } else { 252 } else {
290 SkASSERT(fDstToIndexClass == kLinear_MatrixClass); 253 SkASSERT(fDstToIndexClass == kLinear_MatrixClass);
291 dx = fDstToIndex.getScaleX(); 254 dx = fDstToIndex.getScaleX();
292 dy = fDstToIndex.getSkewY(); 255 dy = fDstToIndex.getSkewY();
293 } 256 }
294 SkScalar b = (SkScalarMul(twoPointRadialGradient.fDiff.fX, fx) + 257 SkScalar b = (SkScalarMul(fDiff.fX, fx) +
295 SkScalarMul(twoPointRadialGradient.fDiff.fY, fy) - 258 SkScalarMul(fDiff.fY, fy) - fStartRadius) * 2;
296 twoPointRadialGradient.fStartRadius) * 2; 259 SkScalar db = (SkScalarMul(fDiff.fX, dx) +
297 SkScalar db = (SkScalarMul(twoPointRadialGradient.fDiff.fX, dx) + 260 SkScalarMul(fDiff.fY, dy)) * 2;
298 SkScalarMul(twoPointRadialGradient.fDiff.fY, dy)) * 2;
299 261
300 TwoPointRadialShadeProc shadeProc = shadeSpan_twopoint_repeat; 262 TwoPointRadialShadeProc shadeProc = shadeSpan_twopoint_repeat;
301 if (SkShader::kClamp_TileMode == twoPointRadialGradient.fTileMode) { 263 if (SkShader::kClamp_TileMode == fTileMode) {
302 shadeProc = shadeSpan_twopoint_clamp; 264 shadeProc = shadeSpan_twopoint_clamp;
303 } else if (SkShader::kMirror_TileMode == twoPointRadialGradient.fTileMod e) { 265 } else if (SkShader::kMirror_TileMode == fTileMode) {
304 shadeProc = shadeSpan_twopoint_mirror; 266 shadeProc = shadeSpan_twopoint_mirror;
305 } else { 267 } else {
306 SkASSERT(SkShader::kRepeat_TileMode == twoPointRadialGradient.fTileM ode); 268 SkASSERT(SkShader::kRepeat_TileMode == fTileMode);
307 } 269 }
308 (*shadeProc)(fx, dx, fy, dy, b, db, 270 (*shadeProc)(fx, dx, fy, dy, b, db,
309 twoPointRadialGradient.fSr2D2, foura, 271 fSr2D2, foura, fOneOverTwoA, posRoot,
310 twoPointRadialGradient.fOneOverTwoA, posRoot,
311 dstC, cache, count); 272 dstC, cache, count);
312 } else { // perspective case 273 } else { // perspective case
313 SkScalar dstX = SkIntToScalar(x); 274 SkScalar dstX = SkIntToScalar(x);
314 SkScalar dstY = SkIntToScalar(y); 275 SkScalar dstY = SkIntToScalar(y);
315 for (; count > 0; --count) { 276 for (; count > 0; --count) {
316 SkPoint srcPt; 277 SkPoint srcPt;
317 dstProc(fDstToIndex, dstX, dstY, &srcPt); 278 dstProc(fDstToIndex, dstX, dstY, &srcPt);
318 SkScalar fx = srcPt.fX; 279 SkScalar fx = srcPt.fX;
319 SkScalar fy = srcPt.fY; 280 SkScalar fy = srcPt.fY;
320 SkScalar b = (SkScalarMul(twoPointRadialGradient.fDiff.fX, fx) + 281 SkScalar b = (SkScalarMul(fDiff.fX, fx) +
321 SkScalarMul(twoPointRadialGradient.fDiff.fY, fy) - 282 SkScalarMul(fDiff.fY, fy) - fStartRadius) * 2;
322 twoPointRadialGradient.fStartRadius) * 2; 283 SkFixed t = two_point_radial(b, fx, fy, fSr2D2, foura,
323 SkFixed t = two_point_radial(b, fx, fy, twoPointRadialGradient.fSr2D 2, foura, 284 fOneOverTwoA, posRoot);
324 twoPointRadialGradient.fOneOverTwoA, po sRoot);
325 SkFixed index = proc(t); 285 SkFixed index = proc(t);
326 SkASSERT(index <= 0xFFFF); 286 SkASSERT(index <= 0xFFFF);
327 *dstC++ = cache[index >> SkGradientShaderBase::kCache32Shift]; 287 *dstC++ = cache[index >> SkGradientShaderBase::kCache32Shift];
328 dstX += SK_Scalar1; 288 dstX += SK_Scalar1;
329 } 289 }
330 } 290 }
331 } 291 }
332 292
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
333 #ifndef SK_IGNORE_TO_STRING 310 #ifndef SK_IGNORE_TO_STRING
334 void SkTwoPointRadialGradient::toString(SkString* str) const { 311 void SkTwoPointRadialGradient::toString(SkString* str) const {
335 str->append("SkTwoPointRadialGradient: ("); 312 str->append("SkTwoPointRadialGradient: (");
336 313
337 str->append("center1: ("); 314 str->append("center1: (");
338 str->appendScalar(fCenter1.fX); 315 str->appendScalar(fCenter1.fX);
339 str->append(", "); 316 str->append(", ");
340 str->appendScalar(fCenter1.fY); 317 str->appendScalar(fCenter1.fY);
341 str->append(") radius1: "); 318 str->append(") radius1: ");
342 str->appendScalar(fRadius1); 319 str->appendScalar(fRadius1);
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after
705 } 682 }
706 683
707 #else 684 #else
708 685
709 GrEffectRef* SkTwoPointRadialGradient::asNewEffect(GrContext*, const SkPaint&) c onst { 686 GrEffectRef* SkTwoPointRadialGradient::asNewEffect(GrContext*, const SkPaint&) c onst {
710 SkDEBUGFAIL("Should not call in GPU-less build"); 687 SkDEBUGFAIL("Should not call in GPU-less build");
711 return NULL; 688 return NULL;
712 } 689 }
713 690
714 #endif 691 #endif
OLDNEW
« no previous file with comments | « src/effects/gradients/SkTwoPointRadialGradient.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698