| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 // patch classes for Int8List ..... Float64List and ByteData implementations. | 5 // patch classes for Int8List ..... Float64List and ByteData implementations. |
| 6 | 6 |
| 7 import "dart:_internal"; | 7 import "dart:_internal"; |
| 8 import 'dart:math' show Random; | 8 import 'dart:math' show Random; |
| 9 | 9 |
| 10 patch class Int8List { | 10 patch class Int8List { |
| (...skipping 3428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3439 } | 3439 } |
| 3440 _typedData._setUint64(_offset + byteOffset, | 3440 _typedData._setUint64(_offset + byteOffset, |
| 3441 identical(endian, Endianness.HOST_ENDIAN) ? value : _byteSwap64(value)); | 3441 identical(endian, Endianness.HOST_ENDIAN) ? value : _byteSwap64(value)); |
| 3442 } | 3442 } |
| 3443 | 3443 |
| 3444 double getFloat32(int byteOffset, | 3444 double getFloat32(int byteOffset, |
| 3445 [Endianness endian = Endianness.BIG_ENDIAN]) { | 3445 [Endianness endian = Endianness.BIG_ENDIAN]) { |
| 3446 if (byteOffset < 0 || byteOffset + 3 >= length) { | 3446 if (byteOffset < 0 || byteOffset + 3 >= length) { |
| 3447 throw _newRangeError(byteOffset + 3, length); | 3447 throw _newRangeError(byteOffset + 3, length); |
| 3448 } | 3448 } |
| 3449 var result = _typedData._getFloat32(_offset + byteOffset); | |
| 3450 if (identical(endian, Endianness.HOST_ENDIAN)) { | 3449 if (identical(endian, Endianness.HOST_ENDIAN)) { |
| 3451 return result; | 3450 return _typedData._getFloat32(_offset + byteOffset); |
| 3452 } | 3451 } |
| 3453 return _byteSwapFloat32(result); | 3452 _convU32[0] = _byteSwap32(_typedData._getUint32(_offset + byteOffset)); |
| 3453 return _convF32[0]; |
| 3454 } | 3454 } |
| 3455 void setFloat32(int byteOffset, | 3455 void setFloat32(int byteOffset, |
| 3456 double value, | 3456 double value, |
| 3457 [Endianness endian = Endianness.BIG_ENDIAN]) { | 3457 [Endianness endian = Endianness.BIG_ENDIAN]) { |
| 3458 if (byteOffset < 0 || byteOffset + 3 >= length) { | 3458 if (byteOffset < 0 || byteOffset + 3 >= length) { |
| 3459 throw _newRangeError(byteOffset + 3, length); | 3459 throw _newRangeError(byteOffset + 3, length); |
| 3460 } | 3460 } |
| 3461 _typedData._setFloat32(_offset + byteOffset, | 3461 if (identical(endian, Endianness.HOST_ENDIAN)) { |
| 3462 identical(endian, Endianness.HOST_ENDIAN) ? value | 3462 _typedData._setFloat32(_offset + byteOffset, value); |
| 3463 : _byteSwapFloat32(value)); | 3463 return; |
| 3464 } |
| 3465 _convF32[0] = value; |
| 3466 _typedData._setUint32(_offset + byteOffset, _byteSwap32(_convU32[0])); |
| 3464 } | 3467 } |
| 3465 | 3468 |
| 3466 double getFloat64(int byteOffset, | 3469 double getFloat64(int byteOffset, |
| 3467 [Endianness endian = Endianness.BIG_ENDIAN]) { | 3470 [Endianness endian = Endianness.BIG_ENDIAN]) { |
| 3468 if (byteOffset < 0 || byteOffset + 7 >= length) { | 3471 if (byteOffset < 0 || byteOffset + 7 >= length) { |
| 3469 throw _newRangeError(byteOffset + 7, length); | 3472 throw _newRangeError(byteOffset + 7, length); |
| 3470 } | 3473 } |
| 3471 var result = _typedData._getFloat64(_offset + byteOffset); | |
| 3472 if (identical(endian, Endianness.HOST_ENDIAN)) { | 3474 if (identical(endian, Endianness.HOST_ENDIAN)) { |
| 3473 return result; | 3475 return _typedData._getFloat64(_offset + byteOffset); |
| 3474 } | 3476 } |
| 3475 return _byteSwapFloat64(result); | 3477 _convU64[0] = _byteSwap64(_typedData._getUint64(_offset + byteOffset)); |
| 3478 return _convF64[0]; |
| 3476 } | 3479 } |
| 3477 void setFloat64(int byteOffset, | 3480 void setFloat64(int byteOffset, |
| 3478 double value, | 3481 double value, |
| 3479 [Endianness endian = Endianness.BIG_ENDIAN]) { | 3482 [Endianness endian = Endianness.BIG_ENDIAN]) { |
| 3480 if (byteOffset < 0 || byteOffset + 7 >= length) { | 3483 if (byteOffset < 0 || byteOffset + 7 >= length) { |
| 3481 throw _newRangeError(byteOffset + 7, length); | 3484 throw _newRangeError(byteOffset + 7, length); |
| 3482 } | 3485 } |
| 3483 _typedData._setFloat64(_offset + byteOffset, | 3486 if (identical(endian, Endianness.HOST_ENDIAN)) { |
| 3484 identical(endian, Endianness.HOST_ENDIAN) ? value | 3487 _typedData._setFloat64(_offset + byteOffset, value); |
| 3485 : _byteSwapFloat64(value)); | 3488 return; |
| 3489 } |
| 3490 _convF64[0] = value; |
| 3491 _typedData._setUint64(_offset + byteOffset, _byteSwap64(_convU64[0])); |
| 3486 } | 3492 } |
| 3487 | 3493 |
| 3488 Float32x4 getFloat32x4(int byteOffset, | 3494 Float32x4 getFloat32x4(int byteOffset, |
| 3489 [Endianness endian = Endianness.BIG_ENDIAN]) { | 3495 [Endianness endian = Endianness.BIG_ENDIAN]) { |
| 3490 if (byteOffset < 0 || byteOffset + 3 >= length) { | 3496 if (byteOffset < 0 || byteOffset + 3 >= length) { |
| 3491 throw _newRangeError(byteOffset + 3, length); | 3497 throw _newRangeError(byteOffset + 3, length); |
| 3492 } | 3498 } |
| 3493 // TODO(johnmccutchan) : Need to resolve this for endianity. | 3499 // TODO(johnmccutchan) : Need to resolve this for endianity. |
| 3494 return _typedData._getFloat32x4(_offset + byteOffset); | 3500 return _typedData._getFloat32x4(_offset + byteOffset); |
| 3495 } | 3501 } |
| (...skipping 22 matching lines...) Expand all Loading... |
| 3518 value = ((value & 0xFF00FF00) >> 8) | ((value & 0x00FF00FF) << 8); | 3524 value = ((value & 0xFF00FF00) >> 8) | ((value & 0x00FF00FF) << 8); |
| 3519 value = ((value & 0xFFFF0000) >> 16) | ((value & 0x0000FFFF) << 16); | 3525 value = ((value & 0xFFFF0000) >> 16) | ((value & 0x0000FFFF) << 16); |
| 3520 return value; | 3526 return value; |
| 3521 } | 3527 } |
| 3522 | 3528 |
| 3523 int _byteSwap64(int value) { | 3529 int _byteSwap64(int value) { |
| 3524 return (_byteSwap32(value) << 32) | _byteSwap32(value >> 32); | 3530 return (_byteSwap32(value) << 32) | _byteSwap32(value >> 32); |
| 3525 } | 3531 } |
| 3526 | 3532 |
| 3527 final _convU32 = new Uint32List(2); | 3533 final _convU32 = new Uint32List(2); |
| 3534 final _convU64 = new Uint64List.view(_convU32.buffer); |
| 3528 final _convF32 = new Float32List.view(_convU32.buffer); | 3535 final _convF32 = new Float32List.view(_convU32.buffer); |
| 3529 final _convF64 = new Float64List.view(_convU32.buffer); | 3536 final _convF64 = new Float64List.view(_convU32.buffer); |
| 3530 | 3537 |
| 3531 double _byteSwapFloat32(double value) { | |
| 3532 _convF32[0] = value; | |
| 3533 _convU32[0] = _byteSwap32(_convU32[0]); | |
| 3534 return _convF32[0]; | |
| 3535 } | |
| 3536 | |
| 3537 double _byteSwapFloat64(double value) { | |
| 3538 _convF64[0] = value; | |
| 3539 var lo = _convU32[0]; | |
| 3540 _convU32[0] = _byteSwap32(_convU32[1]); | |
| 3541 _convU32[1] = _byteSwap32(lo); | |
| 3542 return _convF64[0]; | |
| 3543 } | |
| 3544 | |
| 3545 // Top level utility methods. | 3538 // Top level utility methods. |
| 3546 int _toInt(int value, int mask) { | 3539 int _toInt(int value, int mask) { |
| 3547 value &= mask; | 3540 value &= mask; |
| 3548 if (value > (mask >> 1)) value -= mask + 1; | 3541 if (value > (mask >> 1)) value -= mask + 1; |
| 3549 return value; | 3542 return value; |
| 3550 } | 3543 } |
| 3551 | 3544 |
| 3552 | 3545 |
| 3553 int _toInt8(int value) { | 3546 int _toInt8(int value) { |
| 3554 return _toInt(value, 0xFF); | 3547 return _toInt(value, 0xFF); |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3627 return value; | 3620 return value; |
| 3628 } | 3621 } |
| 3629 return object; | 3622 return object; |
| 3630 } | 3623 } |
| 3631 | 3624 |
| 3632 | 3625 |
| 3633 _newRangeError(int index, int length) { | 3626 _newRangeError(int index, int length) { |
| 3634 String message = "$index must be in the range [0..$length)"; | 3627 String message = "$index must be in the range [0..$length)"; |
| 3635 return new RangeError(message); | 3628 return new RangeError(message); |
| 3636 } | 3629 } |
| OLD | NEW |