Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(806)

Side by Side Diff: include/core/SkCanvas.h

Issue 2225393002: Optimized implementation of quickReject() (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Cleaning things up Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2006 The Android Open Source Project 2 * Copyright 2006 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 #ifndef SkCanvas_DEFINED 8 #ifndef SkCanvas_DEFINED
9 #define SkCanvas_DEFINED 9 #define SkCanvas_DEFINED
10 10
(...skipping 548 matching lines...) Expand 10 before | Expand all | Expand 10 after
559 /** Return true if the horizontal band specified by top and bottom is 559 /** Return true if the horizontal band specified by top and bottom is
560 completely clipped out. This is a conservative calculation, meaning 560 completely clipped out. This is a conservative calculation, meaning
561 that it is possible that if the method returns false, the band may still 561 that it is possible that if the method returns false, the band may still
562 in fact be clipped out, but the converse is not true. If this method 562 in fact be clipped out, but the converse is not true. If this method
563 returns true, then the band is guaranteed to be clipped out. 563 returns true, then the band is guaranteed to be clipped out.
564 @param top The top of the horizontal band to compare with the clip 564 @param top The top of the horizontal band to compare with the clip
565 @param bottom The bottom of the horizontal and to compare with the clip 565 @param bottom The bottom of the horizontal and to compare with the clip
566 @return true if the horizontal band is completely clipped out (i.e. does 566 @return true if the horizontal band is completely clipped out (i.e. does
567 not intersect the current clip) 567 not intersect the current clip)
568 */ 568 */
569 bool quickRejectY(SkScalar top, SkScalar bottom) const { 569 bool quickRejectY(SkScalar top, SkScalar bottom) const;
570 SkASSERT(top <= bottom);
571
572 #ifndef SK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT
573 // TODO: add a hasPerspective method similar to getLocalClipBounds. This
574 // would cache the SkMatrix::hasPerspective result. Alternatively, have
575 // the MC stack just set a hasPerspective boolean as it is updated.
576 if (this->getTotalMatrix().hasPerspective()) {
577 // TODO: consider implementing some half-plane test between the
578 // two Y planes and the device-bounds (i.e., project the top and
579 // bottom Y planes and then determine if the clip bounds is complete ly
580 // outside either one).
581 return false;
582 }
583 #endif
584
585 const SkRect& clipR = this->getLocalClipBounds();
586 // In the case where the clip is empty and we are provided with a
587 // negative top and positive bottom parameter then this test will return
588 // false even though it will be clipped. We have chosen to exclude that
589 // check as it is rare and would result double the comparisons.
590 return top >= clipR.fBottom || bottom <= clipR.fTop;
591 }
592 570
593 /** Return the bounds of the current clip (in local coordinates) in the 571 /** Return the bounds of the current clip (in local coordinates) in the
594 bounds parameter, and return true if it is non-empty. This can be useful 572 bounds parameter, and return true if it is non-empty. This can be useful
595 in a way similar to quickReject, in that it tells you that drawing 573 in a way similar to quickReject, in that it tells you that drawing
596 outside of these bounds will be clipped out. 574 outside of these bounds will be clipped out.
597 */ 575 */
598 virtual bool getClipBounds(SkRect* bounds) const; 576 virtual bool getClipBounds(SkRect* bounds) const;
599 577
600 /** Return the bounds of the current clip, in device coordinates; returns 578 /** Return the bounds of the current clip, in device coordinates; returns
601 true if non-empty. Maybe faster than getting the clip explicitly and 579 true if non-empty. Maybe faster than getting the clip explicitly and
(...skipping 1030 matching lines...) Expand 10 before | Expand all | Expand 10 after
1632 * paint (or default if null) would overwrite the entire root device of the canvas 1610 * paint (or default if null) would overwrite the entire root device of the canvas
1633 * (i.e. the canvas' surface if it had one). 1611 * (i.e. the canvas' surface if it had one).
1634 */ 1612 */
1635 bool wouldOverwriteEntireSurface(const SkRect*, const SkPaint*, ShaderOverri deOpacity) const; 1613 bool wouldOverwriteEntireSurface(const SkRect*, const SkPaint*, ShaderOverri deOpacity) const;
1636 1614
1637 /** 1615 /**
1638 * Returns true if the paint's imagefilter can be invoked directly, without needed a layer. 1616 * Returns true if the paint's imagefilter can be invoked directly, without needed a layer.
1639 */ 1617 */
1640 bool canDrawBitmapAsSprite(SkScalar x, SkScalar y, int w, int h, const SkPai nt&); 1618 bool canDrawBitmapAsSprite(SkScalar x, SkScalar y, int w, int h, const SkPai nt&);
1641 1619
1642 /* These maintain a cache of the clip bounds in local coordinates, 1620
1643 (converted to 2s-compliment if floats are slow). 1621 /**
1622 * Keep track of the device clip bounds and if the matrix is scale-translat e. This allows
1623 * us to do a fast quick reject in the common case.
1644 */ 1624 */
1645 mutable SkRect fCachedLocalClipBounds; 1625 bool fIsScaleTranslate;
1646 mutable bool fCachedLocalClipBoundsDirty; 1626 SkRect fDeviceClipBounds;
1627
1647 bool fAllowSoftClip; 1628 bool fAllowSoftClip;
1648 bool fAllowSimplifyClip; 1629 bool fAllowSimplifyClip;
1649 const bool fConservativeRasterClip; 1630 const bool fConservativeRasterClip;
1650 1631
1651 const SkRect& getLocalClipBounds() const {
1652 if (fCachedLocalClipBoundsDirty) {
1653 if (!this->getClipBounds(&fCachedLocalClipBounds)) {
1654 fCachedLocalClipBounds.setEmpty();
1655 }
1656 fCachedLocalClipBoundsDirty = false;
1657 }
1658 return fCachedLocalClipBounds;
1659 }
1660
1661 class AutoValidateClip : ::SkNoncopyable { 1632 class AutoValidateClip : ::SkNoncopyable {
1662 public: 1633 public:
1663 explicit AutoValidateClip(SkCanvas* canvas) : fCanvas(canvas) { 1634 explicit AutoValidateClip(SkCanvas* canvas) : fCanvas(canvas) {
1664 fCanvas->validateClip(); 1635 fCanvas->validateClip();
1665 } 1636 }
1666 ~AutoValidateClip() { fCanvas->validateClip(); } 1637 ~AutoValidateClip() { fCanvas->validateClip(); }
1667 1638
1668 private: 1639 private:
1669 const SkCanvas* fCanvas; 1640 const SkCanvas* fCanvas;
1670 }; 1641 };
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1717 1688
1718 class SkCanvasClipVisitor { 1689 class SkCanvasClipVisitor {
1719 public: 1690 public:
1720 virtual ~SkCanvasClipVisitor(); 1691 virtual ~SkCanvasClipVisitor();
1721 virtual void clipRect(const SkRect&, SkRegion::Op, bool antialias) = 0; 1692 virtual void clipRect(const SkRect&, SkRegion::Op, bool antialias) = 0;
1722 virtual void clipRRect(const SkRRect&, SkRegion::Op, bool antialias) = 0; 1693 virtual void clipRRect(const SkRRect&, SkRegion::Op, bool antialias) = 0;
1723 virtual void clipPath(const SkPath&, SkRegion::Op, bool antialias) = 0; 1694 virtual void clipPath(const SkPath&, SkRegion::Op, bool antialias) = 0;
1724 }; 1695 };
1725 1696
1726 #endif 1697 #endif
OLDNEW
« no previous file with comments | « bench/QuickRejectBench.cpp ('k') | src/core/SkCanvas.cpp » ('j') | src/core/SkCanvas.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698