onmessage = function(e) { if (e.data.message) { } else { } } function encode() { str = Ox.encodeUTF8(str); var c = Ox.canvas(img), len = str.length; if (len > maxLength(img.width, img.height)) { throw new RangeError("PNG codec can't encode " + len + " bytes into " + (img.width * img.height) + " pixels"); } len = Ox.pad(Ox.encodeBase256(len), 4, Ox.char(0)); Ox.each(Ox.map(len + str, function(byte) { return Ox.map(new Array(8), function(v, i) { return byte.charCodeAt(0) >> 7 - i & 1; }).join(""); }).join(""), function(i, bit) { var index, byte = c.data[index = parseInt(i * 4/3)]; c.data[index] = bit == xor(byte) ? byte : byte & 254 | !(byte & 1); }); c.context.putImageData(c.imageData, 0, 0); postMessage(c.canvas.toDataURL()); } function decode() { var c = Ox.canvas(img), bits = "", str = "", i = 0; len = 4, flag = false; do { bits += xor(c.data[parseInt(i * 4/3)]); if (++i % 8 == 0) { str += Ox.char(parseInt(bits, 2)); bits = ""; len--; if (len == 0 && !flag) { if ((len = Ox.decodeBase256(str)) > maxLength(img.width, img.height)) { throwPNGError(); } str = ""; flag = true; } } } while (len); try { return Ox.decodeUTF8(str); } catch(e) { throwPNGError(); } } function throwError() { throw new RangeError("PNG codec can't decode image"); }