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