| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2008 The Android Open Source Project | 3 * Copyright 2008 The Android Open Source Project |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 | 9 |
| 10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 typedef SkTLazy<SkPaint> SkLazyPaint; | 122 typedef SkTLazy<SkPaint> SkLazyPaint; |
| 123 | 123 |
| 124 void SkCanvas::predrawNotify() { | 124 void SkCanvas::predrawNotify() { |
| 125 if (fSurfaceBase) { | 125 if (fSurfaceBase) { |
| 126 fSurfaceBase->aboutToDraw(SkSurface::kRetain_ContentChangeMode); | 126 fSurfaceBase->aboutToDraw(SkSurface::kRetain_ContentChangeMode); |
| 127 } | 127 } |
| 128 } | 128 } |
| 129 | 129 |
| 130 /////////////////////////////////////////////////////////////////////////////// | 130 /////////////////////////////////////////////////////////////////////////////// |
| 131 | 131 |
| 132 /* This is the record we keep for each SkDevice that the user installs. | 132 /* This is the record we keep for each SkBaseDevice that the user installs. |
| 133 The clip/matrix/proc are fields that reflect the top of the save/restore | 133 The clip/matrix/proc are fields that reflect the top of the save/restore |
| 134 stack. Whenever the canvas changes, it marks a dirty flag, and then before | 134 stack. Whenever the canvas changes, it marks a dirty flag, and then before |
| 135 these are used (assuming we're not on a layer) we rebuild these cache | 135 these are used (assuming we're not on a layer) we rebuild these cache |
| 136 values: they reflect the top of the save stack, but translated and clipped | 136 values: they reflect the top of the save stack, but translated and clipped |
| 137 by the device's XY offset and bitmap-bounds. | 137 by the device's XY offset and bitmap-bounds. |
| 138 */ | 138 */ |
| 139 struct DeviceCM { | 139 struct DeviceCM { |
| 140 DeviceCM* fNext; | 140 DeviceCM* fNext; |
| 141 SkDevice* fDevice; | 141 SkBaseDevice* fDevice; |
| 142 SkRasterClip fClip; | 142 SkRasterClip fClip; |
| 143 const SkMatrix* fMatrix; | 143 const SkMatrix* fMatrix; |
| 144 SkPaint* fPaint; // may be null (in the future) | 144 SkPaint* fPaint; // may be null (in the future) |
| 145 | 145 |
| 146 DeviceCM(SkDevice* device, int x, int y, const SkPaint* paint, SkCanvas* can
vas) | 146 DeviceCM(SkBaseDevice* device, int x, int y, const SkPaint* paint, SkCanvas*
canvas) |
| 147 : fNext(NULL) { | 147 : fNext(NULL) { |
| 148 if (NULL != device) { | 148 if (NULL != device) { |
| 149 device->ref(); | 149 device->ref(); |
| 150 device->onAttachToCanvas(canvas); | 150 device->onAttachToCanvas(canvas); |
| 151 } | 151 } |
| 152 fDevice = device; | 152 fDevice = device; |
| 153 fPaint = paint ? SkNEW_ARGS(SkPaint, (*paint)) : NULL; | 153 fPaint = paint ? SkNEW_ARGS(SkPaint, (*paint)) : NULL; |
| 154 } | 154 } |
| 155 | 155 |
| 156 ~DeviceCM() { | 156 ~DeviceCM() { |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 308 if (fBounder) { | 308 if (fBounder) { |
| 309 fBounder->setClip(fClip); | 309 fBounder->setClip(fClip); |
| 310 } | 310 } |
| 311 // fCurrLayer may be NULL now | 311 // fCurrLayer may be NULL now |
| 312 | 312 |
| 313 return true; | 313 return true; |
| 314 } | 314 } |
| 315 return false; | 315 return false; |
| 316 } | 316 } |
| 317 | 317 |
| 318 SkDevice* getDevice() const { return fDevice; } | 318 SkBaseDevice* getDevice() const { return fDevice; } |
| 319 int getX() const { return fDevice->getOrigin().x(); } | 319 int getX() const { return fDevice->getOrigin().x(); } |
| 320 int getY() const { return fDevice->getOrigin().y(); } | 320 int getY() const { return fDevice->getOrigin().y(); } |
| 321 const SkMatrix& getMatrix() const { return *fMatrix; } | 321 const SkMatrix& getMatrix() const { return *fMatrix; } |
| 322 const SkRegion& getClip() const { return *fClip; } | 322 const SkRegion& getClip() const { return *fClip; } |
| 323 const SkPaint* getPaint() const { return fPaint; } | 323 const SkPaint* getPaint() const { return fPaint; } |
| 324 | 324 |
| 325 private: | 325 private: |
| 326 SkCanvas* fCanvas; | 326 SkCanvas* fCanvas; |
| 327 const DeviceCM* fCurrLayer; | 327 const DeviceCM* fCurrLayer; |
| 328 const SkPaint* fPaint; // May be null. | 328 const SkPaint* fPaint; // May be null. |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 475 this->predrawNotify(); \ | 475 this->predrawNotify(); \ |
| 476 AutoDrawLooper looper(this, paint); \ | 476 AutoDrawLooper looper(this, paint); \ |
| 477 while (looper.next(type)) { \ | 477 while (looper.next(type)) { \ |
| 478 SkAutoBounderCommit ac(fBounder); \ | 478 SkAutoBounderCommit ac(fBounder); \ |
| 479 SkDrawIter iter(this); | 479 SkDrawIter iter(this); |
| 480 | 480 |
| 481 #define LOOPER_END } | 481 #define LOOPER_END } |
| 482 | 482 |
| 483 //////////////////////////////////////////////////////////////////////////// | 483 //////////////////////////////////////////////////////////////////////////// |
| 484 | 484 |
| 485 SkDevice* SkCanvas::init(SkDevice* device) { | 485 SkBaseDevice* SkCanvas::init(SkBaseDevice* device) { |
| 486 fBounder = NULL; | 486 fBounder = NULL; |
| 487 fLocalBoundsCompareType.setEmpty(); | 487 fLocalBoundsCompareType.setEmpty(); |
| 488 fLocalBoundsCompareTypeDirty = true; | 488 fLocalBoundsCompareTypeDirty = true; |
| 489 fAllowSoftClip = true; | 489 fAllowSoftClip = true; |
| 490 fAllowSimplifyClip = false; | 490 fAllowSimplifyClip = false; |
| 491 fDeviceCMDirty = false; | 491 fDeviceCMDirty = false; |
| 492 fSaveLayerCount = 0; | 492 fSaveLayerCount = 0; |
| 493 fMetaData = NULL; | 493 fMetaData = NULL; |
| 494 | 494 |
| 495 fMCRec = (MCRec*)fMCStack.push_back(); | 495 fMCRec = (MCRec*)fMCStack.push_back(); |
| 496 new (fMCRec) MCRec(NULL, 0); | 496 new (fMCRec) MCRec(NULL, 0); |
| 497 | 497 |
| 498 fMCRec->fLayer = SkNEW_ARGS(DeviceCM, (NULL, 0, 0, NULL, NULL)); | 498 fMCRec->fLayer = SkNEW_ARGS(DeviceCM, (NULL, 0, 0, NULL, NULL)); |
| 499 fMCRec->fTopLayer = fMCRec->fLayer; | 499 fMCRec->fTopLayer = fMCRec->fLayer; |
| 500 fMCRec->fNext = NULL; | 500 fMCRec->fNext = NULL; |
| 501 | 501 |
| 502 fSurfaceBase = NULL; | 502 fSurfaceBase = NULL; |
| 503 | 503 |
| 504 return this->setDevice(device); | 504 return this->setDevice(device); |
| 505 } | 505 } |
| 506 | 506 |
| 507 SkCanvas::SkCanvas() | 507 SkCanvas::SkCanvas() |
| 508 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) { | 508 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) { |
| 509 inc_canvas(); | 509 inc_canvas(); |
| 510 | 510 |
| 511 this->init(NULL); | 511 this->init(NULL); |
| 512 } | 512 } |
| 513 | 513 |
| 514 SkCanvas::SkCanvas(SkDevice* device) | 514 SkCanvas::SkCanvas(SkBaseDevice* device) |
| 515 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) { | 515 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) { |
| 516 inc_canvas(); | 516 inc_canvas(); |
| 517 | 517 |
| 518 this->init(device); | 518 this->init(device); |
| 519 } | 519 } |
| 520 | 520 |
| 521 SkCanvas::SkCanvas(const SkBitmap& bitmap) | 521 SkCanvas::SkCanvas(const SkBitmap& bitmap) |
| 522 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) { | 522 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) { |
| 523 inc_canvas(); | 523 inc_canvas(); |
| 524 | 524 |
| 525 this->init(SkNEW_ARGS(SkDevice, (bitmap)))->unref(); | 525 this->init(SkNEW_ARGS(SkBitmapDevice, (bitmap)))->unref(); |
| 526 } | 526 } |
| 527 | 527 |
| 528 SkCanvas::~SkCanvas() { | 528 SkCanvas::~SkCanvas() { |
| 529 // free up the contents of our deque | 529 // free up the contents of our deque |
| 530 this->restoreToCount(1); // restore everything but the last | 530 this->restoreToCount(1); // restore everything but the last |
| 531 SkASSERT(0 == fSaveLayerCount); | 531 SkASSERT(0 == fSaveLayerCount); |
| 532 | 532 |
| 533 this->internalRestore(); // restore the last, since we're going away | 533 this->internalRestore(); // restore the last, since we're going away |
| 534 | 534 |
| 535 SkSafeUnref(fBounder); | 535 SkSafeUnref(fBounder); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 557 // can decide to just make it a field in the device (rather than a ptr) | 557 // can decide to just make it a field in the device (rather than a ptr) |
| 558 if (NULL == fMetaData) { | 558 if (NULL == fMetaData) { |
| 559 fMetaData = new SkMetaData; | 559 fMetaData = new SkMetaData; |
| 560 } | 560 } |
| 561 return *fMetaData; | 561 return *fMetaData; |
| 562 } | 562 } |
| 563 | 563 |
| 564 /////////////////////////////////////////////////////////////////////////////// | 564 /////////////////////////////////////////////////////////////////////////////// |
| 565 | 565 |
| 566 void SkCanvas::flush() { | 566 void SkCanvas::flush() { |
| 567 SkDevice* device = this->getDevice(); | 567 SkBaseDevice* device = this->getDevice(); |
| 568 if (device) { | 568 if (device) { |
| 569 device->flush(); | 569 device->flush(); |
| 570 } | 570 } |
| 571 } | 571 } |
| 572 | 572 |
| 573 SkISize SkCanvas::getDeviceSize() const { | 573 SkISize SkCanvas::getDeviceSize() const { |
| 574 SkDevice* d = this->getDevice(); | 574 SkBaseDevice* d = this->getDevice(); |
| 575 return d ? SkISize::Make(d->width(), d->height()) : SkISize::Make(0, 0); | 575 return d ? SkISize::Make(d->width(), d->height()) : SkISize::Make(0, 0); |
| 576 } | 576 } |
| 577 | 577 |
| 578 SkDevice* SkCanvas::getDevice() const { | 578 SkBaseDevice* SkCanvas::getDevice() const { |
| 579 // return root device | 579 // return root device |
| 580 MCRec* rec = (MCRec*) fMCStack.front(); | 580 MCRec* rec = (MCRec*) fMCStack.front(); |
| 581 SkASSERT(rec && rec->fLayer); | 581 SkASSERT(rec && rec->fLayer); |
| 582 return rec->fLayer->fDevice; | 582 return rec->fLayer->fDevice; |
| 583 } | 583 } |
| 584 | 584 |
| 585 SkDevice* SkCanvas::getTopDevice(bool updateMatrixClip) const { | 585 SkBaseDevice* SkCanvas::getTopDevice(bool updateMatrixClip) const { |
| 586 if (updateMatrixClip) { | 586 if (updateMatrixClip) { |
| 587 const_cast<SkCanvas*>(this)->updateDeviceCMCache(); | 587 const_cast<SkCanvas*>(this)->updateDeviceCMCache(); |
| 588 } | 588 } |
| 589 return fMCRec->fTopLayer->fDevice; | 589 return fMCRec->fTopLayer->fDevice; |
| 590 } | 590 } |
| 591 | 591 |
| 592 SkDevice* SkCanvas::setDevice(SkDevice* device) { | 592 SkBaseDevice* SkCanvas::setDevice(SkBaseDevice* device) { |
| 593 // return root device | 593 // return root device |
| 594 SkDeque::F2BIter iter(fMCStack); | 594 SkDeque::F2BIter iter(fMCStack); |
| 595 MCRec* rec = (MCRec*)iter.next(); | 595 MCRec* rec = (MCRec*)iter.next(); |
| 596 SkASSERT(rec && rec->fLayer); | 596 SkASSERT(rec && rec->fLayer); |
| 597 SkDevice* rootDevice = rec->fLayer->fDevice; | 597 SkBaseDevice* rootDevice = rec->fLayer->fDevice; |
| 598 | 598 |
| 599 if (rootDevice == device) { | 599 if (rootDevice == device) { |
| 600 return device; | 600 return device; |
| 601 } | 601 } |
| 602 | 602 |
| 603 if (device) { | 603 if (device) { |
| 604 device->onAttachToCanvas(this); | 604 device->onAttachToCanvas(this); |
| 605 } | 605 } |
| 606 if (rootDevice) { | 606 if (rootDevice) { |
| 607 rootDevice->onDetachFromCanvas(); | 607 rootDevice->onDetachFromCanvas(); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 637 while ((rec = (MCRec*)iter.next()) != NULL) { | 637 while ((rec = (MCRec*)iter.next()) != NULL) { |
| 638 (void)rec->fRasterClip->op(bounds, SkRegion::kIntersect_Op); | 638 (void)rec->fRasterClip->op(bounds, SkRegion::kIntersect_Op); |
| 639 } | 639 } |
| 640 | 640 |
| 641 return device; | 641 return device; |
| 642 } | 642 } |
| 643 | 643 |
| 644 bool SkCanvas::readPixels(SkBitmap* bitmap, | 644 bool SkCanvas::readPixels(SkBitmap* bitmap, |
| 645 int x, int y, | 645 int x, int y, |
| 646 Config8888 config8888) { | 646 Config8888 config8888) { |
| 647 SkDevice* device = this->getDevice(); | 647 SkBaseDevice* device = this->getDevice(); |
| 648 if (!device) { | 648 if (!device) { |
| 649 return false; | 649 return false; |
| 650 } | 650 } |
| 651 return device->readPixels(bitmap, x, y, config8888); | 651 return device->readPixels(bitmap, x, y, config8888); |
| 652 } | 652 } |
| 653 | 653 |
| 654 bool SkCanvas::readPixels(const SkIRect& srcRect, SkBitmap* bitmap) { | 654 bool SkCanvas::readPixels(const SkIRect& srcRect, SkBitmap* bitmap) { |
| 655 SkDevice* device = this->getDevice(); | 655 SkBaseDevice* device = this->getDevice(); |
| 656 if (!device) { | 656 if (!device) { |
| 657 return false; | 657 return false; |
| 658 } | 658 } |
| 659 | 659 |
| 660 SkIRect bounds; | 660 SkIRect bounds; |
| 661 bounds.set(0, 0, device->width(), device->height()); | 661 bounds.set(0, 0, device->width(), device->height()); |
| 662 if (!bounds.intersect(srcRect)) { | 662 if (!bounds.intersect(srcRect)) { |
| 663 return false; | 663 return false; |
| 664 } | 664 } |
| 665 | 665 |
| 666 SkBitmap tmp; | 666 SkBitmap tmp; |
| 667 tmp.setConfig(SkBitmap::kARGB_8888_Config, bounds.width(), | 667 tmp.setConfig(SkBitmap::kARGB_8888_Config, bounds.width(), |
| 668 bounds.height()); | 668 bounds.height()); |
| 669 if (this->readPixels(&tmp, bounds.fLeft, bounds.fTop)) { | 669 if (this->readPixels(&tmp, bounds.fLeft, bounds.fTop)) { |
| 670 bitmap->swap(tmp); | 670 bitmap->swap(tmp); |
| 671 return true; | 671 return true; |
| 672 } else { | 672 } else { |
| 673 return false; | 673 return false; |
| 674 } | 674 } |
| 675 } | 675 } |
| 676 | 676 |
| 677 void SkCanvas::writePixels(const SkBitmap& bitmap, int x, int y, | 677 void SkCanvas::writePixels(const SkBitmap& bitmap, int x, int y, |
| 678 Config8888 config8888) { | 678 Config8888 config8888) { |
| 679 SkDevice* device = this->getDevice(); | 679 SkBaseDevice* device = this->getDevice(); |
| 680 if (device) { | 680 if (device) { |
| 681 if (SkIRect::Intersects(SkIRect::MakeSize(this->getDeviceSize()), | 681 if (SkIRect::Intersects(SkIRect::MakeSize(this->getDeviceSize()), |
| 682 SkIRect::MakeXYWH(x, y, bitmap.width(), bitmap.h
eight()))) { | 682 SkIRect::MakeXYWH(x, y, bitmap.width(), bitmap.h
eight()))) { |
| 683 device->accessBitmap(true); | 683 device->accessBitmap(true); |
| 684 device->writePixels(bitmap, x, y, config8888); | 684 device->writePixels(bitmap, x, y, config8888); |
| 685 } | 685 } |
| 686 } | 686 } |
| 687 } | 687 } |
| 688 | 688 |
| 689 SkCanvas* SkCanvas::canvasForDrawIter() { | 689 SkCanvas* SkCanvas::canvasForDrawIter() { |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 741 const SkIRect& bounds, | 741 const SkIRect& bounds, |
| 742 SkCanvas::SaveFlags flags, | 742 SkCanvas::SaveFlags flags, |
| 743 bool* isOpaque) { | 743 bool* isOpaque) { |
| 744 *isOpaque = (flags & SkCanvas::kHasAlphaLayer_SaveFlag) == 0; | 744 *isOpaque = (flags & SkCanvas::kHasAlphaLayer_SaveFlag) == 0; |
| 745 | 745 |
| 746 #if 0 | 746 #if 0 |
| 747 // loop through and union all the configs we may draw into | 747 // loop through and union all the configs we may draw into |
| 748 uint32_t configMask = 0; | 748 uint32_t configMask = 0; |
| 749 for (int i = canvas->countLayerDevices() - 1; i >= 0; --i) | 749 for (int i = canvas->countLayerDevices() - 1; i >= 0; --i) |
| 750 { | 750 { |
| 751 SkDevice* device = canvas->getLayerDevice(i); | 751 SkBaseDevice* device = canvas->getLayerDevice(i); |
| 752 if (device->intersects(bounds)) | 752 if (device->intersects(bounds)) |
| 753 configMask |= 1 << device->config(); | 753 configMask |= 1 << device->config(); |
| 754 } | 754 } |
| 755 | 755 |
| 756 // if the caller wants alpha or fullcolor, we can't return 565 | 756 // if the caller wants alpha or fullcolor, we can't return 565 |
| 757 if (flags & (SkCanvas::kFullColorLayer_SaveFlag | | 757 if (flags & (SkCanvas::kFullColorLayer_SaveFlag | |
| 758 SkCanvas::kHasAlphaLayer_SaveFlag)) | 758 SkCanvas::kHasAlphaLayer_SaveFlag)) |
| 759 configMask &= ~C16MASK; | 759 configMask &= ~C16MASK; |
| 760 | 760 |
| 761 switch (configMask) { | 761 switch (configMask) { |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 842 } | 842 } |
| 843 SkPaint* p = lazyP.set(*paint); | 843 SkPaint* p = lazyP.set(*paint); |
| 844 p->setImageFilter(NULL); | 844 p->setImageFilter(NULL); |
| 845 paint = p; | 845 paint = p; |
| 846 } | 846 } |
| 847 } | 847 } |
| 848 | 848 |
| 849 bool isOpaque; | 849 bool isOpaque; |
| 850 SkBitmap::Config config = resolve_config(this, ir, flags, &isOpaque); | 850 SkBitmap::Config config = resolve_config(this, ir, flags, &isOpaque); |
| 851 | 851 |
| 852 SkDevice* device; | 852 SkBaseDevice* device; |
| 853 if (paint && paint->getImageFilter()) { | 853 if (paint && paint->getImageFilter()) { |
| 854 device = this->createCompatibleDevice(config, ir.width(), ir.height(), | 854 device = this->createCompatibleDevice(config, ir.width(), ir.height(), |
| 855 isOpaque); | 855 isOpaque); |
| 856 } else { | 856 } else { |
| 857 device = this->createLayerDevice(config, ir.width(), ir.height(), | 857 device = this->createLayerDevice(config, ir.width(), ir.height(), |
| 858 isOpaque); | 858 isOpaque); |
| 859 } | 859 } |
| 860 if (NULL == device) { | 860 if (NULL == device) { |
| 861 SkDebugf("Unable to create device for layer."); | 861 SkDebugf("Unable to create device for layer."); |
| 862 return count; | 862 return count; |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 974 | 974 |
| 975 LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type) | 975 LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type) |
| 976 | 976 |
| 977 while (iter.next()) { | 977 while (iter.next()) { |
| 978 iter.fDevice->drawBitmap(iter, bitmap, matrix, looper.paint()); | 978 iter.fDevice->drawBitmap(iter, bitmap, matrix, looper.paint()); |
| 979 } | 979 } |
| 980 | 980 |
| 981 LOOPER_END | 981 LOOPER_END |
| 982 } | 982 } |
| 983 | 983 |
| 984 void SkCanvas::internalDrawDevice(SkDevice* srcDev, int x, int y, | 984 void SkCanvas::internalDrawDevice(SkBaseDevice* srcDev, int x, int y, |
| 985 const SkPaint* paint) { | 985 const SkPaint* paint) { |
| 986 SkPaint tmp; | 986 SkPaint tmp; |
| 987 if (NULL == paint) { | 987 if (NULL == paint) { |
| 988 tmp.setDither(true); | 988 tmp.setDither(true); |
| 989 paint = &tmp; | 989 paint = &tmp; |
| 990 } | 990 } |
| 991 | 991 |
| 992 LOOPER_BEGIN_DRAWDEVICE(*paint, SkDrawFilter::kBitmap_Type) | 992 LOOPER_BEGIN_DRAWDEVICE(*paint, SkDrawFilter::kBitmap_Type) |
| 993 while (iter.next()) { | 993 while (iter.next()) { |
| 994 SkDevice* dstDev = iter.fDevice; | 994 SkBaseDevice* dstDev = iter.fDevice; |
| 995 paint = &looper.paint(); | 995 paint = &looper.paint(); |
| 996 SkImageFilter* filter = paint->getImageFilter(); | 996 SkImageFilter* filter = paint->getImageFilter(); |
| 997 SkIPoint pos = { x - iter.getX(), y - iter.getY() }; | 997 SkIPoint pos = { x - iter.getX(), y - iter.getY() }; |
| 998 if (filter && !dstDev->canHandleImageFilter(filter)) { | 998 if (filter && !dstDev->canHandleImageFilter(filter)) { |
| 999 SkDeviceImageFilterProxy proxy(dstDev); | 999 SkDeviceImageFilterProxy proxy(dstDev); |
| 1000 SkBitmap dst; | 1000 SkBitmap dst; |
| 1001 const SkBitmap& src = srcDev->accessBitmap(false); | 1001 const SkBitmap& src = srcDev->accessBitmap(false); |
| 1002 if (filter->filterImage(&proxy, src, *iter.fMatrix, &dst, &pos)) { | 1002 if (filter->filterImage(&proxy, src, *iter.fMatrix, &dst, &pos)) { |
| 1003 SkPaint tmpUnfiltered(*paint); | 1003 SkPaint tmpUnfiltered(*paint); |
| 1004 tmpUnfiltered.setImageFilter(NULL); | 1004 tmpUnfiltered.setImageFilter(NULL); |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1157 // but relaxing the test above triggers GM asserts in | 1157 // but relaxing the test above triggers GM asserts in |
| 1158 // SkRgnBuilder::blitH(). We need to investigate what's going on. | 1158 // SkRgnBuilder::blitH(). We need to investigate what's going on. |
| 1159 return currClip->setPath(devPath, currClip->bwRgn(), doAA); | 1159 return currClip->setPath(devPath, currClip->bwRgn(), doAA); |
| 1160 } else { | 1160 } else { |
| 1161 base.setRect(currClip->getBounds()); | 1161 base.setRect(currClip->getBounds()); |
| 1162 SkRasterClip clip; | 1162 SkRasterClip clip; |
| 1163 clip.setPath(devPath, base, doAA); | 1163 clip.setPath(devPath, base, doAA); |
| 1164 return currClip->op(clip, op); | 1164 return currClip->op(clip, op); |
| 1165 } | 1165 } |
| 1166 } else { | 1166 } else { |
| 1167 const SkDevice* device = canvas->getDevice(); | 1167 const SkBaseDevice* device = canvas->getDevice(); |
| 1168 if (!device) { | 1168 if (!device) { |
| 1169 return currClip->setEmpty(); | 1169 return currClip->setEmpty(); |
| 1170 } | 1170 } |
| 1171 | 1171 |
| 1172 base.setRect(0, 0, device->width(), device->height()); | 1172 base.setRect(0, 0, device->width(), device->height()); |
| 1173 | 1173 |
| 1174 if (SkRegion::kReplace_Op == op) { | 1174 if (SkRegion::kReplace_Op == op) { |
| 1175 return currClip->setPath(devPath, base, doAA); | 1175 return currClip->setPath(devPath, base, doAA); |
| 1176 } else { | 1176 } else { |
| 1177 SkRasterClip clip; | 1177 SkRasterClip clip; |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1351 // todo: signal fClipStack that we have a region, and therefore (I guess) | 1351 // todo: signal fClipStack that we have a region, and therefore (I guess) |
| 1352 // we have to ignore it, and use the region directly? | 1352 // we have to ignore it, and use the region directly? |
| 1353 fClipStack.clipDevRect(rgn.getBounds(), op); | 1353 fClipStack.clipDevRect(rgn.getBounds(), op); |
| 1354 | 1354 |
| 1355 return fMCRec->fRasterClip->op(rgn, op); | 1355 return fMCRec->fRasterClip->op(rgn, op); |
| 1356 } | 1356 } |
| 1357 | 1357 |
| 1358 #ifdef SK_DEBUG | 1358 #ifdef SK_DEBUG |
| 1359 void SkCanvas::validateClip() const { | 1359 void SkCanvas::validateClip() const { |
| 1360 // construct clipRgn from the clipstack | 1360 // construct clipRgn from the clipstack |
| 1361 const SkDevice* device = this->getDevice(); | 1361 const SkBaseDevice* device = this->getDevice(); |
| 1362 if (!device) { | 1362 if (!device) { |
| 1363 SkASSERT(this->getTotalClip().isEmpty()); | 1363 SkASSERT(this->getTotalClip().isEmpty()); |
| 1364 return; | 1364 return; |
| 1365 } | 1365 } |
| 1366 | 1366 |
| 1367 SkIRect ir; | 1367 SkIRect ir; |
| 1368 ir.set(0, 0, device->width(), device->height()); | 1368 ir.set(0, 0, device->width(), device->height()); |
| 1369 SkRasterClip tmpClip(ir); | 1369 SkRasterClip tmpClip(ir); |
| 1370 | 1370 |
| 1371 SkClipStack::B2TIter iter(fClipStack); | 1371 SkClipStack::B2TIter iter(fClipStack); |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1536 SkCanvas::ClipType SkCanvas::getClipType() const { | 1536 SkCanvas::ClipType SkCanvas::getClipType() const { |
| 1537 if (fMCRec->fRasterClip->isEmpty()) return kEmpty_ClipType; | 1537 if (fMCRec->fRasterClip->isEmpty()) return kEmpty_ClipType; |
| 1538 if (fMCRec->fRasterClip->isRect()) return kRect_ClipType; | 1538 if (fMCRec->fRasterClip->isRect()) return kRect_ClipType; |
| 1539 return kComplex_ClipType; | 1539 return kComplex_ClipType; |
| 1540 } | 1540 } |
| 1541 | 1541 |
| 1542 const SkRegion& SkCanvas::getTotalClip() const { | 1542 const SkRegion& SkCanvas::getTotalClip() const { |
| 1543 return fMCRec->fRasterClip->forceGetBW(); | 1543 return fMCRec->fRasterClip->forceGetBW(); |
| 1544 } | 1544 } |
| 1545 | 1545 |
| 1546 SkDevice* SkCanvas::createLayerDevice(SkBitmap::Config config, | 1546 SkBaseDevice* SkCanvas::createLayerDevice(SkBitmap::Config config, |
| 1547 int width, int height, | 1547 int width, int height, |
| 1548 bool isOpaque) { | 1548 bool isOpaque) { |
| 1549 SkDevice* device = this->getTopDevice(); | 1549 SkBaseDevice* device = this->getTopDevice(); |
| 1550 if (device) { | 1550 if (device) { |
| 1551 return device->createCompatibleDeviceForSaveLayer(config, width, height, | 1551 return device->createCompatibleDeviceForSaveLayer(config, width, height, |
| 1552 isOpaque); | 1552 isOpaque); |
| 1553 } else { | 1553 } else { |
| 1554 return NULL; | 1554 return NULL; |
| 1555 } | 1555 } |
| 1556 } | 1556 } |
| 1557 | 1557 |
| 1558 SkDevice* SkCanvas::createCompatibleDevice(SkBitmap::Config config, | 1558 SkBaseDevice* SkCanvas::createCompatibleDevice(SkBitmap::Config config, |
| 1559 int width, int height, | 1559 int width, int height, |
| 1560 bool isOpaque) { | 1560 bool isOpaque) { |
| 1561 SkDevice* device = this->getDevice(); | 1561 SkBaseDevice* device = this->getDevice(); |
| 1562 if (device) { | 1562 if (device) { |
| 1563 return device->createCompatibleDevice(config, width, height, isOpaque); | 1563 return device->createCompatibleDevice(config, width, height, isOpaque); |
| 1564 } else { | 1564 } else { |
| 1565 return NULL; | 1565 return NULL; |
| 1566 } | 1566 } |
| 1567 } | 1567 } |
| 1568 | 1568 |
| 1569 | 1569 |
| 1570 ////////////////////////////////////////////////////////////////////////////// | 1570 ////////////////////////////////////////////////////////////////////////////// |
| 1571 // These are the virtual drawing methods | 1571 // These are the virtual drawing methods |
| (...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1867 void SkCanvas::drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, | 1867 void SkCanvas::drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, |
| 1868 const SkRect& dst, const SkPaint* paint) { | 1868 const SkRect& dst, const SkPaint* paint) { |
| 1869 SkDEBUGCODE(bitmap.validate();) | 1869 SkDEBUGCODE(bitmap.validate();) |
| 1870 | 1870 |
| 1871 // Need a device entry-point, so gpu can use a mesh | 1871 // Need a device entry-point, so gpu can use a mesh |
| 1872 this->internalDrawBitmapNine(bitmap, center, dst, paint); | 1872 this->internalDrawBitmapNine(bitmap, center, dst, paint); |
| 1873 } | 1873 } |
| 1874 | 1874 |
| 1875 class SkDeviceFilteredPaint { | 1875 class SkDeviceFilteredPaint { |
| 1876 public: | 1876 public: |
| 1877 SkDeviceFilteredPaint(SkDevice* device, const SkPaint& paint) { | 1877 SkDeviceFilteredPaint(SkBaseDevice* device, const SkPaint& paint) { |
| 1878 SkDevice::TextFlags flags; | 1878 SkBaseDevice::TextFlags flags; |
| 1879 if (device->filterTextFlags(paint, &flags)) { | 1879 if (device->filterTextFlags(paint, &flags)) { |
| 1880 SkPaint* newPaint = fLazy.set(paint); | 1880 SkPaint* newPaint = fLazy.set(paint); |
| 1881 newPaint->setFlags(flags.fFlags); | 1881 newPaint->setFlags(flags.fFlags); |
| 1882 newPaint->setHinting(flags.fHinting); | 1882 newPaint->setHinting(flags.fHinting); |
| 1883 fPaint = newPaint; | 1883 fPaint = newPaint; |
| 1884 } else { | 1884 } else { |
| 1885 fPaint = &paint; | 1885 fPaint = &paint; |
| 1886 } | 1886 } |
| 1887 } | 1887 } |
| 1888 | 1888 |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2196 } | 2196 } |
| 2197 | 2197 |
| 2198 SkCanvas::LayerIter::~LayerIter() { | 2198 SkCanvas::LayerIter::~LayerIter() { |
| 2199 fImpl->~SkDrawIter(); | 2199 fImpl->~SkDrawIter(); |
| 2200 } | 2200 } |
| 2201 | 2201 |
| 2202 void SkCanvas::LayerIter::next() { | 2202 void SkCanvas::LayerIter::next() { |
| 2203 fDone = !fImpl->next(); | 2203 fDone = !fImpl->next(); |
| 2204 } | 2204 } |
| 2205 | 2205 |
| 2206 SkDevice* SkCanvas::LayerIter::device() const { | 2206 SkBaseDevice* SkCanvas::LayerIter::device() const { |
| 2207 return fImpl->getDevice(); | 2207 return fImpl->getDevice(); |
| 2208 } | 2208 } |
| 2209 | 2209 |
| 2210 const SkMatrix& SkCanvas::LayerIter::matrix() const { | 2210 const SkMatrix& SkCanvas::LayerIter::matrix() const { |
| 2211 return fImpl->getMatrix(); | 2211 return fImpl->getMatrix(); |
| 2212 } | 2212 } |
| 2213 | 2213 |
| 2214 const SkPaint& SkCanvas::LayerIter::paint() const { | 2214 const SkPaint& SkCanvas::LayerIter::paint() const { |
| 2215 const SkPaint* paint = fImpl->getPaint(); | 2215 const SkPaint* paint = fImpl->getPaint(); |
| 2216 if (NULL == paint) { | 2216 if (NULL == paint) { |
| 2217 paint = &fDefaultPaint; | 2217 paint = &fDefaultPaint; |
| 2218 } | 2218 } |
| 2219 return *paint; | 2219 return *paint; |
| 2220 } | 2220 } |
| 2221 | 2221 |
| 2222 const SkRegion& SkCanvas::LayerIter::clip() const { return fImpl->getClip(); } | 2222 const SkRegion& SkCanvas::LayerIter::clip() const { return fImpl->getClip(); } |
| 2223 int SkCanvas::LayerIter::x() const { return fImpl->getX(); } | 2223 int SkCanvas::LayerIter::x() const { return fImpl->getX(); } |
| 2224 int SkCanvas::LayerIter::y() const { return fImpl->getY(); } | 2224 int SkCanvas::LayerIter::y() const { return fImpl->getY(); } |
| 2225 | 2225 |
| 2226 /////////////////////////////////////////////////////////////////////////////// | 2226 /////////////////////////////////////////////////////////////////////////////// |
| 2227 | 2227 |
| 2228 SkCanvas::ClipVisitor::~ClipVisitor() { } | 2228 SkCanvas::ClipVisitor::~ClipVisitor() { } |
| OLD | NEW |