/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.javascript.typedarrays;
import org.mozilla.javascript.ScriptRuntime;
/**
* Numeric conversions from section 7 of the ECMAScript 6 standard.
*/
public class Conversions
{
public static final int EIGHT_BIT = 1 << 8;
public static final int SIXTEEN_BIT = 1 << 16;
public static final long THIRTYTWO_BIT = 1L << 32L;
public static int toInt8(Object arg)
{
int iv;
if (arg instanceof Integer) {
iv = (Integer)arg;
} else {
iv = ScriptRuntime.toInt32(arg);
}
int int8Bit = iv % EIGHT_BIT;
return (int8Bit >= (1 << 7)) ? (int8Bit - EIGHT_BIT) : int8Bit;
}
public static int toUint8(Object arg)
{
int iv;
if (arg instanceof Integer) {
iv = ((Integer)arg);
} else {
iv = ScriptRuntime.toInt32(arg);
}
return iv % EIGHT_BIT;
}
public static int toUint8Clamp(Object arg)
{
double d = ScriptRuntime.toNumber(arg);
if (d <= 0.0) {
return 0;
}
if (d >= 255.0) {
return 255;
}
// Complex rounding behavior -- see 7.1.11
double f = Math.floor(d);
if ((f + 0.5) < d) {
return (int)(f + 1.0);
}
if (d < (f + 0.5)) {
return (int)f;
}
if (((int)f % 2) != 0) {
return (int)f + 1;
}
return (int)f;
}
public static int toInt16(Object arg)
{
int iv;
if (arg instanceof Integer) {
iv = ((Integer)arg);
} else {
iv = ScriptRuntime.toInt32(arg);
}
int int16Bit = iv % SIXTEEN_BIT;
return (int16Bit >= (1 << 15)) ? (int16Bit - SIXTEEN_BIT) : int16Bit;
}
public static int toUint16(Object arg)
{
int iv;
if (arg instanceof Integer) {
iv = ((Integer)arg);
} else {
iv = ScriptRuntime.toInt32(arg);
}
return iv % SIXTEEN_BIT;
}
public static int toInt32(Object arg)
{
long lv = (long)ScriptRuntime.toNumber(arg);
long int32Bit = lv % THIRTYTWO_BIT;
return (int)((int32Bit >= (1L << 31L)) ? (int32Bit - THIRTYTWO_BIT) : int32Bit);
}
public static long toUint32(Object arg)
{
long lv = (long)ScriptRuntime.toNumber(arg);
return lv % THIRTYTWO_BIT;
}
}