1 /* 2 * Copyright 2012 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 #ifndef SkPathOpBounds_DEFINED 8 #define SkPathOpBounds_DEFINED 9 10 #include "SkPathOpsRect.h" 11 #include "SkRect.h" 12 13 // SkPathOpsBounds, unlike SkRect, does not consider a line to be empty. 14 struct SkPathOpsBounds : public SkRect { IntersectsSkPathOpsBounds15 static bool Intersects(const SkPathOpsBounds& a, const SkPathOpsBounds& b) { 16 return AlmostLessOrEqualUlps(a.fLeft, b.fRight) 17 && AlmostLessOrEqualUlps(b.fLeft, a.fRight) 18 && AlmostLessOrEqualUlps(a.fTop, b.fBottom) 19 && AlmostLessOrEqualUlps(b.fTop, a.fBottom); 20 } 21 22 // Note that add(), unlike SkRect::join() or SkRect::growToInclude() 23 // does not treat the bounds of horizontal and vertical lines as 24 // empty rectangles. addSkPathOpsBounds25 void add(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom) { 26 if (left < fLeft) fLeft = left; 27 if (top < fTop) fTop = top; 28 if (right > fRight) fRight = right; 29 if (bottom > fBottom) fBottom = bottom; 30 } 31 addSkPathOpsBounds32 void add(const SkPathOpsBounds& toAdd) { 33 add(toAdd.fLeft, toAdd.fTop, toAdd.fRight, toAdd.fBottom); 34 } 35 addSkPathOpsBounds36 void add(const SkDPoint& pt) { 37 if (pt.fX < fLeft) fLeft = SkDoubleToScalar(pt.fX); 38 if (pt.fY < fTop) fTop = SkDoubleToScalar(pt.fY); 39 if (pt.fX > fRight) fRight = SkDoubleToScalar(pt.fX); 40 if (pt.fY > fBottom) fBottom = SkDoubleToScalar(pt.fY); 41 } 42 almostContainsSkPathOpsBounds43 bool almostContains(const SkPoint& pt) { 44 return AlmostLessOrEqualUlps(fLeft, pt.fX) 45 && AlmostLessOrEqualUlps(pt.fX, fRight) 46 && AlmostLessOrEqualUlps(fTop, pt.fY) 47 && AlmostLessOrEqualUlps(pt.fY, fBottom); 48 } 49 50 typedef SkRect INHERITED; 51 }; 52 53 #endif 54