forked from lavrovd/psd-reader
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpsd-reader.min.js
9 lines (7 loc) · 9.78 KB
/
psd-reader.min.js
1
2
3
4
5
6
7
8
9
/*
psd-reader version 1.1.0
By Epistemex (c) 2015
www.epistemex.com
MIT license (this header required)
*/
function PsdReader(g){g=g||{};var e=this,f,b={url:g.url||"",buffer:g.buffer||null,onError:g.onError||g.onerror,onLoad:g.onLoad||g.onload,onReady:g.onReady||g.onready,gamma:+g.gamma||1,gamma32:+g.gamma32||PsdReader.guessGamma(),duotone:g.duotone||[255,255,255],passive:!!g.passive,ignoreAlpha:!!g.ignoreAlpha,toRGBA:d(g.toRGBA,!0),dematte:d(g.dematte,!0)};this.config=b;this.isParsed=!1;this._isp=!1;this.onready=f=b.onReady?b.onReady.bind(e):null;this.onload=b.onLoad?b.onLoad.bind(e):null;this.onerror=b.onError?b.onError.bind(e):null;this.buffer=b.buffer||null;this.rgba=null;this.info={width:0,height:0,channels:0,depth:0,indexes:0,hasAlpha:!1,byteWidth:0,colorMode:0,colorDesc:"",compression:0,compressionDesc:"",channelSize:0,chunks:[]};this.bitmaps=e.info.bitmaps=[];this.resources=e.info.resources=[];this._err=function(h,j){e._isp=!1;if(e.onerror){setTimeout(i.bind(e),1)}else{throw new TypeError(h)}function i(){e.onerror({message:h,source:j,timeStamp:Date.now()})}};function a(h){e._err(h,"core")}if((!b.url||typeof b.url!=="string"||(b.url&&!b.url.length))&&!e.buffer){a("Buffer nor URL specified");return}else{if(b.url&&e.buffer){a("Both URL and buffer specified");return}}try{if(b.url){e._fetch(b.url,function(h){e.buffer=h;e.view=new DataView(h);if(f){f({url:b.url,timeStamp:Date.now()})}if(!e.config.passive){e._parser(e.buffer)}},a)}else{if(f){f({url:null,timeStamp:Date.now()})}if(!e.config.passive){e._parser(e.buffer)}}}catch(c){a(c.message)}function d(h,i){return typeof h=="boolean"?h:i}}PsdReader.prototype={parse:function(){var a=this;if(!a.isParsed&&!a._isp){a._parser(a.buffer)}},toRGBA:function(a){var c=this,b=a.bind(c);c._toRGBA(function(d){c.rgba=d;b({rgba:c.rgba,timeStamp:Date.now()})})},getIndexTable:function(){var a=this.info.chunks[1];return a.length?new Uint8Array(this.buffer,a.pos,a.length):null},indexToInt:function(c,b,a){var d=4278190080+(c[b+512]<<16)+(c[b+256]<<8)+c[b];return a?d&16777215:d},getGammaLUT:function(a){var c=new Uint8ClampedArray(256),b=0;if(a===1){while(b<256){c[b]=b++}}else{for(;b<256;b++){c[b]=(Math.pow(b/255,a)*255+0.5)|0}}return c},floatToComp:function(a,b){return(a.getFloat32(b)*255+0.5)|0},_fetch:function(d,a,c){var e=new XMLHttpRequest();try{e.open("GET",d);e.responseType="arraybuffer";e.onerror=function(){c("Network error")};e.onload=function(){if(e.status===200){a(e.response)}else{c(e.statusText)}};e.send()}catch(b){c(b.message)}},_chanToDV:function(a){return new DataView(a.buffer,a.byteOffset,a.byteLength)}};PsdReader.guessGamma=function(){return 1/((navigator.userAgent.indexOf("Mac OS")<0)?2.2:1.8)};PsdReader._bSz=1<<21;PsdReader._delay=8;PsdReader.prototype._parser=function(c){var v=this,D=new DataView(c),z=0,h,A=!1,u=l(),C=n(),e,g,E,q,j,w,x,f,s,t,B=performance?performance.now():Date.now(),r=this.info;v._isp=!0;this.findResource=k;this.parseResources=y;if(u!=="8BPS"&&C!==1){a("Not a PSD file");return}if(o()||n()){a("Not a valid PSD file");return}b("Header",14);e=n();if(!e||e>56){a("Invalid channel count");return}q=o();E=o();if(!E||E>30000||!q||q>30000){a("Invalid size");return}j=n();if([1,8,16,32].indexOf(j)<0){a("Invalid depth");return}w=n();if(w>15){a("Invalid color mode");return}if([5,6,11,12,13,14,15].indexOf(w)>-1){a("Unsupported color mode");return}x=["Bitmap","Greyscale","Indexed","RGB","CMYK","HSL","HSB","Multichannel","Duotone","Lab","Greyscale16","RGB48","LAB48","CMYK64","DeepMultichannel","Duotone16"][w];r.channels=e;r.width=E;r.height=q;r.depth=j;r.byteWidth=j/8;r.colorMode=w;r.colorDesc=x;r.channelSize=E*q*r.byteWidth;f=o();b("ColorModeData",f);z+=f;if((w===2||w===8)&&f===0){a("Missing data for mode");return}s=o();b("ImageResource",s);z+=s;t=o();b("LayersAndMasks",t);z+=t;b("ImageData",D.buffer.byteLength-z);g=n();r.compression=g;r.compressionDesc=["Uncompressed","RLE"][g];h=(g?v._rle:v._raw).bind(v);h(D,z,r,i);function i(){v.config.toRGBA?v._toRGBA(d):d(null)}function d(F){v.rgba=F;v.isParsed=!0;v._isp=!1;if(v.onload){v.onload({timeStamp:Date.now(),elapsed:(performance?performance.now():Date.now())-B})}}function k(G){var I=v.resources,F=0,H;if(!A){y()}while(H=I[F++]){if(H.id===G){return H}}return null}function y(){var F=r.chunks[2],G,H=v.resources,I;if(!F.length){return}z=F.pos;G=z+F.length;A=!0;while(z<G){if(l()==="8BIM"){H.push({id:n(),name:m(256),size:(I=o()),pos:z});z+=I%2===0?I:I+1}else{return}}}function b(G,F){r.chunks.push({pos:z,name:G,length:F})}function p(){return D.getUint8(z++)}function n(){var F=D.getUint16(z);z+=2;return F>>>0}function o(){var F=D.getUint32(z);z+=4;return F>>>0}function m(I){var J="",F=-1,G=0,H;while(G++<I&&F){F=p();if(F>0){J+=String.fromCharCode(F)}}H=J.length;if(!H||H%2===0){z++}return J}function l(){var G=o(),F=String.fromCharCode;return F((G&4278190080)>>>24)+F((G&16711680)>>>16)+F((G&65280)>>>8)+F((G&255)>>>0)}function a(F){v._err(F,"parser")}};PsdReader.prototype._rle=function(q,o,n,d){var a=this.bitmaps,f=0,m=n.channels,e=0,b=PsdReader._bSz,p=new Uint8Array(q.buffer),k=q.buffer.byteLength,g=n.height*n.channels,c=new Uint16Array(g);while(f<g){c[f++]=l()}f=0;(function h(){var i=new Uint8Array(n.channelSize);a.push(i);j(p,i,k);b-=i.length;if(--m){if(b>0){h()}else{b=PsdReader._bSz;setTimeout(h,PsdReader._delay*(++e%4?1:2))}}else{d()}})();function j(y,i,r){var x=0,u,z,w,t=n.height,s;while(t--){w=Math.min(o+c[f++],r);while(o<w){u=y[o++];if(u>128){u=257-u;z=y[o++];s=x+u;while(x<s){i[x++]=z}}else{if(u<128){s=x+ ++u;while(x<s){i[x++]=y[o++]}}}}}}function l(){var i=q.getUint16(o);o+=2;return i}};PsdReader.prototype._raw=function(f,e,c,a){for(var b=0,d=c.channelSize;b<c.channels;b++,e+=d){this.bitmaps.push(new Uint8Array(f.buffer,e,d))}a()};PsdReader.prototype._toRGBA=function(d){var j=this,i=j.info,e=j.config,a=j.bitmaps,b=i.byteWidth,c=j._chanToDV.bind(j),g=j.floatToComp,k=i.width,h=e.ignoreAlpha,f=new Uint8ClampedArray(k*i.height<<2);switch(i.colorMode){case 0:h=j._bitmap(a[0],f,k);break;case 1:h=j._grey(a,f,b,h,c,g);break;case 2:h=j._indexed(a[0],f,h);break;case 4:h=j._cmyk(a,f,b,h);break;case 8:h=j._duotone(a,f,h);break;case 9:h=j._lab(a,f,b,h);break;default:h=j._rgba(a,f,b,h,c,g)}i.hasAlpha=h;j._gamma(f,i.depth===32?e.gamma32:e.gamma);(h&&e.dematte)?j._dematte(f,d):d(f)};PsdReader.prototype._rgba=function(e,j,f,o,h,k){var q=j.length,n=0,s=0,t=e[0],l=e[1],d=e[2],c=e[3],m=!!c&&!o;if(this.info.depth===32){t=h(t);l=h(l);d=h(d);if(m){c=h(c)}while(n<q){j[n++]=k(t,s);j[n++]=k(l,s);j[n++]=k(d,s);j[n++]=m?k(c,s):255;s+=f}}else{while(n<q){j[n++]=t[s];j[n++]=l[s];j[n++]=d[s];j[n++]=m?c[s]:255;s+=f}}return m};PsdReader.prototype._cmyk=function(e,h,f,n){var s=h.length,m=0,t=0,u=e[0],j=e[1],d=e[2],o=e[3],c=e[4],q,l=!!c&&!n;while(m<s){q=o[t]/255;h[m++]=u[t]*q+0.5;h[m++]=j[t]*q+0.5;h[m++]=d[t]*q+0.5;h[m++]=l?c[t]:255;t+=f}return l};PsdReader.prototype._grey=function(c,f,d,n,e,h){var r=new Uint32Array(f.buffer),o=r.length,m=0,q=0,j,b,k,l;j=c[0];b=c[1];l=!!b&&!n;if(this.info.depth<32){while(m<o){k=j[q];r[m++]=((l?b[q]:255)<<24)|(k<<16)|(k<<8)|k;q+=d}}else{j=e(j);if(l){b=e(b)}while(m<o){k=h(j,q);r[m++]=((l?h(b,q):255)<<24)|(k<<16)|(k<<8)|k;q+=d}}return l};PsdReader.prototype._indexed=function(j,b,d){var h=this,f=j.length,k=h.getIndexTable(),n=new Uint32Array(b.buffer),c=0,e,a,g=-1,l=-1,m=d?null:h.findResource(1047);if(m){l=new DataView(h.buffer,m.pos,2).getInt16(0)}while(c<f){e=j[c];a=h.indexToInt(k,e,e===l);n[c++]=a;if(e>g){g=e}}h.info.indexes=++g;return !1};PsdReader.prototype._bitmap=function(f,a,j){var h=new Uint32Array(a.buffer),d=f.length,c=0,g=0,e=j;while(c<d){while(g<e){h[g++]=b(c);c+=0.125}c=Math.ceil(c);e+=j}function b(m){var k=f[m|0],l=(m-(m|0))/0.125;return(k&(128>>l))?4278190080:4294967295}return !1};PsdReader.prototype._duotone=function(d,e,l){var q=d[0],a=d[1],j=!!a&&!l,s=this.config.duotone,h,o=s[0]/255,f=s[1]/255,c=s[2]/255,k=0,n=0,m=q.length;while(k<m){h=q[k];e[n++]=h*o+0.5;e[n++]=h*f+0.5;e[n++]=h*c+0.5;e[n++]=j?a[k]:255;k++}return j};PsdReader.prototype._lab=function(f,j,g,m){var n=f[0],c=f[1],e=f[2],d=f[3],k=!!d&!m,q=j.length,h,l=0,r=0;for(;l<q;r+=g,l+=4){h=o(n[r]/2.55,c[r]-128,e[r]-128,j,l);j[l+3]=k?d[r]:255}function o(A,p,s,u,w){var F=(A+16)/116,D=p/500+F,I=F-s/200,E=Math.pow(D,3),H=Math.pow(F,3),J=Math.pow(I,3),C,v,t;F=(H>0.0088561?H:(F-0.137931)/7.787);D=(E>0.0088561?E:(D-0.137931)/7.787)*0.950456;I=(J>0.0088561?J:(I-0.137931)/7.787)*1.088754;C=D*3.2406+F*-1.5372+I*-0.4986;v=D*-0.9689+F*1.8758+I*0.0415;t=D*0.0557+F*-0.204+I*1.057;C=C>0.0031308?1.055*Math.pow(C,0.41667)-0.055:12.92*C;v=v>0.0031308?1.055*Math.pow(v,0.41667)-0.055:12.92*v;t=t>0.0031308?1.055*Math.pow(t,0.41667)-0.055:12.92*t;u[w++]=C*255;u[w++]=v*255;u[w]=t*255}return k};PsdReader.prototype._gamma=function(a,b){if(!a||!b||b===1){return}var c=0,d=a.length,e=this.getGammaLUT(b);while(c<d){a[c]=e[a[c++]];a[c]=e[a[c++]];a[c]=e[a[c++]];c++}};PsdReader.prototype._dematte=function(b,d){var f=0,g=b.length,c=PsdReader._bSz,a=c;(function e(){var h,i;while(f<g&&a--){h=b[f+3];if(h&&h<255){h/=255;i=255*(1-h);b[f]=(b[f++]-i)/h+0.5;b[f]=(b[f++]-i)/h+0.5;b[f]=(b[f++]-i)/h+0.5;f++}else{f+=4}}if(f<g){a=c;setTimeout(e,PsdReader._delay)}else{d(b)}})()};PsdReader.prototype.toCanvas=function(k){if(!this.rgba){return null}k=k||{};var i=this,a=document.createElement("canvas"),b=a.getContext("2d"),g,q,r,o,m=k.scale||1,f=!!k.hq,s=i.info.width,e=i.info.height,l,j,p=(s*m+0.5)|0,n=(e*m+0.5)|0,d="Could not create canvas";try{a.width=s;a.height=e;g=b.createImageData(s,e);g.data.set(i.rgba);b.putImageData(g,0,0)}catch(c){i._err(d,"toCanvas")}try{if(m!==1){q=document.createElement("canvas");r=q.getContext("2d");if(f&&p<s&&n<e){s=q.width=Math.ceil(s*0.5);e=q.height=Math.ceil(e*0.5);r.drawImage(a,0,0,s,e);o=Math.ceil(Math.log(a.width/p)/Math.log(2))-1;if(o>0){while(o--){l=s;j=e;s=Math.ceil(s*0.5);e=Math.ceil(e*0.5);r.drawImage(q,0,0,l,j,0,0,s,e)}}a.width=p;a.height=n;b.drawImage(q,0,0,s,e,0,0,p,n)}else{q.width=p;q.height=n;r.drawImage(a,0,0,p,n);a=q}}}catch(c){i._err(d,"toCanvas/s")}return a};