SkPathOpsTypes.h revision c3f63570c35a1e2bc84b33906c6401d6f3062bf2
107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com/*
207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com * Copyright 2012 Google Inc.
307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com *
407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com * Use of this source code is governed by a BSD-style license that can be
507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com * found in the LICENSE file.
607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com */
707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#ifndef SkPathOpsTypes_DEFINED
807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#define SkPathOpsTypes_DEFINED
907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
1007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#include <float.h>  // for FLT_EPSILON
1107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#include <math.h>   // for fabs, sqrt
1207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
1307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#include "SkFloatingPoint.h"
1407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#include "SkPathOps.h"
1507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#include "SkPathOpsDebug.h"
1607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#include "SkScalar.h"
1707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
1807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comenum SkPathOpsMask {
1907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    kWinding_PathOpsMask = -1,
2007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    kNo_PathOpsMask = 0,
2107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    kEvenOdd_PathOpsMask = 1
2207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com};
2307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
24c3f63570c35a1e2bc84b33906c6401d6f3062bf2caryclark@google.com// Use Almost Equal when comparing coordinates. Use epsilon to compare T values.
2507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comextern bool AlmostEqualUlps(float A, float B);
2607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool AlmostEqualUlps(double A, double B) {
2707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return AlmostEqualUlps(SkDoubleToScalar(A), SkDoubleToScalar(B));
2807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
2907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
3007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com// FLT_EPSILON == 1.19209290E-07 == 1 / (2 ^ 23)
3107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com// DBL_EPSILON == 2.22045e-16
3207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comconst double FLT_EPSILON_CUBED = FLT_EPSILON * FLT_EPSILON * FLT_EPSILON;
3307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comconst double FLT_EPSILON_HALF = FLT_EPSILON / 2;
3407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comconst double FLT_EPSILON_SQUARED = FLT_EPSILON * FLT_EPSILON;
3507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comconst double FLT_EPSILON_SQRT = sqrt(FLT_EPSILON);
3607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comconst double FLT_EPSILON_INVERSE = 1 / FLT_EPSILON;
3707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comconst double DBL_EPSILON_ERR = DBL_EPSILON * 4;  // FIXME: tune -- allow a few bits of error
3807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comconst double ROUGH_EPSILON = FLT_EPSILON * 64;
3907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comconst double MORE_ROUGH_EPSILON = FLT_EPSILON * 256;
4007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
4107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero(double x) {
4207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return fabs(x) < FLT_EPSILON;
4307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
4407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
4507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool precisely_zero(double x) {
4607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return fabs(x) < DBL_EPSILON_ERR;
4707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
4807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
4907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero(float x) {
5007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return fabs(x) < FLT_EPSILON;
5107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
5207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
5307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero_cubed(double x) {
5407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return fabs(x) < FLT_EPSILON_CUBED;
5507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
5607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
5707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero_half(double x) {
5807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return fabs(x) < FLT_EPSILON_HALF;
5907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
6007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
6107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero_squared(double x) {
6207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return fabs(x) < FLT_EPSILON_SQUARED;
6307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
6407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
6507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero_sqrt(double x) {
6607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return fabs(x) < FLT_EPSILON_SQRT;
6707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
6807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
6907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero_inverse(double x) {
7007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return fabs(x) > FLT_EPSILON_INVERSE;
7107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
7207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
7307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com// OPTIMIZATION: if called multiple times with the same denom, we want to pass 1/y instead
7407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero_when_compared_to(double x, double y) {
7507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x == 0 || fabs(x / y) < FLT_EPSILON;
7607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
7707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
7807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com// Use this for comparing Ts in the range of 0 to 1. For general numbers (larger and smaller) use
7907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com// AlmostEqualUlps instead.
8007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_equal(double x, double y) {
8107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return approximately_zero(x - y);
8207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
8307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
8407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool precisely_equal(double x, double y) {
8507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return precisely_zero(x - y);
8607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
8707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
8807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_equal_half(double x, double y) {
8907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return approximately_zero_half(x - y);
9007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
9107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
9207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_equal_squared(double x, double y) {
9307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return approximately_equal(x, y);
9407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
9507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
9607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_greater(double x, double y) {
9707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x - FLT_EPSILON >= y;
9807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
9907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
10007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_greater_or_equal(double x, double y) {
10107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x + FLT_EPSILON > y;
10207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
10307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
10407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_lesser(double x, double y) {
10507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x + FLT_EPSILON <= y;
10607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
10707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
10807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_lesser_or_equal(double x, double y) {
10907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x - FLT_EPSILON < y;
11007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
11107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
11207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline double approximately_pin(double x) {
11307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return approximately_zero(x) ? 0 : x;
11407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
11507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
11607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline float approximately_pin(float x) {
11707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return approximately_zero(x) ? 0 : x;
11807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
11907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
12007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_greater_than_one(double x) {
12107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x > 1 - FLT_EPSILON;
12207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
12307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
12407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool precisely_greater_than_one(double x) {
12507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x > 1 - DBL_EPSILON_ERR;
12607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
12707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
12807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_less_than_zero(double x) {
12907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x < FLT_EPSILON;
13007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
13107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
13207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool precisely_less_than_zero(double x) {
13307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x < DBL_EPSILON_ERR;
13407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
13507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
13607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_negative(double x) {
13707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x < FLT_EPSILON;
13807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
13907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
14007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool precisely_negative(double x) {
14107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x < DBL_EPSILON_ERR;
14207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
14307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
14407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_one_or_less(double x) {
14507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x < 1 + FLT_EPSILON;
14607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
14707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
14807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_positive(double x) {
14907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x > -FLT_EPSILON;
15007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
15107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
15207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_positive_squared(double x) {
15307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x > -(FLT_EPSILON_SQUARED);
15407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
15507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
15607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero_or_more(double x) {
15707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x > -FLT_EPSILON;
15807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
15907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
16007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_between(double a, double b, double c) {
16107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return a <= c ? approximately_negative(a - b) && approximately_negative(b - c)
16207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com            : approximately_negative(b - a) && approximately_negative(c - b);
16307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
1640361032c0b53401030a720bc8b4930c3ec59f19ecaryclark@google.com
1650361032c0b53401030a720bc8b4930c3ec59f19ecaryclark@google.cominline bool precisely_between(double a, double b, double c) {
1660361032c0b53401030a720bc8b4930c3ec59f19ecaryclark@google.com    return a <= c ? precisely_negative(a - b) && precisely_negative(b - c)
1670361032c0b53401030a720bc8b4930c3ec59f19ecaryclark@google.com            : precisely_negative(b - a) && precisely_negative(c - b);
1680361032c0b53401030a720bc8b4930c3ec59f19ecaryclark@google.com}
16907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
17007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com// returns true if (a <= b <= c) || (a >= b >= c)
17107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool between(double a, double b, double c) {
17207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    SkASSERT(((a <= b && b <= c) || (a >= b && b >= c)) == ((a - b) * (c - b) <= 0));
17307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return (a - b) * (c - b) <= 0;
17407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
17507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
17607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool more_roughly_equal(double x, double y) {
17707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return fabs(x - y) < MORE_ROUGH_EPSILON;
17807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
17907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
18007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool roughly_equal(double x, double y) {
18107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return fabs(x - y) < ROUGH_EPSILON;
18207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
18307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
18407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstruct SkDPoint;
18507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstruct SkDVector;
18607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstruct SkDLine;
18707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstruct SkDQuad;
18807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstruct SkDTriangle;
18907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstruct SkDCubic;
19007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstruct SkDRect;
19107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
19207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline double SkDInterp(double A, double B, double t) {
19307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return A + (B - A) * t;
19407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
19507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
19607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comdouble SkDCubeRoot(double x);
19707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
19807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com/* Returns -1 if negative, 0 if zero, 1 if positive
19907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com*/
20007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline int SkDSign(double x) {
20107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return (x > 0) - (x < 0);
20207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
20307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
20407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com/* Returns 0 if negative, 1 if zero, 2 if positive
20507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com*/
20607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline int SKDSide(double x) {
20707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return (x > 0) + (x >= 0);
20807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
20907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
21007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com/* Returns 1 if negative, 2 if zero, 4 if positive
21107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com*/
21207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline int SkDSideBit(double x) {
21307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return 1 << SKDSide(x);
21407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
21507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
21607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#endif
217