| 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 612 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 623 | 623 |
| 624 void SkCanvas::resetForNextPicture(const SkIRect& bounds) { | 624 void SkCanvas::resetForNextPicture(const SkIRect& bounds) { |
| 625 this->restoreToCount(1); | 625 this->restoreToCount(1); |
| 626 fClipStack->reset(); | 626 fClipStack->reset(); |
| 627 fMCRec->reset(bounds); | 627 fMCRec->reset(bounds); |
| 628 | 628 |
| 629 // We're peering through a lot of structs here. Only at this scope do we | 629 // We're peering through a lot of structs here. Only at this scope do we |
| 630 // know that the device is an SkBitmapDevice (really an SkNoPixelsBitmapDevi
ce). | 630 // know that the device is an SkBitmapDevice (really an SkNoPixelsBitmapDevi
ce). |
| 631 static_cast<SkBitmapDevice*>(fMCRec->fLayer->fDevice)->setNewSize(bounds.siz
e()); | 631 static_cast<SkBitmapDevice*>(fMCRec->fLayer->fDevice)->setNewSize(bounds.siz
e()); |
| 632 fDeviceClipBounds = qr_clip_bounds(bounds); | 632 fDeviceClipBounds = qr_clip_bounds(bounds); |
| 633 fConservativeIsScaleTranslate = true; | 633 fIsScaleTranslate = true; |
| 634 } | 634 } |
| 635 | 635 |
| 636 SkBaseDevice* SkCanvas::init(SkBaseDevice* device, InitFlags flags) { | 636 SkBaseDevice* SkCanvas::init(SkBaseDevice* device, InitFlags flags) { |
| 637 if (device && device->forceConservativeRasterClip()) { | 637 if (device && device->forceConservativeRasterClip()) { |
| 638 flags = InitFlags(flags | kConservativeRasterClip_InitFlag); | 638 flags = InitFlags(flags | kConservativeRasterClip_InitFlag); |
| 639 } | 639 } |
| 640 // Since init() is only called once by our constructors, it is safe to perfo
rm this | 640 // Since init() is only called once by our constructors, it is safe to perfo
rm this |
| 641 // const-cast. | 641 // const-cast. |
| 642 *const_cast<bool*>(&fConservativeRasterClip) = SkToBool(flags & kConservativ
eRasterClip_InitFlag); | 642 *const_cast<bool*>(&fConservativeRasterClip) = SkToBool(flags & kConservativ
eRasterClip_InitFlag); |
| 643 | 643 |
| 644 fAllowSoftClip = true; | 644 fAllowSoftClip = true; |
| 645 fAllowSimplifyClip = false; | 645 fAllowSimplifyClip = false; |
| 646 fDeviceCMDirty = true; | 646 fDeviceCMDirty = true; |
| 647 fSaveCount = 1; | 647 fSaveCount = 1; |
| 648 fMetaData = nullptr; | 648 fMetaData = nullptr; |
| 649 #ifdef SK_EXPERIMENTAL_SHADOWING | 649 #ifdef SK_EXPERIMENTAL_SHADOWING |
| 650 fLights = nullptr; | 650 fLights = nullptr; |
| 651 #endif | 651 #endif |
| 652 | 652 |
| 653 fClipStack.reset(new SkClipStack); | 653 fClipStack.reset(new SkClipStack); |
| 654 | 654 |
| 655 fMCRec = (MCRec*)fMCStack.push_back(); | 655 fMCRec = (MCRec*)fMCStack.push_back(); |
| 656 new (fMCRec) MCRec(fConservativeRasterClip); | 656 new (fMCRec) MCRec(fConservativeRasterClip); |
| 657 fIsScaleTranslate = true; |
| 657 | 658 |
| 658 SkASSERT(sizeof(DeviceCM) <= sizeof(fDeviceCMStorage)); | 659 SkASSERT(sizeof(DeviceCM) <= sizeof(fDeviceCMStorage)); |
| 659 fMCRec->fLayer = (DeviceCM*)fDeviceCMStorage; | 660 fMCRec->fLayer = (DeviceCM*)fDeviceCMStorage; |
| 660 new (fDeviceCMStorage) DeviceCM(nullptr, nullptr, nullptr, fConservativeRast
erClip, | 661 new (fDeviceCMStorage) DeviceCM(nullptr, nullptr, nullptr, fConservativeRast
erClip, |
| 661 fMCRec->fMatrix); | 662 fMCRec->fMatrix); |
| 662 | 663 |
| 663 fMCRec->fTopLayer = fMCRec->fLayer; | 664 fMCRec->fTopLayer = fMCRec->fLayer; |
| 664 | 665 |
| 665 fSurfaceBase = nullptr; | 666 fSurfaceBase = nullptr; |
| 666 | 667 |
| 667 if (device) { | 668 if (device) { |
| 668 // The root device and the canvas should always have the same pixel geom
etry | 669 // The root device and the canvas should always have the same pixel geom
etry |
| 669 SkASSERT(fProps.pixelGeometry() == device->surfaceProps().pixelGeometry(
)); | 670 SkASSERT(fProps.pixelGeometry() == device->surfaceProps().pixelGeometry(
)); |
| 670 fMCRec->fLayer->fDevice = SkRef(device); | 671 fMCRec->fLayer->fDevice = SkRef(device); |
| 671 fMCRec->fRasterClip.setRect(device->getGlobalBounds()); | 672 fMCRec->fRasterClip.setRect(device->getGlobalBounds()); |
| 672 fDeviceClipBounds = qr_clip_bounds(device->getGlobalBounds()); | 673 fDeviceClipBounds = qr_clip_bounds(device->getGlobalBounds()); |
| 673 fConservativeIsScaleTranslate = true; | |
| 674 } | 674 } |
| 675 | 675 |
| 676 return device; | 676 return device; |
| 677 } | 677 } |
| 678 | 678 |
| 679 SkCanvas::SkCanvas() | 679 SkCanvas::SkCanvas() |
| 680 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) | 680 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) |
| 681 , fProps(SkSurfaceProps::kLegacyFontHost_InitType) | 681 , fProps(SkSurfaceProps::kLegacyFontHost_InitType) |
| 682 , fConservativeRasterClip(false) | 682 , fConservativeRasterClip(false) |
| 683 { | 683 { |
| (...skipping 637 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1321 delete layer; | 1321 delete layer; |
| 1322 } else { | 1322 } else { |
| 1323 // we're at the root | 1323 // we're at the root |
| 1324 SkASSERT(layer == (void*)fDeviceCMStorage); | 1324 SkASSERT(layer == (void*)fDeviceCMStorage); |
| 1325 layer->~DeviceCM(); | 1325 layer->~DeviceCM(); |
| 1326 // no need to update fMCRec, 'cause we're killing the canvas | 1326 // no need to update fMCRec, 'cause we're killing the canvas |
| 1327 } | 1327 } |
| 1328 } | 1328 } |
| 1329 | 1329 |
| 1330 if (fMCRec) { | 1330 if (fMCRec) { |
| 1331 fConservativeIsScaleTranslate = fMCRec->fMatrix.isScaleTranslate(); | 1331 fIsScaleTranslate = fMCRec->fMatrix.isScaleTranslate(); |
| 1332 fDeviceClipBounds = qr_clip_bounds(fMCRec->fRasterClip.getBounds()); | 1332 fDeviceClipBounds = qr_clip_bounds(fMCRec->fRasterClip.getBounds()); |
| 1333 } | 1333 } |
| 1334 } | 1334 } |
| 1335 | 1335 |
| 1336 sk_sp<SkSurface> SkCanvas::makeSurface(const SkImageInfo& info, const SkSurfaceP
rops* props) { | 1336 sk_sp<SkSurface> SkCanvas::makeSurface(const SkImageInfo& info, const SkSurfaceP
rops* props) { |
| 1337 if (nullptr == props) { | 1337 if (nullptr == props) { |
| 1338 props = &fProps; | 1338 props = &fProps; |
| 1339 } | 1339 } |
| 1340 return this->onNewSurface(info, *props); | 1340 return this->onNewSurface(info, *props); |
| 1341 } | 1341 } |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1479 } | 1479 } |
| 1480 | 1480 |
| 1481 void SkCanvas::concat(const SkMatrix& matrix) { | 1481 void SkCanvas::concat(const SkMatrix& matrix) { |
| 1482 if (matrix.isIdentity()) { | 1482 if (matrix.isIdentity()) { |
| 1483 return; | 1483 return; |
| 1484 } | 1484 } |
| 1485 | 1485 |
| 1486 this->checkForDeferredSave(); | 1486 this->checkForDeferredSave(); |
| 1487 fDeviceCMDirty = true; | 1487 fDeviceCMDirty = true; |
| 1488 fMCRec->fMatrix.preConcat(matrix); | 1488 fMCRec->fMatrix.preConcat(matrix); |
| 1489 fConservativeIsScaleTranslate = fMCRec->fMatrix.isScaleTranslate(); | 1489 fIsScaleTranslate = fMCRec->fMatrix.isScaleTranslate(); |
| 1490 this->didConcat(matrix); | 1490 this->didConcat(matrix); |
| 1491 } | 1491 } |
| 1492 | 1492 |
| 1493 void SkCanvas::internalSetMatrix(const SkMatrix& matrix) { | 1493 void SkCanvas::internalSetMatrix(const SkMatrix& matrix) { |
| 1494 fDeviceCMDirty = true; | 1494 fDeviceCMDirty = true; |
| 1495 fMCRec->fMatrix = matrix; | 1495 fMCRec->fMatrix = matrix; |
| 1496 } | 1496 } |
| 1497 | 1497 |
| 1498 void SkCanvas::setMatrix(const SkMatrix& matrix) { | 1498 void SkCanvas::setMatrix(const SkMatrix& matrix) { |
| 1499 this->checkForDeferredSave(); | 1499 this->checkForDeferredSave(); |
| 1500 this->internalSetMatrix(matrix); | 1500 this->internalSetMatrix(matrix); |
| 1501 fConservativeIsScaleTranslate = matrix.isScaleTranslate(); | 1501 fIsScaleTranslate = matrix.isScaleTranslate(); |
| 1502 this->didSetMatrix(matrix); | 1502 this->didSetMatrix(matrix); |
| 1503 } | 1503 } |
| 1504 | 1504 |
| 1505 void SkCanvas::resetMatrix() { | 1505 void SkCanvas::resetMatrix() { |
| 1506 this->setMatrix(SkMatrix::I()); | 1506 this->setMatrix(SkMatrix::I()); |
| 1507 } | 1507 } |
| 1508 | 1508 |
| 1509 #ifdef SK_EXPERIMENTAL_SHADOWING | 1509 #ifdef SK_EXPERIMENTAL_SHADOWING |
| 1510 void SkCanvas::translateZ(SkScalar z) { | 1510 void SkCanvas::translateZ(SkScalar z) { |
| 1511 this->checkForDeferredSave(); | 1511 this->checkForDeferredSave(); |
| (...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1837 bool SkCanvas::quickReject(const SkRect& src) const { | 1837 bool SkCanvas::quickReject(const SkRect& src) const { |
| 1838 #ifdef SK_DEBUG | 1838 #ifdef SK_DEBUG |
| 1839 // Verify that fDeviceClipBounds are set properly. | 1839 // Verify that fDeviceClipBounds are set properly. |
| 1840 SkRect tmp = qr_clip_bounds(fMCRec->fRasterClip.getBounds()); | 1840 SkRect tmp = qr_clip_bounds(fMCRec->fRasterClip.getBounds()); |
| 1841 if (fMCRec->fRasterClip.isEmpty()) { | 1841 if (fMCRec->fRasterClip.isEmpty()) { |
| 1842 SkASSERT(fDeviceClipBounds.isEmpty()); | 1842 SkASSERT(fDeviceClipBounds.isEmpty()); |
| 1843 } else { | 1843 } else { |
| 1844 SkASSERT(tmp == fDeviceClipBounds); | 1844 SkASSERT(tmp == fDeviceClipBounds); |
| 1845 } | 1845 } |
| 1846 | 1846 |
| 1847 // Verify that fConservativeIsScaleTranslate is set properly. | 1847 // Verify that fIsScaleTranslate is set properly. |
| 1848 SkASSERT(!fConservativeIsScaleTranslate || fMCRec->fMatrix.isScaleTranslate(
)); | 1848 SkASSERT(fIsScaleTranslate == fMCRec->fMatrix.isScaleTranslate()); |
| 1849 #endif | 1849 #endif |
| 1850 | 1850 |
| 1851 if (!fConservativeIsScaleTranslate) { | 1851 if (!fIsScaleTranslate) { |
| 1852 return quick_reject_slow_path(src, fDeviceClipBounds, fMCRec->fMatrix); | 1852 return quick_reject_slow_path(src, fDeviceClipBounds, fMCRec->fMatrix); |
| 1853 } | 1853 } |
| 1854 | 1854 |
| 1855 // We inline the implementation of mapScaleTranslate() for the fast path. | 1855 // We inline the implementation of mapScaleTranslate() for the fast path. |
| 1856 float sx = fMCRec->fMatrix.getScaleX(); | 1856 float sx = fMCRec->fMatrix.getScaleX(); |
| 1857 float sy = fMCRec->fMatrix.getScaleY(); | 1857 float sy = fMCRec->fMatrix.getScaleY(); |
| 1858 float tx = fMCRec->fMatrix.getTranslateX(); | 1858 float tx = fMCRec->fMatrix.getTranslateX(); |
| 1859 float ty = fMCRec->fMatrix.getTranslateY(); | 1859 float ty = fMCRec->fMatrix.getTranslateY(); |
| 1860 Sk4f scale(sx, sy, sx, sy); | 1860 Sk4f scale(sx, sy, sx, sy); |
| 1861 Sk4f trans(tx, ty, tx, ty); | 1861 Sk4f trans(tx, ty, tx, ty); |
| (...skipping 1501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3363 | 3363 |
| 3364 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { | 3364 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { |
| 3365 fCanvas->restoreToCount(fSaveCount); | 3365 fCanvas->restoreToCount(fSaveCount); |
| 3366 } | 3366 } |
| 3367 | 3367 |
| 3368 #ifdef SK_SUPPORT_LEGACY_NEW_SURFACE_API | 3368 #ifdef SK_SUPPORT_LEGACY_NEW_SURFACE_API |
| 3369 SkSurface* SkCanvas::newSurface(const SkImageInfo& info, const SkSurfaceProps* p
rops) { | 3369 SkSurface* SkCanvas::newSurface(const SkImageInfo& info, const SkSurfaceProps* p
rops) { |
| 3370 return this->makeSurface(info, props).release(); | 3370 return this->makeSurface(info, props).release(); |
| 3371 } | 3371 } |
| 3372 #endif | 3372 #endif |
| OLD | NEW |