• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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