SkPathOpsTypes.h revision 07393cab57ce74a4aae89a31fae9aaa9780fc19d
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.com// FIXME: move these into SkTypes.h 1907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comtemplate <typename T> inline T SkTMax(T a, T b) { 2007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com if (a < b) 2107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com a = b; 2207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return a; 2307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 2407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 2507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comtemplate <typename T> inline T SkTMin(T a, T b) { 2607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com if (a > b) 2707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com a = b; 2807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return a; 2907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 3007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 3107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com// FIXME: move this into SkFloatingPoint.h 3207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#define sk_double_isnan(a) sk_float_isnan(a) 3307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 3407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comenum SkPathOpsMask { 3507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com kWinding_PathOpsMask = -1, 3607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com kNo_PathOpsMask = 0, 3707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com kEvenOdd_PathOpsMask = 1 3807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}; 3907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 4007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comextern bool AlmostEqualUlps(float A, float B); 4107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool AlmostEqualUlps(double A, double B) { 4207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return AlmostEqualUlps(SkDoubleToScalar(A), SkDoubleToScalar(B)); 4307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 4407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 4507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com// FLT_EPSILON == 1.19209290E-07 == 1 / (2 ^ 23) 4607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com// DBL_EPSILON == 2.22045e-16 4707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comconst double FLT_EPSILON_CUBED = FLT_EPSILON * FLT_EPSILON * FLT_EPSILON; 4807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comconst double FLT_EPSILON_HALF = FLT_EPSILON / 2; 4907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comconst double FLT_EPSILON_SQUARED = FLT_EPSILON * FLT_EPSILON; 5007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comconst double FLT_EPSILON_SQRT = sqrt(FLT_EPSILON); 5107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comconst double FLT_EPSILON_INVERSE = 1 / FLT_EPSILON; 5207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comconst double DBL_EPSILON_ERR = DBL_EPSILON * 4; // FIXME: tune -- allow a few bits of error 5307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comconst double ROUGH_EPSILON = FLT_EPSILON * 64; 5407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comconst double MORE_ROUGH_EPSILON = FLT_EPSILON * 256; 5507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 5607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero(double x) { 5707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return fabs(x) < FLT_EPSILON; 5807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 5907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 6007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool precisely_zero(double x) { 6107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return fabs(x) < DBL_EPSILON_ERR; 6207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 6307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 6407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero(float x) { 6507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return fabs(x) < FLT_EPSILON; 6607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 6707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 6807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero_cubed(double x) { 6907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return fabs(x) < FLT_EPSILON_CUBED; 7007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 7107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 7207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero_half(double x) { 7307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return fabs(x) < FLT_EPSILON_HALF; 7407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 7507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 7607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero_squared(double x) { 7707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return fabs(x) < FLT_EPSILON_SQUARED; 7807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 7907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 8007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero_sqrt(double x) { 8107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return fabs(x) < FLT_EPSILON_SQRT; 8207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 8307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 8407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero_inverse(double x) { 8507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return fabs(x) > FLT_EPSILON_INVERSE; 8607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 8707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 8807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com// OPTIMIZATION: if called multiple times with the same denom, we want to pass 1/y instead 8907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero_when_compared_to(double x, double y) { 9007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return x == 0 || fabs(x / y) < FLT_EPSILON; 9107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 9207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 9307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com// Use this for comparing Ts in the range of 0 to 1. For general numbers (larger and smaller) use 9407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com// AlmostEqualUlps instead. 9507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_equal(double x, double y) { 9607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return approximately_zero(x - y); 9707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 9807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 9907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool precisely_equal(double x, double y) { 10007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return precisely_zero(x - y); 10107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 10207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 10307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_equal_half(double x, double y) { 10407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return approximately_zero_half(x - y); 10507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 10607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 10707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_equal_squared(double x, double y) { 10807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return approximately_equal(x, y); 10907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 11007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 11107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_greater(double x, double y) { 11207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return x - FLT_EPSILON >= y; 11307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 11407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 11507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_greater_or_equal(double x, double y) { 11607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return x + FLT_EPSILON > y; 11707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 11807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 11907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_lesser(double x, double y) { 12007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return x + FLT_EPSILON <= y; 12107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 12207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 12307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_lesser_or_equal(double x, double y) { 12407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return x - FLT_EPSILON < y; 12507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 12607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 12707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline double approximately_pin(double x) { 12807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return approximately_zero(x) ? 0 : x; 12907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 13007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 13107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline float approximately_pin(float x) { 13207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return approximately_zero(x) ? 0 : x; 13307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 13407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 13507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_greater_than_one(double x) { 13607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return x > 1 - FLT_EPSILON; 13707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 13807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 13907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool precisely_greater_than_one(double x) { 14007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return x > 1 - DBL_EPSILON_ERR; 14107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 14207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 14307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_less_than_zero(double x) { 14407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return x < FLT_EPSILON; 14507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 14607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 14707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool precisely_less_than_zero(double x) { 14807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return x < DBL_EPSILON_ERR; 14907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 15007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 15107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_negative(double x) { 15207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return x < FLT_EPSILON; 15307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 15407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 15507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool precisely_negative(double x) { 15607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return x < DBL_EPSILON_ERR; 15707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 15807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 15907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_one_or_less(double x) { 16007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return x < 1 + FLT_EPSILON; 16107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 16207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 16307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_positive(double x) { 16407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return x > -FLT_EPSILON; 16507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 16607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 16707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_positive_squared(double x) { 16807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return x > -(FLT_EPSILON_SQUARED); 16907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 17007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 17107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero_or_more(double x) { 17207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return x > -FLT_EPSILON; 17307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 17407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 17507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_between(double a, double b, double c) { 17607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return a <= c ? approximately_negative(a - b) && approximately_negative(b - c) 17707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com : approximately_negative(b - a) && approximately_negative(c - b); 17807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 17907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 18007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com// returns true if (a <= b <= c) || (a >= b >= c) 18107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool between(double a, double b, double c) { 18207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkASSERT(((a <= b && b <= c) || (a >= b && b >= c)) == ((a - b) * (c - b) <= 0)); 18307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return (a - b) * (c - b) <= 0; 18407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 18507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 18607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool more_roughly_equal(double x, double y) { 18707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return fabs(x - y) < MORE_ROUGH_EPSILON; 18807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 18907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 19007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool roughly_equal(double x, double y) { 19107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return fabs(x - y) < ROUGH_EPSILON; 19207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 19307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 19407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstruct SkDPoint; 19507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstruct SkDVector; 19607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstruct SkDLine; 19707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstruct SkDQuad; 19807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstruct SkDTriangle; 19907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstruct SkDCubic; 20007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstruct SkDRect; 20107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 20207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline double SkDInterp(double A, double B, double t) { 20307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return A + (B - A) * t; 20407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 20507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 20607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comdouble SkDCubeRoot(double x); 20707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 20807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com/* Returns -1 if negative, 0 if zero, 1 if positive 20907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com*/ 21007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline int SkDSign(double x) { 21107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return (x > 0) - (x < 0); 21207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 21307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 21407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com/* Returns 0 if negative, 1 if zero, 2 if positive 21507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com*/ 21607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline int SKDSide(double x) { 21707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return (x > 0) + (x >= 0); 21807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 21907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 22007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com/* Returns 1 if negative, 2 if zero, 4 if positive 22107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com*/ 22207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline int SkDSideBit(double x) { 22307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return 1 << SKDSide(x); 22407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 22507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 22607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#endif 227