package tr.com.stackdeveloper.esgm;
public class JsToDataUrl
{
public static String buidScript()
{
StringBuilder sb = new StringBuilder();
sb.append("Number.prototype.toUInt=function(){ return this<0?this+4294967296:this; }; ");
sb.append("Number.prototype.bytes32=function(){ return [(this>>>24)&0xff,(this>>>16)&0xff,(this>>>8)&0xff,this&0xff]; }; ");
sb.append("Number.prototype.bytes16sw=function(){ return [this&0xff,(this>>>8)&0xff]; }; ");
sb.append("Array.prototype.adler32=function(start,len){ ");
sb.append(" switch(arguments.length){ case 0:start=0; case 1:len=this.length-start; } ");
sb.append(" var a=1,b=0; ");
sb.append(" for(var i=0;i<len;i++){ ");
sb.append(" a = (a+this[start+i])%65521; b = (b+a)%65521; ");
sb.append(" } ");
sb.append(" return ((b << 16) | a).toUInt(); ");
sb.append("};");
sb.append("Array.prototype.crc32=function(start,len){ ");
sb.append(" switch(arguments.length){ case 0:start=0; case 1:len=this.length-start; } ");
sb.append(" var table=arguments.callee.crctable; ");
sb.append(" if(!table){ ");
sb.append(" table=[]; ");
sb.append(" var c; ");
sb.append(" for (var n = 0; n < 256; n++) { ");
sb.append(" c = n; ");
sb.append(" for (var k = 0; k < 8; k++) ");
sb.append(" c = c & 1?0xedb88320 ^ (c >>> 1):c >>> 1; ");
sb.append(" table[n] = c.toUInt(); ");
sb.append(" } ");
sb.append(" arguments.callee.crctable=table; ");
sb.append(" } ");
sb.append(" var c = 0xffffffff; ");
sb.append(" for (var i = 0; i < len; i++) ");
sb.append(" c = table[(c ^ this[start+i]) & 0xff] ^ (c>>>8); ");
sb.append(" return (c^0xffffffff).toUInt(); ");
sb.append("}; ");
sb.append("(function(){ ");
sb.append(" var toDataURL=function(){ ");
sb.append(" var imageData=Array.prototype.slice.call(this.getContext(\"2d\").getImageData(0,0,this.width,this.height).data); ");
sb.append(" var w=this.width; ");
sb.append(" var h=this.height; ");
sb.append(" var stream=[ ");
sb.append(" 0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a, ");
sb.append(" 0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52 ");
sb.append(" ]; ");
sb.append(" Array.prototype.push.apply(stream, w.bytes32() ); ");
sb.append(" Array.prototype.push.apply(stream, h.bytes32() ); ");
sb.append(" stream.push(0x08,0x06,0x00,0x00,0x00); ");
sb.append(" Array.prototype.push.apply(stream, stream.crc32(12,17).bytes32() ); ");
sb.append(" var len=h*(w*4+1); ");
sb.append(" for(var y=0;y<h;y++) ");
sb.append(" imageData.splice(y*(w*4+1),0,0); ");
sb.append(" var blocks=Math.ceil(len/32768);");
sb.append(" Array.prototype.push.apply(stream, (len+5*blocks+6).bytes32() );");
sb.append(" var crcStart=stream.length; ");
sb.append(" var crcLen=(len+5*blocks+6+4); ");
sb.append(" stream.push(0x49,0x44,0x41,0x54,0x78,0x01); ");
sb.append(" for(var i=0;i<blocks;i++){ ");
sb.append(" var blockLen=Math.min(32768,len-(i*32768)); ");
sb.append(" stream.push(i==(blocks-1)?0x01:0x00); ");
sb.append(" Array.prototype.push.apply(stream, blockLen.bytes16sw() ); ");
sb.append(" Array.prototype.push.apply(stream, (~blockLen).bytes16sw() ); ");
sb.append(" var id=imageData.slice(i*32768,i*32768+blockLen); ");
sb.append(" Array.prototype.push.apply(stream, id ); ");
sb.append(" } ");
sb.append(" Array.prototype.push.apply(stream, imageData.adler32().bytes32() ); ");
sb.append(" Array.prototype.push.apply(stream, stream.crc32(crcStart, crcLen).bytes32() ); ");
sb.append(" stream.push(0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44); ");
sb.append(" Array.prototype.push.apply(stream, stream.crc32(stream.length-4, 4).bytes32() ); ");
sb.append(" return \"data:image/png;base64,\"+btoa(stream.map(function(c){ return String.fromCharCode(c); }).join('')); ");
sb.append(" }; ");
sb.append(" var tdu=HTMLCanvasElement.prototype.toDataURL; ");
sb.append(" HTMLCanvasElement.prototype.toDataURL=function(type){ ");
sb.append(" var res=tdu.apply(this,arguments); ");
sb.append(" if(res == \"data:,\"){ ");
sb.append(" HTMLCanvasElement.prototype.toDataURL=toDataURL; ");
sb.append(" return this.toDataURL(); ");
sb.append(" }else{ ");
sb.append(" HTMLCanvasElement.prototype.toDataURL=tdu; ");
sb.append(" return res; ");
sb.append(" } ");
sb.append(" } ");
sb.append("})(); ");
return sb.toString();
}
}