12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- if (!dojo._hasResource["dojox.encoding.lzw"]) { // _hasResource checks added by
- // build. Do not use
- // _hasResource directly in your
- // code.
- dojo._hasResource["dojox.encoding.lzw"] = true;
- dojo.provide("dojox.encoding.lzw");
- (function() {
- var _bits = function(x) {
- var w = 1;
- for (var v = 2; x >= v; v <<= 1, ++w);
- return w;
- };
- dojox.encoding.lzw.Encoder = function(n) {
- this.size = n;
- this.init();
- };
- dojo.extend(dojox.encoding.lzw.Encoder, {
- init : function() {
- this.dict = {};
- for (var i = 0; i < this.size; ++i) {
- this.dict[String.fromCharCode(i)] = i;
- }
- this.width = _bits(this.code = this.size);
- this.p = "";
- },
- encode : function(value, stream) {
- var c = String.fromCharCode(value), p = this.p + c, r = 0;
- // if already in the dictionary
- if (p in this.dict) {
- this.p = p;
- return r;
- }
- stream.putBits(this.dict[this.p], this.width);
- // if we need to increase the code length
- if ((this.code & (this.code + 1)) == 0) {
- stream.putBits(this.code++, r = this.width++);
- }
- // add new string
- this.dict[p] = this.code++;
- this.p = c;
- return r + this.width;
- },
- flush : function(stream) {
- if (this.p.length == 0) {
- return 0;
- }
- stream.putBits(this.dict[this.p], this.width);
- this.p = "";
- return this.width;
- }
- });
- dojox.encoding.lzw.Decoder = function(n) {
- this.size = n;
- this.init();
- };
- dojo.extend(dojox.encoding.lzw.Decoder, {
- init : function() {
- this.codes = new Array(this.size);
- for (var i = 0; i < this.size; ++i) {
- this.codes[i] = String.fromCharCode(i);
- }
- this.width = _bits(this.size);
- this.p = -1;
- },
- decode : function(stream) {
- var c = stream.getBits(this.width), v;
- if (c < this.codes.length) {
- v = this.codes[c];
- if (this.p >= 0) {
- this.codes.push(this.codes[this.p]
- + v.substr(0, 1));
- }
- } else {
- if ((c & (c + 1)) == 0) {
- this.codes.push("");
- ++this.width;
- return "";
- }
- var x = this.codes[this.p];
- v = x + x.substr(0, 1);
- this.codes.push(v);
- }
- this.p = c;
- return v;
- }
- });
- })();
- }
|