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 "include/core/SkRect.h" 11 #include "src/pathops/SkPathOpsRect.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 SkPoint& pt) { 37 if (pt.fX < fLeft) fLeft = pt.fX; 38 if (pt.fY < fTop) fTop = pt.fY; 39 if (pt.fX > fRight) fRight = pt.fX; 40 if (pt.fY > fBottom) fBottom = pt.fY; 41 } 42 addSkPathOpsBounds43 void add(const SkDPoint& pt) { 44 if (pt.fX < fLeft) fLeft = SkDoubleToScalar(pt.fX); 45 if (pt.fY < fTop) fTop = SkDoubleToScalar(pt.fY); 46 if (pt.fX > fRight) fRight = SkDoubleToScalar(pt.fX); 47 if (pt.fY > fBottom) fBottom = SkDoubleToScalar(pt.fY); 48 } 49 almostContainsSkPathOpsBounds50 bool almostContains(const SkPoint& pt) const { 51 return AlmostLessOrEqualUlps(fLeft, pt.fX) 52 && AlmostLessOrEqualUlps(pt.fX, fRight) 53 && AlmostLessOrEqualUlps(fTop, pt.fY) 54 && AlmostLessOrEqualUlps(pt.fY, fBottom); 55 } 56 containsSkPathOpsBounds57 bool contains(const SkPoint& pt) const { 58 return fLeft <= pt.fX && fTop <= pt.fY && 59 fRight >= pt.fX && fBottom >= pt.fY; 60 } 61 62 using INHERITED = SkRect; 63 }; 64 65 #endif 66