| Index: runtime/lib/byte_array.dart
 | 
| ===================================================================
 | 
| --- runtime/lib/byte_array.dart	(revision 15794)
 | 
| +++ runtime/lib/byte_array.dart	(working copy)
 | 
| @@ -34,6 +34,22 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| +patch class Uint8ClampedList {
 | 
| +  /* patch */ factory Uint8ClampedList(int length) {
 | 
| +    return new _Uint8ClampedArray(length);
 | 
| +  }
 | 
| +
 | 
| +  /* patch */ factory Uint8ClampedList.transferable(int length) {
 | 
| +    return new _Uint8ClampedArray.transferable(length);
 | 
| +  }
 | 
| +
 | 
| +  /* patch */ factory Uint8ClampedList.view(ByteArray array,
 | 
| +                                            [int start = 0, int length]) {
 | 
| +    return new _Uint8ClampedArrayView(array, start, length);
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +
 | 
|  patch class Int16List {
 | 
|    /* patch */ factory Int16List(int length) {
 | 
|      return new _Int16Array(length);
 | 
| @@ -325,6 +341,11 @@
 | 
|  int _toUint8(int value) {
 | 
|    return value & 0xFF;
 | 
|  }
 | 
| +int _toClampedUint8(int value) {
 | 
| +  if (value < 0) return 0;
 | 
| +  if (value > 0xFF) return 0xFF;
 | 
| +  return value;
 | 
| +}
 | 
|  
 | 
|  
 | 
|  int _toInt16(int value) {
 | 
| @@ -446,7 +467,6 @@
 | 
|    static _Int8Array _new(int length) native "Int8Array_new";
 | 
|    static _Int8Array _newTransferable(int length)
 | 
|        native "Int8Array_newTransferable";
 | 
| -      
 | 
|  
 | 
|    int _getIndexed(int index) native "Int8Array_getIndexed";
 | 
|    int _setIndexed(int index, int value) native "Int8Array_setIndexed";
 | 
| @@ -489,7 +509,8 @@
 | 
|    }
 | 
|  
 | 
|    void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
 | 
| -    if (from is _Uint8Array || from is _ExternalUint8Array) {
 | 
| +    if (from is _Uint8Array || from is _ExternalUint8Array ||
 | 
| +        from is _Uint8ClampedArray || from is _ExternalUint8ClampedArray) {
 | 
|        _setRange(start * _BYTES_PER_ELEMENT,
 | 
|                  length * _BYTES_PER_ELEMENT,
 | 
|                  from,
 | 
| @@ -514,14 +535,85 @@
 | 
|    static const int _BYTES_PER_ELEMENT = 1;
 | 
|  
 | 
|    static _Uint8Array _new(int length) native "Uint8Array_new";
 | 
| -  static _Uint8Array _newTransferable(int length) 
 | 
| +  static _Uint8Array _newTransferable(int length)
 | 
|        native "Uint8Array_newTransferable";
 | 
| -      
 | 
| +
 | 
|    int _getIndexed(int index) native "Uint8Array_getIndexed";
 | 
|    int _setIndexed(int index, int value) native "Uint8Array_setIndexed";
 | 
|  }
 | 
|  
 | 
|  
 | 
| +class _Uint8ClampedArray extends _ByteArrayBase implements Uint8ClampedList {
 | 
| +  factory _Uint8ClampedArray(int length) {
 | 
| +    return _new(length);
 | 
| +  }
 | 
| +
 | 
| +  factory _Uint8ClampedArray.transferable(int length) {
 | 
| +    return _newTransferable(length);
 | 
| +  }
 | 
| +
 | 
| +  factory _Uint8ClampedArray.view(ByteArray array,
 | 
| +                                 [int start = 0, int length]) {
 | 
| +    if (length == null) {
 | 
| +      length = array.lengthInBytes();
 | 
| +    }
 | 
| +    return new _Uint8ClampedArrayView(array, start, length);
 | 
| +  }
 | 
| +
 | 
| +  int operator[](int index) {
 | 
| +    return _getIndexed(index);
 | 
| +  }
 | 
| +
 | 
| +  int operator[]=(int index, int value) {
 | 
| +    _setIndexed(index, _toClampedUint8(value));
 | 
| +  }
 | 
| +
 | 
| +  Iterator<int> iterator() {
 | 
| +    return new _ByteArrayIterator<int>(this);
 | 
| +  }
 | 
| +
 | 
| +  List<int> getRange(int start, int length) {
 | 
| +    _rangeCheck(this.length, start, length);
 | 
| +    List<int> result = _new(length);
 | 
| +    result.setRange(0, length, this, start);
 | 
| +    return result;
 | 
| +  }
 | 
| +
 | 
| +  void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
 | 
| +    if (from is _Uint8Array || from is _ExternalUint8Array ||
 | 
| +        from is _Uint8ClampedArray || from is _ExternalUint8ClampedArray) {
 | 
| +      _setRange(start * _BYTES_PER_ELEMENT,
 | 
| +                length * _BYTES_PER_ELEMENT,
 | 
| +                from,
 | 
| +                startFrom * _BYTES_PER_ELEMENT);
 | 
| +    } else {
 | 
| +      Arrays.copy(from, startFrom, this, start, length);
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  String toString() {
 | 
| +    return Collections.collectionToString(this);
 | 
| +  }
 | 
| +
 | 
| +  int bytesPerElement() {
 | 
| +    return _BYTES_PER_ELEMENT;
 | 
| +  }
 | 
| +
 | 
| +  int lengthInBytes() {
 | 
| +    return _length() * _BYTES_PER_ELEMENT;
 | 
| +  }
 | 
| +
 | 
| +  static const int _BYTES_PER_ELEMENT = 1;
 | 
| +
 | 
| +  static _Uint8ClampedArray _new(int length) native "Uint8ClampedArray_new";
 | 
| +  static _Uint8ClampedArray _newTransferable(int length)
 | 
| +      native "Uint8ClampedArray_newTransferable";
 | 
| +
 | 
| +  int _getIndexed(int index) native "Uint8Array_getIndexed";
 | 
| +  int _setIndexed(int index, int value) native "Uint8Array_setIndexed";
 | 
| +}
 | 
| +
 | 
| +
 | 
|  class _Int16Array extends _ByteArrayBase implements Int16List {
 | 
|    factory _Int16Array(int length) {
 | 
|      return _new(length);
 | 
| @@ -723,8 +815,8 @@
 | 
|    static _Int32Array _new(int length) native "Int32Array_new";
 | 
|    static _Int32Array _newTransferable(int length)
 | 
|        native "Int32Array_newTransferable";
 | 
| -      
 | 
|  
 | 
| +
 | 
|    int _getIndexed(int index) native "Int32Array_getIndexed";
 | 
|    int _setIndexed(int index, int value) native "Int32Array_setIndexed";
 | 
|  }
 | 
| 
 |