better showcanvas fix
[mminer.git] / dpack / packer_rle.js
blob6f862096752019cebaf4326a1f7b0426dbbba625
1 /*
2 * simple RLE packer
3 * 1st char: code of rep prefix, then:
4 * char or
5 * repprefix,count,code
6 */
7 function RLEPack (s) {
8 var f, res = "", used = [], ch;
9 /* find least used char */
10 for (f = 0; f <= 255; f++) used[f] = 0;
11 for (f = 0; f < s.length; f++) {
12 ch = s[f];
13 /*if (!used[ch]) {
14 if (ch >= 32 && ch <= 126) print('"'+String.fromCharCode(ch)+'"');
15 else print("0x"+ch.toString(16).toUpperCase());
16 }*/
17 used[ch]++;
20 var repChar = 35, repCnt = used[repChar], repASCII = true;
21 for (f = 0; f <= 255; f++) {
22 var uc = used[f];
23 if (uc < repCnt || (!repASCII && uc <= repCnt)) {
24 repChar = f; repCnt = uc;
25 repASCII = (f >= 32 && f <= 126 && f != 34 && f != 92);
29 print("----------");
30 if (repASCII) print('"'+String.fromCharCode(repChar)+'"');
31 else print("0x"+repChar.charCodeAt(0).toString(16).toUpperCase());
32 print("cnt: "+repCnt);
33 print("used: "+used[repChar]);
35 function AddCode (c, isRep) {
36 if (!isRep && c == repChar) {
37 /* 'repeat' once */
38 /*print("fuck!");*/
39 AddCode(repChar, true);
40 AddCode(0, true);
42 if (c >= 32 && c <= 126) {
43 if (c == 34 || c == 92) res += '\\';
44 res += String.fromCharCode(c);
45 } else {
46 var h = c.toString(16).toLowerCase();
47 while (h.length < 2) h = "0"+h;
48 res += "\\x"+h;
52 AddCode(repChar, true); /* repchar */
53 for (f = 0; f < s.length; ) {
54 var c = s[f];
55 if (f >= s.length-2) { AddCode(c); f++; continue; }
56 if (s[f+1] == c && (c == repChar || s[f+2] == c)) {
57 /* repeats */
58 AddCode(repChar, true);
59 var cnt = -1; /* 0 means at least one repeat */
60 while (cnt < 255 && f < s.length && s[f] == c) { cnt++; f++; }
61 AddCode(cnt, true); /* repcount */
62 AddCode(c, true); /* char */
63 /*print("rep "+(cnt+1)+"; char: "+c);*/
64 } else { AddCode(c); f++; }
66 return res;
71 * simple RLE unpacker
72 * 1st char: code of rep prefix, then:
73 * char or
74 * repprefix,count,code
76 function RLEUnpack (s) {
77 var res = [], rc = s.charCodeAt(0);
78 /*print(rc);*/
79 for (var f = 1; f < s.length; ) {
80 var cc = s.charCodeAt(f++);
81 if (cc == rc) {
82 var cnt = s.charCodeAt(f++);
83 cc = s.charCodeAt(f++);
84 /*print("pos: "+(f-3)+"; rep "+(cnt+1)+"; char: "+cc+"; npos: "+f+"; nchar: "+s.charCodeAt(f));*/
85 while (cnt-- > 0) res.push(cc);
87 res.push(cc);
89 return res;
93 function PackArray (arr) {
94 return RLEPack(arr);
98 function DUnpackStr (s) {
99 return RLEUnpack(s);