gfx/skia/trunk/src/pathops/SkPathOpsBounds.h

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     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
    10 #include "SkPathOpsRect.h"
    11 #include "SkRect.h"
    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     }
    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     }
    32     void add(const SkPathOpsBounds& toAdd) {
    33         add(toAdd.fLeft, toAdd.fTop, toAdd.fRight, toAdd.fBottom);
    34     }
    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     }
    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     }
    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     }
    58     void setCubicBounds(const SkPoint a[4]);
    59     void setLineBounds(const SkPoint a[2]);
    60     void setQuadBounds(const SkPoint a[3]);
    62     void setPointBounds(const SkPoint& pt) {
    63         fLeft = fRight = pt.fX;
    64         fTop = fBottom = pt.fY;
    65     }
    67     typedef SkRect INHERITED;
    68 };
    70 extern void (SkPathOpsBounds::*SetCurveBounds[])(const SkPoint[]);
    72 #endif

mercurial