| 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 "SkCanvas.h" | 8 #include "SkCanvas.h" |
| 9 #include "SkCanvasPriv.h" | 9 #include "SkCanvasPriv.h" |
| 10 #include "SkBitmapDevice.h" | 10 #include "SkBitmapDevice.h" |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 #define inc_layer() | 71 #define inc_layer() |
| 72 #define dec_layer() | 72 #define dec_layer() |
| 73 #define inc_rec() | 73 #define inc_rec() |
| 74 #define dec_rec() | 74 #define dec_rec() |
| 75 #define inc_canvas() | 75 #define inc_canvas() |
| 76 #define dec_canvas() | 76 #define dec_canvas() |
| 77 #endif | 77 #endif |
| 78 | 78 |
| 79 typedef SkTLazy<SkPaint> SkLazyPaint; | 79 typedef SkTLazy<SkPaint> SkLazyPaint; |
| 80 | 80 |
| 81 void SkCanvas::predrawNotify() { | |
| 82 if (fSurfaceBase) { | |
| 83 fSurfaceBase->aboutToDraw(SkSurface::kRetain_ContentChangeMode); | |
| 84 } | |
| 85 } | |
| 86 | |
| 87 /////////////////////////////////////////////////////////////////////////////// | 81 /////////////////////////////////////////////////////////////////////////////// |
| 88 | 82 |
| 89 static uint32_t filter_paint_flags(const SkSurfaceProps& props, uint32_t flags)
{ | 83 static uint32_t filter_paint_flags(const SkSurfaceProps& props, uint32_t flags)
{ |
| 90 const uint32_t propFlags = props.flags(); | 84 const uint32_t propFlags = props.flags(); |
| 91 if (propFlags & SkSurfaceProps::kDisallowDither_Flag) { | 85 if (propFlags & SkSurfaceProps::kDisallowDither_Flag) { |
| 92 flags &= ~SkPaint::kDither_Flag; | 86 flags &= ~SkPaint::kDither_Flag; |
| 93 } | 87 } |
| 94 if (propFlags & SkSurfaceProps::kDisallowAntiAlias_Flag) { | 88 if (propFlags & SkSurfaceProps::kDisallowAntiAlias_Flag) { |
| 95 flags &= ~SkPaint::kAntiAlias_Flag; | 89 flags &= ~SkPaint::kAntiAlias_Flag; |
| 96 } | 90 } |
| (...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 402 if (fPaint->nothingToDraw()) { | 396 if (fPaint->nothingToDraw()) { |
| 403 fPaint = NULL; | 397 fPaint = NULL; |
| 404 return false; | 398 return false; |
| 405 } | 399 } |
| 406 return true; | 400 return true; |
| 407 } | 401 } |
| 408 | 402 |
| 409 ////////// macros to place around the internal draw calls ////////////////// | 403 ////////// macros to place around the internal draw calls ////////////////// |
| 410 | 404 |
| 411 #define LOOPER_BEGIN_DRAWDEVICE(paint, type) \ | 405 #define LOOPER_BEGIN_DRAWDEVICE(paint, type) \ |
| 412 this->predrawNotify(); \ | |
| 413 AutoDrawLooper looper(this, fProps, paint, true); \ | 406 AutoDrawLooper looper(this, fProps, paint, true); \ |
| 414 while (looper.next(type)) { \ | 407 while (looper.next(type)) { \ |
| 415 SkDrawIter iter(this); | 408 SkDrawIter iter(this); |
| 416 | 409 |
| 417 #define LOOPER_BEGIN(paint, type, bounds) \ | 410 #define LOOPER_BEGIN(paint, type, bounds) \ |
| 418 this->predrawNotify(); \ | |
| 419 AutoDrawLooper looper(this, fProps, paint, false, bounds); \ | 411 AutoDrawLooper looper(this, fProps, paint, false, bounds); \ |
| 420 while (looper.next(type)) { \ | 412 while (looper.next(type)) { \ |
| 421 SkDrawIter iter(this); | 413 SkDrawIter iter(this); |
| 422 | 414 |
| 423 #define LOOPER_END } | 415 #define LOOPER_END } |
| 424 | 416 |
| 425 //////////////////////////////////////////////////////////////////////////// | 417 //////////////////////////////////////////////////////////////////////////// |
| 426 | 418 |
| 427 SkBaseDevice* SkCanvas::init(SkBaseDevice* device, InitFlags flags) { | 419 SkBaseDevice* SkCanvas::init(SkBaseDevice* device, InitFlags flags) { |
| 428 fConservativeRasterClip = SkToBool(flags & kConservativeRasterClip_InitFlag)
; | 420 fConservativeRasterClip = SkToBool(flags & kConservativeRasterClip_InitFlag)
; |
| 429 fCachedLocalClipBounds.setEmpty(); | 421 fCachedLocalClipBounds.setEmpty(); |
| 430 fCachedLocalClipBoundsDirty = true; | 422 fCachedLocalClipBoundsDirty = true; |
| 431 fAllowSoftClip = true; | 423 fAllowSoftClip = true; |
| 432 fAllowSimplifyClip = false; | 424 fAllowSimplifyClip = false; |
| 433 fDeviceCMDirty = true; | 425 fDeviceCMDirty = true; |
| 434 fSaveCount = 1; | 426 fSaveCount = 1; |
| 435 fMetaData = NULL; | 427 fMetaData = NULL; |
| 436 | 428 |
| 437 fMCRec = (MCRec*)fMCStack.push_back(); | 429 fMCRec = (MCRec*)fMCStack.push_back(); |
| 438 new (fMCRec) MCRec(fConservativeRasterClip); | 430 new (fMCRec) MCRec(fConservativeRasterClip); |
| 439 | 431 |
| 440 fMCRec->fLayer = SkNEW_ARGS(DeviceCM, (NULL, 0, 0, NULL, NULL, fConservative
RasterClip)); | 432 fMCRec->fLayer = SkNEW_ARGS(DeviceCM, (NULL, 0, 0, NULL, NULL, fConservative
RasterClip)); |
| 441 fMCRec->fTopLayer = fMCRec->fLayer; | 433 fMCRec->fTopLayer = fMCRec->fLayer; |
| 442 | 434 |
| 443 fSurfaceBase = NULL; | |
| 444 | |
| 445 fClipStack.reset(SkNEW(SkClipStack)); | 435 fClipStack.reset(SkNEW(SkClipStack)); |
| 446 | 436 |
| 447 if (device) { | 437 if (device) { |
| 448 device->initForRootLayer(fProps.pixelGeometry()); | 438 device->initForRootLayer(fProps.pixelGeometry()); |
| 449 if (device->forceConservativeRasterClip()) { | 439 if (device->forceConservativeRasterClip()) { |
| 450 fConservativeRasterClip = true; | 440 fConservativeRasterClip = true; |
| 451 } | 441 } |
| 452 device->onAttachToCanvas(this); | 442 device->onAttachToCanvas(this); |
| 453 fMCRec->fLayer->fDevice = SkRef(device); | 443 fMCRec->fLayer->fDevice = SkRef(device); |
| 454 fMCRec->fRasterClip.setRect(device->getGlobalBounds()); | 444 fMCRec->fRasterClip.setRect(device->getGlobalBounds()); |
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 710 // if x or y are negative, then we have to adjust pixels | 700 // if x or y are negative, then we have to adjust pixels |
| 711 if (x > 0) { | 701 if (x > 0) { |
| 712 x = 0; | 702 x = 0; |
| 713 } | 703 } |
| 714 if (y > 0) { | 704 if (y > 0) { |
| 715 y = 0; | 705 y = 0; |
| 716 } | 706 } |
| 717 // here x,y are either 0 or negative | 707 // here x,y are either 0 or negative |
| 718 pixels = ((const char*)pixels - y * rowBytes - x * info.bytesPerPixel()); | 708 pixels = ((const char*)pixels - y * rowBytes - x * info.bytesPerPixel()); |
| 719 | 709 |
| 720 // Tell our owning surface to bump its generation ID | |
| 721 this->predrawNotify(); | |
| 722 | |
| 723 // The device can assert that the requested area is always contained in its
bounds | 710 // The device can assert that the requested area is always contained in its
bounds |
| 724 return device->writePixels(info, pixels, rowBytes, target.x(), target.y()); | 711 return device->writePixels(info, pixels, rowBytes, target.x(), target.y()); |
| 725 } | 712 } |
| 726 | 713 |
| 727 SkCanvas* SkCanvas::canvasForDrawIter() { | 714 SkCanvas* SkCanvas::canvasForDrawIter() { |
| 728 return this; | 715 return this; |
| 729 } | 716 } |
| 730 | 717 |
| 731 ////////////////////////////////////////////////////////////////////////////// | 718 ////////////////////////////////////////////////////////////////////////////// |
| 732 | 719 |
| (...skipping 925 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1658 | 1645 |
| 1659 void SkCanvas::drawSprite(const SkBitmap& bitmap, int left, int top, const SkPai
nt* paint) { | 1646 void SkCanvas::drawSprite(const SkBitmap& bitmap, int left, int top, const SkPai
nt* paint) { |
| 1660 this->onDrawSprite(bitmap, left, top, paint); | 1647 this->onDrawSprite(bitmap, left, top, paint); |
| 1661 } | 1648 } |
| 1662 | 1649 |
| 1663 ////////////////////////////////////////////////////////////////////////////// | 1650 ////////////////////////////////////////////////////////////////////////////// |
| 1664 // These are the virtual drawing methods | 1651 // These are the virtual drawing methods |
| 1665 ////////////////////////////////////////////////////////////////////////////// | 1652 ////////////////////////////////////////////////////////////////////////////// |
| 1666 | 1653 |
| 1667 void SkCanvas::onDiscard() { | 1654 void SkCanvas::onDiscard() { |
| 1668 if (fSurfaceBase) { | 1655 if (this->getDevice()) { |
| 1669 fSurfaceBase->aboutToDraw(SkSurface::kDiscard_ContentChangeMode); | 1656 this->getDevice()->discard(); |
| 1670 } | 1657 } |
| 1671 } | 1658 } |
| 1672 | 1659 |
| 1673 void SkCanvas::onDrawPaint(const SkPaint& paint) { | 1660 void SkCanvas::onDrawPaint(const SkPaint& paint) { |
| 1674 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawPaint()"); | 1661 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawPaint()"); |
| 1675 this->internalDrawPaint(paint); | 1662 this->internalDrawPaint(paint); |
| 1676 } | 1663 } |
| 1677 | 1664 |
| 1678 void SkCanvas::internalDrawPaint(const SkPaint& paint) { | 1665 void SkCanvas::internalDrawPaint(const SkPaint& paint) { |
| 1679 LOOPER_BEGIN(paint, SkDrawFilter::kPaint_Type, NULL) | 1666 LOOPER_BEGIN(paint, SkDrawFilter::kPaint_Type, NULL) |
| (...skipping 831 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2511 } | 2498 } |
| 2512 | 2499 |
| 2513 if (matrix) { | 2500 if (matrix) { |
| 2514 canvas->concat(*matrix); | 2501 canvas->concat(*matrix); |
| 2515 } | 2502 } |
| 2516 } | 2503 } |
| 2517 | 2504 |
| 2518 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { | 2505 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { |
| 2519 fCanvas->restoreToCount(fSaveCount); | 2506 fCanvas->restoreToCount(fSaveCount); |
| 2520 } | 2507 } |
| OLD | NEW |