Project

General

Profile

Statistics
| Revision:

root / trunk / web / dojo / dojox / encoding / compression / lzw.js

History | View | Annotate | Download (1.77 KB)

1
/*
2
        Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
3
        Available via Academic Free License >= 2.1 OR the modified BSD license.
4
        see: http://dojotoolkit.org/license for details
5
*/
6

    
7

    
8
if(!dojo._hasResource["dojox.encoding.compression.lzw"]){
9
dojo._hasResource["dojox.encoding.compression.lzw"]=true;
10
dojo.provide("dojox.encoding.compression.lzw");
11
dojo.require("dojox.encoding.bits");
12
(function(){
13
var _1=function(x){
14
var w=1;
15
for(var v=2;x>=v;v<<=1,++w){
16
}
17
return w;
18
};
19
dojox.encoding.compression.lzw.Encoder=function(n){
20
this.size=n;
21
this.init();
22
};
23
dojo.extend(dojox.encoding.compression.lzw.Encoder,{init:function(){
24
this.dict={};
25
for(var i=0;i<this.size;++i){
26
this.dict[String.fromCharCode(i)]=i;
27
}
28
this.width=_1(this.code=this.size);
29
this.p="";
30
},encode:function(_2,_3){
31
var c=String.fromCharCode(_2),p=this.p+c,r=0;
32
if(p in this.dict){
33
this.p=p;
34
return r;
35
}
36
_3.putBits(this.dict[this.p],this.width);
37
if((this.code&(this.code+1))==0){
38
_3.putBits(this.code++,r=this.width++);
39
}
40
this.dict[p]=this.code++;
41
this.p=c;
42
return r+this.width;
43
},flush:function(_4){
44
if(this.p.length==0){
45
return 0;
46
}
47
_4.putBits(this.dict[this.p],this.width);
48
this.p="";
49
return this.width;
50
}});
51
dojox.encoding.compression.lzw.Decoder=function(n){
52
this.size=n;
53
this.init();
54
};
55
dojo.extend(dojox.encoding.compression.lzw.Decoder,{init:function(){
56
this.codes=new Array(this.size);
57
for(var i=0;i<this.size;++i){
58
this.codes[i]=String.fromCharCode(i);
59
}
60
this.width=_1(this.size);
61
this.p=-1;
62
},decode:function(_5){
63
var c=_5.getBits(this.width),v;
64
if(c<this.codes.length){
65
v=this.codes[c];
66
if(this.p>=0){
67
this.codes.push(this.codes[this.p]+v.substr(0,1));
68
}
69
}else{
70
if((c&(c+1))==0){
71
this.codes.push("");
72
++this.width;
73
return "";
74
}
75
var x=this.codes[this.p];
76
v=x+x.substr(0,1);
77
this.codes.push(v);
78
}
79
this.p=c;
80
return v;
81
}});
82
})();
83
}