| 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 1508 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1519 fClipStack.clipDevRect(rgn.getBounds(), op); | 1519 fClipStack.clipDevRect(rgn.getBounds(), op); |
| 1520 | 1520 |
| 1521 fMCRec->fRasterClip->op(rgn, op); | 1521 fMCRec->fRasterClip->op(rgn, op); |
| 1522 } | 1522 } |
| 1523 | 1523 |
| 1524 #ifdef SK_DEBUG | 1524 #ifdef SK_DEBUG |
| 1525 void SkCanvas::validateClip() const { | 1525 void SkCanvas::validateClip() const { |
| 1526 // construct clipRgn from the clipstack | 1526 // construct clipRgn from the clipstack |
| 1527 const SkBaseDevice* device = this->getDevice(); | 1527 const SkBaseDevice* device = this->getDevice(); |
| 1528 if (!device) { | 1528 if (!device) { |
| 1529 SkASSERT(this->getTotalClip().isEmpty()); | 1529 SkASSERT(this->isClipEmpty()); |
| 1530 return; | 1530 return; |
| 1531 } | 1531 } |
| 1532 | 1532 |
| 1533 SkIRect ir; | 1533 SkIRect ir; |
| 1534 ir.set(0, 0, device->width(), device->height()); | 1534 ir.set(0, 0, device->width(), device->height()); |
| 1535 SkRasterClip tmpClip(ir); | 1535 SkRasterClip tmpClip(ir); |
| 1536 | 1536 |
| 1537 SkClipStack::B2TIter iter(fClipStack); | 1537 SkClipStack::B2TIter iter(fClipStack); |
| 1538 const SkClipStack::Element* element; | 1538 const SkClipStack::Element* element; |
| 1539 while ((element = iter.next()) != NULL) { | 1539 while ((element = iter.next()) != NULL) { |
| 1540 switch (element->getType()) { | 1540 switch (element->getType()) { |
| 1541 case SkClipStack::Element::kRect_Type: | 1541 case SkClipStack::Element::kRect_Type: |
| 1542 element->getRect().round(&ir); | 1542 element->getRect().round(&ir); |
| 1543 tmpClip.op(ir, element->getOp()); | 1543 tmpClip.op(ir, element->getOp()); |
| 1544 break; | 1544 break; |
| 1545 case SkClipStack::Element::kEmpty_Type: | 1545 case SkClipStack::Element::kEmpty_Type: |
| 1546 tmpClip.setEmpty(); | 1546 tmpClip.setEmpty(); |
| 1547 break; | 1547 break; |
| 1548 default: { | 1548 default: { |
| 1549 SkPath path; | 1549 SkPath path; |
| 1550 element->asPath(&path); | 1550 element->asPath(&path); |
| 1551 clip_path_helper(this, &tmpClip, path, element->getOp(), element
->isAA()); | 1551 clip_path_helper(this, &tmpClip, path, element->getOp(), element
->isAA()); |
| 1552 break; | 1552 break; |
| 1553 } | 1553 } |
| 1554 } | 1554 } |
| 1555 } | 1555 } |
| 1556 | |
| 1557 #if 0 // enable this locally for testing | |
| 1558 // now compare against the current rgn | |
| 1559 const SkRegion& rgn = this->getTotalClip(); | |
| 1560 SkASSERT(rgn == tmpClip); | |
| 1561 #endif | |
| 1562 } | 1556 } |
| 1563 #endif | 1557 #endif |
| 1564 | 1558 |
| 1565 void SkCanvas::replayClips(ClipVisitor* visitor) const { | 1559 void SkCanvas::replayClips(ClipVisitor* visitor) const { |
| 1566 SkClipStack::B2TIter iter(fClipStack); | 1560 SkClipStack::B2TIter iter(fClipStack); |
| 1567 const SkClipStack::Element* element; | 1561 const SkClipStack::Element* element; |
| 1568 | 1562 |
| 1569 static const SkRect kEmpty = { 0, 0, 0, 0 }; | 1563 static const SkRect kEmpty = { 0, 0, 0, 0 }; |
| 1570 while ((element = iter.next()) != NULL) { | 1564 while ((element = iter.next()) != NULL) { |
| 1571 switch (element->getType()) { | 1565 switch (element->getType()) { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1584 } | 1578 } |
| 1585 } | 1579 } |
| 1586 } | 1580 } |
| 1587 | 1581 |
| 1588 /////////////////////////////////////////////////////////////////////////////// | 1582 /////////////////////////////////////////////////////////////////////////////// |
| 1589 | 1583 |
| 1590 bool SkCanvas::isClipEmpty() const { | 1584 bool SkCanvas::isClipEmpty() const { |
| 1591 return fMCRec->fRasterClip->isEmpty(); | 1585 return fMCRec->fRasterClip->isEmpty(); |
| 1592 } | 1586 } |
| 1593 | 1587 |
| 1588 bool SkCanvas::isClipRect() const { |
| 1589 return fMCRec->fRasterClip->isRect(); |
| 1590 } |
| 1591 |
| 1594 bool SkCanvas::quickReject(const SkRect& rect) const { | 1592 bool SkCanvas::quickReject(const SkRect& rect) const { |
| 1595 | 1593 |
| 1596 if (!rect.isFinite()) | 1594 if (!rect.isFinite()) |
| 1597 return true; | 1595 return true; |
| 1598 | 1596 |
| 1599 if (fMCRec->fRasterClip->isEmpty()) { | 1597 if (fMCRec->fRasterClip->isEmpty()) { |
| 1600 return true; | 1598 return true; |
| 1601 } | 1599 } |
| 1602 | 1600 |
| 1603 if (fMCRec->fMatrix->hasPerspective()) { | 1601 if (fMCRec->fMatrix->hasPerspective()) { |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1664 if (NULL != bounds) { | 1662 if (NULL != bounds) { |
| 1665 *bounds = clip.getBounds(); | 1663 *bounds = clip.getBounds(); |
| 1666 } | 1664 } |
| 1667 return true; | 1665 return true; |
| 1668 } | 1666 } |
| 1669 | 1667 |
| 1670 const SkMatrix& SkCanvas::getTotalMatrix() const { | 1668 const SkMatrix& SkCanvas::getTotalMatrix() const { |
| 1671 return *fMCRec->fMatrix; | 1669 return *fMCRec->fMatrix; |
| 1672 } | 1670 } |
| 1673 | 1671 |
| 1672 #ifdef SK_SUPPORT_LEGACY_GETCLIPTYPE |
| 1674 SkCanvas::ClipType SkCanvas::getClipType() const { | 1673 SkCanvas::ClipType SkCanvas::getClipType() const { |
| 1675 if (fMCRec->fRasterClip->isEmpty()) { | 1674 if (fMCRec->fRasterClip->isEmpty()) { |
| 1676 return kEmpty_ClipType; | 1675 return kEmpty_ClipType; |
| 1677 } | 1676 } |
| 1678 if (fMCRec->fRasterClip->isRect()) { | 1677 if (fMCRec->fRasterClip->isRect()) { |
| 1679 return kRect_ClipType; | 1678 return kRect_ClipType; |
| 1680 } | 1679 } |
| 1681 return kComplex_ClipType; | 1680 return kComplex_ClipType; |
| 1682 } | 1681 } |
| 1682 #endif |
| 1683 | 1683 |
| 1684 #ifdef SK_SUPPORT_LEGACY_GETTOTALCLIP |
| 1684 const SkRegion& SkCanvas::getTotalClip() const { | 1685 const SkRegion& SkCanvas::getTotalClip() const { |
| 1685 return fMCRec->fRasterClip->forceGetBW(); | 1686 return fMCRec->fRasterClip->forceGetBW(); |
| 1686 } | 1687 } |
| 1688 #endif |
| 1689 |
| 1690 const SkRegion& SkCanvas::internal_private_getTotalClip() const { |
| 1691 return fMCRec->fRasterClip->forceGetBW(); |
| 1692 } |
| 1693 |
| 1694 void SkCanvas::internal_private_getTotalClipAsPath(SkPath* path) const { |
| 1695 path->reset(); |
| 1696 |
| 1697 const SkRegion& rgn = fMCRec->fRasterClip->forceGetBW(); |
| 1698 if (rgn.isEmpty()) { |
| 1699 return; |
| 1700 } |
| 1701 (void)rgn.getBoundaryPath(path); |
| 1702 } |
| 1687 | 1703 |
| 1688 SkBaseDevice* SkCanvas::createLayerDevice(const SkImageInfo& info) { | 1704 SkBaseDevice* SkCanvas::createLayerDevice(const SkImageInfo& info) { |
| 1689 SkBaseDevice* device = this->getTopDevice(); | 1705 SkBaseDevice* device = this->getTopDevice(); |
| 1690 return device ? device->createCompatibleDeviceForSaveLayer(info) : NULL; | 1706 return device ? device->createCompatibleDeviceForSaveLayer(info) : NULL; |
| 1691 } | 1707 } |
| 1692 | 1708 |
| 1693 GrContext* SkCanvas::getGrContext() { | 1709 GrContext* SkCanvas::getGrContext() { |
| 1694 #if SK_SUPPORT_GPU | 1710 #if SK_SUPPORT_GPU |
| 1695 SkBaseDevice* device = this->getTopDevice(); | 1711 SkBaseDevice* device = this->getTopDevice(); |
| 1696 if (NULL != device) { | 1712 if (NULL != device) { |
| (...skipping 738 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2435 if (!bitmap.allocPixels(info)) { | 2451 if (!bitmap.allocPixels(info)) { |
| 2436 return NULL; | 2452 return NULL; |
| 2437 } | 2453 } |
| 2438 | 2454 |
| 2439 // should this functionality be moved into allocPixels()? | 2455 // should this functionality be moved into allocPixels()? |
| 2440 if (!bitmap.info().isOpaque()) { | 2456 if (!bitmap.info().isOpaque()) { |
| 2441 bitmap.eraseColor(0); | 2457 bitmap.eraseColor(0); |
| 2442 } | 2458 } |
| 2443 return SkNEW_ARGS(SkCanvas, (bitmap)); | 2459 return SkNEW_ARGS(SkCanvas, (bitmap)); |
| 2444 } | 2460 } |
| OLD | NEW |