OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2008 The Android Open Source Project | 2 * Copyright 2008 The Android Open Source Project |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkBitmapDevice.h" | 8 #include "SkBitmapDevice.h" |
9 #include "SkCanvas.h" | 9 #include "SkCanvas.h" |
10 #include "SkCanvasPriv.h" | 10 #include "SkCanvasPriv.h" |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
187 DeviceCM* fNext; | 187 DeviceCM* fNext; |
188 SkBaseDevice* fDevice; | 188 SkBaseDevice* fDevice; |
189 SkRasterClip fClip; | 189 SkRasterClip fClip; |
190 SkPaint* fPaint; // may be null (in the future) | 190 SkPaint* fPaint; // may be null (in the future) |
191 const SkMatrix* fMatrix; | 191 const SkMatrix* fMatrix; |
192 SkMatrix fMatrixStorage; | 192 SkMatrix fMatrixStorage; |
193 const bool fDeviceIsBitmapDevice; | 193 const bool fDeviceIsBitmapDevice; |
194 | 194 |
195 DeviceCM(SkBaseDevice* device, const SkPaint* paint, SkCanvas* canvas, | 195 DeviceCM(SkBaseDevice* device, const SkPaint* paint, SkCanvas* canvas, |
196 bool conservativeRasterClip, bool deviceIsBitmapDevice) | 196 bool conservativeRasterClip, bool deviceIsBitmapDevice) |
197 : fNext(NULL) | 197 : fNext(nullptr) |
198 , fClip(conservativeRasterClip) | 198 , fClip(conservativeRasterClip) |
199 , fDeviceIsBitmapDevice(deviceIsBitmapDevice) | 199 , fDeviceIsBitmapDevice(deviceIsBitmapDevice) |
200 { | 200 { |
201 if (NULL != device) { | 201 if (nullptr != device) { |
202 device->ref(); | 202 device->ref(); |
203 device->onAttachToCanvas(canvas); | 203 device->onAttachToCanvas(canvas); |
204 } | 204 } |
205 fDevice = device; | 205 fDevice = device; |
206 fPaint = paint ? new SkPaint(*paint) : NULL; | 206 fPaint = paint ? new SkPaint(*paint) : nullptr; |
207 } | 207 } |
208 | 208 |
209 ~DeviceCM() { | 209 ~DeviceCM() { |
210 if (fDevice) { | 210 if (fDevice) { |
211 fDevice->onDetachFromCanvas(); | 211 fDevice->onDetachFromCanvas(); |
212 fDevice->unref(); | 212 fDevice->unref(); |
213 } | 213 } |
214 delete fPaint; | 214 delete fPaint; |
215 } | 215 } |
216 | 216 |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
277 bitmap/device to draw into from this level. This value is NOT | 277 bitmap/device to draw into from this level. This value is NOT |
278 reference counted, since the real owner is either our fLayer field, | 278 reference counted, since the real owner is either our fLayer field, |
279 or a previous one in a lower level.) | 279 or a previous one in a lower level.) |
280 */ | 280 */ |
281 DeviceCM* fTopLayer; | 281 DeviceCM* fTopLayer; |
282 SkRasterClip fRasterClip; | 282 SkRasterClip fRasterClip; |
283 SkMatrix fMatrix; | 283 SkMatrix fMatrix; |
284 int fDeferredSaveCount; | 284 int fDeferredSaveCount; |
285 | 285 |
286 MCRec(bool conservativeRasterClip) : fRasterClip(conservativeRasterClip) { | 286 MCRec(bool conservativeRasterClip) : fRasterClip(conservativeRasterClip) { |
287 fFilter = NULL; | 287 fFilter = nullptr; |
288 fLayer = NULL; | 288 fLayer = nullptr; |
289 fTopLayer = NULL; | 289 fTopLayer = nullptr; |
290 fMatrix.reset(); | 290 fMatrix.reset(); |
291 fDeferredSaveCount = 0; | 291 fDeferredSaveCount = 0; |
292 | 292 |
293 // don't bother initializing fNext | 293 // don't bother initializing fNext |
294 inc_rec(); | 294 inc_rec(); |
295 } | 295 } |
296 MCRec(const MCRec& prev) : fRasterClip(prev.fRasterClip), fMatrix(prev.fMatr
ix) { | 296 MCRec(const MCRec& prev) : fRasterClip(prev.fRasterClip), fMatrix(prev.fMatr
ix) { |
297 fFilter = SkSafeRef(prev.fFilter); | 297 fFilter = SkSafeRef(prev.fFilter); |
298 fLayer = NULL; | 298 fLayer = nullptr; |
299 fTopLayer = prev.fTopLayer; | 299 fTopLayer = prev.fTopLayer; |
300 fDeferredSaveCount = 0; | 300 fDeferredSaveCount = 0; |
301 | 301 |
302 // don't bother initializing fNext | 302 // don't bother initializing fNext |
303 inc_rec(); | 303 inc_rec(); |
304 } | 304 } |
305 ~MCRec() { | 305 ~MCRec() { |
306 SkSafeUnref(fFilter); | 306 SkSafeUnref(fFilter); |
307 delete fLayer; | 307 delete fLayer; |
308 dec_rec(); | 308 dec_rec(); |
(...skipping 30 matching lines...) Expand all Loading... |
339 } | 339 } |
340 | 340 |
341 const DeviceCM* rec = fCurrLayer; | 341 const DeviceCM* rec = fCurrLayer; |
342 if (rec && rec->fDevice) { | 342 if (rec && rec->fDevice) { |
343 | 343 |
344 fMatrix = rec->fMatrix; | 344 fMatrix = rec->fMatrix; |
345 fClip = &((SkRasterClip*)&rec->fClip)->forceGetBW(); | 345 fClip = &((SkRasterClip*)&rec->fClip)->forceGetBW(); |
346 fRC = &rec->fClip; | 346 fRC = &rec->fClip; |
347 fDevice = rec->fDevice; | 347 fDevice = rec->fDevice; |
348 if (!fDevice->accessPixels(&fDst)) { | 348 if (!fDevice->accessPixels(&fDst)) { |
349 fDst.reset(fDevice->imageInfo(), NULL, 0); | 349 fDst.reset(fDevice->imageInfo(), nullptr, 0); |
350 } | 350 } |
351 fPaint = rec->fPaint; | 351 fPaint = rec->fPaint; |
352 SkDEBUGCODE(this->validate();) | 352 SkDEBUGCODE(this->validate();) |
353 | 353 |
354 fCurrLayer = rec->fNext; | 354 fCurrLayer = rec->fNext; |
355 // fCurrLayer may be NULL now | 355 // fCurrLayer may be nullptr now |
356 | 356 |
357 return true; | 357 return true; |
358 } | 358 } |
359 return false; | 359 return false; |
360 } | 360 } |
361 | 361 |
362 SkBaseDevice* getDevice() const { return fDevice; } | 362 SkBaseDevice* getDevice() const { return fDevice; } |
363 int getX() const { return fDevice->getOrigin().x(); } | 363 int getX() const { return fDevice->getOrigin().x(); } |
364 int getY() const { return fDevice->getOrigin().y(); } | 364 int getY() const { return fDevice->getOrigin().y(); } |
365 const SkMatrix& getMatrix() const { return *fMatrix; } | 365 const SkMatrix& getMatrix() const { return *fMatrix; } |
(...skipping 10 matching lines...) Expand all Loading... |
376 }; | 376 }; |
377 | 377 |
378 ///////////////////////////////////////////////////////////////////////////// | 378 ///////////////////////////////////////////////////////////////////////////// |
379 | 379 |
380 static SkPaint* set_if_needed(SkLazyPaint* lazy, const SkPaint& orig) { | 380 static SkPaint* set_if_needed(SkLazyPaint* lazy, const SkPaint& orig) { |
381 return lazy->isValid() ? lazy->get() : lazy->set(orig); | 381 return lazy->isValid() ? lazy->get() : lazy->set(orig); |
382 } | 382 } |
383 | 383 |
384 /** | 384 /** |
385 * If the paint has an imagefilter, but it can be simplified to just a colorfil
ter, return that | 385 * If the paint has an imagefilter, but it can be simplified to just a colorfil
ter, return that |
386 * colorfilter, else return NULL. | 386 * colorfilter, else return nullptr. |
387 */ | 387 */ |
388 static SkColorFilter* image_to_color_filter(const SkPaint& paint) { | 388 static SkColorFilter* image_to_color_filter(const SkPaint& paint) { |
389 SkImageFilter* imgf = paint.getImageFilter(); | 389 SkImageFilter* imgf = paint.getImageFilter(); |
390 if (!imgf) { | 390 if (!imgf) { |
391 return NULL; | 391 return nullptr; |
392 } | 392 } |
393 | 393 |
394 SkColorFilter* imgCF; | 394 SkColorFilter* imgCF; |
395 if (!imgf->asAColorFilter(&imgCF)) { | 395 if (!imgf->asAColorFilter(&imgCF)) { |
396 return NULL; | 396 return nullptr; |
397 } | 397 } |
398 | 398 |
399 SkColorFilter* paintCF = paint.getColorFilter(); | 399 SkColorFilter* paintCF = paint.getColorFilter(); |
400 if (NULL == paintCF) { | 400 if (nullptr == paintCF) { |
401 // there is no existing paint colorfilter, so we can just return the ima
gefilter's | 401 // there is no existing paint colorfilter, so we can just return the ima
gefilter's |
402 return imgCF; | 402 return imgCF; |
403 } | 403 } |
404 | 404 |
405 // The paint has both a colorfilter(paintCF) and an imagefilter-which-is-a-c
olorfilter(imgCF) | 405 // The paint has both a colorfilter(paintCF) and an imagefilter-which-is-a-c
olorfilter(imgCF) |
406 // and we need to combine them into a single colorfilter. | 406 // and we need to combine them into a single colorfilter. |
407 SkAutoTUnref<SkColorFilter> autoImgCF(imgCF); | 407 SkAutoTUnref<SkColorFilter> autoImgCF(imgCF); |
408 return SkColorFilter::CreateComposeFilter(imgCF, paintCF); | 408 return SkColorFilter::CreateComposeFilter(imgCF, paintCF); |
409 } | 409 } |
410 | 410 |
411 class AutoDrawLooper { | 411 class AutoDrawLooper { |
412 public: | 412 public: |
413 AutoDrawLooper(SkCanvas* canvas, const SkSurfaceProps& props, const SkPaint&
paint, | 413 AutoDrawLooper(SkCanvas* canvas, const SkSurfaceProps& props, const SkPaint&
paint, |
414 bool skipLayerForImageFilter = false, | 414 bool skipLayerForImageFilter = false, |
415 const SkRect* bounds = NULL) : fOrigPaint(paint) { | 415 const SkRect* bounds = nullptr) : fOrigPaint(paint) { |
416 fCanvas = canvas; | 416 fCanvas = canvas; |
417 fFilter = canvas->getDrawFilter(); | 417 fFilter = canvas->getDrawFilter(); |
418 fPaint = &fOrigPaint; | 418 fPaint = &fOrigPaint; |
419 fSaveCount = canvas->getSaveCount(); | 419 fSaveCount = canvas->getSaveCount(); |
420 fTempLayerForImageFilter = false; | 420 fTempLayerForImageFilter = false; |
421 fDone = false; | 421 fDone = false; |
422 | 422 |
423 SkColorFilter* simplifiedCF = image_to_color_filter(fOrigPaint); | 423 SkColorFilter* simplifiedCF = image_to_color_filter(fOrigPaint); |
424 if (simplifiedCF) { | 424 if (simplifiedCF) { |
425 SkPaint* paint = set_if_needed(&fLazyPaintInit, fOrigPaint); | 425 SkPaint* paint = set_if_needed(&fLazyPaintInit, fOrigPaint); |
426 paint->setColorFilter(simplifiedCF)->unref(); | 426 paint->setColorFilter(simplifiedCF)->unref(); |
427 paint->setImageFilter(NULL); | 427 paint->setImageFilter(nullptr); |
428 fPaint = paint; | 428 fPaint = paint; |
429 } | 429 } |
430 | 430 |
431 if (!skipLayerForImageFilter && fPaint->getImageFilter()) { | 431 if (!skipLayerForImageFilter && fPaint->getImageFilter()) { |
432 /** | 432 /** |
433 * We implement ImageFilters for a given draw by creating a layer,
then applying the | 433 * We implement ImageFilters for a given draw by creating a layer,
then applying the |
434 * imagefilter to the pixels of that layer (its backing surface/ima
ge), and then | 434 * imagefilter to the pixels of that layer (its backing surface/ima
ge), and then |
435 * we call restore() to xfer that layer to the main canvas. | 435 * we call restore() to xfer that layer to the main canvas. |
436 * | 436 * |
437 * 1. SaveLayer (with a paint containing the current imagefilter an
d xfermode) | 437 * 1. SaveLayer (with a paint containing the current imagefilter an
d xfermode) |
(...skipping 14 matching lines...) Expand all Loading... |
452 fTempLayerForImageFilter = true; | 452 fTempLayerForImageFilter = true; |
453 // we remove the imagefilter/xfermode inside doNext() | 453 // we remove the imagefilter/xfermode inside doNext() |
454 } | 454 } |
455 | 455 |
456 if (SkDrawLooper* looper = paint.getLooper()) { | 456 if (SkDrawLooper* looper = paint.getLooper()) { |
457 void* buffer = fLooperContextAllocator.reserveT<SkDrawLooper::Contex
t>( | 457 void* buffer = fLooperContextAllocator.reserveT<SkDrawLooper::Contex
t>( |
458 looper->contextSize()); | 458 looper->contextSize()); |
459 fLooperContext = looper->createContext(canvas, buffer); | 459 fLooperContext = looper->createContext(canvas, buffer); |
460 fIsSimple = false; | 460 fIsSimple = false; |
461 } else { | 461 } else { |
462 fLooperContext = NULL; | 462 fLooperContext = nullptr; |
463 // can we be marked as simple? | 463 // can we be marked as simple? |
464 fIsSimple = !fFilter && !fTempLayerForImageFilter; | 464 fIsSimple = !fFilter && !fTempLayerForImageFilter; |
465 } | 465 } |
466 | 466 |
467 uint32_t oldFlags = paint.getFlags(); | 467 uint32_t oldFlags = paint.getFlags(); |
468 fNewPaintFlags = filter_paint_flags(props, oldFlags); | 468 fNewPaintFlags = filter_paint_flags(props, oldFlags); |
469 if (fIsSimple && (fNewPaintFlags != oldFlags)) { | 469 if (fIsSimple && (fNewPaintFlags != oldFlags)) { |
470 SkPaint* paint = set_if_needed(&fLazyPaintInit, fOrigPaint); | 470 SkPaint* paint = set_if_needed(&fLazyPaintInit, fOrigPaint); |
471 paint->setFlags(fNewPaintFlags); | 471 paint->setFlags(fNewPaintFlags); |
472 fPaint = paint; | 472 fPaint = paint; |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
509 bool fTempLayerForImageFilter; | 509 bool fTempLayerForImageFilter; |
510 bool fDone; | 510 bool fDone; |
511 bool fIsSimple; | 511 bool fIsSimple; |
512 SkDrawLooper::Context* fLooperContext; | 512 SkDrawLooper::Context* fLooperContext; |
513 SkSmallAllocator<1, 32> fLooperContextAllocator; | 513 SkSmallAllocator<1, 32> fLooperContextAllocator; |
514 | 514 |
515 bool doNext(SkDrawFilter::Type drawType); | 515 bool doNext(SkDrawFilter::Type drawType); |
516 }; | 516 }; |
517 | 517 |
518 bool AutoDrawLooper::doNext(SkDrawFilter::Type drawType) { | 518 bool AutoDrawLooper::doNext(SkDrawFilter::Type drawType) { |
519 fPaint = NULL; | 519 fPaint = nullptr; |
520 SkASSERT(!fIsSimple); | 520 SkASSERT(!fIsSimple); |
521 SkASSERT(fLooperContext || fFilter || fTempLayerForImageFilter); | 521 SkASSERT(fLooperContext || fFilter || fTempLayerForImageFilter); |
522 | 522 |
523 SkPaint* paint = fLazyPaintPerLooper.set(fLazyPaintInit.isValid() ? | 523 SkPaint* paint = fLazyPaintPerLooper.set(fLazyPaintInit.isValid() ? |
524 *fLazyPaintInit.get() : fOrigPaint)
; | 524 *fLazyPaintInit.get() : fOrigPaint)
; |
525 paint->setFlags(fNewPaintFlags); | 525 paint->setFlags(fNewPaintFlags); |
526 | 526 |
527 if (fTempLayerForImageFilter) { | 527 if (fTempLayerForImageFilter) { |
528 paint->setImageFilter(NULL); | 528 paint->setImageFilter(nullptr); |
529 paint->setXfermode(NULL); | 529 paint->setXfermode(nullptr); |
530 } | 530 } |
531 | 531 |
532 if (fLooperContext && !fLooperContext->next(fCanvas, paint)) { | 532 if (fLooperContext && !fLooperContext->next(fCanvas, paint)) { |
533 fDone = true; | 533 fDone = true; |
534 return false; | 534 return false; |
535 } | 535 } |
536 if (fFilter) { | 536 if (fFilter) { |
537 if (!fFilter->filter(paint, drawType)) { | 537 if (!fFilter->filter(paint, drawType)) { |
538 fDone = true; | 538 fDone = true; |
539 return false; | 539 return false; |
540 } | 540 } |
541 if (NULL == fLooperContext) { | 541 if (nullptr == fLooperContext) { |
542 // no looper means we only draw once | 542 // no looper means we only draw once |
543 fDone = true; | 543 fDone = true; |
544 } | 544 } |
545 } | 545 } |
546 fPaint = paint; | 546 fPaint = paint; |
547 | 547 |
548 // if we only came in here for the imagefilter, mark us as done | 548 // if we only came in here for the imagefilter, mark us as done |
549 if (!fLooperContext && !fFilter) { | 549 if (!fLooperContext && !fFilter) { |
550 fDone = true; | 550 fDone = true; |
551 } | 551 } |
552 | 552 |
553 // call this after any possible paint modifiers | 553 // call this after any possible paint modifiers |
554 if (fPaint->nothingToDraw()) { | 554 if (fPaint->nothingToDraw()) { |
555 fPaint = NULL; | 555 fPaint = nullptr; |
556 return false; | 556 return false; |
557 } | 557 } |
558 return true; | 558 return true; |
559 } | 559 } |
560 | 560 |
561 ////////// macros to place around the internal draw calls ////////////////// | 561 ////////// macros to place around the internal draw calls ////////////////// |
562 | 562 |
563 #define LOOPER_BEGIN_DRAWDEVICE(paint, type) \ | 563 #define LOOPER_BEGIN_DRAWDEVICE(paint, type) \ |
564 this->predrawNotify(); \ | 564 this->predrawNotify(); \ |
565 AutoDrawLooper looper(this, fProps, paint, true); \ | 565 AutoDrawLooper looper(this, fProps, paint, true); \ |
(...skipping 29 matching lines...) Expand all Loading... |
595 } | 595 } |
596 | 596 |
597 SkBaseDevice* SkCanvas::init(SkBaseDevice* device, InitFlags flags) { | 597 SkBaseDevice* SkCanvas::init(SkBaseDevice* device, InitFlags flags) { |
598 fConservativeRasterClip = SkToBool(flags & kConservativeRasterClip_InitFlag)
; | 598 fConservativeRasterClip = SkToBool(flags & kConservativeRasterClip_InitFlag)
; |
599 fCachedLocalClipBounds.setEmpty(); | 599 fCachedLocalClipBounds.setEmpty(); |
600 fCachedLocalClipBoundsDirty = true; | 600 fCachedLocalClipBoundsDirty = true; |
601 fAllowSoftClip = true; | 601 fAllowSoftClip = true; |
602 fAllowSimplifyClip = false; | 602 fAllowSimplifyClip = false; |
603 fDeviceCMDirty = true; | 603 fDeviceCMDirty = true; |
604 fSaveCount = 1; | 604 fSaveCount = 1; |
605 fMetaData = NULL; | 605 fMetaData = nullptr; |
606 | 606 |
607 fClipStack.reset(new SkClipStack); | 607 fClipStack.reset(new SkClipStack); |
608 | 608 |
609 fMCRec = (MCRec*)fMCStack.push_back(); | 609 fMCRec = (MCRec*)fMCStack.push_back(); |
610 new (fMCRec) MCRec(fConservativeRasterClip); | 610 new (fMCRec) MCRec(fConservativeRasterClip); |
611 | 611 |
612 SkASSERT(sizeof(DeviceCM) <= sizeof(fDeviceCMStorage)); | 612 SkASSERT(sizeof(DeviceCM) <= sizeof(fDeviceCMStorage)); |
613 fMCRec->fLayer = (DeviceCM*)fDeviceCMStorage; | 613 fMCRec->fLayer = (DeviceCM*)fDeviceCMStorage; |
614 new (fDeviceCMStorage) DeviceCM(NULL, NULL, NULL, fConservativeRasterClip, f
alse); | 614 new (fDeviceCMStorage) DeviceCM(nullptr, nullptr, nullptr, fConservativeRast
erClip, false); |
615 | 615 |
616 fMCRec->fTopLayer = fMCRec->fLayer; | 616 fMCRec->fTopLayer = fMCRec->fLayer; |
617 | 617 |
618 fSurfaceBase = NULL; | 618 fSurfaceBase = nullptr; |
619 | 619 |
620 if (device) { | 620 if (device) { |
621 // The root device and the canvas should always have the same pixel geom
etry | 621 // The root device and the canvas should always have the same pixel geom
etry |
622 SkASSERT(fProps.pixelGeometry() == device->surfaceProps().pixelGeometry(
)); | 622 SkASSERT(fProps.pixelGeometry() == device->surfaceProps().pixelGeometry(
)); |
623 if (device->forceConservativeRasterClip()) { | 623 if (device->forceConservativeRasterClip()) { |
624 fConservativeRasterClip = true; | 624 fConservativeRasterClip = true; |
625 } | 625 } |
626 device->onAttachToCanvas(this); | 626 device->onAttachToCanvas(this); |
627 fMCRec->fLayer->fDevice = SkRef(device); | 627 fMCRec->fLayer->fDevice = SkRef(device); |
628 fMCRec->fRasterClip.setRect(device->getGlobalBounds()); | 628 fMCRec->fRasterClip.setRect(device->getGlobalBounds()); |
629 } | 629 } |
630 return device; | 630 return device; |
631 } | 631 } |
632 | 632 |
633 SkCanvas::SkCanvas() | 633 SkCanvas::SkCanvas() |
634 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) | 634 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) |
635 , fProps(SkSurfaceProps::kLegacyFontHost_InitType) | 635 , fProps(SkSurfaceProps::kLegacyFontHost_InitType) |
636 { | 636 { |
637 inc_canvas(); | 637 inc_canvas(); |
638 | 638 |
639 this->init(NULL, kDefault_InitFlags); | 639 this->init(nullptr, kDefault_InitFlags); |
640 } | 640 } |
641 | 641 |
642 static SkBitmap make_nopixels(int width, int height) { | 642 static SkBitmap make_nopixels(int width, int height) { |
643 SkBitmap bitmap; | 643 SkBitmap bitmap; |
644 bitmap.setInfo(SkImageInfo::MakeUnknown(width, height)); | 644 bitmap.setInfo(SkImageInfo::MakeUnknown(width, height)); |
645 return bitmap; | 645 return bitmap; |
646 } | 646 } |
647 | 647 |
648 class SkNoPixelsBitmapDevice : public SkBitmapDevice { | 648 class SkNoPixelsBitmapDevice : public SkBitmapDevice { |
649 public: | 649 public: |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
732 | 732 |
733 SkDrawFilter* SkCanvas::setDrawFilter(SkDrawFilter* filter) { | 733 SkDrawFilter* SkCanvas::setDrawFilter(SkDrawFilter* filter) { |
734 this->checkForDeferredSave(); | 734 this->checkForDeferredSave(); |
735 SkRefCnt_SafeAssign(fMCRec->fFilter, filter); | 735 SkRefCnt_SafeAssign(fMCRec->fFilter, filter); |
736 return filter; | 736 return filter; |
737 } | 737 } |
738 | 738 |
739 SkMetaData& SkCanvas::getMetaData() { | 739 SkMetaData& SkCanvas::getMetaData() { |
740 // metadata users are rare, so we lazily allocate it. If that changes we | 740 // metadata users are rare, so we lazily allocate it. If that changes we |
741 // can decide to just make it a field in the device (rather than a ptr) | 741 // can decide to just make it a field in the device (rather than a ptr) |
742 if (NULL == fMetaData) { | 742 if (nullptr == fMetaData) { |
743 fMetaData = new SkMetaData; | 743 fMetaData = new SkMetaData; |
744 } | 744 } |
745 return *fMetaData; | 745 return *fMetaData; |
746 } | 746 } |
747 | 747 |
748 /////////////////////////////////////////////////////////////////////////////// | 748 /////////////////////////////////////////////////////////////////////////////// |
749 | 749 |
750 void SkCanvas::flush() { | 750 void SkCanvas::flush() { |
751 SkBaseDevice* device = this->getDevice(); | 751 SkBaseDevice* device = this->getDevice(); |
752 if (device) { | 752 if (device) { |
(...skipping 29 matching lines...) Expand all Loading... |
782 } | 782 } |
783 return fMCRec->fTopLayer->fDevice; | 783 return fMCRec->fTopLayer->fDevice; |
784 } | 784 } |
785 | 785 |
786 bool SkCanvas::readPixels(SkBitmap* bitmap, int x, int y) { | 786 bool SkCanvas::readPixels(SkBitmap* bitmap, int x, int y) { |
787 if (kUnknown_SkColorType == bitmap->colorType() || bitmap->getTexture()) { | 787 if (kUnknown_SkColorType == bitmap->colorType() || bitmap->getTexture()) { |
788 return false; | 788 return false; |
789 } | 789 } |
790 | 790 |
791 bool weAllocated = false; | 791 bool weAllocated = false; |
792 if (NULL == bitmap->pixelRef()) { | 792 if (nullptr == bitmap->pixelRef()) { |
793 if (!bitmap->tryAllocPixels()) { | 793 if (!bitmap->tryAllocPixels()) { |
794 return false; | 794 return false; |
795 } | 795 } |
796 weAllocated = true; | 796 weAllocated = true; |
797 } | 797 } |
798 | 798 |
799 SkAutoPixmapUnlock unlocker; | 799 SkAutoPixmapUnlock unlocker; |
800 if (bitmap->requestLock(&unlocker)) { | 800 if (bitmap->requestLock(&unlocker)) { |
801 const SkPixmap& pm = unlocker.pixmap(); | 801 const SkPixmap& pm = unlocker.pixmap(); |
802 if (this->readPixels(pm.info(), pm.writable_addr(), pm.rowBytes(), x, y)
) { | 802 if (this->readPixels(pm.info(), pm.writable_addr(), pm.rowBytes(), x, y)
) { |
803 return true; | 803 return true; |
804 } | 804 } |
805 } | 805 } |
806 | 806 |
807 if (weAllocated) { | 807 if (weAllocated) { |
808 bitmap->setPixelRef(NULL); | 808 bitmap->setPixelRef(nullptr); |
809 } | 809 } |
810 return false; | 810 return false; |
811 } | 811 } |
812 | 812 |
813 bool SkCanvas::readPixels(const SkIRect& srcRect, SkBitmap* bitmap) { | 813 bool SkCanvas::readPixels(const SkIRect& srcRect, SkBitmap* bitmap) { |
814 SkIRect r = srcRect; | 814 SkIRect r = srcRect; |
815 const SkISize size = this->getBaseLayerSize(); | 815 const SkISize size = this->getBaseLayerSize(); |
816 if (!r.intersect(0, 0, size.width(), size.height())) { | 816 if (!r.intersect(0, 0, size.width(), size.height())) { |
817 bitmap->reset(); | 817 bitmap->reset(); |
818 return false; | 818 return false; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
860 | 860 |
861 bool SkCanvas::writePixels(const SkImageInfo& origInfo, const void* pixels, size
_t rowBytes, | 861 bool SkCanvas::writePixels(const SkImageInfo& origInfo, const void* pixels, size
_t rowBytes, |
862 int x, int y) { | 862 int x, int y) { |
863 switch (origInfo.colorType()) { | 863 switch (origInfo.colorType()) { |
864 case kUnknown_SkColorType: | 864 case kUnknown_SkColorType: |
865 case kIndex_8_SkColorType: | 865 case kIndex_8_SkColorType: |
866 return false; | 866 return false; |
867 default: | 867 default: |
868 break; | 868 break; |
869 } | 869 } |
870 if (NULL == pixels || rowBytes < origInfo.minRowBytes()) { | 870 if (nullptr == pixels || rowBytes < origInfo.minRowBytes()) { |
871 return false; | 871 return false; |
872 } | 872 } |
873 | 873 |
874 const SkISize size = this->getBaseLayerSize(); | 874 const SkISize size = this->getBaseLayerSize(); |
875 SkIRect target = SkIRect::MakeXYWH(x, y, origInfo.width(), origInfo.height()
); | 875 SkIRect target = SkIRect::MakeXYWH(x, y, origInfo.width(), origInfo.height()
); |
876 if (!target.intersect(0, 0, size.width(), size.height())) { | 876 if (!target.intersect(0, 0, size.width(), size.height())) { |
877 return false; | 877 return false; |
878 } | 878 } |
879 | 879 |
880 SkBaseDevice* device = this->getDevice(); | 880 SkBaseDevice* device = this->getDevice(); |
(...skipping 27 matching lines...) Expand all Loading... |
908 } | 908 } |
909 | 909 |
910 ////////////////////////////////////////////////////////////////////////////// | 910 ////////////////////////////////////////////////////////////////////////////// |
911 | 911 |
912 void SkCanvas::updateDeviceCMCache() { | 912 void SkCanvas::updateDeviceCMCache() { |
913 if (fDeviceCMDirty) { | 913 if (fDeviceCMDirty) { |
914 const SkMatrix& totalMatrix = this->getTotalMatrix(); | 914 const SkMatrix& totalMatrix = this->getTotalMatrix(); |
915 const SkRasterClip& totalClip = fMCRec->fRasterClip; | 915 const SkRasterClip& totalClip = fMCRec->fRasterClip; |
916 DeviceCM* layer = fMCRec->fTopLayer; | 916 DeviceCM* layer = fMCRec->fTopLayer; |
917 | 917 |
918 if (NULL == layer->fNext) { // only one layer | 918 if (nullptr == layer->fNext) { // only one layer |
919 layer->updateMC(totalMatrix, totalClip, *fClipStack, NULL); | 919 layer->updateMC(totalMatrix, totalClip, *fClipStack, nullptr); |
920 } else { | 920 } else { |
921 SkRasterClip clip(totalClip); | 921 SkRasterClip clip(totalClip); |
922 do { | 922 do { |
923 layer->updateMC(totalMatrix, clip, *fClipStack, &clip); | 923 layer->updateMC(totalMatrix, clip, *fClipStack, &clip); |
924 } while ((layer = layer->fNext) != NULL); | 924 } while ((layer = layer->fNext) != nullptr); |
925 } | 925 } |
926 fDeviceCMDirty = false; | 926 fDeviceCMDirty = false; |
927 } | 927 } |
928 } | 928 } |
929 | 929 |
930 /////////////////////////////////////////////////////////////////////////////// | 930 /////////////////////////////////////////////////////////////////////////////// |
931 | 931 |
932 void SkCanvas::checkForDeferredSave() { | 932 void SkCanvas::checkForDeferredSave() { |
933 if (fMCRec->fDeferredSaveCount > 0) { | 933 if (fMCRec->fDeferredSaveCount > 0) { |
934 this->doSave(); | 934 this->doSave(); |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1049 } | 1049 } |
1050 | 1050 |
1051 if (intersection) { | 1051 if (intersection) { |
1052 *intersection = ir; | 1052 *intersection = ir; |
1053 } | 1053 } |
1054 return true; | 1054 return true; |
1055 } | 1055 } |
1056 | 1056 |
1057 int SkCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint) { | 1057 int SkCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint) { |
1058 if (gIgnoreSaveLayerBounds) { | 1058 if (gIgnoreSaveLayerBounds) { |
1059 bounds = NULL; | 1059 bounds = nullptr; |
1060 } | 1060 } |
1061 SaveLayerStrategy strategy = this->willSaveLayer(bounds, paint, kARGB_ClipLa
yer_SaveFlag); | 1061 SaveLayerStrategy strategy = this->willSaveLayer(bounds, paint, kARGB_ClipLa
yer_SaveFlag); |
1062 fSaveCount += 1; | 1062 fSaveCount += 1; |
1063 this->internalSaveLayer(bounds, paint, kARGB_ClipLayer_SaveFlag, strategy); | 1063 this->internalSaveLayer(bounds, paint, kARGB_ClipLayer_SaveFlag, strategy); |
1064 return this->getSaveCount() - 1; | 1064 return this->getSaveCount() - 1; |
1065 } | 1065 } |
1066 | 1066 |
1067 int SkCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint, SaveFlags fl
ags) { | 1067 int SkCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint, SaveFlags fl
ags) { |
1068 if (gIgnoreSaveLayerBounds) { | 1068 if (gIgnoreSaveLayerBounds) { |
1069 bounds = NULL; | 1069 bounds = nullptr; |
1070 } | 1070 } |
1071 SaveLayerStrategy strategy = this->willSaveLayer(bounds, paint, flags); | 1071 SaveLayerStrategy strategy = this->willSaveLayer(bounds, paint, flags); |
1072 fSaveCount += 1; | 1072 fSaveCount += 1; |
1073 this->internalSaveLayer(bounds, paint, flags, strategy); | 1073 this->internalSaveLayer(bounds, paint, flags, strategy); |
1074 return this->getSaveCount() - 1; | 1074 return this->getSaveCount() - 1; |
1075 } | 1075 } |
1076 | 1076 |
1077 void SkCanvas::internalSaveLayer(const SkRect* bounds, const SkPaint* paint, Sav
eFlags flags, | 1077 void SkCanvas::internalSaveLayer(const SkRect* bounds, const SkPaint* paint, Sav
eFlags flags, |
1078 SaveLayerStrategy strategy) { | 1078 SaveLayerStrategy strategy) { |
1079 #ifndef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG | 1079 #ifndef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG |
1080 flags |= kClipToLayer_SaveFlag; | 1080 flags |= kClipToLayer_SaveFlag; |
1081 #endif | 1081 #endif |
1082 | 1082 |
1083 // do this before we create the layer. We don't call the public save() since | 1083 // do this before we create the layer. We don't call the public save() since |
1084 // that would invoke a possibly overridden virtual | 1084 // that would invoke a possibly overridden virtual |
1085 this->internalSave(); | 1085 this->internalSave(); |
1086 | 1086 |
1087 fDeviceCMDirty = true; | 1087 fDeviceCMDirty = true; |
1088 | 1088 |
1089 SkIRect ir; | 1089 SkIRect ir; |
1090 if (!this->clipRectBounds(bounds, flags, &ir, paint ? paint->getImageFilter(
) : NULL)) { | 1090 if (!this->clipRectBounds(bounds, flags, &ir, paint ? paint->getImageFilter(
) : nullptr)) { |
1091 return; | 1091 return; |
1092 } | 1092 } |
1093 | 1093 |
1094 // FIXME: do willSaveLayer() overriders returning kNoLayer_SaveLayerStrategy
really care about | 1094 // FIXME: do willSaveLayer() overriders returning kNoLayer_SaveLayerStrategy
really care about |
1095 // the clipRectBounds() call above? | 1095 // the clipRectBounds() call above? |
1096 if (kNoLayer_SaveLayerStrategy == strategy) { | 1096 if (kNoLayer_SaveLayerStrategy == strategy) { |
1097 return; | 1097 return; |
1098 } | 1098 } |
1099 | 1099 |
1100 bool isOpaque = !SkToBool(flags & kHasAlphaLayer_SaveFlag); | 1100 bool isOpaque = !SkToBool(flags & kHasAlphaLayer_SaveFlag); |
1101 SkPixelGeometry geo = fProps.pixelGeometry(); | 1101 SkPixelGeometry geo = fProps.pixelGeometry(); |
1102 if (paint) { | 1102 if (paint) { |
1103 // TODO: perhaps add a query to filters so we might preserve opaqueness.
.. | 1103 // TODO: perhaps add a query to filters so we might preserve opaqueness.
.. |
1104 if (paint->getImageFilter() || paint->getColorFilter()) { | 1104 if (paint->getImageFilter() || paint->getColorFilter()) { |
1105 isOpaque = false; | 1105 isOpaque = false; |
1106 geo = kUnknown_SkPixelGeometry; | 1106 geo = kUnknown_SkPixelGeometry; |
1107 } | 1107 } |
1108 } | 1108 } |
1109 SkImageInfo info = SkImageInfo::MakeN32(ir.width(), ir.height(), | 1109 SkImageInfo info = SkImageInfo::MakeN32(ir.width(), ir.height(), |
1110 isOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType); | 1110 isOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType); |
1111 | 1111 |
1112 SkBaseDevice* device = this->getTopDevice(); | 1112 SkBaseDevice* device = this->getTopDevice(); |
1113 if (NULL == device) { | 1113 if (nullptr == device) { |
1114 SkDebugf("Unable to find device for layer."); | 1114 SkDebugf("Unable to find device for layer."); |
1115 return; | 1115 return; |
1116 } | 1116 } |
1117 | 1117 |
1118 bool forceSpriteOnRestore = false; | 1118 bool forceSpriteOnRestore = false; |
1119 { | 1119 { |
1120 const SkBaseDevice::TileUsage usage = SkBaseDevice::kNever_TileUsage; | 1120 const SkBaseDevice::TileUsage usage = SkBaseDevice::kNever_TileUsage; |
1121 const SkBaseDevice::CreateInfo createInfo = SkBaseDevice::CreateInfo(inf
o, usage, geo); | 1121 const SkBaseDevice::CreateInfo createInfo = SkBaseDevice::CreateInfo(inf
o, usage, geo); |
1122 SkBaseDevice* newDev = device->onCreateDevice(createInfo, paint); | 1122 SkBaseDevice* newDev = device->onCreateDevice(createInfo, paint); |
1123 if (NULL == newDev) { | 1123 if (nullptr == newDev) { |
1124 // If onCreateDevice didn't succeed, try raster (e.g. PDF couldn't h
andle the paint) | 1124 // If onCreateDevice didn't succeed, try raster (e.g. PDF couldn't h
andle the paint) |
1125 const SkSurfaceProps surfaceProps(fProps.flags(), createInfo.fPixelG
eometry); | 1125 const SkSurfaceProps surfaceProps(fProps.flags(), createInfo.fPixelG
eometry); |
1126 newDev = SkBitmapDevice::Create(createInfo.fInfo, surfaceProps); | 1126 newDev = SkBitmapDevice::Create(createInfo.fInfo, surfaceProps); |
1127 if (NULL == newDev) { | 1127 if (nullptr == newDev) { |
1128 SkErrorInternals::SetError(kInternalError_SkError, | 1128 SkErrorInternals::SetError(kInternalError_SkError, |
1129 "Unable to create device for layer.")
; | 1129 "Unable to create device for layer.")
; |
1130 return; | 1130 return; |
1131 } | 1131 } |
1132 forceSpriteOnRestore = true; | 1132 forceSpriteOnRestore = true; |
1133 } | 1133 } |
1134 device = newDev; | 1134 device = newDev; |
1135 } | 1135 } |
1136 | 1136 |
1137 device->setOrigin(ir.fLeft, ir.fTop); | 1137 device->setOrigin(ir.fLeft, ir.fTop); |
1138 DeviceCM* layer = | 1138 DeviceCM* layer = |
1139 new DeviceCM(device, paint, this, fConservativeRasterClip, forceSpri
teOnRestore); | 1139 new DeviceCM(device, paint, this, fConservativeRasterClip, forceSpri
teOnRestore); |
1140 device->unref(); | 1140 device->unref(); |
1141 | 1141 |
1142 layer->fNext = fMCRec->fTopLayer; | 1142 layer->fNext = fMCRec->fTopLayer; |
1143 fMCRec->fLayer = layer; | 1143 fMCRec->fLayer = layer; |
1144 fMCRec->fTopLayer = layer; // this field is NOT an owner of layer | 1144 fMCRec->fTopLayer = layer; // this field is NOT an owner of layer |
1145 } | 1145 } |
1146 | 1146 |
1147 int SkCanvas::saveLayerAlpha(const SkRect* bounds, U8CPU alpha) { | 1147 int SkCanvas::saveLayerAlpha(const SkRect* bounds, U8CPU alpha) { |
1148 return this->saveLayerAlpha(bounds, alpha, kARGB_ClipLayer_SaveFlag); | 1148 return this->saveLayerAlpha(bounds, alpha, kARGB_ClipLayer_SaveFlag); |
1149 } | 1149 } |
1150 | 1150 |
1151 int SkCanvas::saveLayerAlpha(const SkRect* bounds, U8CPU alpha, | 1151 int SkCanvas::saveLayerAlpha(const SkRect* bounds, U8CPU alpha, |
1152 SaveFlags flags) { | 1152 SaveFlags flags) { |
1153 if (0xFF == alpha) { | 1153 if (0xFF == alpha) { |
1154 return this->saveLayer(bounds, NULL, flags); | 1154 return this->saveLayer(bounds, nullptr, flags); |
1155 } else { | 1155 } else { |
1156 SkPaint tmpPaint; | 1156 SkPaint tmpPaint; |
1157 tmpPaint.setAlpha(alpha); | 1157 tmpPaint.setAlpha(alpha); |
1158 return this->saveLayer(bounds, &tmpPaint, flags); | 1158 return this->saveLayer(bounds, &tmpPaint, flags); |
1159 } | 1159 } |
1160 } | 1160 } |
1161 | 1161 |
1162 void SkCanvas::internalRestore() { | 1162 void SkCanvas::internalRestore() { |
1163 SkASSERT(fMCStack.count() != 0); | 1163 SkASSERT(fMCStack.count() != 0); |
1164 | 1164 |
1165 fDeviceCMDirty = true; | 1165 fDeviceCMDirty = true; |
1166 fCachedLocalClipBoundsDirty = true; | 1166 fCachedLocalClipBoundsDirty = true; |
1167 | 1167 |
1168 fClipStack->restore(); | 1168 fClipStack->restore(); |
1169 | 1169 |
1170 // reserve our layer (if any) | 1170 // reserve our layer (if any) |
1171 DeviceCM* layer = fMCRec->fLayer; // may be null | 1171 DeviceCM* layer = fMCRec->fLayer; // may be null |
1172 // now detach it from fMCRec so we can pop(). Gets freed after its drawn | 1172 // now detach it from fMCRec so we can pop(). Gets freed after its drawn |
1173 fMCRec->fLayer = NULL; | 1173 fMCRec->fLayer = nullptr; |
1174 | 1174 |
1175 // now do the normal restore() | 1175 // now do the normal restore() |
1176 fMCRec->~MCRec(); // balanced in save() | 1176 fMCRec->~MCRec(); // balanced in save() |
1177 fMCStack.pop_back(); | 1177 fMCStack.pop_back(); |
1178 fMCRec = (MCRec*)fMCStack.back(); | 1178 fMCRec = (MCRec*)fMCStack.back(); |
1179 | 1179 |
1180 /* Time to draw the layer's offscreen. We can't call the public drawSprite, | 1180 /* Time to draw the layer's offscreen. We can't call the public drawSprite, |
1181 since if we're being recorded, we don't want to record this (the | 1181 since if we're being recorded, we don't want to record this (the |
1182 recorder will have already recorded the restore). | 1182 recorder will have already recorded the restore). |
1183 */ | 1183 */ |
1184 if (layer) { | 1184 if (layer) { |
1185 if (layer->fNext) { | 1185 if (layer->fNext) { |
1186 const SkIPoint& origin = layer->fDevice->getOrigin(); | 1186 const SkIPoint& origin = layer->fDevice->getOrigin(); |
1187 this->internalDrawDevice(layer->fDevice, origin.x(), origin.y(), | 1187 this->internalDrawDevice(layer->fDevice, origin.x(), origin.y(), |
1188 layer->fPaint, layer->fDeviceIsBitmapDevice
); | 1188 layer->fPaint, layer->fDeviceIsBitmapDevice
); |
1189 // reset this, since internalDrawDevice will have set it to true | 1189 // reset this, since internalDrawDevice will have set it to true |
1190 fDeviceCMDirty = true; | 1190 fDeviceCMDirty = true; |
1191 delete layer; | 1191 delete layer; |
1192 } else { | 1192 } else { |
1193 // we're at the root | 1193 // we're at the root |
1194 SkASSERT(layer == (void*)fDeviceCMStorage); | 1194 SkASSERT(layer == (void*)fDeviceCMStorage); |
1195 layer->~DeviceCM(); | 1195 layer->~DeviceCM(); |
1196 } | 1196 } |
1197 } | 1197 } |
1198 } | 1198 } |
1199 | 1199 |
1200 SkSurface* SkCanvas::newSurface(const SkImageInfo& info, const SkSurfaceProps* p
rops) { | 1200 SkSurface* SkCanvas::newSurface(const SkImageInfo& info, const SkSurfaceProps* p
rops) { |
1201 if (NULL == props) { | 1201 if (nullptr == props) { |
1202 props = &fProps; | 1202 props = &fProps; |
1203 } | 1203 } |
1204 return this->onNewSurface(info, *props); | 1204 return this->onNewSurface(info, *props); |
1205 } | 1205 } |
1206 | 1206 |
1207 SkSurface* SkCanvas::onNewSurface(const SkImageInfo& info, const SkSurfaceProps&
props) { | 1207 SkSurface* SkCanvas::onNewSurface(const SkImageInfo& info, const SkSurfaceProps&
props) { |
1208 SkBaseDevice* dev = this->getDevice(); | 1208 SkBaseDevice* dev = this->getDevice(); |
1209 return dev ? dev->newSurface(info, props) : NULL; | 1209 return dev ? dev->newSurface(info, props) : nullptr; |
1210 } | 1210 } |
1211 | 1211 |
1212 SkImageInfo SkCanvas::imageInfo() const { | 1212 SkImageInfo SkCanvas::imageInfo() const { |
1213 SkBaseDevice* dev = this->getDevice(); | 1213 SkBaseDevice* dev = this->getDevice(); |
1214 if (dev) { | 1214 if (dev) { |
1215 return dev->imageInfo(); | 1215 return dev->imageInfo(); |
1216 } else { | 1216 } else { |
1217 return SkImageInfo::MakeUnknown(0, 0); | 1217 return SkImageInfo::MakeUnknown(0, 0); |
1218 } | 1218 } |
1219 } | 1219 } |
1220 | 1220 |
1221 const void* SkCanvas::peekPixels(SkImageInfo* info, size_t* rowBytes) { | 1221 const void* SkCanvas::peekPixels(SkImageInfo* info, size_t* rowBytes) { |
1222 SkPixmap pmap; | 1222 SkPixmap pmap; |
1223 if (!this->onPeekPixels(&pmap)) { | 1223 if (!this->onPeekPixels(&pmap)) { |
1224 return NULL; | 1224 return nullptr; |
1225 } | 1225 } |
1226 if (info) { | 1226 if (info) { |
1227 *info = pmap.info(); | 1227 *info = pmap.info(); |
1228 } | 1228 } |
1229 if (rowBytes) { | 1229 if (rowBytes) { |
1230 *rowBytes = pmap.rowBytes(); | 1230 *rowBytes = pmap.rowBytes(); |
1231 } | 1231 } |
1232 return pmap.addr(); | 1232 return pmap.addr(); |
1233 } | 1233 } |
1234 | 1234 |
1235 bool SkCanvas::onPeekPixels(SkPixmap* pmap) { | 1235 bool SkCanvas::onPeekPixels(SkPixmap* pmap) { |
1236 SkBaseDevice* dev = this->getDevice(); | 1236 SkBaseDevice* dev = this->getDevice(); |
1237 return dev && dev->peekPixels(pmap); | 1237 return dev && dev->peekPixels(pmap); |
1238 } | 1238 } |
1239 | 1239 |
1240 void* SkCanvas::accessTopLayerPixels(SkImageInfo* info, size_t* rowBytes, SkIPoi
nt* origin) { | 1240 void* SkCanvas::accessTopLayerPixels(SkImageInfo* info, size_t* rowBytes, SkIPoi
nt* origin) { |
1241 SkPixmap pmap; | 1241 SkPixmap pmap; |
1242 if (!this->onAccessTopLayerPixels(&pmap)) { | 1242 if (!this->onAccessTopLayerPixels(&pmap)) { |
1243 return NULL; | 1243 return nullptr; |
1244 } | 1244 } |
1245 if (info) { | 1245 if (info) { |
1246 *info = pmap.info(); | 1246 *info = pmap.info(); |
1247 } | 1247 } |
1248 if (rowBytes) { | 1248 if (rowBytes) { |
1249 *rowBytes = pmap.rowBytes(); | 1249 *rowBytes = pmap.rowBytes(); |
1250 } | 1250 } |
1251 if (origin) { | 1251 if (origin) { |
1252 *origin = this->getTopDevice(false)->getOrigin(); | 1252 *origin = this->getTopDevice(false)->getOrigin(); |
1253 } | 1253 } |
1254 return pmap.writable_addr(); | 1254 return pmap.writable_addr(); |
1255 } | 1255 } |
1256 | 1256 |
1257 bool SkCanvas::onAccessTopLayerPixels(SkPixmap* pmap) { | 1257 bool SkCanvas::onAccessTopLayerPixels(SkPixmap* pmap) { |
1258 SkBaseDevice* dev = this->getTopDevice(); | 1258 SkBaseDevice* dev = this->getTopDevice(); |
1259 return dev && dev->accessPixels(pmap); | 1259 return dev && dev->accessPixels(pmap); |
1260 } | 1260 } |
1261 | 1261 |
1262 SkAutoROCanvasPixels::SkAutoROCanvasPixels(SkCanvas* canvas) { | 1262 SkAutoROCanvasPixels::SkAutoROCanvasPixels(SkCanvas* canvas) { |
1263 fAddr = canvas->peekPixels(&fInfo, &fRowBytes); | 1263 fAddr = canvas->peekPixels(&fInfo, &fRowBytes); |
1264 if (NULL == fAddr) { | 1264 if (nullptr == fAddr) { |
1265 fInfo = canvas->imageInfo(); | 1265 fInfo = canvas->imageInfo(); |
1266 if (kUnknown_SkColorType == fInfo.colorType() || !fBitmap.tryAllocPixels
(fInfo)) { | 1266 if (kUnknown_SkColorType == fInfo.colorType() || !fBitmap.tryAllocPixels
(fInfo)) { |
1267 return; // failure, fAddr is NULL | 1267 return; // failure, fAddr is nullptr |
1268 } | 1268 } |
1269 if (!canvas->readPixels(&fBitmap, 0, 0)) { | 1269 if (!canvas->readPixels(&fBitmap, 0, 0)) { |
1270 return; // failure, fAddr is NULL | 1270 return; // failure, fAddr is nullptr |
1271 } | 1271 } |
1272 fAddr = fBitmap.getPixels(); | 1272 fAddr = fBitmap.getPixels(); |
1273 fRowBytes = fBitmap.rowBytes(); | 1273 fRowBytes = fBitmap.rowBytes(); |
1274 } | 1274 } |
1275 SkASSERT(fAddr); // success | 1275 SkASSERT(fAddr); // success |
1276 } | 1276 } |
1277 | 1277 |
1278 bool SkAutoROCanvasPixels::asROBitmap(SkBitmap* bitmap) const { | 1278 bool SkAutoROCanvasPixels::asROBitmap(SkBitmap* bitmap) const { |
1279 if (fAddr) { | 1279 if (fAddr) { |
1280 return bitmap->installPixels(fInfo, const_cast<void*>(fAddr), fRowBytes)
; | 1280 return bitmap->installPixels(fInfo, const_cast<void*>(fAddr), fRowBytes)
; |
1281 } else { | 1281 } else { |
1282 bitmap->reset(); | 1282 bitmap->reset(); |
1283 return false; | 1283 return false; |
1284 } | 1284 } |
1285 } | 1285 } |
1286 | 1286 |
1287 ///////////////////////////////////////////////////////////////////////////// | 1287 ///////////////////////////////////////////////////////////////////////////// |
1288 void SkCanvas::internalDrawBitmap(const SkBitmap& bitmap, | 1288 void SkCanvas::internalDrawBitmap(const SkBitmap& bitmap, |
1289 const SkMatrix& matrix, const SkPaint* paint) { | 1289 const SkMatrix& matrix, const SkPaint* paint) { |
1290 if (bitmap.drawsNothing()) { | 1290 if (bitmap.drawsNothing()) { |
1291 return; | 1291 return; |
1292 } | 1292 } |
1293 | 1293 |
1294 SkLazyPaint lazy; | 1294 SkLazyPaint lazy; |
1295 if (NULL == paint) { | 1295 if (nullptr == paint) { |
1296 paint = lazy.init(); | 1296 paint = lazy.init(); |
1297 } | 1297 } |
1298 | 1298 |
1299 SkDEBUGCODE(bitmap.validate();) | 1299 SkDEBUGCODE(bitmap.validate();) |
1300 | 1300 |
1301 SkRect storage; | 1301 SkRect storage; |
1302 const SkRect* bounds = NULL; | 1302 const SkRect* bounds = nullptr; |
1303 if (paint && paint->canComputeFastBounds()) { | 1303 if (paint && paint->canComputeFastBounds()) { |
1304 bitmap.getBounds(&storage); | 1304 bitmap.getBounds(&storage); |
1305 matrix.mapRect(&storage); | 1305 matrix.mapRect(&storage); |
1306 bounds = &paint->computeFastBounds(storage, &storage); | 1306 bounds = &paint->computeFastBounds(storage, &storage); |
1307 } | 1307 } |
1308 | 1308 |
1309 LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type, bounds) | 1309 LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type, bounds) |
1310 | 1310 |
1311 while (iter.next()) { | 1311 while (iter.next()) { |
1312 iter.fDevice->drawBitmap(iter, bitmap, matrix, looper.paint()); | 1312 iter.fDevice->drawBitmap(iter, bitmap, matrix, looper.paint()); |
1313 } | 1313 } |
1314 | 1314 |
1315 LOOPER_END | 1315 LOOPER_END |
1316 } | 1316 } |
1317 | 1317 |
1318 void SkCanvas::internalDrawDevice(SkBaseDevice* srcDev, int x, int y, | 1318 void SkCanvas::internalDrawDevice(SkBaseDevice* srcDev, int x, int y, |
1319 const SkPaint* paint, bool deviceIsBitmapDevic
e) { | 1319 const SkPaint* paint, bool deviceIsBitmapDevic
e) { |
1320 SkPaint tmp; | 1320 SkPaint tmp; |
1321 if (NULL == paint) { | 1321 if (nullptr == paint) { |
1322 paint = &tmp; | 1322 paint = &tmp; |
1323 } | 1323 } |
1324 | 1324 |
1325 LOOPER_BEGIN_DRAWDEVICE(*paint, SkDrawFilter::kBitmap_Type) | 1325 LOOPER_BEGIN_DRAWDEVICE(*paint, SkDrawFilter::kBitmap_Type) |
1326 while (iter.next()) { | 1326 while (iter.next()) { |
1327 SkBaseDevice* dstDev = iter.fDevice; | 1327 SkBaseDevice* dstDev = iter.fDevice; |
1328 paint = &looper.paint(); | 1328 paint = &looper.paint(); |
1329 SkImageFilter* filter = paint->getImageFilter(); | 1329 SkImageFilter* filter = paint->getImageFilter(); |
1330 SkIPoint pos = { x - iter.getX(), y - iter.getY() }; | 1330 SkIPoint pos = { x - iter.getX(), y - iter.getY() }; |
1331 if (filter && !dstDev->canHandleImageFilter(filter)) { | 1331 if (filter && !dstDev->canHandleImageFilter(filter)) { |
1332 SkImageFilter::Proxy proxy(dstDev); | 1332 SkImageFilter::Proxy proxy(dstDev); |
1333 SkBitmap dst; | 1333 SkBitmap dst; |
1334 SkIPoint offset = SkIPoint::Make(0, 0); | 1334 SkIPoint offset = SkIPoint::Make(0, 0); |
1335 const SkBitmap& src = srcDev->accessBitmap(false); | 1335 const SkBitmap& src = srcDev->accessBitmap(false); |
1336 SkMatrix matrix = *iter.fMatrix; | 1336 SkMatrix matrix = *iter.fMatrix; |
1337 matrix.postTranslate(SkIntToScalar(-pos.x()), SkIntToScalar(-pos.y()
)); | 1337 matrix.postTranslate(SkIntToScalar(-pos.x()), SkIntToScalar(-pos.y()
)); |
1338 SkIRect clipBounds = SkIRect::MakeWH(srcDev->width(), srcDev->height
()); | 1338 SkIRect clipBounds = SkIRect::MakeWH(srcDev->width(), srcDev->height
()); |
1339 SkAutoTUnref<SkImageFilter::Cache> cache(dstDev->getImageFilterCache
()); | 1339 SkAutoTUnref<SkImageFilter::Cache> cache(dstDev->getImageFilterCache
()); |
1340 SkImageFilter::Context ctx(matrix, clipBounds, cache.get()); | 1340 SkImageFilter::Context ctx(matrix, clipBounds, cache.get()); |
1341 if (filter->filterImage(&proxy, src, ctx, &dst, &offset)) { | 1341 if (filter->filterImage(&proxy, src, ctx, &dst, &offset)) { |
1342 SkPaint tmpUnfiltered(*paint); | 1342 SkPaint tmpUnfiltered(*paint); |
1343 tmpUnfiltered.setImageFilter(NULL); | 1343 tmpUnfiltered.setImageFilter(nullptr); |
1344 dstDev->drawSprite(iter, dst, pos.x() + offset.x(), pos.y() + of
fset.y(), | 1344 dstDev->drawSprite(iter, dst, pos.x() + offset.x(), pos.y() + of
fset.y(), |
1345 tmpUnfiltered); | 1345 tmpUnfiltered); |
1346 } | 1346 } |
1347 } else if (deviceIsBitmapDevice) { | 1347 } else if (deviceIsBitmapDevice) { |
1348 const SkBitmap& src = static_cast<SkBitmapDevice*>(srcDev)->fBitmap; | 1348 const SkBitmap& src = static_cast<SkBitmapDevice*>(srcDev)->fBitmap; |
1349 dstDev->drawSprite(iter, src, pos.x(), pos.y(), *paint); | 1349 dstDev->drawSprite(iter, src, pos.x(), pos.y(), *paint); |
1350 } else { | 1350 } else { |
1351 dstDev->drawDevice(iter, srcDev, pos.x(), pos.y(), *paint); | 1351 dstDev->drawDevice(iter, srcDev, pos.x(), pos.y(), *paint); |
1352 } | 1352 } |
1353 } | 1353 } |
1354 LOOPER_END | 1354 LOOPER_END |
1355 } | 1355 } |
1356 | 1356 |
1357 void SkCanvas::onDrawSprite(const SkBitmap& bitmap, int x, int y, const SkPaint*
paint) { | 1357 void SkCanvas::onDrawSprite(const SkBitmap& bitmap, int x, int y, const SkPaint*
paint) { |
1358 if (gTreatSpriteAsBitmap) { | 1358 if (gTreatSpriteAsBitmap) { |
1359 this->save(); | 1359 this->save(); |
1360 this->resetMatrix(); | 1360 this->resetMatrix(); |
1361 this->drawBitmap(bitmap, SkIntToScalar(x), SkIntToScalar(y), paint); | 1361 this->drawBitmap(bitmap, SkIntToScalar(x), SkIntToScalar(y), paint); |
1362 this->restore(); | 1362 this->restore(); |
1363 return; | 1363 return; |
1364 } | 1364 } |
1365 | 1365 |
1366 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawSprite()"); | 1366 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawSprite()"); |
1367 if (bitmap.drawsNothing()) { | 1367 if (bitmap.drawsNothing()) { |
1368 return; | 1368 return; |
1369 } | 1369 } |
1370 SkDEBUGCODE(bitmap.validate();) | 1370 SkDEBUGCODE(bitmap.validate();) |
1371 | 1371 |
1372 SkPaint tmp; | 1372 SkPaint tmp; |
1373 if (NULL == paint) { | 1373 if (nullptr == paint) { |
1374 paint = &tmp; | 1374 paint = &tmp; |
1375 } | 1375 } |
1376 | 1376 |
1377 LOOPER_BEGIN_DRAWDEVICE(*paint, SkDrawFilter::kBitmap_Type) | 1377 LOOPER_BEGIN_DRAWDEVICE(*paint, SkDrawFilter::kBitmap_Type) |
1378 | 1378 |
1379 while (iter.next()) { | 1379 while (iter.next()) { |
1380 paint = &looper.paint(); | 1380 paint = &looper.paint(); |
1381 SkImageFilter* filter = paint->getImageFilter(); | 1381 SkImageFilter* filter = paint->getImageFilter(); |
1382 SkIPoint pos = { x - iter.getX(), y - iter.getY() }; | 1382 SkIPoint pos = { x - iter.getX(), y - iter.getY() }; |
1383 if (filter && !iter.fDevice->canHandleImageFilter(filter)) { | 1383 if (filter && !iter.fDevice->canHandleImageFilter(filter)) { |
1384 SkImageFilter::Proxy proxy(iter.fDevice); | 1384 SkImageFilter::Proxy proxy(iter.fDevice); |
1385 SkBitmap dst; | 1385 SkBitmap dst; |
1386 SkIPoint offset = SkIPoint::Make(0, 0); | 1386 SkIPoint offset = SkIPoint::Make(0, 0); |
1387 SkMatrix matrix = *iter.fMatrix; | 1387 SkMatrix matrix = *iter.fMatrix; |
1388 matrix.postTranslate(SkIntToScalar(-pos.x()), SkIntToScalar(-pos.y()
)); | 1388 matrix.postTranslate(SkIntToScalar(-pos.x()), SkIntToScalar(-pos.y()
)); |
1389 const SkIRect clipBounds = bitmap.bounds(); | 1389 const SkIRect clipBounds = bitmap.bounds(); |
1390 SkAutoTUnref<SkImageFilter::Cache> cache(iter.fDevice->getImageFilte
rCache()); | 1390 SkAutoTUnref<SkImageFilter::Cache> cache(iter.fDevice->getImageFilte
rCache()); |
1391 SkImageFilter::Context ctx(matrix, clipBounds, cache.get()); | 1391 SkImageFilter::Context ctx(matrix, clipBounds, cache.get()); |
1392 if (filter->filterImage(&proxy, bitmap, ctx, &dst, &offset)) { | 1392 if (filter->filterImage(&proxy, bitmap, ctx, &dst, &offset)) { |
1393 SkPaint tmpUnfiltered(*paint); | 1393 SkPaint tmpUnfiltered(*paint); |
1394 tmpUnfiltered.setImageFilter(NULL); | 1394 tmpUnfiltered.setImageFilter(nullptr); |
1395 iter.fDevice->drawSprite(iter, dst, pos.x() + offset.x(), pos.y(
) + offset.y(), | 1395 iter.fDevice->drawSprite(iter, dst, pos.x() + offset.x(), pos.y(
) + offset.y(), |
1396 tmpUnfiltered); | 1396 tmpUnfiltered); |
1397 } | 1397 } |
1398 } else { | 1398 } else { |
1399 iter.fDevice->drawSprite(iter, bitmap, pos.x(), pos.y(), *paint); | 1399 iter.fDevice->drawSprite(iter, bitmap, pos.x(), pos.y(), *paint); |
1400 } | 1400 } |
1401 } | 1401 } |
1402 LOOPER_END | 1402 LOOPER_END |
1403 } | 1403 } |
1404 | 1404 |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1641 SkASSERT(this->isClipEmpty()); | 1641 SkASSERT(this->isClipEmpty()); |
1642 return; | 1642 return; |
1643 } | 1643 } |
1644 | 1644 |
1645 SkIRect ir; | 1645 SkIRect ir; |
1646 ir.set(0, 0, device->width(), device->height()); | 1646 ir.set(0, 0, device->width(), device->height()); |
1647 SkRasterClip tmpClip(ir, fConservativeRasterClip); | 1647 SkRasterClip tmpClip(ir, fConservativeRasterClip); |
1648 | 1648 |
1649 SkClipStack::B2TIter iter(*fClipStack); | 1649 SkClipStack::B2TIter iter(*fClipStack); |
1650 const SkClipStack::Element* element; | 1650 const SkClipStack::Element* element; |
1651 while ((element = iter.next()) != NULL) { | 1651 while ((element = iter.next()) != nullptr) { |
1652 switch (element->getType()) { | 1652 switch (element->getType()) { |
1653 case SkClipStack::Element::kRect_Type: | 1653 case SkClipStack::Element::kRect_Type: |
1654 element->getRect().round(&ir); | 1654 element->getRect().round(&ir); |
1655 tmpClip.op(ir, element->getOp()); | 1655 tmpClip.op(ir, element->getOp()); |
1656 break; | 1656 break; |
1657 case SkClipStack::Element::kEmpty_Type: | 1657 case SkClipStack::Element::kEmpty_Type: |
1658 tmpClip.setEmpty(); | 1658 tmpClip.setEmpty(); |
1659 break; | 1659 break; |
1660 default: { | 1660 default: { |
1661 SkPath path; | 1661 SkPath path; |
1662 element->asPath(&path); | 1662 element->asPath(&path); |
1663 rasterclip_path(&tmpClip, this, path, element->getOp(), element-
>isAA()); | 1663 rasterclip_path(&tmpClip, this, path, element->getOp(), element-
>isAA()); |
1664 break; | 1664 break; |
1665 } | 1665 } |
1666 } | 1666 } |
1667 } | 1667 } |
1668 } | 1668 } |
1669 #endif | 1669 #endif |
1670 | 1670 |
1671 void SkCanvas::replayClips(ClipVisitor* visitor) const { | 1671 void SkCanvas::replayClips(ClipVisitor* visitor) const { |
1672 SkClipStack::B2TIter iter(*fClipStack); | 1672 SkClipStack::B2TIter iter(*fClipStack); |
1673 const SkClipStack::Element* element; | 1673 const SkClipStack::Element* element; |
1674 | 1674 |
1675 while ((element = iter.next()) != NULL) { | 1675 while ((element = iter.next()) != nullptr) { |
1676 element->replay(visitor); | 1676 element->replay(visitor); |
1677 } | 1677 } |
1678 } | 1678 } |
1679 | 1679 |
1680 /////////////////////////////////////////////////////////////////////////////// | 1680 /////////////////////////////////////////////////////////////////////////////// |
1681 | 1681 |
1682 bool SkCanvas::isClipEmpty() const { | 1682 bool SkCanvas::isClipEmpty() const { |
1683 return fMCRec->fRasterClip.isEmpty(); | 1683 return fMCRec->fRasterClip.isEmpty(); |
1684 } | 1684 } |
1685 | 1685 |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1763 const SkMatrix& SkCanvas::getTotalMatrix() const { | 1763 const SkMatrix& SkCanvas::getTotalMatrix() const { |
1764 return fMCRec->fMatrix; | 1764 return fMCRec->fMatrix; |
1765 } | 1765 } |
1766 | 1766 |
1767 const SkRegion& SkCanvas::internal_private_getTotalClip() const { | 1767 const SkRegion& SkCanvas::internal_private_getTotalClip() const { |
1768 return fMCRec->fRasterClip.forceGetBW(); | 1768 return fMCRec->fRasterClip.forceGetBW(); |
1769 } | 1769 } |
1770 | 1770 |
1771 GrRenderTarget* SkCanvas::internal_private_accessTopLayerRenderTarget() { | 1771 GrRenderTarget* SkCanvas::internal_private_accessTopLayerRenderTarget() { |
1772 SkBaseDevice* dev = this->getTopDevice(); | 1772 SkBaseDevice* dev = this->getTopDevice(); |
1773 return dev ? dev->accessRenderTarget() : NULL; | 1773 return dev ? dev->accessRenderTarget() : nullptr; |
1774 } | 1774 } |
1775 | 1775 |
1776 GrContext* SkCanvas::getGrContext() { | 1776 GrContext* SkCanvas::getGrContext() { |
1777 #if SK_SUPPORT_GPU | 1777 #if SK_SUPPORT_GPU |
1778 SkBaseDevice* device = this->getTopDevice(); | 1778 SkBaseDevice* device = this->getTopDevice(); |
1779 if (device) { | 1779 if (device) { |
1780 GrRenderTarget* renderTarget = device->accessRenderTarget(); | 1780 GrRenderTarget* renderTarget = device->accessRenderTarget(); |
1781 if (renderTarget) { | 1781 if (renderTarget) { |
1782 return renderTarget->getContext(); | 1782 return renderTarget->getContext(); |
1783 } | 1783 } |
1784 } | 1784 } |
1785 #endif | 1785 #endif |
1786 | 1786 |
1787 return NULL; | 1787 return nullptr; |
1788 | 1788 |
1789 } | 1789 } |
1790 | 1790 |
1791 void SkCanvas::drawDRRect(const SkRRect& outer, const SkRRect& inner, | 1791 void SkCanvas::drawDRRect(const SkRRect& outer, const SkRRect& inner, |
1792 const SkPaint& paint) { | 1792 const SkPaint& paint) { |
1793 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawDRRect()"); | 1793 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawDRRect()"); |
1794 if (outer.isEmpty()) { | 1794 if (outer.isEmpty()) { |
1795 return; | 1795 return; |
1796 } | 1796 } |
1797 if (inner.isEmpty()) { | 1797 if (inner.isEmpty()) { |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1960 fSurfaceBase->aboutToDraw(SkSurface::kDiscard_ContentChangeMode); | 1960 fSurfaceBase->aboutToDraw(SkSurface::kDiscard_ContentChangeMode); |
1961 } | 1961 } |
1962 } | 1962 } |
1963 | 1963 |
1964 void SkCanvas::onDrawPaint(const SkPaint& paint) { | 1964 void SkCanvas::onDrawPaint(const SkPaint& paint) { |
1965 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawPaint()"); | 1965 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawPaint()"); |
1966 this->internalDrawPaint(paint); | 1966 this->internalDrawPaint(paint); |
1967 } | 1967 } |
1968 | 1968 |
1969 void SkCanvas::internalDrawPaint(const SkPaint& paint) { | 1969 void SkCanvas::internalDrawPaint(const SkPaint& paint) { |
1970 LOOPER_BEGIN_CHECK_COMPLETE_OVERWRITE(paint, SkDrawFilter::kPaint_Type, NULL
, false) | 1970 LOOPER_BEGIN_CHECK_COMPLETE_OVERWRITE(paint, SkDrawFilter::kPaint_Type, null
ptr, false) |
1971 | 1971 |
1972 while (iter.next()) { | 1972 while (iter.next()) { |
1973 iter.fDevice->drawPaint(iter, looper.paint()); | 1973 iter.fDevice->drawPaint(iter, looper.paint()); |
1974 } | 1974 } |
1975 | 1975 |
1976 LOOPER_END | 1976 LOOPER_END |
1977 } | 1977 } |
1978 | 1978 |
1979 void SkCanvas::onDrawPoints(PointMode mode, size_t count, const SkPoint pts[], | 1979 void SkCanvas::onDrawPoints(PointMode mode, size_t count, const SkPoint pts[], |
1980 const SkPaint& paint) { | 1980 const SkPaint& paint) { |
1981 TRACE_EVENT1("disabled-by-default-skia", "SkCanvas::drawPoints()", "count",
static_cast<uint64_t>(count)); | 1981 TRACE_EVENT1("disabled-by-default-skia", "SkCanvas::drawPoints()", "count",
static_cast<uint64_t>(count)); |
1982 if ((long)count <= 0) { | 1982 if ((long)count <= 0) { |
1983 return; | 1983 return; |
1984 } | 1984 } |
1985 | 1985 |
1986 SkRect r, storage; | 1986 SkRect r, storage; |
1987 const SkRect* bounds = NULL; | 1987 const SkRect* bounds = nullptr; |
1988 if (paint.canComputeFastBounds()) { | 1988 if (paint.canComputeFastBounds()) { |
1989 // special-case 2 points (common for drawing a single line) | 1989 // special-case 2 points (common for drawing a single line) |
1990 if (2 == count) { | 1990 if (2 == count) { |
1991 r.set(pts[0], pts[1]); | 1991 r.set(pts[0], pts[1]); |
1992 } else { | 1992 } else { |
1993 r.set(pts, SkToInt(count)); | 1993 r.set(pts, SkToInt(count)); |
1994 } | 1994 } |
1995 bounds = &paint.computeFastStrokeBounds(r, &storage); | 1995 bounds = &paint.computeFastStrokeBounds(r, &storage); |
1996 if (this->quickReject(*bounds)) { | 1996 if (this->quickReject(*bounds)) { |
1997 return; | 1997 return; |
1998 } | 1998 } |
1999 } | 1999 } |
2000 | 2000 |
2001 SkASSERT(pts != NULL); | 2001 SkASSERT(pts != nullptr); |
2002 | 2002 |
2003 LOOPER_BEGIN(paint, SkDrawFilter::kPoint_Type, bounds) | 2003 LOOPER_BEGIN(paint, SkDrawFilter::kPoint_Type, bounds) |
2004 | 2004 |
2005 while (iter.next()) { | 2005 while (iter.next()) { |
2006 iter.fDevice->drawPoints(iter, mode, count, pts, looper.paint()); | 2006 iter.fDevice->drawPoints(iter, mode, count, pts, looper.paint()); |
2007 } | 2007 } |
2008 | 2008 |
2009 LOOPER_END | 2009 LOOPER_END |
2010 } | 2010 } |
2011 | 2011 |
2012 void SkCanvas::onDrawRect(const SkRect& r, const SkPaint& paint) { | 2012 void SkCanvas::onDrawRect(const SkRect& r, const SkPaint& paint) { |
2013 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawRect()"); | 2013 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawRect()"); |
2014 SkRect storage; | 2014 SkRect storage; |
2015 const SkRect* bounds = NULL; | 2015 const SkRect* bounds = nullptr; |
2016 if (paint.canComputeFastBounds()) { | 2016 if (paint.canComputeFastBounds()) { |
2017 // Skia will draw an inverted rect, because it explicitly "sorts" it dow
nstream. | 2017 // Skia will draw an inverted rect, because it explicitly "sorts" it dow
nstream. |
2018 // To prevent accidental rejecting at this stage, we have to sort it bef
ore we check. | 2018 // To prevent accidental rejecting at this stage, we have to sort it bef
ore we check. |
2019 SkRect tmp(r); | 2019 SkRect tmp(r); |
2020 tmp.sort(); | 2020 tmp.sort(); |
2021 | 2021 |
2022 bounds = &paint.computeFastBounds(tmp, &storage); | 2022 bounds = &paint.computeFastBounds(tmp, &storage); |
2023 if (this->quickReject(*bounds)) { | 2023 if (this->quickReject(*bounds)) { |
2024 return; | 2024 return; |
2025 } | 2025 } |
2026 } | 2026 } |
2027 | 2027 |
2028 LOOPER_BEGIN_CHECK_COMPLETE_OVERWRITE(paint, SkDrawFilter::kRect_Type, bound
s, false) | 2028 LOOPER_BEGIN_CHECK_COMPLETE_OVERWRITE(paint, SkDrawFilter::kRect_Type, bound
s, false) |
2029 | 2029 |
2030 while (iter.next()) { | 2030 while (iter.next()) { |
2031 iter.fDevice->drawRect(iter, r, looper.paint()); | 2031 iter.fDevice->drawRect(iter, r, looper.paint()); |
2032 } | 2032 } |
2033 | 2033 |
2034 LOOPER_END | 2034 LOOPER_END |
2035 } | 2035 } |
2036 | 2036 |
2037 void SkCanvas::onDrawOval(const SkRect& oval, const SkPaint& paint) { | 2037 void SkCanvas::onDrawOval(const SkRect& oval, const SkPaint& paint) { |
2038 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawOval()"); | 2038 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawOval()"); |
2039 SkRect storage; | 2039 SkRect storage; |
2040 const SkRect* bounds = NULL; | 2040 const SkRect* bounds = nullptr; |
2041 if (paint.canComputeFastBounds()) { | 2041 if (paint.canComputeFastBounds()) { |
2042 bounds = &paint.computeFastBounds(oval, &storage); | 2042 bounds = &paint.computeFastBounds(oval, &storage); |
2043 if (this->quickReject(*bounds)) { | 2043 if (this->quickReject(*bounds)) { |
2044 return; | 2044 return; |
2045 } | 2045 } |
2046 } | 2046 } |
2047 | 2047 |
2048 LOOPER_BEGIN(paint, SkDrawFilter::kOval_Type, bounds) | 2048 LOOPER_BEGIN(paint, SkDrawFilter::kOval_Type, bounds) |
2049 | 2049 |
2050 while (iter.next()) { | 2050 while (iter.next()) { |
2051 iter.fDevice->drawOval(iter, oval, looper.paint()); | 2051 iter.fDevice->drawOval(iter, oval, looper.paint()); |
2052 } | 2052 } |
2053 | 2053 |
2054 LOOPER_END | 2054 LOOPER_END |
2055 } | 2055 } |
2056 | 2056 |
2057 void SkCanvas::onDrawRRect(const SkRRect& rrect, const SkPaint& paint) { | 2057 void SkCanvas::onDrawRRect(const SkRRect& rrect, const SkPaint& paint) { |
2058 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawRRect()"); | 2058 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawRRect()"); |
2059 SkRect storage; | 2059 SkRect storage; |
2060 const SkRect* bounds = NULL; | 2060 const SkRect* bounds = nullptr; |
2061 if (paint.canComputeFastBounds()) { | 2061 if (paint.canComputeFastBounds()) { |
2062 bounds = &paint.computeFastBounds(rrect.getBounds(), &storage); | 2062 bounds = &paint.computeFastBounds(rrect.getBounds(), &storage); |
2063 if (this->quickReject(*bounds)) { | 2063 if (this->quickReject(*bounds)) { |
2064 return; | 2064 return; |
2065 } | 2065 } |
2066 } | 2066 } |
2067 | 2067 |
2068 if (rrect.isRect()) { | 2068 if (rrect.isRect()) { |
2069 // call the non-virtual version | 2069 // call the non-virtual version |
2070 this->SkCanvas::drawRect(rrect.getBounds(), paint); | 2070 this->SkCanvas::drawRect(rrect.getBounds(), paint); |
2071 return; | 2071 return; |
2072 } else if (rrect.isOval()) { | 2072 } else if (rrect.isOval()) { |
2073 // call the non-virtual version | 2073 // call the non-virtual version |
2074 this->SkCanvas::drawOval(rrect.getBounds(), paint); | 2074 this->SkCanvas::drawOval(rrect.getBounds(), paint); |
2075 return; | 2075 return; |
2076 } | 2076 } |
2077 | 2077 |
2078 LOOPER_BEGIN(paint, SkDrawFilter::kRRect_Type, bounds) | 2078 LOOPER_BEGIN(paint, SkDrawFilter::kRRect_Type, bounds) |
2079 | 2079 |
2080 while (iter.next()) { | 2080 while (iter.next()) { |
2081 iter.fDevice->drawRRect(iter, rrect, looper.paint()); | 2081 iter.fDevice->drawRRect(iter, rrect, looper.paint()); |
2082 } | 2082 } |
2083 | 2083 |
2084 LOOPER_END | 2084 LOOPER_END |
2085 } | 2085 } |
2086 | 2086 |
2087 void SkCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, | 2087 void SkCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, |
2088 const SkPaint& paint) { | 2088 const SkPaint& paint) { |
2089 SkRect storage; | 2089 SkRect storage; |
2090 const SkRect* bounds = NULL; | 2090 const SkRect* bounds = nullptr; |
2091 if (paint.canComputeFastBounds()) { | 2091 if (paint.canComputeFastBounds()) { |
2092 bounds = &paint.computeFastBounds(outer.getBounds(), &storage); | 2092 bounds = &paint.computeFastBounds(outer.getBounds(), &storage); |
2093 if (this->quickReject(*bounds)) { | 2093 if (this->quickReject(*bounds)) { |
2094 return; | 2094 return; |
2095 } | 2095 } |
2096 } | 2096 } |
2097 | 2097 |
2098 LOOPER_BEGIN(paint, SkDrawFilter::kRRect_Type, bounds) | 2098 LOOPER_BEGIN(paint, SkDrawFilter::kRRect_Type, bounds) |
2099 | 2099 |
2100 while (iter.next()) { | 2100 while (iter.next()) { |
2101 iter.fDevice->drawDRRect(iter, outer, inner, looper.paint()); | 2101 iter.fDevice->drawDRRect(iter, outer, inner, looper.paint()); |
2102 } | 2102 } |
2103 | 2103 |
2104 LOOPER_END | 2104 LOOPER_END |
2105 } | 2105 } |
2106 | 2106 |
2107 void SkCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) { | 2107 void SkCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) { |
2108 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawPath()"); | 2108 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawPath()"); |
2109 if (!path.isFinite()) { | 2109 if (!path.isFinite()) { |
2110 return; | 2110 return; |
2111 } | 2111 } |
2112 | 2112 |
2113 SkRect storage; | 2113 SkRect storage; |
2114 const SkRect* bounds = NULL; | 2114 const SkRect* bounds = nullptr; |
2115 if (!path.isInverseFillType() && paint.canComputeFastBounds()) { | 2115 if (!path.isInverseFillType() && paint.canComputeFastBounds()) { |
2116 const SkRect& pathBounds = path.getBounds(); | 2116 const SkRect& pathBounds = path.getBounds(); |
2117 bounds = &paint.computeFastBounds(pathBounds, &storage); | 2117 bounds = &paint.computeFastBounds(pathBounds, &storage); |
2118 if (this->quickReject(*bounds)) { | 2118 if (this->quickReject(*bounds)) { |
2119 return; | 2119 return; |
2120 } | 2120 } |
2121 } | 2121 } |
2122 | 2122 |
2123 const SkRect& r = path.getBounds(); | 2123 const SkRect& r = path.getBounds(); |
2124 if (r.width() <= 0 && r.height() <= 0) { | 2124 if (r.width() <= 0 && r.height() <= 0) { |
2125 if (path.isInverseFillType()) { | 2125 if (path.isInverseFillType()) { |
2126 this->internalDrawPaint(paint); | 2126 this->internalDrawPaint(paint); |
2127 } | 2127 } |
2128 return; | 2128 return; |
2129 } | 2129 } |
2130 | 2130 |
2131 LOOPER_BEGIN(paint, SkDrawFilter::kPath_Type, bounds) | 2131 LOOPER_BEGIN(paint, SkDrawFilter::kPath_Type, bounds) |
2132 | 2132 |
2133 while (iter.next()) { | 2133 while (iter.next()) { |
2134 iter.fDevice->drawPath(iter, path, looper.paint()); | 2134 iter.fDevice->drawPath(iter, path, looper.paint()); |
2135 } | 2135 } |
2136 | 2136 |
2137 LOOPER_END | 2137 LOOPER_END |
2138 } | 2138 } |
2139 | 2139 |
2140 void SkCanvas::onDrawImage(const SkImage* image, SkScalar x, SkScalar y, const S
kPaint* paint) { | 2140 void SkCanvas::onDrawImage(const SkImage* image, SkScalar x, SkScalar y, const S
kPaint* paint) { |
2141 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawImage()"); | 2141 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawImage()"); |
2142 SkRect bounds = SkRect::MakeXYWH(x, y, | 2142 SkRect bounds = SkRect::MakeXYWH(x, y, |
2143 SkIntToScalar(image->width()), SkIntToScala
r(image->height())); | 2143 SkIntToScalar(image->width()), SkIntToScala
r(image->height())); |
2144 if (NULL == paint || paint->canComputeFastBounds()) { | 2144 if (nullptr == paint || paint->canComputeFastBounds()) { |
2145 if (paint) { | 2145 if (paint) { |
2146 paint->computeFastBounds(bounds, &bounds); | 2146 paint->computeFastBounds(bounds, &bounds); |
2147 } | 2147 } |
2148 if (this->quickReject(bounds)) { | 2148 if (this->quickReject(bounds)) { |
2149 return; | 2149 return; |
2150 } | 2150 } |
2151 } | 2151 } |
2152 | 2152 |
2153 SkLazyPaint lazy; | 2153 SkLazyPaint lazy; |
2154 if (NULL == paint) { | 2154 if (nullptr == paint) { |
2155 paint = lazy.init(); | 2155 paint = lazy.init(); |
2156 } | 2156 } |
2157 | 2157 |
2158 LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type, &bounds) | 2158 LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type, &bounds) |
2159 | 2159 |
2160 while (iter.next()) { | 2160 while (iter.next()) { |
2161 iter.fDevice->drawImage(iter, image, x, y, looper.paint()); | 2161 iter.fDevice->drawImage(iter, image, x, y, looper.paint()); |
2162 } | 2162 } |
2163 | 2163 |
2164 LOOPER_END | 2164 LOOPER_END |
2165 } | 2165 } |
2166 | 2166 |
2167 void SkCanvas::onDrawImageRect(const SkImage* image, const SkRect* src, const Sk
Rect& dst, | 2167 void SkCanvas::onDrawImageRect(const SkImage* image, const SkRect* src, const Sk
Rect& dst, |
2168 const SkPaint* paint, SrcRectConstraint constrain
t) { | 2168 const SkPaint* paint, SrcRectConstraint constrain
t) { |
2169 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawImageRect()"); | 2169 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawImageRect()"); |
2170 SkRect storage; | 2170 SkRect storage; |
2171 const SkRect* bounds = &dst; | 2171 const SkRect* bounds = &dst; |
2172 if (NULL == paint || paint->canComputeFastBounds()) { | 2172 if (nullptr == paint || paint->canComputeFastBounds()) { |
2173 if (paint) { | 2173 if (paint) { |
2174 bounds = &paint->computeFastBounds(dst, &storage); | 2174 bounds = &paint->computeFastBounds(dst, &storage); |
2175 } | 2175 } |
2176 if (this->quickReject(*bounds)) { | 2176 if (this->quickReject(*bounds)) { |
2177 return; | 2177 return; |
2178 } | 2178 } |
2179 } | 2179 } |
2180 SkLazyPaint lazy; | 2180 SkLazyPaint lazy; |
2181 if (NULL == paint) { | 2181 if (nullptr == paint) { |
2182 paint = lazy.init(); | 2182 paint = lazy.init(); |
2183 } | 2183 } |
2184 | 2184 |
2185 LOOPER_BEGIN_CHECK_COMPLETE_OVERWRITE(*paint, SkDrawFilter::kBitmap_Type, bo
unds, | 2185 LOOPER_BEGIN_CHECK_COMPLETE_OVERWRITE(*paint, SkDrawFilter::kBitmap_Type, bo
unds, |
2186 image->isOpaque()) | 2186 image->isOpaque()) |
2187 | 2187 |
2188 while (iter.next()) { | 2188 while (iter.next()) { |
2189 iter.fDevice->drawImageRect(iter, image, src, dst, looper.paint(), const
raint); | 2189 iter.fDevice->drawImageRect(iter, image, src, dst, looper.paint(), const
raint); |
2190 } | 2190 } |
2191 | 2191 |
2192 LOOPER_END | 2192 LOOPER_END |
2193 } | 2193 } |
2194 | 2194 |
2195 void SkCanvas::onDrawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y, cons
t SkPaint* paint) { | 2195 void SkCanvas::onDrawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y, cons
t SkPaint* paint) { |
2196 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawBitmap()"); | 2196 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawBitmap()"); |
2197 SkDEBUGCODE(bitmap.validate();) | 2197 SkDEBUGCODE(bitmap.validate();) |
2198 | 2198 |
2199 if (NULL == paint || paint->canComputeFastBounds()) { | 2199 if (nullptr == paint || paint->canComputeFastBounds()) { |
2200 SkRect bounds = { | 2200 SkRect bounds = { |
2201 x, y, | 2201 x, y, |
2202 x + SkIntToScalar(bitmap.width()), | 2202 x + SkIntToScalar(bitmap.width()), |
2203 y + SkIntToScalar(bitmap.height()) | 2203 y + SkIntToScalar(bitmap.height()) |
2204 }; | 2204 }; |
2205 if (paint) { | 2205 if (paint) { |
2206 (void)paint->computeFastBounds(bounds, &bounds); | 2206 (void)paint->computeFastBounds(bounds, &bounds); |
2207 } | 2207 } |
2208 if (this->quickReject(bounds)) { | 2208 if (this->quickReject(bounds)) { |
2209 return; | 2209 return; |
2210 } | 2210 } |
2211 } | 2211 } |
2212 | 2212 |
2213 SkMatrix matrix; | 2213 SkMatrix matrix; |
2214 matrix.setTranslate(x, y); | 2214 matrix.setTranslate(x, y); |
2215 this->internalDrawBitmap(bitmap, matrix, paint); | 2215 this->internalDrawBitmap(bitmap, matrix, paint); |
2216 } | 2216 } |
2217 | 2217 |
2218 // this one is non-virtual, so it can be called safely by other canvas apis | 2218 // this one is non-virtual, so it can be called safely by other canvas apis |
2219 void SkCanvas::internalDrawBitmapRect(const SkBitmap& bitmap, const SkRect* src, | 2219 void SkCanvas::internalDrawBitmapRect(const SkBitmap& bitmap, const SkRect* src, |
2220 const SkRect& dst, const SkPaint* paint, | 2220 const SkRect& dst, const SkPaint* paint, |
2221 SrcRectConstraint constraint) { | 2221 SrcRectConstraint constraint) { |
2222 if (bitmap.drawsNothing() || dst.isEmpty()) { | 2222 if (bitmap.drawsNothing() || dst.isEmpty()) { |
2223 return; | 2223 return; |
2224 } | 2224 } |
2225 | 2225 |
2226 SkRect storage; | 2226 SkRect storage; |
2227 const SkRect* bounds = &dst; | 2227 const SkRect* bounds = &dst; |
2228 if (NULL == paint || paint->canComputeFastBounds()) { | 2228 if (nullptr == paint || paint->canComputeFastBounds()) { |
2229 if (paint) { | 2229 if (paint) { |
2230 bounds = &paint->computeFastBounds(dst, &storage); | 2230 bounds = &paint->computeFastBounds(dst, &storage); |
2231 } | 2231 } |
2232 if (this->quickReject(*bounds)) { | 2232 if (this->quickReject(*bounds)) { |
2233 return; | 2233 return; |
2234 } | 2234 } |
2235 } | 2235 } |
2236 | 2236 |
2237 SkLazyPaint lazy; | 2237 SkLazyPaint lazy; |
2238 if (NULL == paint) { | 2238 if (nullptr == paint) { |
2239 paint = lazy.init(); | 2239 paint = lazy.init(); |
2240 } | 2240 } |
2241 | 2241 |
2242 LOOPER_BEGIN_CHECK_COMPLETE_OVERWRITE(*paint, SkDrawFilter::kBitmap_Type, bo
unds, | 2242 LOOPER_BEGIN_CHECK_COMPLETE_OVERWRITE(*paint, SkDrawFilter::kBitmap_Type, bo
unds, |
2243 bitmap.isOpaque()) | 2243 bitmap.isOpaque()) |
2244 | 2244 |
2245 while (iter.next()) { | 2245 while (iter.next()) { |
2246 iter.fDevice->drawBitmapRect(iter, bitmap, src, dst, looper.paint(), con
straint); | 2246 iter.fDevice->drawBitmapRect(iter, bitmap, src, dst, looper.paint(), con
straint); |
2247 } | 2247 } |
2248 | 2248 |
2249 LOOPER_END | 2249 LOOPER_END |
2250 } | 2250 } |
2251 | 2251 |
2252 void SkCanvas::onDrawBitmapRect(const SkBitmap& bitmap, const SkRect* src, const
SkRect& dst, | 2252 void SkCanvas::onDrawBitmapRect(const SkBitmap& bitmap, const SkRect* src, const
SkRect& dst, |
2253 const SkPaint* paint, SrcRectConstraint constrai
nt) { | 2253 const SkPaint* paint, SrcRectConstraint constrai
nt) { |
2254 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawBitmapRectToRect()")
; | 2254 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawBitmapRectToRect()")
; |
2255 SkDEBUGCODE(bitmap.validate();) | 2255 SkDEBUGCODE(bitmap.validate();) |
2256 this->internalDrawBitmapRect(bitmap, src, dst, paint, constraint); | 2256 this->internalDrawBitmapRect(bitmap, src, dst, paint, constraint); |
2257 } | 2257 } |
2258 | 2258 |
2259 void SkCanvas::onDrawImageNine(const SkImage* image, const SkIRect& center, cons
t SkRect& dst, | 2259 void SkCanvas::onDrawImageNine(const SkImage* image, const SkIRect& center, cons
t SkRect& dst, |
2260 const SkPaint* paint) { | 2260 const SkPaint* paint) { |
2261 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawImageNine()"); | 2261 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawImageNine()"); |
2262 | 2262 |
2263 SkRect storage; | 2263 SkRect storage; |
2264 const SkRect* bounds = &dst; | 2264 const SkRect* bounds = &dst; |
2265 if (NULL == paint || paint->canComputeFastBounds()) { | 2265 if (nullptr == paint || paint->canComputeFastBounds()) { |
2266 if (paint) { | 2266 if (paint) { |
2267 bounds = &paint->computeFastBounds(dst, &storage); | 2267 bounds = &paint->computeFastBounds(dst, &storage); |
2268 } | 2268 } |
2269 if (this->quickReject(*bounds)) { | 2269 if (this->quickReject(*bounds)) { |
2270 return; | 2270 return; |
2271 } | 2271 } |
2272 } | 2272 } |
2273 | 2273 |
2274 SkLazyPaint lazy; | 2274 SkLazyPaint lazy; |
2275 if (NULL == paint) { | 2275 if (nullptr == paint) { |
2276 paint = lazy.init(); | 2276 paint = lazy.init(); |
2277 } | 2277 } |
2278 | 2278 |
2279 LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type, bounds) | 2279 LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type, bounds) |
2280 | 2280 |
2281 while (iter.next()) { | 2281 while (iter.next()) { |
2282 iter.fDevice->drawImageNine(iter, image, center, dst, looper.paint()); | 2282 iter.fDevice->drawImageNine(iter, image, center, dst, looper.paint()); |
2283 } | 2283 } |
2284 | 2284 |
2285 LOOPER_END | 2285 LOOPER_END |
2286 } | 2286 } |
2287 | 2287 |
2288 void SkCanvas::onDrawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, c
onst SkRect& dst, | 2288 void SkCanvas::onDrawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, c
onst SkRect& dst, |
2289 const SkPaint* paint) { | 2289 const SkPaint* paint) { |
2290 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawBitmapNine()"); | 2290 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawBitmapNine()"); |
2291 SkDEBUGCODE(bitmap.validate();) | 2291 SkDEBUGCODE(bitmap.validate();) |
2292 | 2292 |
2293 SkRect storage; | 2293 SkRect storage; |
2294 const SkRect* bounds = &dst; | 2294 const SkRect* bounds = &dst; |
2295 if (NULL == paint || paint->canComputeFastBounds()) { | 2295 if (nullptr == paint || paint->canComputeFastBounds()) { |
2296 if (paint) { | 2296 if (paint) { |
2297 bounds = &paint->computeFastBounds(dst, &storage); | 2297 bounds = &paint->computeFastBounds(dst, &storage); |
2298 } | 2298 } |
2299 if (this->quickReject(*bounds)) { | 2299 if (this->quickReject(*bounds)) { |
2300 return; | 2300 return; |
2301 } | 2301 } |
2302 } | 2302 } |
2303 | 2303 |
2304 SkLazyPaint lazy; | 2304 SkLazyPaint lazy; |
2305 if (NULL == paint) { | 2305 if (nullptr == paint) { |
2306 paint = lazy.init(); | 2306 paint = lazy.init(); |
2307 } | 2307 } |
2308 | 2308 |
2309 LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type, bounds) | 2309 LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type, bounds) |
2310 | 2310 |
2311 while (iter.next()) { | 2311 while (iter.next()) { |
2312 iter.fDevice->drawBitmapNine(iter, bitmap, center, dst, looper.paint()); | 2312 iter.fDevice->drawBitmapNine(iter, bitmap, center, dst, looper.paint()); |
2313 } | 2313 } |
2314 | 2314 |
2315 LOOPER_END | 2315 LOOPER_END |
(...skipping 26 matching lines...) Expand all Loading... |
2342 } else { | 2342 } else { |
2343 SkPaint p(paint); | 2343 SkPaint p(paint); |
2344 p.setStrokeWidth(SkScalarMul(textSize, paint.getStrokeWidth())); | 2344 p.setStrokeWidth(SkScalarMul(textSize, paint.getStrokeWidth())); |
2345 draw.fDevice->drawRect(draw, r, p); | 2345 draw.fDevice->drawRect(draw, r, p); |
2346 } | 2346 } |
2347 } | 2347 } |
2348 | 2348 |
2349 void SkCanvas::DrawTextDecorations(const SkDraw& draw, const SkPaint& paint, | 2349 void SkCanvas::DrawTextDecorations(const SkDraw& draw, const SkPaint& paint, |
2350 const char text[], size_t byteLength, | 2350 const char text[], size_t byteLength, |
2351 SkScalar x, SkScalar y) { | 2351 SkScalar x, SkScalar y) { |
2352 SkASSERT(byteLength == 0 || text != NULL); | 2352 SkASSERT(byteLength == 0 || text != nullptr); |
2353 | 2353 |
2354 // nothing to draw | 2354 // nothing to draw |
2355 if (text == NULL || byteLength == 0 || | 2355 if (text == nullptr || byteLength == 0 || |
2356 draw.fClip->isEmpty() || | 2356 draw.fClip->isEmpty() || |
2357 (paint.getAlpha() == 0 && paint.getXfermode() == NULL)) { | 2357 (paint.getAlpha() == 0 && paint.getXfermode() == nullptr)) { |
2358 return; | 2358 return; |
2359 } | 2359 } |
2360 | 2360 |
2361 SkScalar width = 0; | 2361 SkScalar width = 0; |
2362 SkPoint start; | 2362 SkPoint start; |
2363 | 2363 |
2364 start.set(0, 0); // to avoid warning | 2364 start.set(0, 0); // to avoid warning |
2365 if (paint.getFlags() & (SkPaint::kUnderlineText_Flag | | 2365 if (paint.getFlags() & (SkPaint::kUnderlineText_Flag | |
2366 SkPaint::kStrikeThruText_Flag)) { | 2366 SkPaint::kStrikeThruText_Flag)) { |
2367 width = paint.measureText(text, byteLength); | 2367 width = paint.measureText(text, byteLength); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2402 start.fY); | 2402 start.fY); |
2403 r.fTop = offset; | 2403 r.fTop = offset; |
2404 r.fBottom = offset + height; | 2404 r.fBottom = offset + height; |
2405 DrawRect(draw, paint, r, textSize); | 2405 DrawRect(draw, paint, r, textSize); |
2406 } | 2406 } |
2407 } | 2407 } |
2408 } | 2408 } |
2409 | 2409 |
2410 void SkCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x, SkSca
lar y, | 2410 void SkCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x, SkSca
lar y, |
2411 const SkPaint& paint) { | 2411 const SkPaint& paint) { |
2412 LOOPER_BEGIN(paint, SkDrawFilter::kText_Type, NULL) | 2412 LOOPER_BEGIN(paint, SkDrawFilter::kText_Type, nullptr) |
2413 | 2413 |
2414 while (iter.next()) { | 2414 while (iter.next()) { |
2415 SkDeviceFilteredPaint dfp(iter.fDevice, looper.paint()); | 2415 SkDeviceFilteredPaint dfp(iter.fDevice, looper.paint()); |
2416 iter.fDevice->drawText(iter, text, byteLength, x, y, dfp.paint()); | 2416 iter.fDevice->drawText(iter, text, byteLength, x, y, dfp.paint()); |
2417 DrawTextDecorations(iter, dfp.paint(), | 2417 DrawTextDecorations(iter, dfp.paint(), |
2418 static_cast<const char*>(text), byteLength, x, y); | 2418 static_cast<const char*>(text), byteLength, x, y); |
2419 } | 2419 } |
2420 | 2420 |
2421 LOOPER_END | 2421 LOOPER_END |
2422 } | 2422 } |
2423 | 2423 |
2424 void SkCanvas::onDrawPosText(const void* text, size_t byteLength, const SkPoint
pos[], | 2424 void SkCanvas::onDrawPosText(const void* text, size_t byteLength, const SkPoint
pos[], |
2425 const SkPaint& paint) { | 2425 const SkPaint& paint) { |
2426 SkPoint textOffset = SkPoint::Make(0, 0); | 2426 SkPoint textOffset = SkPoint::Make(0, 0); |
2427 | 2427 |
2428 LOOPER_BEGIN(paint, SkDrawFilter::kText_Type, NULL) | 2428 LOOPER_BEGIN(paint, SkDrawFilter::kText_Type, nullptr) |
2429 | 2429 |
2430 while (iter.next()) { | 2430 while (iter.next()) { |
2431 SkDeviceFilteredPaint dfp(iter.fDevice, looper.paint()); | 2431 SkDeviceFilteredPaint dfp(iter.fDevice, looper.paint()); |
2432 iter.fDevice->drawPosText(iter, text, byteLength, &pos->fX, 2, textOffse
t, | 2432 iter.fDevice->drawPosText(iter, text, byteLength, &pos->fX, 2, textOffse
t, |
2433 dfp.paint()); | 2433 dfp.paint()); |
2434 } | 2434 } |
2435 | 2435 |
2436 LOOPER_END | 2436 LOOPER_END |
2437 } | 2437 } |
2438 | 2438 |
2439 void SkCanvas::onDrawPosTextH(const void* text, size_t byteLength, const SkScala
r xpos[], | 2439 void SkCanvas::onDrawPosTextH(const void* text, size_t byteLength, const SkScala
r xpos[], |
2440 SkScalar constY, const SkPaint& paint) { | 2440 SkScalar constY, const SkPaint& paint) { |
2441 | 2441 |
2442 SkPoint textOffset = SkPoint::Make(0, constY); | 2442 SkPoint textOffset = SkPoint::Make(0, constY); |
2443 | 2443 |
2444 LOOPER_BEGIN(paint, SkDrawFilter::kText_Type, NULL) | 2444 LOOPER_BEGIN(paint, SkDrawFilter::kText_Type, nullptr) |
2445 | 2445 |
2446 while (iter.next()) { | 2446 while (iter.next()) { |
2447 SkDeviceFilteredPaint dfp(iter.fDevice, looper.paint()); | 2447 SkDeviceFilteredPaint dfp(iter.fDevice, looper.paint()); |
2448 iter.fDevice->drawPosText(iter, text, byteLength, xpos, 1, textOffset, | 2448 iter.fDevice->drawPosText(iter, text, byteLength, xpos, 1, textOffset, |
2449 dfp.paint()); | 2449 dfp.paint()); |
2450 } | 2450 } |
2451 | 2451 |
2452 LOOPER_END | 2452 LOOPER_END |
2453 } | 2453 } |
2454 | 2454 |
2455 void SkCanvas::onDrawTextOnPath(const void* text, size_t byteLength, const SkPat
h& path, | 2455 void SkCanvas::onDrawTextOnPath(const void* text, size_t byteLength, const SkPat
h& path, |
2456 const SkMatrix* matrix, const SkPaint& paint) { | 2456 const SkMatrix* matrix, const SkPaint& paint) { |
2457 LOOPER_BEGIN(paint, SkDrawFilter::kText_Type, NULL) | 2457 LOOPER_BEGIN(paint, SkDrawFilter::kText_Type, nullptr) |
2458 | 2458 |
2459 while (iter.next()) { | 2459 while (iter.next()) { |
2460 iter.fDevice->drawTextOnPath(iter, text, byteLength, path, | 2460 iter.fDevice->drawTextOnPath(iter, text, byteLength, path, |
2461 matrix, looper.paint()); | 2461 matrix, looper.paint()); |
2462 } | 2462 } |
2463 | 2463 |
2464 LOOPER_END | 2464 LOOPER_END |
2465 } | 2465 } |
2466 | 2466 |
2467 void SkCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, | 2467 void SkCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, |
2468 const SkPaint& paint) { | 2468 const SkPaint& paint) { |
2469 | 2469 |
2470 SkRect storage; | 2470 SkRect storage; |
2471 const SkRect* bounds = NULL; | 2471 const SkRect* bounds = nullptr; |
2472 if (paint.canComputeFastBounds()) { | 2472 if (paint.canComputeFastBounds()) { |
2473 storage = blob->bounds().makeOffset(x, y); | 2473 storage = blob->bounds().makeOffset(x, y); |
2474 bounds = &paint.computeFastBounds(storage, &storage); | 2474 bounds = &paint.computeFastBounds(storage, &storage); |
2475 | 2475 |
2476 if (this->quickReject(*bounds)) { | 2476 if (this->quickReject(*bounds)) { |
2477 return; | 2477 return; |
2478 } | 2478 } |
2479 } | 2479 } |
2480 | 2480 |
2481 // We cannot filter in the looper as we normally do, because the paint is | 2481 // We cannot filter in the looper as we normally do, because the paint is |
2482 // incomplete at this point (text-related attributes are embedded within blo
b run paints). | 2482 // incomplete at this point (text-related attributes are embedded within blo
b run paints). |
2483 SkDrawFilter* drawFilter = fMCRec->fFilter; | 2483 SkDrawFilter* drawFilter = fMCRec->fFilter; |
2484 fMCRec->fFilter = NULL; | 2484 fMCRec->fFilter = nullptr; |
2485 | 2485 |
2486 LOOPER_BEGIN(paint, SkDrawFilter::kText_Type, bounds) | 2486 LOOPER_BEGIN(paint, SkDrawFilter::kText_Type, bounds) |
2487 | 2487 |
2488 while (iter.next()) { | 2488 while (iter.next()) { |
2489 SkDeviceFilteredPaint dfp(iter.fDevice, looper.paint()); | 2489 SkDeviceFilteredPaint dfp(iter.fDevice, looper.paint()); |
2490 iter.fDevice->drawTextBlob(iter, blob, x, y, dfp.paint(), drawFilter); | 2490 iter.fDevice->drawTextBlob(iter, blob, x, y, dfp.paint(), drawFilter); |
2491 } | 2491 } |
2492 | 2492 |
2493 LOOPER_END | 2493 LOOPER_END |
2494 | 2494 |
(...skipping 28 matching lines...) Expand all Loading... |
2523 this->onDrawTextBlob(blob, x, y, paint); | 2523 this->onDrawTextBlob(blob, x, y, paint); |
2524 } | 2524 } |
2525 } | 2525 } |
2526 | 2526 |
2527 void SkCanvas::onDrawVertices(VertexMode vmode, int vertexCount, | 2527 void SkCanvas::onDrawVertices(VertexMode vmode, int vertexCount, |
2528 const SkPoint verts[], const SkPoint texs[], | 2528 const SkPoint verts[], const SkPoint texs[], |
2529 const SkColor colors[], SkXfermode* xmode, | 2529 const SkColor colors[], SkXfermode* xmode, |
2530 const uint16_t indices[], int indexCount, | 2530 const uint16_t indices[], int indexCount, |
2531 const SkPaint& paint) { | 2531 const SkPaint& paint) { |
2532 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawVertices()"); | 2532 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawVertices()"); |
2533 LOOPER_BEGIN(paint, SkDrawFilter::kPath_Type, NULL) | 2533 LOOPER_BEGIN(paint, SkDrawFilter::kPath_Type, nullptr) |
2534 | 2534 |
2535 while (iter.next()) { | 2535 while (iter.next()) { |
2536 iter.fDevice->drawVertices(iter, vmode, vertexCount, verts, texs, | 2536 iter.fDevice->drawVertices(iter, vmode, vertexCount, verts, texs, |
2537 colors, xmode, indices, indexCount, | 2537 colors, xmode, indices, indexCount, |
2538 looper.paint()); | 2538 looper.paint()); |
2539 } | 2539 } |
2540 | 2540 |
2541 LOOPER_END | 2541 LOOPER_END |
2542 } | 2542 } |
2543 | 2543 |
2544 void SkCanvas::drawPatch(const SkPoint cubics[12], const SkColor colors[4], | 2544 void SkCanvas::drawPatch(const SkPoint cubics[12], const SkColor colors[4], |
2545 const SkPoint texCoords[4], SkXfermode* xmode, const Sk
Paint& paint) { | 2545 const SkPoint texCoords[4], SkXfermode* xmode, const Sk
Paint& paint) { |
2546 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawPatch()"); | 2546 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawPatch()"); |
2547 if (NULL == cubics) { | 2547 if (nullptr == cubics) { |
2548 return; | 2548 return; |
2549 } | 2549 } |
2550 | 2550 |
2551 // Since a patch is always within the convex hull of the control points, we
discard it when its | 2551 // Since a patch is always within the convex hull of the control points, we
discard it when its |
2552 // bounding rectangle is completely outside the current clip. | 2552 // bounding rectangle is completely outside the current clip. |
2553 SkRect bounds; | 2553 SkRect bounds; |
2554 bounds.set(cubics, SkPatchUtils::kNumCtrlPts); | 2554 bounds.set(cubics, SkPatchUtils::kNumCtrlPts); |
2555 if (this->quickReject(bounds)) { | 2555 if (this->quickReject(bounds)) { |
2556 return; | 2556 return; |
2557 } | 2557 } |
2558 | 2558 |
2559 this->onDrawPatch(cubics, colors, texCoords, xmode, paint); | 2559 this->onDrawPatch(cubics, colors, texCoords, xmode, paint); |
2560 } | 2560 } |
2561 | 2561 |
2562 void SkCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], | 2562 void SkCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], |
2563 const SkPoint texCoords[4], SkXfermode* xmode, const
SkPaint& paint) { | 2563 const SkPoint texCoords[4], SkXfermode* xmode, const
SkPaint& paint) { |
2564 | 2564 |
2565 LOOPER_BEGIN(paint, SkDrawFilter::kPath_Type, NULL) | 2565 LOOPER_BEGIN(paint, SkDrawFilter::kPath_Type, nullptr) |
2566 | 2566 |
2567 while (iter.next()) { | 2567 while (iter.next()) { |
2568 iter.fDevice->drawPatch(iter, cubics, colors, texCoords, xmode, paint); | 2568 iter.fDevice->drawPatch(iter, cubics, colors, texCoords, xmode, paint); |
2569 } | 2569 } |
2570 | 2570 |
2571 LOOPER_END | 2571 LOOPER_END |
2572 } | 2572 } |
2573 | 2573 |
2574 void SkCanvas::drawDrawable(SkDrawable* dr, SkScalar x, SkScalar y) { | 2574 void SkCanvas::drawDrawable(SkDrawable* dr, SkScalar x, SkScalar y) { |
2575 if (dr) { | 2575 if (dr) { |
2576 if (x || y) { | 2576 if (x || y) { |
2577 SkMatrix matrix = SkMatrix::MakeTrans(x, y); | 2577 SkMatrix matrix = SkMatrix::MakeTrans(x, y); |
2578 this->onDrawDrawable(dr, &matrix); | 2578 this->onDrawDrawable(dr, &matrix); |
2579 } else { | 2579 } else { |
2580 this->onDrawDrawable(dr, NULL); | 2580 this->onDrawDrawable(dr, nullptr); |
2581 } | 2581 } |
2582 } | 2582 } |
2583 } | 2583 } |
2584 | 2584 |
2585 void SkCanvas::drawDrawable(SkDrawable* dr, const SkMatrix* matrix) { | 2585 void SkCanvas::drawDrawable(SkDrawable* dr, const SkMatrix* matrix) { |
2586 if (dr) { | 2586 if (dr) { |
2587 if (matrix && matrix->isIdentity()) { | 2587 if (matrix && matrix->isIdentity()) { |
2588 matrix = NULL; | 2588 matrix = nullptr; |
2589 } | 2589 } |
2590 this->onDrawDrawable(dr, matrix); | 2590 this->onDrawDrawable(dr, matrix); |
2591 } | 2591 } |
2592 } | 2592 } |
2593 | 2593 |
2594 void SkCanvas::onDrawDrawable(SkDrawable* dr, const SkMatrix* matrix) { | 2594 void SkCanvas::onDrawDrawable(SkDrawable* dr, const SkMatrix* matrix) { |
2595 SkRect bounds = dr->getBounds(); | 2595 SkRect bounds = dr->getBounds(); |
2596 if (matrix) { | 2596 if (matrix) { |
2597 matrix->mapRect(&bounds); | 2597 matrix->mapRect(&bounds); |
2598 } | 2598 } |
2599 if (this->quickReject(bounds)) { | 2599 if (this->quickReject(bounds)) { |
2600 return; | 2600 return; |
2601 } | 2601 } |
2602 dr->draw(this, matrix); | 2602 dr->draw(this, matrix); |
2603 } | 2603 } |
2604 | 2604 |
2605 void SkCanvas::onDrawAtlas(const SkImage* atlas, const SkRSXform xform[], const
SkRect tex[], | 2605 void SkCanvas::onDrawAtlas(const SkImage* atlas, const SkRSXform xform[], const
SkRect tex[], |
2606 const SkColor colors[], int count, SkXfermode::Mode m
ode, | 2606 const SkColor colors[], int count, SkXfermode::Mode m
ode, |
2607 const SkRect* cull, const SkPaint* paint) { | 2607 const SkRect* cull, const SkPaint* paint) { |
2608 if (cull && this->quickReject(*cull)) { | 2608 if (cull && this->quickReject(*cull)) { |
2609 return; | 2609 return; |
2610 } | 2610 } |
2611 | 2611 |
2612 SkPaint pnt; | 2612 SkPaint pnt; |
2613 if (paint) { | 2613 if (paint) { |
2614 pnt = *paint; | 2614 pnt = *paint; |
2615 } | 2615 } |
2616 | 2616 |
2617 LOOPER_BEGIN(pnt, SkDrawFilter::kPath_Type, NULL) | 2617 LOOPER_BEGIN(pnt, SkDrawFilter::kPath_Type, nullptr) |
2618 while (iter.next()) { | 2618 while (iter.next()) { |
2619 iter.fDevice->drawAtlas(iter, atlas, xform, tex, colors, count, mode, pn
t); | 2619 iter.fDevice->drawAtlas(iter, atlas, xform, tex, colors, count, mode, pn
t); |
2620 } | 2620 } |
2621 LOOPER_END | 2621 LOOPER_END |
2622 } | 2622 } |
2623 | 2623 |
2624 ////////////////////////////////////////////////////////////////////////////// | 2624 ////////////////////////////////////////////////////////////////////////////// |
2625 // These methods are NOT virtual, and therefore must call back into virtual | 2625 // These methods are NOT virtual, and therefore must call back into virtual |
2626 // methods, rather than actually drawing themselves. | 2626 // methods, rather than actually drawing themselves. |
2627 ////////////////////////////////////////////////////////////////////////////// | 2627 ////////////////////////////////////////////////////////////////////////////// |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2754 * | 2754 * |
2755 * For now we pick a conservatively small value, though measurement (and other
heuristics like | 2755 * For now we pick a conservatively small value, though measurement (and other
heuristics like |
2756 * the type of ops contained) may justify changing this value. | 2756 * the type of ops contained) may justify changing this value. |
2757 */ | 2757 */ |
2758 #define kMaxPictureOpsToUnrollInsteadOfRef 1 | 2758 #define kMaxPictureOpsToUnrollInsteadOfRef 1 |
2759 | 2759 |
2760 void SkCanvas::drawPicture(const SkPicture* picture, const SkMatrix* matrix, con
st SkPaint* paint) { | 2760 void SkCanvas::drawPicture(const SkPicture* picture, const SkMatrix* matrix, con
st SkPaint* paint) { |
2761 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawPicture()"); | 2761 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawPicture()"); |
2762 if (picture) { | 2762 if (picture) { |
2763 if (matrix && matrix->isIdentity()) { | 2763 if (matrix && matrix->isIdentity()) { |
2764 matrix = NULL; | 2764 matrix = nullptr; |
2765 } | 2765 } |
2766 if (picture->approximateOpCount() <= kMaxPictureOpsToUnrollInsteadOfRef)
{ | 2766 if (picture->approximateOpCount() <= kMaxPictureOpsToUnrollInsteadOfRef)
{ |
2767 SkAutoCanvasMatrixPaint acmp(this, matrix, paint, picture->cullRect(
)); | 2767 SkAutoCanvasMatrixPaint acmp(this, matrix, paint, picture->cullRect(
)); |
2768 picture->playback(this); | 2768 picture->playback(this); |
2769 } else { | 2769 } else { |
2770 this->onDrawPicture(picture, matrix, paint); | 2770 this->onDrawPicture(picture, matrix, paint); |
2771 } | 2771 } |
2772 } | 2772 } |
2773 } | 2773 } |
2774 | 2774 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2823 SkBaseDevice* SkCanvas::LayerIter::device() const { | 2823 SkBaseDevice* SkCanvas::LayerIter::device() const { |
2824 return fImpl->getDevice(); | 2824 return fImpl->getDevice(); |
2825 } | 2825 } |
2826 | 2826 |
2827 const SkMatrix& SkCanvas::LayerIter::matrix() const { | 2827 const SkMatrix& SkCanvas::LayerIter::matrix() const { |
2828 return fImpl->getMatrix(); | 2828 return fImpl->getMatrix(); |
2829 } | 2829 } |
2830 | 2830 |
2831 const SkPaint& SkCanvas::LayerIter::paint() const { | 2831 const SkPaint& SkCanvas::LayerIter::paint() const { |
2832 const SkPaint* paint = fImpl->getPaint(); | 2832 const SkPaint* paint = fImpl->getPaint(); |
2833 if (NULL == paint) { | 2833 if (nullptr == paint) { |
2834 paint = &fDefaultPaint; | 2834 paint = &fDefaultPaint; |
2835 } | 2835 } |
2836 return *paint; | 2836 return *paint; |
2837 } | 2837 } |
2838 | 2838 |
2839 const SkRegion& SkCanvas::LayerIter::clip() const { return fImpl->getClip(); } | 2839 const SkRegion& SkCanvas::LayerIter::clip() const { return fImpl->getClip(); } |
2840 int SkCanvas::LayerIter::x() const { return fImpl->getX(); } | 2840 int SkCanvas::LayerIter::x() const { return fImpl->getX(); } |
2841 int SkCanvas::LayerIter::y() const { return fImpl->getY(); } | 2841 int SkCanvas::LayerIter::y() const { return fImpl->getY(); } |
2842 | 2842 |
2843 /////////////////////////////////////////////////////////////////////////////// | 2843 /////////////////////////////////////////////////////////////////////////////// |
(...skipping 18 matching lines...) Expand all Loading... |
2862 break; | 2862 break; |
2863 default: | 2863 default: |
2864 return false; | 2864 return false; |
2865 } | 2865 } |
2866 | 2866 |
2867 return true; | 2867 return true; |
2868 } | 2868 } |
2869 | 2869 |
2870 SkCanvas* SkCanvas::NewRasterDirect(const SkImageInfo& info, void* pixels, size_
t rowBytes) { | 2870 SkCanvas* SkCanvas::NewRasterDirect(const SkImageInfo& info, void* pixels, size_
t rowBytes) { |
2871 if (!supported_for_raster_canvas(info)) { | 2871 if (!supported_for_raster_canvas(info)) { |
2872 return NULL; | 2872 return nullptr; |
2873 } | 2873 } |
2874 | 2874 |
2875 SkBitmap bitmap; | 2875 SkBitmap bitmap; |
2876 if (!bitmap.installPixels(info, pixels, rowBytes)) { | 2876 if (!bitmap.installPixels(info, pixels, rowBytes)) { |
2877 return NULL; | 2877 return nullptr; |
2878 } | 2878 } |
2879 return new SkCanvas(bitmap); | 2879 return new SkCanvas(bitmap); |
2880 } | 2880 } |
2881 | 2881 |
2882 /////////////////////////////////////////////////////////////////////////////// | 2882 /////////////////////////////////////////////////////////////////////////////// |
2883 | 2883 |
2884 SkAutoCanvasMatrixPaint::SkAutoCanvasMatrixPaint(SkCanvas* canvas, const SkMatri
x* matrix, | 2884 SkAutoCanvasMatrixPaint::SkAutoCanvasMatrixPaint(SkCanvas* canvas, const SkMatri
x* matrix, |
2885 const SkPaint* paint, const SkR
ect& bounds) | 2885 const SkPaint* paint, const SkR
ect& bounds) |
2886 : fCanvas(canvas) | 2886 : fCanvas(canvas) |
2887 , fSaveCount(canvas->getSaveCount()) | 2887 , fSaveCount(canvas->getSaveCount()) |
2888 { | 2888 { |
2889 if (paint) { | 2889 if (paint) { |
2890 SkRect newBounds = bounds; | 2890 SkRect newBounds = bounds; |
2891 if (matrix) { | 2891 if (matrix) { |
2892 matrix->mapRect(&newBounds); | 2892 matrix->mapRect(&newBounds); |
2893 } | 2893 } |
2894 canvas->saveLayer(&newBounds, paint); | 2894 canvas->saveLayer(&newBounds, paint); |
2895 } else if (matrix) { | 2895 } else if (matrix) { |
2896 canvas->save(); | 2896 canvas->save(); |
2897 } | 2897 } |
2898 | 2898 |
2899 if (matrix) { | 2899 if (matrix) { |
2900 canvas->concat(*matrix); | 2900 canvas->concat(*matrix); |
2901 } | 2901 } |
2902 } | 2902 } |
2903 | 2903 |
2904 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { | 2904 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { |
2905 fCanvas->restoreToCount(fSaveCount); | 2905 fCanvas->restoreToCount(fSaveCount); |
2906 } | 2906 } |
OLD | NEW |