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