11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project 40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef Sk64_DEFINED 110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define Sk64_DEFINED 120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkFixed.h" 140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** \class Sk64 160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Sk64 is a 64-bit math package that does not require long long support from the compiler. 180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 1935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergerstruct SK_API Sk64 { 200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int32_t fHi; //!< the high 32 bits of the number (including sign) 210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint32_t fLo; //!< the low 32 bits of the number 220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns non-zero if the Sk64 can be represented as a signed 32 bit integer 240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkBool is32() const { return fHi == ((int32_t)fLo >> 31); } 260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns non-zero if the Sk64 cannot be represented as a signed 32 bit integer 280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkBool is64() const { return fHi != ((int32_t)fLo >> 31); } 300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns non-zero if the Sk64 can be represented as a signed 48 bit integer. Used to know 320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if we can shift the value down by 16 to treat it as a SkFixed. 330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkBool isFixed() const; 350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Return the signed 32 bit integer equivalent. Asserts that is32() returns non-zero. 370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int32_t get32() const { SkASSERT(this->is32()); return (int32_t)fLo; } 390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Return the number >> 16. Asserts that this does not loose any significant high bits. 410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed getFixed() const { 430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(this->isFixed()); 440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint32_t sum = fLo + (1 << 15); 460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int32_t hi = fHi; 470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (sum < fLo) { 480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project hi += 1; 490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return (hi << 16) | (sum >> 16); 510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Return the number >> 30. Asserts that this does not loose any 540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project significant high bits. 550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFract getFract() const; 570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns the square-root of the number as a signed 32 bit value. */ 590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int32_t getSqrt() const; 600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns the number of leading zeros of the absolute value of this. 620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Will return in the range [0..64] 630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int getClzAbs() const; 650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns non-zero if the number is zero */ 670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkBool isZero() const { return (fHi | fLo) == 0; } 680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns non-zero if the number is non-zero */ 700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkBool nonZero() const { return fHi | fLo; } 710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns non-zero if the number is negative (number < 0) */ 730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkBool isNeg() const { return (uint32_t)fHi >> 31; } 740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns non-zero if the number is positive (number > 0) */ 760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkBool isPos() const { return ~(fHi >> 31) & (fHi | fLo); } 770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns -1,0,+1 based on the sign of the number */ 790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int getSign() const { return (fHi >> 31) | Sk32ToBool(fHi | fLo); } 800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Negate the number */ 820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void negate(); 830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** If the number < 0, negate the number 850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void abs(); 870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns the number of bits needed to shift the Sk64 to the right 890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project in order to make it fit in a signed 32 bit integer. 900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int shiftToMake32() const; 920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Set the number to zero */ 940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void setZero() { fHi = fLo = 0; } 950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Set the high and low 32 bit values of the number */ 970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void set(int32_t hi, uint32_t lo) { fHi = hi; fLo = lo; } 980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Set the number to the specified 32 bit integer */ 1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void set(int32_t a) { fHi = a >> 31; fLo = a; } 1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Set the number to the product of the two 32 bit integers */ 1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void setMul(int32_t a, int32_t b); 1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** extract 32bits after shifting right by bitCount. 1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Note: itCount must be [0..63]. 1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Asserts that no significant high bits were lost. 1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int32_t getShiftRight(unsigned bitCount) const; 1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Shift the number left by the specified number of bits. 1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param bits How far to shift left, must be [0..63] 1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void shiftLeft(unsigned bits); 1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Shift the number right by the specified number of bits. 1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param bits How far to shift right, must be [0..63]. This 1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project performs an arithmetic right-shift (sign extending). 1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void shiftRight(unsigned bits); 1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Shift the number right by the specified number of bits, but 1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project round the result. 1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param bits How far to shift right, must be [0..63]. This 1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project performs an arithmetic right-shift (sign extending). 1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void roundRight(unsigned bits); 1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Add the specified 32 bit integer to the number */ 1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void add(int32_t lo) { 1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int32_t hi = lo >> 31; // 0 or -1 1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint32_t sum = fLo + (uint32_t)lo; 1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fHi = fHi + hi + (sum < fLo); 1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fLo = sum; 1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Add the specified Sk64 to the number */ 1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void add(int32_t hi, uint32_t lo) { 1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint32_t sum = fLo + lo; 1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fHi = fHi + hi + (sum < fLo); 1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fLo = sum; 1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Add the specified Sk64 to the number */ 1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void add(const Sk64& other) { this->add(other.fHi, other.fLo); } 1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Subtract the specified Sk64 from the number. (*this) = (*this) - num 1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void sub(const Sk64& num); 1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Subtract the number from the specified Sk64. (*this) = num - (*this) 1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void rsub(const Sk64& num); 1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Multiply the number by the specified 32 bit integer 1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void mul(int32_t); 1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project enum DivOptions { 1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kTrunc_DivOption, //!< truncate the result when calling div() 1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kRound_DivOption //!< round the result when calling div() 1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project }; 1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Divide the number by the specified 32 bit integer, using the specified 1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project divide option (either truncate or round). 1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void div(int32_t, DivOptions); 1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** return (this + other >> 16) as a 32bit result */ 1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed addGetFixed(const Sk64& other) const { 1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return this->addGetFixed(other.fHi, other.fLo); 1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** return (this + Sk64(hi, lo) >> 16) as a 32bit result */ 1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed addGetFixed(int32_t hi, uint32_t lo) const { 1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG 1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Sk64 tmp(*this); 1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project tmp.add(hi, lo); 1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint32_t sum = fLo + lo; 1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project hi += fHi + (sum < fLo); 1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project lo = sum; 1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project sum = lo + (1 << 15); 1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (sum < lo) 1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project hi += 1; 1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project hi = (hi << 16) | (sum >> 16); 1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(hi == tmp.getFixed()); 1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return hi; 1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Return the result of dividing the number by denom, treating the answer 1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project as a SkFixed. (*this) << 16 / denom. It is an error for denom to be 0. 1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed getFixedDiv(const Sk64& denom) const; 2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend bool operator==(const Sk64& a, const Sk64& b) { 2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return a.fHi == b.fHi && a.fLo == b.fLo; 2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend bool operator!=(const Sk64& a, const Sk64& b) { 2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return a.fHi != b.fHi || a.fLo != b.fLo; 2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend bool operator<(const Sk64& a, const Sk64& b) { 2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return a.fHi < b.fHi || (a.fHi == b.fHi && a.fLo < b.fLo); 2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend bool operator<=(const Sk64& a, const Sk64& b) { 2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return a.fHi < b.fHi || (a.fHi == b.fHi && a.fLo <= b.fLo); 2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend bool operator>(const Sk64& a, const Sk64& b) { 2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return a.fHi > b.fHi || (a.fHi == b.fHi && a.fLo > b.fLo); 2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend bool operator>=(const Sk64& a, const Sk64& b) { 2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return a.fHi > b.fHi || (a.fHi == b.fHi && a.fLo >= b.fLo); 2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SkLONGLONG 2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkLONGLONG getLongLong() const; 2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 2310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 232