Use lzw_encode instead of LZString.compress

This commit is contained in:
oc 2019-03-05 21:46:45 +08:00
parent ca250fa60a
commit d837ab1120
4 changed files with 72 additions and 14 deletions

View File

@ -2679,7 +2679,7 @@ actions.prototype.onupPaint = function () {
core.status.event.data.x = null;
core.status.event.data.y = null;
// 保存
core.paint[core.status.floorId] = LZString.compress(core.utils.encodeCanvas(core.dymCanvas.paint).join(","));
core.paint[core.status.floorId] = lzw_encode(core.utils.encodeCanvas(core.dymCanvas.paint).join(","));
}
actions.prototype.setPaintMode = function (mode) {
@ -2700,7 +2700,7 @@ actions.prototype.savePaint = function () {
var data = {};
for (var floorId in core.paint) {
if (core.isset(core.paint[floorId]))
data[floorId] = LZString.decompress(core.paint[floorId]);
data[floorId] = lzw_decode(core.paint[floorId]);
}
core.download(core.firstData.name+".h5paint", JSON.stringify({
'name': core.firstData.name,
@ -2721,12 +2721,12 @@ actions.prototype.loadPaint = function () {
core.paint = {};
for (var floorId in obj.paint) {
if (core.isset(obj.paint[floorId]))
core.paint[floorId] = LZString.compress(obj.paint[floorId]);
core.paint[floorId] = lzw_encode(obj.paint[floorId]);
}
core.clearMap('paint');
var value = core.paint[core.status.floorId];
if (core.isset(value)) value = LZString.decompress(value).split(",");
if (core.isset(value)) value = lzw_decode(value).split(",");
core.utils.decodeCanvas(value, 32*core.bigmap.width, 32*core.bigmap.height);
core.drawImage('paint', core.bigmap.tempCanvas.canvas, 0, 0);

View File

@ -276,11 +276,11 @@ core.prototype.init = function (coreData, callback) {
core.platform.useLocalForage = core.getLocalStorage('useLocalForage', !core.platform.isIOS);
if (core.platform.useLocalForage) {
try {
core.setLocalForage("__test__", LZString.compress("__test__"), function() {
core.setLocalForage("__test__", lzw_encode("__test__"), function() {
try {
core.getLocalForage("__test__", null, function(data) {
try {
if (LZString.decompress(data)!="__test__") {
if (lzw_decode(data)!="__test__") {
console.log("localForage unsupported!");
core.platform.useLocalForage=false;
}

View File

@ -1690,7 +1690,7 @@ ui.prototype.drawMaps = function (index, x, y) {
if (core.status.event.data.paint) {
var offsetX = core.clamp(x-6, 0, mw-13), offsetY = core.clamp(y-6, 0, mh-13);
var value = core.paint[floorId];
if (core.isset(value)) value = LZString.decompress(value).split(",");
if (core.isset(value)) value = lzw_decode(value).split(",");
core.utils.decodeCanvas(value, 32*mw, 32*mh);
core.drawImage('ui', core.bigmap.tempCanvas.canvas, offsetX*32, offsetY*32, 416, 416, 0, 0, 416, 416);
}
@ -2582,7 +2582,7 @@ ui.prototype.drawPaint = function () {
// 将已有的内容绘制到route上
var value = core.paint[core.status.floorId];
if (core.isset(value)) value = LZString.decompress(value).split(",");
if (core.isset(value)) value = lzw_decode(value).split(",");
core.utils.decodeCanvas(value, 32*core.bigmap.width, 32*core.bigmap.height);
core.drawImage('paint', core.bigmap.tempCanvas.canvas, 0, 0);

View File

@ -136,12 +136,14 @@ utils.prototype.setLocalStorage = function(key, value) {
return;
}
var str = JSON.stringify(value);
var compressed = LZString.compress(str);
var str = JSON.stringify(value).replace(/[\u007F-\uFFFF]/g, function(chr) {
return "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).substr(-4)
});
var compressed = lzw_encode(str);
// test if we can save to localStorage
localStorage.setItem("__tmp__", compressed);
if (LZString.decompress(localStorage.getItem("__tmp__"))==str) {
if (lzw_decode(localStorage.getItem("__tmp__"))==str) {
localStorage.setItem(core.firstData.name + "_" + key, compressed);
}
else {
@ -166,7 +168,7 @@ utils.prototype.getLocalStorage = function(key, defaultValue) {
try {
var value = localStorage.getItem(core.firstData.name+"_"+key);
if (core.isset(value)) {
var output = LZString.decompress(value);
var output = lzw_decode(value);
if (core.isset(output) && output.length>0) {
try {
return JSON.parse(output);
@ -210,7 +212,9 @@ utils.prototype.setLocalForage = function (key, value, successCallback, errorCal
}
// Save to localforage
var compressed = LZString.compress(JSON.stringify(value));
var compressed = lzw_encode(JSON.stringify(value).replace(/[\u007F-\uFFFF]/g, function(chr) {
return "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).substr(-4)
}));
localforage.setItem(core.firstData.name+"_"+key, compressed, function (err) {
if (core.isset(err)) {
if (core.isset(errorCallback)) errorCallback(err);
@ -241,7 +245,7 @@ utils.prototype.getLocalForage = function (key, defaultValue, successCallback, e
if (!core.isset(successCallback)) return;
if (core.isset(value)) {
try {
var output = LZString.decompress(value);
var output = lzw_decode(value);
if (core.isset(output) && output.length>0) {
try {
successCallback(JSON.parse(output));
@ -1043,3 +1047,57 @@ utils.prototype.http = function (type, url, formData, success, error, mimeType,
xhr.send(formData);
else xhr.send();
}
// LZW-compress
// https://gist.github.com/revolunet/843889
function lzw_encode(s) {
var dict = {};
var data = (s + "").split("");
var out = [];
var currChar;
var phrase = data[0];
var code = 256;
for (var i=1; i<data.length; i++) {
currChar=data[i];
if (dict[phrase + currChar] != null) {
phrase += currChar;
}
else {
out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0));
dict[phrase + currChar] = code;
code++;
phrase=currChar;
}
}
out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0));
for (var i=0; i<out.length; i++) {
out[i] = String.fromCharCode(out[i]);
}
return out.join("");
}
// Decompress an LZW-encoded string
function lzw_decode(s) {
var dict = {};
var data = (s + "").split("");
var currChar = data[0];
var oldPhrase = currChar;
var out = [currChar];
var code = 256;
var phrase;
for (var i=1; i<data.length; i++) {
var currCode = data[i].charCodeAt(0);
if (currCode < 256) {
phrase = data[i];
}
else {
phrase = dict[currCode] ? dict[currCode] : (oldPhrase + currChar);
}
out.push(phrase);
currChar = phrase.charAt(0);
dict[code] = oldPhrase + currChar;
code++;
oldPhrase = phrase;
}
return out.join("");
}