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

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

Issue 640723004: cleanup and optimize rect intersect routines (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: cleanup the new bench Created 6 years, 2 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
« no previous file with comments | « gyp/bench.gypi ('k') | src/core/SkRect.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2006 The Android Open Source Project 3 * Copyright 2006 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 #ifndef SkRect_DEFINED 10 #ifndef SkRect_DEFINED
(...skipping 633 matching lines...) Expand 10 before | Expand all | Expand 10 after
644 sides are moved inwards, making the rectangle narrower. The same holds 644 sides are moved inwards, making the rectangle narrower. The same holds
645 true for dy and the top and bottom. 645 true for dy and the top and bottom.
646 */ 646 */
647 void outset(SkScalar dx, SkScalar dy) { this->inset(-dx, -dy); } 647 void outset(SkScalar dx, SkScalar dy) { this->inset(-dx, -dy); }
648 648
649 /** If this rectangle intersects r, return true and set this rectangle to th at 649 /** If this rectangle intersects r, return true and set this rectangle to th at
650 intersection, otherwise return false and do not change this rectangle. 650 intersection, otherwise return false and do not change this rectangle.
651 If either rectangle is empty, do nothing and return false. 651 If either rectangle is empty, do nothing and return false.
652 */ 652 */
653 bool intersect(const SkRect& r); 653 bool intersect(const SkRect& r);
654 bool intersect2(const SkRect& r);
655 654
656 /** If this rectangle intersects the rectangle specified by left, top, right , bottom, 655 /** If this rectangle intersects the rectangle specified by left, top, right , bottom,
657 return true and set this rectangle to that intersection, otherwise retur n false 656 return true and set this rectangle to that intersection, otherwise retur n false
658 and do not change this rectangle. 657 and do not change this rectangle.
659 If either rectangle is empty, do nothing and return false. 658 If either rectangle is empty, do nothing and return false.
660 */ 659 */
661 bool intersect(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom) ; 660 bool intersect(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom) ;
662 661
663 /** 662 /**
663 * If rectangles a and b intersect, return true and set this rectangle to
664 * that intersection, otherwise return false and do not change this
665 * rectangle. If either rectangle is empty, do nothing and return false.
666 */
667 bool intersect(const SkRect& a, const SkRect& b);
668
669
670 private:
671 static bool Intersects(SkScalar al, SkScalar at, SkScalar ar, SkScalar ab,
672 SkScalar bl, SkScalar bt, SkScalar br, SkScalar bb) {
673 SkScalar L = SkMaxScalar(al, bl);
674 SkScalar R = SkMinScalar(ar, br);
675 SkScalar T = SkMaxScalar(at, bt);
676 SkScalar B = SkMinScalar(ab, bb);
677 return L < R && T < B;
678 }
679
680 public:
681 /**
664 * Return true if this rectangle is not empty, and the specified sides of 682 * Return true if this rectangle is not empty, and the specified sides of
665 * a rectangle are not empty, and they intersect. 683 * a rectangle are not empty, and they intersect.
666 */ 684 */
667 bool intersects(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom ) const { 685 bool intersects(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom ) const {
668 return // first check that both are not empty 686 return Intersects(fLeft, fTop, fRight, fBottom, left, top, right, bottom );
669 left < right && top < bottom &&
670 fLeft < fRight && fTop < fBottom &&
671 // now check for intersection
672 fLeft < right && left < fRight &&
673 fTop < bottom && top < fBottom;
674 } 687 }
675 688
676 /** If rectangles a and b intersect, return true and set this rectangle to
677 * that intersection, otherwise return false and do not change this
678 * rectangle. If either rectangle is empty, do nothing and return false.
679 */
680 bool intersect(const SkRect& a, const SkRect& b);
681
682 /** 689 /**
683 * Return true if rectangles a and b are not empty and intersect. 690 * Return true if rectangles a and b are not empty and intersect.
684 */ 691 */
685 static bool Intersects(const SkRect& a, const SkRect& b) { 692 static bool Intersects(const SkRect& a, const SkRect& b) {
686 return !a.isEmpty() && !b.isEmpty() && 693 return Intersects(a.fLeft, a.fTop, a.fRight, a.fBottom,
687 a.fLeft < b.fRight && b.fLeft < a.fRight && 694 b.fLeft, b.fTop, b.fRight, b.fBottom);
688 a.fTop < b.fBottom && b.fTop < a.fBottom;
689 } 695 }
690 696
691 /** 697 /**
692 * Update this rectangle to enclose itself and the specified rectangle. 698 * Update this rectangle to enclose itself and the specified rectangle.
693 * If this rectangle is empty, just set it to the specified rectangle. 699 * If this rectangle is empty, just set it to the specified rectangle.
694 * If the specified rectangle is empty, do nothing. 700 * If the specified rectangle is empty, do nothing.
695 */ 701 */
696 void join(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom); 702 void join(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom);
697 703
698 /** Update this rectangle to enclose itself and the specified rectangle. 704 /** Update this rectangle to enclose itself and the specified rectangle.
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
849 * rely on the existence of this function or the formatting of its output. 855 * rely on the existence of this function or the formatting of its output.
850 */ 856 */
851 void dump() const { 857 void dump() const {
852 SkDebugf("{ l: %f, t: %f, r: %f, b: %f }", fLeft, fTop, fRight, fBottom) ; 858 SkDebugf("{ l: %f, t: %f, r: %f, b: %f }", fLeft, fTop, fRight, fBottom) ;
853 } 859 }
854 #endif 860 #endif
855 861
856 }; 862 };
857 863
858 #endif 864 #endif
OLDNEW
« no previous file with comments | « gyp/bench.gypi ('k') | src/core/SkRect.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698