Home | History | Annotate | Download | only in pathops
      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 {
     15     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.
     25     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 
     32     void add(const SkPathOpsBounds& toAdd) {
     33         add(toAdd.fLeft, toAdd.fTop, toAdd.fRight, toAdd.fBottom);
     34     }
     35 
     36     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 
     43     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 
     50     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 
     57     bool contains(const SkPoint& pt) const {
     58         return fLeft <= pt.fX && fTop <= pt.fY &&
     59                fRight >= pt.fX && fBottom >= pt.fY;
     60     }
     61 
     62     typedef SkRect INHERITED;
     63 };
     64 
     65 #endif
     66