Skip to content

Instantly share code, notes, and snippets.

@renesugar
Forked from nphyx/arraybuffer.transfer.js
Created May 11, 2021 03:16
Show Gist options
  • Select an option

  • Save renesugar/ae894ece95cb5544ab611c10224fefcb to your computer and use it in GitHub Desktop.

Select an option

Save renesugar/ae894ece95cb5544ab611c10224fefcb to your computer and use it in GitHub Desktop.

Revisions

  1. @nphyx nphyx revised this gist Apr 13, 2016. 1 changed file with 11 additions and 11 deletions.
    22 changes: 11 additions & 11 deletions arraybuffer.transfer.js
    Original file line number Diff line number Diff line change
    @@ -1,20 +1,20 @@
    if(typeof(ArrayBuffer.prototype.transfer) === "undefined") {
    ArrayBuffer.prototype.transfer = function transfer(buffer) {
    ArrayBuffer.prototype.transfer = function transfer(old) {
    var dva, dvb, i, mod;
    dva = new DataView(this);
    dvb = new DataView(buffer);
    mod = this.byteLength%8;
    for(i = 0; i < buffer.byteLength-mod; i+=8) dva.setFloat64(i, dvb.getFloat64(i));
    mod = this.byteLength%4;
    for(; i < buffer.byteLength-mod; i+=4) {
    dvb = new DataView(old);
    mod = this.byteLength%8+1;
    for(i = 0; i <= old.byteLength-mod; i+=8) dva.setFloat64(i, dvb.getFloat64(i));
    mod = this.byteLength%4+1;
    if(i < old.byteLength-mod) {
    dva.setUint32(i, dvb.getUint32(i));
    i += 4;
    }
    mod = this.byteLength%2;
    for(; i < buffer.byteLength-mod; i+=2) {
    mod = this.byteLength%2+1;
    if(i < old.byteLength-mod) {
    dva.setUint16(i, dvb.getUint16(i));
    i += 2;
    }
    for(; i < buffer.byteLength; ++i) {
    dva.setUint8(i, dvb.getUint8(i));
    }
    if(i < old.byteLength) dva.setUint8(i, dvb.getUint8(i));
    }
    }
  2. @nphyx nphyx revised this gist Mar 22, 2016. 1 changed file with 4 additions and 13 deletions.
    17 changes: 4 additions & 13 deletions arraybuffer.transfer.js
    Original file line number Diff line number Diff line change
    @@ -1,29 +1,20 @@
    /**
    * Polyfill for ArrayBuffer.transfer. Uses DataView setter/getters to make transfers
    * as fast as possible. Still slow with large buffers, but less slow than copying
    * byte by byte. This has been working for me so far but I'm not 100% sure there
    * are no bugs or edge cases.
    *
    * @param {ArrayBuffer} buffer original ArrayBuffer
    * @return {undefined}
    */
    if(typeof(ArrayBuffer.prototype.transfer) === "undefined") {
    ArrayBuffer.prototype.transfer = function transfer(buffer) {
    var dva, dvb, i, mod;
    dva = new DataView(this);
    dvb = new DataView(buffer);
    mod = this.byteLength%8;
    for(i = 0; i < buffer.byteLength-mod; i+=8) dvb.setFloat64(i, dva.getFloat64(i));
    for(i = 0; i < buffer.byteLength-mod; i+=8) dva.setFloat64(i, dvb.getFloat64(i));
    mod = this.byteLength%4;
    for(; i < buffer.byteLength-mod; i+=4) {
    dvb.setUint32(i, dva.getUint32(i));
    dva.setUint32(i, dvb.getUint32(i));
    }
    mod = this.byteLength%2;
    for(; i < buffer.byteLength-mod; i+=2) {
    dvb.setUint16(i, dva.getUint16(i));
    dva.setUint16(i, dvb.getUint16(i));
    }
    for(; i < buffer.byteLength; ++i) {
    dvb.setUint8(i, dva.getUint8(i));
    dva.setUint8(i, dvb.getUint8(i));
    }
    }
    }
  3. @nphyx nphyx revised this gist Mar 21, 2016. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions arraybuffer.transfer.js
    Original file line number Diff line number Diff line change
    @@ -15,11 +15,11 @@ if(typeof(ArrayBuffer.prototype.transfer) === "undefined") {
    mod = this.byteLength%8;
    for(i = 0; i < buffer.byteLength-mod; i+=8) dvb.setFloat64(i, dva.getFloat64(i));
    mod = this.byteLength%4;
    for(; i < buffer.byteLength-mod; ++i) {
    for(; i < buffer.byteLength-mod; i+=4) {
    dvb.setUint32(i, dva.getUint32(i));
    }
    mod = this.byteLength%2;
    for(; i < buffer.byteLength-mod; ++i) {
    for(; i < buffer.byteLength-mod; i+=2) {
    dvb.setUint16(i, dva.getUint16(i));
    }
    for(; i < buffer.byteLength; ++i) {
  4. @nphyx nphyx created this gist Mar 21, 2016.
    29 changes: 29 additions & 0 deletions arraybuffer.transfer.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,29 @@
    /**
    * Polyfill for ArrayBuffer.transfer. Uses DataView setter/getters to make transfers
    * as fast as possible. Still slow with large buffers, but less slow than copying
    * byte by byte. This has been working for me so far but I'm not 100% sure there
    * are no bugs or edge cases.
    *
    * @param {ArrayBuffer} buffer original ArrayBuffer
    * @return {undefined}
    */
    if(typeof(ArrayBuffer.prototype.transfer) === "undefined") {
    ArrayBuffer.prototype.transfer = function transfer(buffer) {
    var dva, dvb, i, mod;
    dva = new DataView(this);
    dvb = new DataView(buffer);
    mod = this.byteLength%8;
    for(i = 0; i < buffer.byteLength-mod; i+=8) dvb.setFloat64(i, dva.getFloat64(i));
    mod = this.byteLength%4;
    for(; i < buffer.byteLength-mod; ++i) {
    dvb.setUint32(i, dva.getUint32(i));
    }
    mod = this.byteLength%2;
    for(; i < buffer.byteLength-mod; ++i) {
    dvb.setUint16(i, dva.getUint16(i));
    }
    for(; i < buffer.byteLength; ++i) {
    dvb.setUint8(i, dva.getUint8(i));
    }
    }
    }