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