summaryrefslogtreecommitdiff
path: root/js/dojo-1.7.2/dojox/encoding/bits.js
blob: 359c5e80fba7476d6993e0c2201b777112970554 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
//>>built
define("dojox/encoding/bits", [
	"dojo/_base/lang"	// dojo.extend
], function(lang) {
	var bits = lang.getObject("dojox.encoding.bits", true);
	/*=====
		bits = dojox.encoding.bits;
	=====*/

	bits.OutputStream = function(){
		this.reset();
	};

	lang.extend(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;
		}
	});

	bits.InputStream = function(buffer, width){
		this.buffer = buffer;
		this.width = width;
		this.bbyte = this.bit = 0;
	};

	lang.extend(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;
		}
	});


	return bits;
});