Subversion Repositories Applications.papyrus

Rev

Blame | Last modification | View Log | RSS feed

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;
        }
});

}