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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 | 43 |
44 #if SK_SUPPORT_GPU | 44 #if SK_SUPPORT_GPU |
45 #include "GrContext.h" | 45 #include "GrContext.h" |
46 #include "GrRenderTarget.h" | 46 #include "GrRenderTarget.h" |
47 #include "SkGrPriv.h" | 47 #include "SkGrPriv.h" |
48 | 48 |
49 #endif | 49 #endif |
50 | 50 |
51 #define RETURN_ON_NULL(ptr) do { if (nullptr == (ptr)) return; } while (0) | 51 #define RETURN_ON_NULL(ptr) do { if (nullptr == (ptr)) return; } while (0) |
52 | 52 |
53 //#define SK_SUPPORT_PRECHECK_CLIPRECT | |
54 | |
55 /* | 53 /* |
56 * Return true if the drawing this rect would hit every pixels in the canvas. | 54 * Return true if the drawing this rect would hit every pixels in the canvas. |
57 * | 55 * |
58 * Returns false if | 56 * Returns false if |
59 * - rect does not contain the canvas' bounds | 57 * - rect does not contain the canvas' bounds |
60 * - paint is not fill | 58 * - paint is not fill |
61 * - paint would blur or otherwise change the coverage of the rect | 59 * - paint would blur or otherwise change the coverage of the rect |
62 */ | 60 */ |
63 bool SkCanvas::wouldOverwriteEntireSurface(const SkRect* rect, const SkPaint* pa
int, | 61 bool SkCanvas::wouldOverwriteEntireSurface(const SkRect* rect, const SkPaint* pa
int, |
64 ShaderOverrideOpacity overrideOpacity
) const { | 62 ShaderOverrideOpacity overrideOpacity
) const { |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 | 114 |
117 static bool gTreatSpriteAsBitmap; | 115 static bool gTreatSpriteAsBitmap; |
118 void SkCanvas::Internal_Private_SetTreatSpriteAsBitmap(bool spriteAsBitmap) { | 116 void SkCanvas::Internal_Private_SetTreatSpriteAsBitmap(bool spriteAsBitmap) { |
119 gTreatSpriteAsBitmap = spriteAsBitmap; | 117 gTreatSpriteAsBitmap = spriteAsBitmap; |
120 } | 118 } |
121 bool SkCanvas::Internal_Private_GetTreatSpriteAsBitmap() { | 119 bool SkCanvas::Internal_Private_GetTreatSpriteAsBitmap() { |
122 return gTreatSpriteAsBitmap; | 120 return gTreatSpriteAsBitmap; |
123 } | 121 } |
124 | 122 |
125 // experimental for faster tiled drawing... | 123 // experimental for faster tiled drawing... |
126 //#define SK_ENABLE_CLIP_QUICKREJECT | |
127 //#define SK_TRACE_SAVERESTORE | 124 //#define SK_TRACE_SAVERESTORE |
128 | 125 |
129 #ifdef SK_TRACE_SAVERESTORE | 126 #ifdef SK_TRACE_SAVERESTORE |
130 static int gLayerCounter; | 127 static int gLayerCounter; |
131 static void inc_layer() { ++gLayerCounter; printf("----- inc layer %d\n", gL
ayerCounter); } | 128 static void inc_layer() { ++gLayerCounter; printf("----- inc layer %d\n", gL
ayerCounter); } |
132 static void dec_layer() { --gLayerCounter; printf("----- dec layer %d\n", gL
ayerCounter); } | 129 static void dec_layer() { --gLayerCounter; printf("----- dec layer %d\n", gL
ayerCounter); } |
133 | 130 |
134 static int gRecCounter; | 131 static int gRecCounter; |
135 static void inc_rec() { ++gRecCounter; printf("----- inc rec %d\n", gRecCoun
ter); } | 132 static void inc_rec() { ++gRecCounter; printf("----- inc rec %d\n", gRecCoun
ter); } |
136 static void dec_rec() { --gRecCounter; printf("----- dec rec %d\n", gRecCoun
ter); } | 133 static void dec_rec() { --gRecCounter; printf("----- dec rec %d\n", gRecCoun
ter); } |
(...skipping 1404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1541 } | 1538 } |
1542 #endif | 1539 #endif |
1543 | 1540 |
1544 ////////////////////////////////////////////////////////////////////////////// | 1541 ////////////////////////////////////////////////////////////////////////////// |
1545 | 1542 |
1546 void SkCanvas::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) { | 1543 void SkCanvas::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) { |
1547 if (!fAllowSoftClip) { | 1544 if (!fAllowSoftClip) { |
1548 doAA = false; | 1545 doAA = false; |
1549 } | 1546 } |
1550 | 1547 |
1551 #ifdef SK_SUPPORT_PRECHECK_CLIPRECT | |
1552 // Check if we can quick-accept the clip call (and do nothing) | |
1553 // | |
1554 if (SkRegion::kIntersect_Op == op && !doAA && fMCRec->fMatrix.isScaleTransla
te()) { | |
1555 SkRect devR; | |
1556 fMCRec->fMatrix.mapRectScaleTranslate(&devR, rect); | |
1557 // NOTE: this check is CTM specific, since we might round differently wi
th a different | |
1558 // CTM. Thus this is only 100% reliable if there is not global CTM
scale to be | |
1559 // applied later (i.e. if this is going into a picture). | |
1560 if (devR.round().contains(fMCRec->fRasterClip.getBounds())) { | |
1561 #if 0 | |
1562 SkDebugf("ignored clipRect [%g %g %g %g]\n", | |
1563 rect.left(), rect.top(), rect.right(), rect.bottom()); | |
1564 #endif | |
1565 return; | |
1566 } | |
1567 } | |
1568 #endif | |
1569 | |
1570 this->checkForDeferredSave(); | 1548 this->checkForDeferredSave(); |
1571 ClipEdgeStyle edgeStyle = doAA ? kSoft_ClipEdgeStyle : kHard_ClipEdgeStyle; | 1549 ClipEdgeStyle edgeStyle = doAA ? kSoft_ClipEdgeStyle : kHard_ClipEdgeStyle; |
1572 this->onClipRect(rect, op, edgeStyle); | 1550 this->onClipRect(rect, op, edgeStyle); |
1573 } | 1551 } |
1574 | 1552 |
1575 void SkCanvas::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle edg
eStyle) { | 1553 void SkCanvas::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle edg
eStyle) { |
1576 #ifdef SK_ENABLE_CLIP_QUICKREJECT | |
1577 if (SkRegion::kIntersect_Op == op) { | |
1578 if (fMCRec->fRasterClip.isEmpty()) { | |
1579 return; | |
1580 } | |
1581 | |
1582 if (this->quickReject(rect)) { | |
1583 fDeviceCMDirty = true; | |
1584 fCachedLocalClipBoundsDirty = true; | |
1585 | |
1586 fClipStack->clipEmpty(); | |
1587 (void)fMCRec->fRasterClip.setEmpty(); | |
1588 fDeviceClipBounds.setEmpty(); | |
1589 return; | |
1590 } | |
1591 } | |
1592 #endif | |
1593 | |
1594 const bool isScaleTrans = fMCRec->fMatrix.isScaleTranslate(); | 1554 const bool isScaleTrans = fMCRec->fMatrix.isScaleTranslate(); |
1595 SkRect devR; | 1555 SkRect devR; |
1596 if (isScaleTrans) { | 1556 if (isScaleTrans) { |
1597 fMCRec->fMatrix.mapRectScaleTranslate(&devR, rect); | 1557 fMCRec->fMatrix.mapRectScaleTranslate(&devR, rect); |
1598 } | 1558 } |
1599 | 1559 |
1600 #ifndef SK_SUPPORT_PRECHECK_CLIPRECT | |
1601 if (SkRegion::kIntersect_Op == op && | 1560 if (SkRegion::kIntersect_Op == op && |
1602 kHard_ClipEdgeStyle == edgeStyle | 1561 kHard_ClipEdgeStyle == edgeStyle |
1603 && isScaleTrans) | 1562 && isScaleTrans) |
1604 { | 1563 { |
1605 if (devR.round().contains(fMCRec->fRasterClip.getBounds())) { | 1564 if (devR.round().contains(fMCRec->fRasterClip.getBounds())) { |
1606 #if 0 | 1565 #if 0 |
1607 SkDebugf("------- ignored clipRect [%g %g %g %g]\n", | 1566 SkDebugf("------- ignored clipRect [%g %g %g %g]\n", |
1608 rect.left(), rect.top(), rect.right(), rect.bottom()); | 1567 rect.left(), rect.top(), rect.right(), rect.bottom()); |
1609 #endif | 1568 #endif |
1610 return; | 1569 return; |
1611 } | 1570 } |
1612 } | 1571 } |
1613 #endif | |
1614 | 1572 |
1615 AutoValidateClip avc(this); | 1573 AutoValidateClip avc(this); |
1616 | 1574 |
1617 fDeviceCMDirty = true; | 1575 fDeviceCMDirty = true; |
1618 | 1576 |
1619 if (isScaleTrans) { | 1577 if (isScaleTrans) { |
1620 const bool isAA = kSoft_ClipEdgeStyle == edgeStyle; | 1578 const bool isAA = kSoft_ClipEdgeStyle == edgeStyle; |
1621 fClipStack->clipDevRect(devR, op, isAA); | 1579 fClipStack->clipDevRect(devR, op, isAA); |
1622 fMCRec->fRasterClip.op(devR, this->getTopLayerBounds(), op, isAA); | 1580 fMCRec->fRasterClip.op(devR, this->getTopLayerBounds(), op, isAA); |
1623 } else { | 1581 } else { |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1689 if (path.isRRect(&rrect)) { | 1647 if (path.isRRect(&rrect)) { |
1690 this->onClipRRect(rrect, op, edgeStyle); | 1648 this->onClipRRect(rrect, op, edgeStyle); |
1691 return; | 1649 return; |
1692 } | 1650 } |
1693 } | 1651 } |
1694 | 1652 |
1695 this->onClipPath(path, op, edgeStyle); | 1653 this->onClipPath(path, op, edgeStyle); |
1696 } | 1654 } |
1697 | 1655 |
1698 void SkCanvas::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edg
eStyle) { | 1656 void SkCanvas::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edg
eStyle) { |
1699 #ifdef SK_ENABLE_CLIP_QUICKREJECT | |
1700 if (SkRegion::kIntersect_Op == op && !path.isInverseFillType()) { | |
1701 if (fMCRec->fRasterClip.isEmpty()) { | |
1702 return; | |
1703 } | |
1704 | |
1705 if (this->quickReject(path.getBounds())) { | |
1706 fDeviceCMDirty = true; | |
1707 fCachedLocalClipBoundsDirty = true; | |
1708 | |
1709 fClipStack->clipEmpty(); | |
1710 (void)fMCRec->fRasterClip.setEmpty(); | |
1711 fDeviceClipBounds.setEmpty(); | |
1712 return; | |
1713 } | |
1714 } | |
1715 #endif | |
1716 | |
1717 AutoValidateClip avc(this); | 1657 AutoValidateClip avc(this); |
1718 | 1658 |
1719 fDeviceCMDirty = true; | 1659 fDeviceCMDirty = true; |
1720 if (!fAllowSoftClip) { | 1660 if (!fAllowSoftClip) { |
1721 edgeStyle = kHard_ClipEdgeStyle; | 1661 edgeStyle = kHard_ClipEdgeStyle; |
1722 } | 1662 } |
1723 | 1663 |
1724 SkPath devPath; | 1664 SkPath devPath; |
1725 if (fMCRec->fMatrix.isIdentity()) { | 1665 if (fMCRec->fMatrix.isIdentity()) { |
1726 devPath = path; | 1666 devPath = path; |
(...skipping 1777 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3504 | 3444 |
3505 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { | 3445 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { |
3506 fCanvas->restoreToCount(fSaveCount); | 3446 fCanvas->restoreToCount(fSaveCount); |
3507 } | 3447 } |
3508 | 3448 |
3509 #ifdef SK_SUPPORT_LEGACY_NEW_SURFACE_API | 3449 #ifdef SK_SUPPORT_LEGACY_NEW_SURFACE_API |
3510 SkSurface* SkCanvas::newSurface(const SkImageInfo& info, const SkSurfaceProps* p
rops) { | 3450 SkSurface* SkCanvas::newSurface(const SkImageInfo& info, const SkSurfaceProps* p
rops) { |
3511 return this->makeSurface(info, props).release(); | 3451 return this->makeSurface(info, props).release(); |
3512 } | 3452 } |
3513 #endif | 3453 #endif |
OLD | NEW |