summaryrefslogtreecommitdiffstatshomepage
path: root/includes/js/dojox/encoding/bits.js
diff options
context:
space:
mode:
Diffstat (limited to 'includes/js/dojox/encoding/bits.js')
-rw-r--r--includes/js/dojox/encoding/bits.js68
1 files changed, 68 insertions, 0 deletions
diff --git a/includes/js/dojox/encoding/bits.js b/includes/js/dojox/encoding/bits.js
new file mode 100644
index 0000000..8beb167
--- /dev/null
+++ b/includes/js/dojox/encoding/bits.js
@@ -0,0 +1,68 @@
+if(!dojo._hasResource["dojox.encoding.bits"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.encoding.bits"] = true;
+dojo.provide("dojox.encoding.bits");
+
+dojox.encoding.bits.OutputStream = function(){
+ this.reset();
+};
+
+dojo.extend(dojox.encoding.bits.OutputStream, {
+ reset: function(){
+ this.buffer = [];
+ this.accumulator = 0;
+ this.available = 8;
+ },
+ putBits: function(value, width){
+ while(width){
+ var w = Math.min(width, this.available);
+ var v = (w <= width ? value >>> (width - w) : value) << (this.available - w);
+ this.accumulator |= v & (255 >>> (8 - this.available));
+ this.available -= w;
+ if(!this.available){
+ this.buffer.push(this.accumulator);
+ this.accumulator = 0;
+ this.available = 8;
+ }
+ width -= w;
+ }
+ },
+ getWidth: function(){
+ return this.buffer.length * 8 + (8 - this.available);
+ },
+ getBuffer: function(){
+ var b = this.buffer;
+ if(this.available < 8){ b.push(this.accumulator & (255 << this.available)); }
+ this.reset();
+ return b;
+ }
+});
+
+dojox.encoding.bits.InputStream = function(buffer, width){
+ this.buffer = buffer;
+ this.width = width;
+ this.bbyte = this.bit = 0;
+};
+
+dojo.extend(dojox.encoding.bits.InputStream, {
+ getBits: function(width){
+ var r = 0;
+ while(width){
+ var w = Math.min(width, 8 - this.bit);
+ var v = this.buffer[this.bbyte] >>> (8 - this.bit - w);
+ r <<= w;
+ r |= v & ~(~0 << w);
+ this.bit += w;
+ if(this.bit == 8){
+ ++this.bbyte;
+ this.bit = 0;
+ }
+ width -= w;
+ }
+ return r;
+ },
+ getWidth: function(){
+ return this.width - this.bbyte * 8 - this.bit;
+ }
+});
+
+}