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     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     // unlike isEmpty(), this permits lines, but not points
     51     // FIXME: unused for now
     52     bool isReallyEmpty() const {
     53         // use !<= instead of > to detect NaN values
     54         return !(fLeft <= fRight) || !(fTop <= fBottom)
     55                 || (fLeft == fRight && fTop == fBottom);
     56     }
     57 
     58     void setCubicBounds(const SkPoint a[4]);
     59     void setLineBounds(const SkPoint a[2]);
     60     void setQuadBounds(const SkPoint a[3]);
     61 
     62     void setPointBounds(const SkPoint& pt) {
     63         fLeft = fRight = pt.fX;
     64         fTop = fBottom = pt.fY;
     65     }
     66 
     67     typedef SkRect INHERITED;
     68 };
     69 
     70 extern void (SkPathOpsBounds::*SetCurveBounds[])(const SkPoint[]);
     71 
     72 #endif
     73