OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2008 The Android Open Source Project | 3 * Copyright 2008 The Android Open Source Project |
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 | 9 |
10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
349 SkPaint tmp; | 349 SkPaint tmp; |
350 tmp.setImageFilter(fOrigPaint.getImageFilter()); | 350 tmp.setImageFilter(fOrigPaint.getImageFilter()); |
351 (void)canvas->internalSaveLayer(bounds, &tmp, | 351 (void)canvas->internalSaveLayer(bounds, &tmp, |
352 SkCanvas::kARGB_ClipLayer_SaveFlag, true); | 352 SkCanvas::kARGB_ClipLayer_SaveFlag, true); |
353 // we'll clear the imageFilter for the actual draws in next(), so | 353 // we'll clear the imageFilter for the actual draws in next(), so |
354 // it will only be applied during the restore(). | 354 // it will only be applied during the restore(). |
355 fDoClearImageFilter = true; | 355 fDoClearImageFilter = true; |
356 } | 356 } |
357 | 357 |
358 if (fLooper) { | 358 if (fLooper) { |
359 fLooper->init(canvas); | 359 fLooperContext = fLooper->init(canvas, fLooperContextStorage, |
| 360 sizeof(fLooperContextStorage)); |
360 fIsSimple = false; | 361 fIsSimple = false; |
361 } else { | 362 } else { |
362 // can we be marked as simple? | 363 // can we be marked as simple? |
363 fIsSimple = !fFilter && !fDoClearImageFilter; | 364 fIsSimple = !fFilter && !fDoClearImageFilter; |
364 } | 365 } |
365 } | 366 } |
366 | 367 |
367 ~AutoDrawLooper() { | 368 ~AutoDrawLooper() { |
368 if (fDoClearImageFilter) { | 369 if (fDoClearImageFilter) { |
369 fCanvas->internalRestore(); | 370 fCanvas->internalRestore(); |
370 } | 371 } |
371 SkASSERT(fCanvas->getSaveCount() == fSaveCount); | 372 SkASSERT(fCanvas->getSaveCount() == fSaveCount); |
| 373 if (fLooper) { |
| 374 SkASSERT(fLooperContext); |
| 375 fLooperContext->cleanup(fLooperContextStorage); |
| 376 } |
372 } | 377 } |
373 | 378 |
374 const SkPaint& paint() const { | 379 const SkPaint& paint() const { |
375 SkASSERT(fPaint); | 380 SkASSERT(fPaint); |
376 return *fPaint; | 381 return *fPaint; |
377 } | 382 } |
378 | 383 |
379 bool next(SkDrawFilter::Type drawType) { | 384 bool next(SkDrawFilter::Type drawType) { |
380 if (fDone) { | 385 if (fDone) { |
381 return false; | 386 return false; |
(...skipping 10 matching lines...) Expand all Loading... |
392 SkLazyPaint fLazyPaint; | 397 SkLazyPaint fLazyPaint; |
393 SkCanvas* fCanvas; | 398 SkCanvas* fCanvas; |
394 const SkPaint& fOrigPaint; | 399 const SkPaint& fOrigPaint; |
395 SkDrawLooper* fLooper; | 400 SkDrawLooper* fLooper; |
396 SkDrawFilter* fFilter; | 401 SkDrawFilter* fFilter; |
397 const SkPaint* fPaint; | 402 const SkPaint* fPaint; |
398 int fSaveCount; | 403 int fSaveCount; |
399 bool fDoClearImageFilter; | 404 bool fDoClearImageFilter; |
400 bool fDone; | 405 bool fDone; |
401 bool fIsSimple; | 406 bool fIsSimple; |
| 407 SkDrawLooper::DrawContext* fLooperContext; |
| 408 uint32_t fLooperContextStorage[kDrawLooperContextStorageLongCount]; |
402 | 409 |
403 bool doNext(SkDrawFilter::Type drawType); | 410 bool doNext(SkDrawFilter::Type drawType); |
404 }; | 411 }; |
405 | 412 |
406 bool AutoDrawLooper::doNext(SkDrawFilter::Type drawType) { | 413 bool AutoDrawLooper::doNext(SkDrawFilter::Type drawType) { |
407 fPaint = NULL; | 414 fPaint = NULL; |
408 SkASSERT(!fIsSimple); | 415 SkASSERT(!fIsSimple); |
409 SkASSERT(fLooper || fFilter || fDoClearImageFilter); | 416 SkASSERT(fLooper || fFilter || fDoClearImageFilter); |
| 417 SkASSERT(!fLooper || fLooperContext); |
410 | 418 |
411 SkPaint* paint = fLazyPaint.set(fOrigPaint); | 419 SkPaint* paint = fLazyPaint.set(fOrigPaint); |
412 | 420 |
413 if (fDoClearImageFilter) { | 421 if (fDoClearImageFilter) { |
414 paint->setImageFilter(NULL); | 422 paint->setImageFilter(NULL); |
415 } | 423 } |
416 | 424 |
417 if (fLooper && !fLooper->next(fCanvas, paint)) { | 425 if (fLooper && !fLooperContext->next(fCanvas, paint)) { |
418 fDone = true; | 426 fDone = true; |
419 return false; | 427 return false; |
420 } | 428 } |
421 if (fFilter) { | 429 if (fFilter) { |
422 if (!fFilter->filter(paint, drawType)) { | 430 if (!fFilter->filter(paint, drawType)) { |
423 fDone = true; | 431 fDone = true; |
424 return false; | 432 return false; |
425 } | 433 } |
426 if (NULL == fLooper) { | 434 if (NULL == fLooper) { |
427 // no looper means we only draw once | 435 // no looper means we only draw once |
(...skipping 1790 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2218 return *paint; | 2226 return *paint; |
2219 } | 2227 } |
2220 | 2228 |
2221 const SkRegion& SkCanvas::LayerIter::clip() const { return fImpl->getClip(); } | 2229 const SkRegion& SkCanvas::LayerIter::clip() const { return fImpl->getClip(); } |
2222 int SkCanvas::LayerIter::x() const { return fImpl->getX(); } | 2230 int SkCanvas::LayerIter::x() const { return fImpl->getX(); } |
2223 int SkCanvas::LayerIter::y() const { return fImpl->getY(); } | 2231 int SkCanvas::LayerIter::y() const { return fImpl->getY(); } |
2224 | 2232 |
2225 /////////////////////////////////////////////////////////////////////////////// | 2233 /////////////////////////////////////////////////////////////////////////////// |
2226 | 2234 |
2227 SkCanvas::ClipVisitor::~ClipVisitor() { } | 2235 SkCanvas::ClipVisitor::~ClipVisitor() { } |
OLD | NEW |