UTIF.js 61 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169
  1. ;(function(){
  2. var UTIF = {};
  3. // Make available for import by `require()`
  4. if (typeof module == "object") {module.exports = UTIF;}
  5. else {self.UTIF = UTIF;}
  6. var pako = (typeof require === "function") ? require("pako") : self.pako;
  7. function log() { if (typeof process=="undefined" || process.env.NODE_ENV=="development") console.log.apply(console, arguments); }
  8. (function(UTIF, pako){
  9. // Following lines add a JPEG decoder to UTIF.JpegDecoder
  10. (function(){"use strict";var W=function a1(){function W(p){this.message="JPEG error: "+p}W.prototype=new Error;W.prototype.name="JpegError";W.constructor=W;return W}(),ak=function ag(){var p=new Uint8Array([0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63]),t=4017,ac=799,ah=3406,ao=2276,ar=1567,ai=3784,s=5793,ad=2896;function ak(Q){if(Q==null)Q={};if(Q.w==null)Q.w=-1;this.V=Q.n;this.N=Q.w}function a5(Q,h){var f=0,G=[],n,E,a=16,F;while(a>0&&!Q[a-1]){a--}G.push({children:[],index:0});var C=G[0];for(n=0;n<a;n++)
  11. {for(E=0;E<Q[n];E++){C=G.pop();C.children[C.index]=h[f];while(C.index>0){C=G.pop()}C.index++;G.push(C);while(G.length<=n){G.push(F={children:[],index:0});C.children[C.index]=F.children;C=F}f++}if(n+1<a){G.push(F={children:[],index:0});C.children[C.index]=F.children;C=F}}return G[0].children}function a2(Q,h,f){return 64*((Q.P+1)*h+f)}function a7(Q,h,f,G,n,E,a,C,F,d){if(d==null)d=!1;var T=f.m,U=f.Z,z=h,J=0,V=0,r=0,D=0,a8,q=0,X,O,_,N,e,K,x=0,k,g,R,c;function Y(){if(V>0){V--;return J>>V&1}J=Q[h++];if(J===255){var I=Q[h++];if(I){if(I===220&&d){h+=2;var l=Z(Q,h);h+=2;if(l>0&&l!==f.s){throw new DNLMarkerError("Found DNL marker (0xFFDC) while parsing scan data",l)}}else if(I===217){if(d){var M=q*8;
  12. if(M>0&&M<f.s/10){throw new DNLMarkerError("Found EOI marker (0xFFD9) while parsing scan data, "+"possibly caused by incorrect `scanLines` parameter",M)}}throw new EOIMarkerError("Found EOI marker (0xFFD9) while parsing scan data")}throw new W("unexpected marker")}}V=7;return J>>>7}function u(I){var l=I;while(!0){l=l[Y()];switch(typeof l){case"number":return l;case"object":continue}throw new W("invalid huffman sequence")}}function m(I){var e=0;while(I>0){e=e<<1|Y();I--}return e}function j(I){if(I===1){return Y()===1?1:-1}var e=m(I);if(e>=1<<I-1){return e}return e+(-1<<I)+1}function v(X,I){var l=u(X.J),M=l===0?0:j(l),N=1;
  13. X.D[I]=X.Q+=M;while(N<64){var S=u(X.i),i=S&15,A=S>>4;if(i===0){if(A<15){break}N+=16;continue}N+=A;var o=p[N];X.D[I+o]=j(i);N++}}function $(X,I){var l=u(X.J),M=l===0?0:j(l)<<F;X.D[I]=X.Q+=M}function b(X,I){X.D[I]|=Y()<<F}function P(X,I){if(r>0){r--;return}var N=E,l=a;while(N<=l){var M=u(X.i),S=M&15,i=M>>4;if(S===0){if(i<15){r=m(i)+(1<<i)-1;break}N+=16;continue}N+=i;var A=p[N];X.D[I+A]=j(S)*(1<<F);N++}}function a4(X,I){var N=E,l=a,M=0,S,i;while(N<=l){var A=I+p[N],o=X.D[A]<0?-1:1;switch(D){case 0:i=u(X.i);S=i&15;M=i>>4;if(S===0){if(M<15){r=m(M)+(1<<M);D=4}else{M=16;D=1}}else{if(S!==1){throw new W("invalid ACn encoding")}a8=j(S);D=M?2:3}continue;case 1:case 2:if(X.D[A]){X.D[A]+=o*(Y()<<F)}else{M--;if(M===0){D=D===2?3:0}}break;case 3:if(X.D[A]){X.D[A]+=o*(Y()<<F)}else{X.D[A]=a8<<F;
  14. D=0}break;case 4:if(X.D[A]){X.D[A]+=o*(Y()<<F)}break}N++}if(D===4){r--;if(r===0){D=0}}}function H(X,I,x,l,M){var S=x/T|0,i=x%T;q=S*X.A+l;var A=i*X.h+M,o=a2(X,q,A);I(X,o)}function w(X,I,x){q=x/X.P|0;var l=x%X.P,M=a2(X,q,l);I(X,M)}var y=G.length;if(U){if(E===0){K=C===0?$:b}else{K=C===0?P:a4}}else{K=v}if(y===1){g=G[0].P*G[0].c}else{g=T*f.R}while(x<=g){var L=n?Math.min(g-x,n):g;if(L>0){for(O=0;O<y;O++){G[O].Q=0}r=0;if(y===1){X=G[0];for(e=0;e<L;e++){w(X,K,x);x++}}else{for(e=0;e<L;
  15. e++){for(O=0;O<y;O++){X=G[O];R=X.h;c=X.A;for(_=0;_<c;_++){for(N=0;N<R;N++){H(X,K,x,_,N)}}}x++}}}V=0;k=an(Q,h);if(!k){break}if(k.u){var a6=L>0?"unexpected":"excessive";h=k.offset}if(k.M>=65488&&k.M<=65495){h+=2}else{break}}return h-z}function al(Q,h,f){var G=Q.$,n=Q.D,E,a,C,F,d,T,U,z,J,V,Y,u,m,j,v,$,b;if(!G){throw new W("missing required Quantization Table.")}for(var r=0;r<64;r+=8){J=n[h+r];V=n[h+r+1];Y=n[h+r+2];u=n[h+r+3];m=n[h+r+4];j=n[h+r+5];v=n[h+r+6];$=n[h+r+7];J*=G[r];if((V|Y|u|m|j|v|$)===0){b=s*J+512>>10;f[r]=b;f[r+1]=b;f[r+2]=b;f[r+3]=b;f[r+4]=b;f[r+5]=b;f[r+6]=b;f[r+7]=b;continue}V*=G[r+1];Y*=G[r+2];u*=G[r+3];m*=G[r+4];j*=G[r+5];v*=G[r+6];$*=G[r+7];E=s*J+128>>8;a=s*m+128>>8;C=Y;F=v;d=ad*(V-$)+128>>8;z=ad*(V+$)+128>>8;
  16. T=u<<4;U=j<<4;E=E+a+1>>1;a=E-a;b=C*ai+F*ar+128>>8;C=C*ar-F*ai+128>>8;F=b;d=d+U+1>>1;U=d-U;z=z+T+1>>1;T=z-T;E=E+F+1>>1;F=E-F;a=a+C+1>>1;C=a-C;b=d*ao+z*ah+2048>>12;d=d*ah-z*ao+2048>>12;z=b;b=T*ac+U*t+2048>>12;T=T*t-U*ac+2048>>12;U=b;f[r]=E+z;f[r+7]=E-z;f[r+1]=a+U;f[r+6]=a-U;f[r+2]=C+T;f[r+5]=C-T;f[r+3]=F+d;f[r+4]=F-d}for(var P=0;P<8;++P){J=f[P];V=f[P+8];Y=f[P+16];u=f[P+24];m=f[P+32];j=f[P+40];v=f[P+48];$=f[P+56];if((V|Y|u|m|j|v|$)===0){b=s*J+8192>>14;if(b<-2040){b=0}else if(b>=2024){b=255}else{b=b+2056>>4}n[h+P]=b;n[h+P+8]=b;n[h+P+16]=b;n[h+P+24]=b;n[h+P+32]=b;n[h+P+40]=b;n[h+P+48]=b;n[h+P+56]=b;continue}E=s*J+2048>>12;a=s*m+2048>>12;C=Y;F=v;d=ad*(V-$)+2048>>12;z=ad*(V+$)+2048>>12;T=u;U=j;E=(E+a+1>>1)+4112;a=E-a;b=C*ai+F*ar+2048>>12;C=C*ar-F*ai+2048>>12;F=b;d=d+U+1>>1;U=d-U;z=z+T+1>>1;T=z-T;E=E+F+1>>1;F=E-F;a=a+C+1>>1;C=a-C;b=d*ao+z*ah+2048>>12;d=d*ah-z*ao+2048>>12;z=b;
  17. b=T*ac+U*t+2048>>12;T=T*t-U*ac+2048>>12;U=b;J=E+z;$=E-z;V=a+U;v=a-U;Y=C+T;j=C-T;u=F+d;m=F-d;if(J<16){J=0}else if(J>=4080){J=255}else{J>>=4}if(V<16){V=0}else if(V>=4080){V=255}else{V>>=4}if(Y<16){Y=0}else if(Y>=4080){Y=255}else{Y>>=4}if(u<16){u=0}else if(u>=4080){u=255}else{u>>=4}if(m<16){m=0}else if(m>=4080){m=255}else{m>>=4}if(j<16){j=0}else if(j>=4080){j=255}else{j>>=4}if(v<16){v=0}else if(v>=4080){v=255}else{v>>=4}if($<16){$=0}else if($>=4080){$=255}else{$>>=4}n[h+P]=J;
  18. n[h+P+8]=V;n[h+P+16]=Y;n[h+P+24]=u;n[h+P+32]=m;n[h+P+40]=j;n[h+P+48]=v;n[h+P+56]=$}}function a0(Q,h){var f=h.P,G=h.c,n=new Int16Array(64);for(var E=0;E<G;E++){for(var a=0;a<f;a++){var C=a2(h,E,a);al(h,C,n)}}return h.D}function an(Q,h,f){if(f==null)f=h;var G=Q.length-1,n=f<h?f:h;if(h>=G){return null}var E=Z(Q,h);if(E>=65472&&E<=65534){return{u:null,M:E,offset:h}}var a=Z(Q,n);while(!(a>=65472&&a<=65534)){if(++n>=G){return null}a=Z(Q,n)}return{u:E.toString(16),M:a,offset:n}}ak.prototype={parse(Q,h){if(h==null)h={};
  19. var f=h.F,E=0,a=null,C=null,F,d,T=0;function G(){var o=Z(Q,E);E+=2;var B=E+o-2,V=an(Q,B,E);if(V&&V.u){B=V.offset}var ab=Q.subarray(E,B);E+=ab.length;return ab}function n(F){var o=Math.ceil(F.o/8/F.X),B=Math.ceil(F.s/8/F.B);for(var Y=0;Y<F.W.length;Y++){R=F.W[Y];var ab=Math.ceil(Math.ceil(F.o/8)*R.h/F.X),af=Math.ceil(Math.ceil(F.s/8)*R.A/F.B),ap=o*R.h,aq=B*R.A,ae=64*aq*(ap+1);R.D=new Int16Array(ae);R.P=ab;R.c=af}F.m=o;F.R=B}var U=[],z=[],J=[],V=Z(Q,E);E+=2;if(V!==65496){throw new W("SOI not found")}V=Z(Q,E);
  20. E+=2;markerLoop:while(V!==65497){var Y,u,m;switch(V){case 65504:case 65505:case 65506:case 65507:case 65508:case 65509:case 65510:case 65511:case 65512:case 65513:case 65514:case 65515:case 65516:case 65517:case 65518:case 65519:case 65534:var j=G();if(V===65504){if(j[0]===74&&j[1]===70&&j[2]===73&&j[3]===70&&j[4]===0){a={version:{d:j[5],T:j[6]},K:j[7],j:j[8]<<8|j[9],H:j[10]<<8|j[11],S:j[12],I:j[13],C:j.subarray(14,14+3*j[12]*j[13])}}}if(V===65518){if(j[0]===65&&j[1]===100&&j[2]===111&&j[3]===98&&j[4]===101){C={version:j[5]<<8|j[6],k:j[7]<<8|j[8],q:j[9]<<8|j[10],a:j[11]}}}break;
  21. case 65499:var v=Z(Q,E),b;E+=2;var $=v+E-2;while(E<$){var r=Q[E++],P=new Uint16Array(64);if(r>>4===0){for(u=0;u<64;u++){b=p[u];P[b]=Q[E++]}}else if(r>>4===1){for(u=0;u<64;u++){b=p[u];P[b]=Z(Q,E);E+=2}}else{throw new W("DQT - invalid table spec")}U[r&15]=P}break;case 65472:case 65473:case 65474:if(F){throw new W("Only single frame JPEGs supported")}E+=2;F={};F.G=V===65473;F.Z=V===65474;F.precision=Q[E++];var D=Z(Q,E),a4,q=0,H=0;E+=2;F.s=f||D;F.o=Z(Q,E);E+=2;F.W=[];F._={};var a8=Q[E++];for(Y=0;Y<a8;Y++){a4=Q[E];var w=Q[E+1]>>4,y=Q[E+1]&15;if(q<w){q=w}if(H<y){H=y}var X=Q[E+2];m=F.W.push({h:w,A:y,L:X,$:null});F._[a4]=m-1;E+=3}F.X=q;F.B=H;n(F);break;case 65476:var O=Z(Q,E);E+=2;
  22. for(Y=2;Y<O;){var _=Q[E++],N=new Uint8Array(16),e=0;for(u=0;u<16;u++,E++){e+=N[u]=Q[E]}var K=new Uint8Array(e);for(u=0;u<e;u++,E++){K[u]=Q[E]}Y+=17+e;(_>>4===0?J:z)[_&15]=a5(N,K)}break;case 65501:E+=2;d=Z(Q,E);E+=2;break;case 65498:var x=++T===1&&!f,R;E+=2;var k=Q[E++],g=[];for(Y=0;Y<k;Y++){var c=Q[E++],L=F._[c];R=F.W[L];R.index=c;var a6=Q[E++];R.J=J[a6>>4];R.i=z[a6&15];g.push(R)}var I=Q[E++],l=Q[E++],M=Q[E++];try{var S=a7(Q,E,F,g,d,I,l,M>>4,M&15,x);E+=S}catch(ex){if(ex instanceof DNLMarkerError){return this.parse(Q,{F:ex.s})}else if(ex instanceof EOIMarkerError){break markerLoop}throw ex}break;case 65500:E+=4;break;case 65535:if(Q[E]!==255){E--}break;default:var i=an(Q,E-2,E-3);if(i&&i.u){E=i.offset;break}if(E>=Q.length-1){break markerLoop}throw new W("JpegImage.parse - unknown marker: "+V.toString(16))}V=Z(Q,E);E+=2}this.width=F.o;this.height=F.s;this.g=a;this.b=C;this.W=[];for(Y=0;Y<F.W.length;Y++){R=F.W[Y];
  23. var A=U[R.L];if(A){R.$=A}this.W.push({index:R.index,e:a0(F,R),l:R.h/F.X,t:R.A/F.B,P:R.P,c:R.c})}this.p=this.W.length;return undefined},Y(Q,h,f){if(f==null)f=!1;var G=this.width/Q,n=this.height/h,E,a,C,F,d,T,U,z,J,V,Y=0,u,m=this.W.length,j=Q*h*m,v=new Uint8ClampedArray(j),$=new Uint32Array(Q),b=4294967288,r;for(U=0;U<m;U++){E=this.W[U];a=E.l*G;C=E.t*n;Y=U;u=E.e;F=E.P+1<<3;if(a!==r){for(d=0;d<Q;d++){z=0|d*a;$[d]=(z&b)<<3|z&7}r=a}for(T=0;T<h;T++){z=0|T*C;V=F*(z&b)|(z&7)<<3;for(d=0;d<Q;d++){v[Y]=u[V+$[d]];Y+=m}}}var P=this.V;if(!f&&m===4&&!P){P=new Int32Array([-256,255,-256,255,-256,255,-256,255])}if(P){for(U=0;U<j;){for(z=0,J=0;z<m;z++,U++,J+=2){v[U]=(v[U]*P[J]>>8)+P[J+1]}}}return v},get f(){if(this.b){return!!this.b.a}if(this.p===3){if(this.N===0){return!1}else if(this.W[0].index===82&&this.W[1].index===71&&this.W[2].index===66){return!1}return!0}if(this.N===1){return!0}return!1},z:function aj(Q){var h,f,G;
  24. for(var n=0,E=Q.length;n<E;n+=3){h=Q[n];f=Q[n+1];G=Q[n+2];Q[n]=h-179.456+1.402*G;Q[n+1]=h+135.459-.344*f-.714*G;Q[n+2]=h-226.816+1.772*f}return Q},O:function aa(Q){var h,f,G,n,E=0;for(var a=0,C=Q.length;a<C;a+=4){h=Q[a];f=Q[a+1];G=Q[a+2];n=Q[a+3];Q[E++]=-122.67195406894+f*(-660635669420364e-19*f+.000437130475926232*G-54080610064599e-18*h+.00048449797120281*n-.154362151871126)+G*(-.000957964378445773*G+.000817076911346625*h-.00477271405408747*n+1.53380253221734)+h*(.000961250184130688*h-.00266257332283933*n+.48357088451265)+n*(-.000336197177618394*n+.484791561490776);
  25. Q[E++]=107.268039397724+f*(219927104525741e-19*f-.000640992018297945*G+.000659397001245577*h+.000426105652938837*n-.176491792462875)+G*(-.000778269941513683*G+.00130872261408275*h+.000770482631801132*n-.151051492775562)+h*(.00126935368114843*h-.00265090189010898*n+.25802910206845)+n*(-.000318913117588328*n-.213742400323665);Q[E++]=-20.810012546947+f*(-.000570115196973677*f-263409051004589e-19*G+.0020741088115012*h-.00288260236853442*n+.814272968359295)+G*(-153496057440975e-19*G-.000132689043961446*h+.000560833691242812*n-.195152027534049)+h*(.00174418132927582*h-.00255243321439347*n+.116935020465145)+n*(-.000343531996510555*n+.24165260232407)}return Q.subarray(0,E)},r:function a3(Q){var h,f,G;
  26. for(var n=0,E=Q.length;n<E;n+=4){h=Q[n];f=Q[n+1];G=Q[n+2];Q[n]=434.456-h-1.402*G;Q[n+1]=119.541-h+.344*f+.714*G;Q[n+2]=481.816-h-1.772*f}return Q},U:function as(Q){var h,f,G,n,E=0;for(var a=0,C=Q.length;a<C;a+=4){h=Q[a];f=Q[a+1];G=Q[a+2];n=Q[a+3];Q[E++]=255+h*(-6747147073602441e-20*h+.0008379262121013727*f+.0002894718188643294*G+.003264231057537806*n-1.1185611867203937)+f*(26374107616089404e-21*f-8626949158638572e-20*G-.0002748769067499491*n-.02155688794978967)+G*(-3878099212869363e-20*G-.0003267808279485286*n+.0686742238595345)-n*(.0003361971776183937*n+.7430659151342254);
  27. Q[E++]=255+h*(.00013596372813588848*h+.000924537132573585*f+.00010567359618683593*G+.0004791864687436512*n-.3109689587515875)+f*(-.00023545346108370344*f+.0002702845253534714*G+.0020200308977307156*n-.7488052167015494)+G*(6834815998235662e-20*G+.00015168452363460973*n-.09751927774728933)-n*(.0003189131175883281*n+.7364883807733168);Q[E++]=255+h*(13598650411385308e-21*h+.00012423956175490851*f+.0004751985097583589*G-36729317476630424e-22*n-.05562186980264034)+f*(.00016141380598724676*f+.0009692239130725186*G+.0007782692450036253*n-.44015232367526463)+G*(5.068882914068769e-7*G+.0017778369011375071*n-.7591454649749609)-n*(.0003435319965105553*n+.7063770186160144)}return Q.subarray(0,E)},getData:function(Q){var h=Q.width,f=Q.height,G=Q.forceRGB,n=Q.isSourcePDF;
  28. if(this.p>4){throw new W("Unsupported color mode")}var E=this.Y(h,f,n);if(this.p===1&&G){var a=E.length,C=new Uint8ClampedArray(a*3),F=0;for(var d=0;d<a;d++){var T=E[d];C[F++]=T;C[F++]=T;C[F++]=T}return C}else if(this.p===3&&this.f){return this.z(E)}else if(this.p===4){if(this.f){if(G){return this.O(E)}return this.r(E)}else if(G){return this.U(E)}}return E}};return ak}();function a9(p,t){return p[t]<<24>>24}function Z(p,t){return p[t]<<8|p[t+1]}function am(p,t){return(p[t]<<24|p[t+1]<<16|p[t+2]<<8|p[t+3])>>>0}UTIF.JpegDecoder=ak}());
  29. //UTIF.JpegDecoder = PDFJS.JpegImage;
  30. UTIF.encodeImage = function(rgba, w, h, metadata)
  31. {
  32. var idf = { "t256":[w], "t257":[h], "t258":[8,8,8,8], "t259":[1], "t262":[2], "t273":[1000], // strips offset
  33. "t277":[4], "t278":[h], /* rows per strip */ "t279":[w*h*4], // strip byte counts
  34. "t282":[[72,1]], "t283":[[72,1]], "t284":[1], "t286":[[0,1]], "t287":[[0,1]], "t296":[1], "t305": ["Photopea (UTIF.js)"], "t338":[1]
  35. };
  36. if (metadata) for (var i in metadata) idf[i] = metadata[i];
  37. var prfx = new Uint8Array(UTIF.encode([idf]));
  38. var img = new Uint8Array(rgba);
  39. var data = new Uint8Array(1000+w*h*4);
  40. for(var i=0; i<prfx.length; i++) data[i] = prfx[i];
  41. for(var i=0; i<img .length; i++) data[1000+i] = img[i];
  42. return data.buffer;
  43. }
  44. UTIF.encode = function(ifds)
  45. {
  46. var LE = false;
  47. var data = new Uint8Array(20000), offset = 4, bin = LE ? UTIF._binLE : UTIF._binBE;
  48. data[0]=data[1]=LE?73:77; bin.writeUshort(data,2,42);
  49. var ifdo = 8;
  50. bin.writeUint(data, offset, ifdo); offset+=4;
  51. for(var i=0; i<ifds.length; i++)
  52. {
  53. var noffs = UTIF._writeIFD(bin, UTIF._types.basic, data, ifdo, ifds[i]);
  54. ifdo = noffs[1];
  55. if(i<ifds.length-1) {
  56. if((ifdo&3)!=0) ifdo+=(4-(ifdo&3)); // make each IFD start at multiple of 4
  57. bin.writeUint(data, noffs[0], ifdo);
  58. }
  59. }
  60. return data.slice(0, ifdo).buffer;
  61. }
  62. UTIF.decode = function(buff, prm)
  63. {
  64. if(prm==null) prm = {parseMN:true, debug:false}; // read MakerNote, debug
  65. var data = new Uint8Array(buff), offset = 0;
  66. var id = UTIF._binBE.readASCII(data, offset, 2); offset+=2;
  67. var bin = id=="II" ? UTIF._binLE : UTIF._binBE;
  68. var num = bin.readUshort(data, offset); offset+=2;
  69. var ifdo = bin.readUint(data, offset); offset+=4;
  70. var ifds = [];
  71. while(true) {
  72. var noff = UTIF._readIFD(bin, data, ifdo, ifds, 0, prm);
  73. ifdo = bin.readUint(data, noff);
  74. if(ifdo==0 || noff==0) break;
  75. }
  76. return ifds;
  77. }
  78. UTIF.decodeImage = function(buff, img, ifds)
  79. {
  80. if(img.data) return;
  81. var data = new Uint8Array(buff);
  82. var id = UTIF._binBE.readASCII(data, 0, 2);
  83. if(img["t256"]==null) return; // No width => probably not an image
  84. img.isLE = id=="II";
  85. img.width = img["t256"][0]; //delete img["t256"];
  86. img.height = img["t257"][0]; //delete img["t257"];
  87. var cmpr = img["t259"] ? img["t259"][0] : 1; //delete img["t259"];
  88. var fo = img["t266"] ? img["t266"][0] : 1; //delete img["t266"];
  89. if(img["t284"] && img["t284"][0]==2) log("PlanarConfiguration 2 should not be used!");
  90. var bipp; // bits per pixel
  91. if(img["t258"]) bipp = Math.min(32,img["t258"][0])*img["t258"].length;
  92. else bipp = (img["t277"]?img["t277"][0]:1);
  93. // Some .NEF files have t258==14, even though they use 16 bits per pixel
  94. if(cmpr==1 && img["t279"]!=null && img["t278"] && img["t262"][0]==32803) {
  95. bipp = Math.round((img["t279"][0]*8)/(img.width*img["t278"][0]));
  96. }
  97. var bipl = Math.ceil(img.width*bipp/8)*8;
  98. var soff = img["t273"]; if(soff==null) soff = img["t324"];
  99. var bcnt = img["t279"]; if(cmpr==1 && soff.length==1) bcnt = [img.height*(bipl>>>3)]; if(bcnt==null) bcnt = img["t325"];
  100. var bytes = new Uint8Array(img.height*(bipl>>>3)), bilen = 0;
  101. if(img["t322"]!=null) // tiled
  102. {
  103. var tw = img["t322"][0], th = img["t323"][0];
  104. var tx = Math.floor((img.width + tw - 1) / tw);
  105. var ty = Math.floor((img.height + th - 1) / th);
  106. var tbuff = new Uint8Array(Math.ceil(tw*th*bipp/8)|0);
  107. for(var y=0; y<ty; y++)
  108. for(var x=0; x<tx; x++)
  109. {
  110. var i = y*tx+x; for(var j=0; j<tbuff.length; j++) tbuff[j]=0;
  111. UTIF.decode._decompress(img,ifds, data, soff[i], bcnt[i], cmpr, tbuff, 0, fo);
  112. // Might be required for 7 too. Need to check
  113. if (cmpr==6) bytes = tbuff;
  114. else UTIF._copyTile(tbuff, Math.ceil(tw*bipp/8)|0, th, bytes, Math.ceil(img.width*bipp/8)|0, img.height, Math.ceil(x*tw*bipp/8)|0, y*th);
  115. }
  116. bilen = bytes.length*8;
  117. }
  118. else // stripped
  119. {
  120. var rps = img["t278"] ? img["t278"][0] : img.height; rps = Math.min(rps, img.height);
  121. for(var i=0; i<soff.length; i++)
  122. {
  123. UTIF.decode._decompress(img,ifds, data, soff[i], bcnt[i], cmpr, bytes, Math.ceil(bilen/8)|0, fo);
  124. bilen += bipl * rps;
  125. }
  126. bilen = Math.min(bilen, bytes.length*8);
  127. }
  128. img.data = new Uint8Array(bytes.buffer, 0, Math.ceil(bilen/8)|0);
  129. }
  130. UTIF.decode._decompress = function(img,ifds, data, off, len, cmpr, tgt, toff, fo) // fill order
  131. {
  132. //console.log("compression", cmpr);
  133. //var time = Date.now();
  134. if(false) {}
  135. else if(cmpr==1 || (len==tgt.length && cmpr!=32767)) for(var j=0; j<len; j++) tgt[toff+j] = data[off+j];
  136. else if(cmpr==3) UTIF.decode._decodeG3 (data, off, len, tgt, toff, img.width, fo, img["t292"]?((img["t292"][0]&1)==1):false);
  137. else if(cmpr==4) UTIF.decode._decodeG4 (data, off, len, tgt, toff, img.width, fo);
  138. else if(cmpr==5) UTIF.decode._decodeLZW(data, off, len, tgt, toff,8);
  139. else if(cmpr==6) UTIF.decode._decodeOldJPEG(img, data, off, len, tgt, toff);
  140. else if(cmpr==7) UTIF.decode._decodeNewJPEG(img, data, off, len, tgt, toff);
  141. else if(cmpr==8) { var src = new Uint8Array(data.buffer,off,len); var bin = pako["inflate"](src); for(var i=0; i<bin.length; i++) tgt[toff+i]=bin[i]; }
  142. else if(cmpr==32767) UTIF.decode._decodeARW(img, data, off, len, tgt, toff);
  143. else if(cmpr==32773) UTIF.decode._decodePackBits(data, off, len, tgt, toff);
  144. else if(cmpr==32809) UTIF.decode._decodeThunder (data, off, len, tgt, toff);
  145. else if(cmpr==34713) //for(var j=0; j<len; j++) tgt[toff+j] = data[off+j];
  146. UTIF.decode._decodeNikon (img,ifds, data, off, len, tgt, toff);
  147. else log("Unknown compression", cmpr);
  148. //console.log(Date.now()-time);
  149. var bps = (img["t258"]?Math.min(32,img["t258"][0]):1);
  150. var noc = (img["t277"]?img["t277"][0]:1), bpp=(bps*noc)>>>3, h = (img["t278"] ? img["t278"][0] : img.height), bpl = Math.ceil(bps*noc*img.width/8);
  151. // convert to Little Endian /*
  152. if(bps==16 && !img.isLE && img["t33422"]==null) // not DNG
  153. for(var y=0; y<h; y++) {
  154. //console.log("fixing endianity");
  155. var roff = toff+y*bpl;
  156. for(var x=1; x<bpl; x+=2) { var t=tgt[roff+x]; tgt[roff+x]=tgt[roff+x-1]; tgt[roff+x-1]=t; }
  157. } //*/
  158. if(img["t317"] && img["t317"][0]==2)
  159. {
  160. for(var y=0; y<h; y++)
  161. {
  162. var ntoff = toff+y*bpl;
  163. if(bps==16) for(var j=bpp; j<bpl; j+=2) {
  164. var nv = ((tgt[ntoff+j+1]<<8)|tgt[ntoff+j]) + ((tgt[ntoff+j-bpp+1]<<8)|tgt[ntoff+j-bpp]);
  165. tgt[ntoff+j] = nv&255; tgt[ntoff+j+1] = (nv>>>8)&255;
  166. }
  167. else if(noc==3) for(var j= 3; j<bpl; j+=3)
  168. {
  169. tgt[ntoff+j ] = (tgt[ntoff+j ] + tgt[ntoff+j-3])&255;
  170. tgt[ntoff+j+1] = (tgt[ntoff+j+1] + tgt[ntoff+j-2])&255;
  171. tgt[ntoff+j+2] = (tgt[ntoff+j+2] + tgt[ntoff+j-1])&255;
  172. }
  173. else for(var j=bpp; j<bpl; j++) tgt[ntoff+j] = (tgt[ntoff+j] + tgt[ntoff+j-bpp])&255;
  174. }
  175. }
  176. }
  177. UTIF.decode._ljpeg_diff = function(data, prm, huff) {
  178. var getbithuff = UTIF.decode._getbithuff;
  179. var len, diff;
  180. len = getbithuff(data, prm, huff[0], huff);
  181. diff = getbithuff(data, prm, len, 0);
  182. if ((diff & (1 << (len-1))) == 0) diff -= (1 << len) - 1;
  183. return diff;
  184. }
  185. UTIF.decode._decodeARW = function(img, inp, off, src_length, tgt, toff) {
  186. var raw_width = img["t256"][0], height=img["t257"][0], tiff_bps=img["t258"][0];
  187. var bin=(img.isLE ? UTIF._binLE : UTIF._binBE);
  188. //console.log(raw_width, height, tiff_bps, raw_width*height, src_length);
  189. var arw2 = (raw_width*height == src_length) || (raw_width*height*1.5 == src_length);
  190. //arw2 = true;
  191. //console.log("ARW2: ", arw2, raw_width*height, src_length, tgt.length);
  192. if(!arw2) { //"sony_arw_load_raw"; // not arw2
  193. height+=8;
  194. var prm = [off,0,0,0];
  195. var huff = new Uint16Array(32770);
  196. var tab = [ 0xf11,0xf10,0xe0f,0xd0e,0xc0d,0xb0c,0xa0b,0x90a,0x809,
  197. 0x708,0x607,0x506,0x405,0x304,0x303,0x300,0x202,0x201 ];
  198. var i, c, n, col, row, sum=0;
  199. var ljpeg_diff = UTIF.decode._ljpeg_diff;
  200. huff[0] = 15;
  201. for (n=i=0; i < 18; i++) {
  202. var lim = 32768 >>> (tab[i] >>> 8);
  203. for(var c=0; c<lim; c++) huff[++n] = tab[i];
  204. }
  205. for (col = raw_width; col--; )
  206. for (row=0; row < height+1; row+=2) {
  207. if (row == height) row = 1;
  208. sum += ljpeg_diff(inp, prm, huff);
  209. if (row < height) {
  210. var clr = (sum)&4095;
  211. UTIF.decode._putsF(tgt, (row*raw_width+col)*tiff_bps, clr<<(16-tiff_bps));
  212. }
  213. }
  214. return;
  215. }
  216. if(raw_width*height*1.5==src_length) {
  217. //console.log("weird compression");
  218. for(var i=0; i<src_length; i+=3) { var b0=inp[off+i+0], b1=inp[off+i+1], b2=inp[off+i+2];
  219. tgt[toff+i]=(b1<<4)|(b0>>>4); tgt[toff+i+1]=(b0<<4)|(b2>>>4); tgt[toff+i+2]=(b2<<4)|(b1>>>4); }
  220. return;
  221. }
  222. var pix = new Uint16Array(16);
  223. var row, col, val, max, min, imax, imin, sh, bit, i, dp;
  224. var data = new Uint8Array(raw_width+1);
  225. for (row=0; row < height; row++) {
  226. //fread (data, 1, raw_width, ifp);
  227. for(var j=0; j<raw_width; j++) data[j]=inp[off++];
  228. for (dp=0, col=0; col < raw_width-30; dp+=16) {
  229. max = 0x7ff & (val = bin.readUint(data,dp));
  230. min = 0x7ff & (val >>> 11);
  231. imax = 0x0f & (val >>> 22);
  232. imin = 0x0f & (val >>> 26);
  233. for (sh=0; sh < 4 && 0x80 << sh <= max-min; sh++);
  234. for (bit=30, i=0; i < 16; i++)
  235. if (i == imax) pix[i] = max;
  236. else if (i == imin) pix[i] = min;
  237. else {
  238. pix[i] = ((bin.readUshort(data, dp+(bit >> 3)) >>> (bit & 7) & 0x7f) << sh) + min;
  239. if (pix[i] > 0x7ff) pix[i] = 0x7ff;
  240. bit += 7;
  241. }
  242. for (i=0; i < 16; i++, col+=2) {
  243. //RAW(row,col) = curve[pix[i] << 1] >> 2;
  244. var clr = pix[i]<<1; //clr = 0xffff;
  245. UTIF.decode._putsF(tgt, (row*raw_width+col)*tiff_bps, clr<<(16-tiff_bps));
  246. }
  247. col -= col & 1 ? 1:31;
  248. }
  249. }
  250. }
  251. UTIF.decode._decodeNikon = function(img,imgs, data, off, src_length, tgt, toff)
  252. {
  253. var nikon_tree = [
  254. [ 0, 0,1,5,1,1,1,1,1,1,2,0,0,0,0,0,0, /* 12-bit lossy */
  255. 5,4,3,6,2,7,1,0,8,9,11,10,12 ],
  256. [ 0, 0,1,5,1,1,1,1,1,1,2,0,0,0,0,0,0, /* 12-bit lossy after split */
  257. 0x39,0x5a,0x38,0x27,0x16,5,4,3,2,1,0,11,12,12 ],
  258. [ 0, 0,1,4,2,3,1,2,0,0,0,0,0,0,0,0,0, /* 12-bit lossless */
  259. 5,4,6,3,7,2,8,1,9,0,10,11,12 ],
  260. [ 0, 0,1,4,3,1,1,1,1,1,2,0,0,0,0,0,0, /* 14-bit lossy */
  261. 5,6,4,7,8,3,9,2,1,0,10,11,12,13,14 ],
  262. [ 0, 0,1,5,1,1,1,1,1,1,1,2,0,0,0,0,0, /* 14-bit lossy after split */
  263. 8,0x5c,0x4b,0x3a,0x29,7,6,5,4,3,2,1,0,13,14 ],
  264. [ 0, 0,1,4,2,2,3,1,2,0,0,0,0,0,0,0,0, /* 14-bit lossless */
  265. 7,6,8,5,9,4,10,3,11,12,2,0,1,13,14 ] ];
  266. var raw_width = img["t256"][0], height=img["t257"][0], tiff_bps=img["t258"][0];
  267. var tree = 0, split = 0;
  268. var make_decoder = UTIF.decode._make_decoder;
  269. var getbithuff = UTIF.decode._getbithuff;
  270. var mn = imgs[0].exifIFD.makerNote, md = mn["t150"]?mn["t150"]:mn["t140"], mdo=0; //console.log(mn,md);
  271. //console.log(md[0].toString(16), md[1].toString(16), tiff_bps);
  272. var ver0 = md[mdo++], ver1 = md[mdo++];
  273. if (ver0 == 0x49 || ver1 == 0x58) mdo+=2110;
  274. if (ver0 == 0x46) tree = 2;
  275. if (tiff_bps == 14) tree += 3;
  276. var vpred = [[0,0],[0,0]], bin=(img.isLE ? UTIF._binLE : UTIF._binBE);
  277. for(var i=0; i<2; i++) for(var j=0; j<2; j++) { vpred[i][j] = bin.readShort(md,mdo); mdo+=2; } // not sure here ... [i][j] or [j][i]
  278. //console.log(vpred);
  279. var max = 1 << tiff_bps & 0x7fff, step=0;
  280. var csize = bin.readShort(md,mdo); mdo+=2;
  281. if (csize > 1) step = Math.floor(max / (csize-1));
  282. if (ver0 == 0x44 && ver1 == 0x20 && step > 0) split = bin.readShort(md,562);
  283. var i;
  284. var row, col;
  285. var len, shl, diff;
  286. var min_v = 0;
  287. var hpred = [0,0];
  288. var huff = make_decoder(nikon_tree[tree]);
  289. //var g_input_offset=0, bitbuf=0, vbits=0, reset=0;
  290. var prm = [off,0,0,0];
  291. //console.log(split); split = 170;
  292. for (min_v=row=0; row < height; row++) {
  293. if (split && row == split) {
  294. //free (huff);
  295. huff = make_decoder (nikon_tree[tree+1]);
  296. //max_v += (min_v = 16) << 1;
  297. }
  298. for (col=0; col < raw_width; col++) {
  299. i = getbithuff(data,prm,huff[0],huff);
  300. len = i & 15;
  301. shl = i >>> 4;
  302. diff = (((getbithuff(data,prm,len-shl,0) << 1) + 1) << shl) >>> 1;
  303. if ((diff & (1 << (len-1))) == 0)
  304. diff -= (1 << len) - (shl==0?1:0);
  305. if (col < 2) hpred[col] = vpred[row & 1][col] += diff;
  306. else hpred[col & 1] += diff;
  307. var clr = Math.min(Math.max(hpred[col & 1],0),(1<<tiff_bps)-1);
  308. var bti = (row*raw_width+col)*tiff_bps;
  309. UTIF.decode._putsF(tgt, bti, clr<<(16-tiff_bps));
  310. }
  311. }
  312. }
  313. // put 16 bits
  314. UTIF.decode._putsF= function(dt, pos, val) { val = val<<(8-(pos&7)); var o=(pos>>>3); dt[o]|=val>>>16; dt[o+1]|=val>>>8; dt[o+2]|=val; }
  315. UTIF.decode._getbithuff = function(data,prm,nbits, huff) {
  316. var zero_after_ff = 0;
  317. var get_byte = UTIF.decode._get_byte;
  318. var c;
  319. var off=prm[0], bitbuf=prm[1], vbits=prm[2], reset=prm[3];
  320. //if (nbits > 25) return 0;
  321. //if (nbits < 0) return bitbuf = vbits = reset = 0;
  322. if (nbits == 0 || vbits < 0) return 0;
  323. while (!reset && vbits < nbits && (c = data[off++]) != -1 &&
  324. !(reset = zero_after_ff && c == 0xff && data[off++])) {
  325. //console.log("byte read into c");
  326. bitbuf = (bitbuf << 8) + c;
  327. vbits += 8;
  328. }
  329. c = (bitbuf << (32-vbits)) >>> (32-nbits);
  330. if (huff) {
  331. vbits -= huff[c+1] >>> 8; //console.log(c, huff[c]>>8);
  332. c = huff[c+1]&255;
  333. } else
  334. vbits -= nbits;
  335. if (vbits < 0) throw "e";
  336. prm[0]=off; prm[1]=bitbuf; prm[2]=vbits; prm[3]=reset;
  337. return c;
  338. }
  339. UTIF.decode._make_decoder = function(source) {
  340. var max, len, h, i, j;
  341. var huff = [];
  342. for (max=16; max!=0 && !source[max]; max--);
  343. var si=17;
  344. huff[0] = max;
  345. for (h=len=1; len <= max; len++)
  346. for (i=0; i < source[len]; i++, ++si)
  347. for (j=0; j < 1 << (max-len); j++)
  348. if (h <= 1 << max)
  349. huff[h++] = (len << 8) | source[si];
  350. return huff;
  351. }
  352. UTIF.decode._decodeNewJPEG = function(img, data, off, len, tgt, toff)
  353. {
  354. var tables = img["t347"], tlen = tables ? tables.length : 0, buff = new Uint8Array(tlen + len);
  355. if (tables) {
  356. var SOI = 216, EOI = 217, boff = 0;
  357. for (var i=0; i<(tlen-1); i++)
  358. {
  359. // Skip EOI marker from JPEGTables
  360. if (tables[i]==255 && tables[i+1]==EOI) break;
  361. buff[boff++] = tables[i];
  362. }
  363. // Skip SOI marker from data
  364. var byte1 = data[off], byte2 = data[off + 1];
  365. if (byte1!=255 || byte2!=SOI)
  366. {
  367. buff[boff++] = byte1;
  368. buff[boff++] = byte2;
  369. }
  370. for (var i=2; i<len; i++) buff[boff++] = data[off+i];
  371. }
  372. else for (var i=0; i<len; i++) buff[i] = data[off+i];
  373. if(img["t262"][0]==32803 || img["t262"][0]==34892) // lossless JPEG and lossy JPEG (used in DNG files)
  374. {
  375. var bps = img["t258"][0];//, dcdr = new LosslessJpegDecoder();
  376. var out = UTIF.LosslessJpegDecode(buff), olen=out.length; //console.log(olen);
  377. if(false) {}
  378. else if(bps==16) {
  379. if(img.isLE) for(var i=0; i<olen; i++ ) { tgt[toff+(i<<1)] = (out[i]&255); tgt[toff+(i<<1)+1] = (out[i]>>>8); }
  380. else for(var i=0; i<olen; i++ ) { tgt[toff+(i<<1)] = (out[i]>>>8); tgt[toff+(i<<1)+1] = (out[i]&255); }
  381. }
  382. else if(bps==14 || bps==12) { // 4 * 14 == 56 == 7 * 8
  383. var rst = 16-bps;
  384. for(var i=0; i<olen; i++) UTIF.decode._putsF(tgt, i*bps, out[i]<<rst);
  385. }
  386. else if(bps==8) {
  387. for(var i=0; i<olen; i++) tgt[toff+i]=out[i];
  388. }
  389. else throw new Error("unsupported bit depth "+bps);
  390. }
  391. else
  392. {
  393. var parser = new UTIF.JpegDecoder(); parser.parse(buff);
  394. var decoded = parser.getData({"width":parser.width,"height":parser.height,"forceRGB":true,"isSourcePDF":false});
  395. for (var i=0; i<decoded.length; i++) tgt[toff + i] = decoded[i];
  396. }
  397. // PhotometricInterpretation is 6 (YCbCr) for JPEG, but after decoding we populate data in
  398. // RGB format, so updating the tag value
  399. if(img["t262"][0] == 6) img["t262"][0] = 2;
  400. }
  401. UTIF.decode._decodeOldJPEGInit = function(img, data, off, len)
  402. {
  403. var SOI = 216, EOI = 217, DQT = 219, DHT = 196, DRI = 221, SOF0 = 192, SOS = 218;
  404. var joff = 0, soff = 0, tables, sosMarker, isTiled = false, i, j, k;
  405. var jpgIchgFmt = img["t513"], jifoff = jpgIchgFmt ? jpgIchgFmt[0] : 0;
  406. var jpgIchgFmtLen = img["t514"], jiflen = jpgIchgFmtLen ? jpgIchgFmtLen[0] : 0;
  407. var soffTag = img["t324"] || img["t273"] || jpgIchgFmt;
  408. var ycbcrss = img["t530"], ssx = 0, ssy = 0;
  409. var spp = img["t277"]?img["t277"][0]:1;
  410. var jpgresint = img["t515"];
  411. if(soffTag)
  412. {
  413. soff = soffTag[0];
  414. isTiled = (soffTag.length > 1);
  415. }
  416. if(!isTiled)
  417. {
  418. if(data[off]==255 && data[off+1]==SOI) return { jpegOffset: off };
  419. if(jpgIchgFmt!=null)
  420. {
  421. if(data[off+jifoff]==255 && data[off+jifoff+1]==SOI) joff = off+jifoff;
  422. else log("JPEGInterchangeFormat does not point to SOI");
  423. if(jpgIchgFmtLen==null) log("JPEGInterchangeFormatLength field is missing");
  424. else if(jifoff >= soff || (jifoff+jiflen) <= soff) log("JPEGInterchangeFormatLength field value is invalid");
  425. if(joff != null) return { jpegOffset: joff };
  426. }
  427. }
  428. if(ycbcrss!=null) { ssx = ycbcrss[0]; ssy = ycbcrss[1]; }
  429. if(jpgIchgFmt!=null)
  430. if(jpgIchgFmtLen!=null)
  431. if(jiflen >= 2 && (jifoff+jiflen) <= soff)
  432. {
  433. if(data[off+jifoff+jiflen-2]==255 && data[off+jifoff+jiflen-1]==SOI) tables = new Uint8Array(jiflen-2);
  434. else tables = new Uint8Array(jiflen);
  435. for(i=0; i<tables.length; i++) tables[i] = data[off+jifoff+i];
  436. log("Incorrect JPEG interchange format: using JPEGInterchangeFormat offset to derive tables");
  437. }
  438. else log("JPEGInterchangeFormat+JPEGInterchangeFormatLength > offset to first strip or tile");
  439. if(tables == null)
  440. {
  441. var ooff = 0, out = [];
  442. out[ooff++] = 255; out[ooff++] = SOI;
  443. var qtables = img["t519"];
  444. if(qtables==null) throw new Error("JPEGQTables tag is missing");
  445. for(i=0; i<qtables.length; i++)
  446. {
  447. out[ooff++] = 255; out[ooff++] = DQT; out[ooff++] = 0; out[ooff++] = 67; out[ooff++] = i;
  448. for(j=0; j<64; j++) out[ooff++] = data[off+qtables[i]+j];
  449. }
  450. for(k=0; k<2; k++)
  451. {
  452. var htables = img[(k == 0) ? "t520" : "t521"];
  453. if(htables==null) throw new Error(((k == 0) ? "JPEGDCTables" : "JPEGACTables") + " tag is missing");
  454. for(i=0; i<htables.length; i++)
  455. {
  456. out[ooff++] = 255; out[ooff++] = DHT;
  457. //out[ooff++] = 0; out[ooff++] = 67; out[ooff++] = i;
  458. var nc = 19;
  459. for(j=0; j<16; j++) nc += data[off+htables[i]+j];
  460. out[ooff++] = (nc >>> 8); out[ooff++] = nc & 255;
  461. out[ooff++] = (i | (k << 4));
  462. for(j=0; j<16; j++) out[ooff++] = data[off+htables[i]+j];
  463. for(j=0; j<nc; j++) out[ooff++] = data[off+htables[i]+16+j];
  464. }
  465. }
  466. out[ooff++] = 255; out[ooff++] = SOF0;
  467. out[ooff++] = 0; out[ooff++] = 8 + 3*spp; out[ooff++] = 8;
  468. out[ooff++] = (img.height >>> 8) & 255; out[ooff++] = img.height & 255;
  469. out[ooff++] = (img.width >>> 8) & 255; out[ooff++] = img.width & 255;
  470. out[ooff++] = spp;
  471. if(spp==1) { out[ooff++] = 1; out[ooff++] = 17; out[ooff++] = 0; }
  472. else for(i=0; i<3; i++)
  473. {
  474. out[ooff++] = i + 1;
  475. out[ooff++] = (i != 0) ? 17 : (((ssx & 15) << 4) | (ssy & 15));
  476. out[ooff++] = i;
  477. }
  478. if(jpgresint!=null && jpgresint[0]!=0)
  479. {
  480. out[ooff++] = 255; out[ooff++] = DRI; out[ooff++] = 0; out[ooff++] = 4;
  481. out[ooff++] = (jpgresint[0] >>> 8) & 255;
  482. out[ooff++] = jpgresint[0] & 255;
  483. }
  484. tables = new Uint8Array(out);
  485. }
  486. var sofpos = -1;
  487. i = 0;
  488. while(i < (tables.length - 1)) {
  489. if(tables[i]==255 && tables[i+1]==SOF0) { sofpos = i; break; }
  490. i++;
  491. }
  492. if(sofpos == -1)
  493. {
  494. var tmptab = new Uint8Array(tables.length + 10 + 3*spp);
  495. tmptab.set(tables);
  496. var tmpoff = tables.length;
  497. sofpos = tables.length;
  498. tables = tmptab;
  499. tables[tmpoff++] = 255; tables[tmpoff++] = SOF0;
  500. tables[tmpoff++] = 0; tables[tmpoff++] = 8 + 3*spp; tables[tmpoff++] = 8;
  501. tables[tmpoff++] = (img.height >>> 8) & 255; tables[tmpoff++] = img.height & 255;
  502. tables[tmpoff++] = (img.width >>> 8) & 255; tables[tmpoff++] = img.width & 255;
  503. tables[tmpoff++] = spp;
  504. if(spp==1) { tables[tmpoff++] = 1; tables[tmpoff++] = 17; tables[tmpoff++] = 0; }
  505. else for(i=0; i<3; i++)
  506. {
  507. tables[tmpoff++] = i + 1;
  508. tables[tmpoff++] = (i != 0) ? 17 : (((ssx & 15) << 4) | (ssy & 15));
  509. tables[tmpoff++] = i;
  510. }
  511. }
  512. if(data[soff]==255 && data[soff+1]==SOS)
  513. {
  514. var soslen = (data[soff+2]<<8) | data[soff+3];
  515. sosMarker = new Uint8Array(soslen+2);
  516. sosMarker[0] = data[soff]; sosMarker[1] = data[soff+1]; sosMarker[2] = data[soff+2]; sosMarker[3] = data[soff+3];
  517. for(i=0; i<(soslen-2); i++) sosMarker[i+4] = data[soff+i+4];
  518. }
  519. else
  520. {
  521. sosMarker = new Uint8Array(2 + 6 + 2*spp);
  522. var sosoff = 0;
  523. sosMarker[sosoff++] = 255; sosMarker[sosoff++] = SOS;
  524. sosMarker[sosoff++] = 0; sosMarker[sosoff++] = 6 + 2*spp; sosMarker[sosoff++] = spp;
  525. if(spp==1) { sosMarker[sosoff++] = 1; sosMarker[sosoff++] = 0; }
  526. else for(i=0; i<3; i++)
  527. {
  528. sosMarker[sosoff++] = i+1; sosMarker[sosoff++] = (i << 4) | i;
  529. }
  530. sosMarker[sosoff++] = 0; sosMarker[sosoff++] = 63; sosMarker[sosoff++] = 0;
  531. }
  532. return { jpegOffset: off, tables: tables, sosMarker: sosMarker, sofPosition: sofpos };
  533. }
  534. UTIF.decode._decodeOldJPEG = function(img, data, off, len, tgt, toff)
  535. {
  536. var i, dlen, tlen, buff, buffoff;
  537. var jpegData = UTIF.decode._decodeOldJPEGInit(img, data, off, len);
  538. if(jpegData.jpegOffset!=null)
  539. {
  540. dlen = off+len-jpegData.jpegOffset;
  541. buff = new Uint8Array(dlen);
  542. for(i=0; i<dlen; i++) buff[i] = data[jpegData.jpegOffset+i];
  543. }
  544. else
  545. {
  546. tlen = jpegData.tables.length;
  547. buff = new Uint8Array(tlen + jpegData.sosMarker.length + len + 2);
  548. buff.set(jpegData.tables);
  549. buffoff = tlen;
  550. buff[jpegData.sofPosition+5] = (img.height >>> 8) & 255; buff[jpegData.sofPosition+6] = img.height & 255;
  551. buff[jpegData.sofPosition+7] = (img.width >>> 8) & 255; buff[jpegData.sofPosition+8] = img.width & 255;
  552. if(data[off]!=255 || data[off+1]!=SOS)
  553. {
  554. buff.set(jpegData.sosMarker, buffoff);
  555. buffoff += sosMarker.length;
  556. }
  557. for(i=0; i<len; i++) buff[buffoff++] = data[off+i];
  558. buff[buffoff++] = 255; buff[buffoff++] = EOI;
  559. }
  560. var parser = new UTIF.JpegDecoder(); parser.parse(buff);
  561. var decoded = parser.getData({"width":parser.width,"height":parser.height,"forceRGB":true,"isSourcePDF":false});
  562. for (var i=0; i<decoded.length; i++) tgt[toff + i] = decoded[i];
  563. // PhotometricInterpretation is 6 (YCbCr) for JPEG, but after decoding we populate data in
  564. // RGB format, so updating the tag value
  565. if(img["t262"] && img["t262"][0] == 6) img["t262"][0] = 2;
  566. }
  567. UTIF.decode._decodePackBits = function(data, off, len, tgt, toff)
  568. {
  569. var sa = new Int8Array(data.buffer), ta = new Int8Array(tgt.buffer), lim = off+len;
  570. while(off<lim)
  571. {
  572. var n = sa[off]; off++;
  573. if(n>=0 && n<128) for(var i=0; i< n+1; i++) { ta[toff]=sa[off]; toff++; off++; }
  574. if(n>=-127 && n<0) { for(var i=0; i<-n+1; i++) { ta[toff]=sa[off]; toff++; } off++; }
  575. }
  576. }
  577. UTIF.decode._decodeThunder = function(data, off, len, tgt, toff)
  578. {
  579. var d2 = [ 0, 1, 0, -1 ], d3 = [ 0, 1, 2, 3, 0, -3, -2, -1 ];
  580. var lim = off+len, qoff = toff*2, px = 0;
  581. while(off<lim)
  582. {
  583. var b = data[off], msk = (b>>>6), n = (b&63); off++;
  584. if(msk==3) { px=(n&15); tgt[qoff>>>1] |= (px<<(4*(1-qoff&1))); qoff++; }
  585. if(msk==0) for(var i=0; i<n; i++) { tgt[qoff>>>1] |= (px<<(4*(1-qoff&1))); qoff++; }
  586. if(msk==2) for(var i=0; i<2; i++) { var d=(n>>>(3*(1-i)))&7; if(d!=4) { px+=d3[d]; tgt[qoff>>>1] |= (px<<(4*(1-qoff&1))); qoff++; } }
  587. if(msk==1) for(var i=0; i<3; i++) { var d=(n>>>(2*(2-i)))&3; if(d!=2) { px+=d2[d]; tgt[qoff>>>1] |= (px<<(4*(1-qoff&1))); qoff++; } }
  588. }
  589. }
  590. UTIF.decode._dmap = { "1":0,"011":1,"000011":2,"0000011":3, "010":-1,"000010":-2,"0000010":-3 };
  591. UTIF.decode._lens = ( function()
  592. {
  593. var addKeys = function(lens, arr, i0, inc) { for(var i=0; i<arr.length; i++) lens[arr[i]] = i0 + i*inc; }
  594. var termW = "00110101,000111,0111,1000,1011,1100,1110,1111,10011,10100,00111,01000,001000,000011,110100,110101," // 15
  595. + "101010,101011,0100111,0001100,0001000,0010111,0000011,0000100,0101000,0101011,0010011,0100100,0011000,00000010,00000011,00011010," // 31
  596. + "00011011,00010010,00010011,00010100,00010101,00010110,00010111,00101000,00101001,00101010,00101011,00101100,00101101,00000100,00000101,00001010," // 47
  597. + "00001011,01010010,01010011,01010100,01010101,00100100,00100101,01011000,01011001,01011010,01011011,01001010,01001011,00110010,00110011,00110100";
  598. var termB = "0000110111,010,11,10,011,0011,0010,00011,000101,000100,0000100,0000101,0000111,00000100,00000111,000011000," // 15
  599. + "0000010111,0000011000,0000001000,00001100111,00001101000,00001101100,00000110111,00000101000,00000010111,00000011000,000011001010,000011001011,000011001100,000011001101,000001101000,000001101001," // 31
  600. + "000001101010,000001101011,000011010010,000011010011,000011010100,000011010101,000011010110,000011010111,000001101100,000001101101,000011011010,000011011011,000001010100,000001010101,000001010110,000001010111," // 47
  601. + "000001100100,000001100101,000001010010,000001010011,000000100100,000000110111,000000111000,000000100111,000000101000,000001011000,000001011001,000000101011,000000101100,000001011010,000001100110,000001100111";
  602. var makeW = "11011,10010,010111,0110111,00110110,00110111,01100100,01100101,01101000,01100111,011001100,011001101,011010010,011010011,011010100,011010101,011010110,"
  603. + "011010111,011011000,011011001,011011010,011011011,010011000,010011001,010011010,011000,010011011";
  604. var makeB = "0000001111,000011001000,000011001001,000001011011,000000110011,000000110100,000000110101,0000001101100,0000001101101,0000001001010,0000001001011,0000001001100,"
  605. + "0000001001101,0000001110010,0000001110011,0000001110100,0000001110101,0000001110110,0000001110111,0000001010010,0000001010011,0000001010100,0000001010101,0000001011010,"
  606. + "0000001011011,0000001100100,0000001100101";
  607. var makeA = "00000001000,00000001100,00000001101,000000010010,000000010011,000000010100,000000010101,000000010110,000000010111,000000011100,000000011101,000000011110,000000011111";
  608. termW = termW.split(","); termB = termB.split(","); makeW = makeW.split(","); makeB = makeB.split(","); makeA = makeA.split(",");
  609. var lensW = {}, lensB = {};
  610. addKeys(lensW, termW, 0, 1); addKeys(lensW, makeW, 64,64); addKeys(lensW, makeA, 1792,64);
  611. addKeys(lensB, termB, 0, 1); addKeys(lensB, makeB, 64,64); addKeys(lensB, makeA, 1792,64);
  612. return [lensW, lensB];
  613. } )();
  614. UTIF.decode._decodeG4 = function(data, off, slen, tgt, toff, w, fo)
  615. {
  616. var U = UTIF.decode, boff=off<<3, len=0, wrd=""; // previous starts with 1
  617. var line=[], pline=[]; for(var i=0; i<w; i++) pline.push(0); pline=U._makeDiff(pline);
  618. var a0=0, a1=0, a2=0, b1=0, b2=0, clr=0;
  619. var y=0, mode="", toRead=0;
  620. var bipl = Math.ceil(w/8)*8;
  621. while((boff>>>3)<off+slen)
  622. {
  623. b1 = U._findDiff(pline, a0+(a0==0?0:1), 1-clr), b2 = U._findDiff(pline, b1, clr); // could be precomputed
  624. var bit =0;
  625. if(fo==1) bit = (data[boff>>>3]>>>(7-(boff&7)))&1;
  626. if(fo==2) bit = (data[boff>>>3]>>>( (boff&7)))&1;
  627. boff++; wrd+=bit;
  628. if(mode=="H")
  629. {
  630. if(U._lens[clr][wrd]!=null)
  631. {
  632. var dl=U._lens[clr][wrd]; wrd=""; len+=dl;
  633. if(dl<64) { U._addNtimes(line,len,clr); a0+=len; clr=1-clr; len=0; toRead--; if(toRead==0) mode=""; }
  634. }
  635. }
  636. else
  637. {
  638. if(wrd=="0001") { wrd=""; U._addNtimes(line,b2-a0,clr); a0=b2; }
  639. if(wrd=="001" ) { wrd=""; mode="H"; toRead=2; }
  640. if(U._dmap[wrd]!=null) { a1 = b1+U._dmap[wrd]; U._addNtimes(line, a1-a0, clr); a0=a1; wrd=""; clr=1-clr; }
  641. }
  642. if(line.length==w && mode=="")
  643. {
  644. U._writeBits(line, tgt, toff*8+y*bipl);
  645. clr=0; y++; a0=0;
  646. pline=U._makeDiff(line); line=[];
  647. }
  648. //if(wrd.length>150) { log(wrd); break; throw "e"; }
  649. }
  650. }
  651. UTIF.decode._findDiff = function(line, x, clr) { for(var i=0; i<line.length; i+=2) if(line[i]>=x && line[i+1]==clr) return line[i]; }
  652. UTIF.decode._makeDiff = function(line)
  653. {
  654. var out = []; if(line[0]==1) out.push(0,1);
  655. for(var i=1; i<line.length; i++) if(line[i-1]!=line[i]) out.push(i, line[i]);
  656. out.push(line.length,0,line.length,1); return out;
  657. }
  658. UTIF.decode._decodeG3 = function(data, off, slen, tgt, toff, w, fo, twoDim)
  659. {
  660. var U = UTIF.decode, boff=off<<3, len=0, wrd="";
  661. var line=[], pline=[]; for(var i=0; i<w; i++) line.push(0);
  662. var a0=0, a1=0, a2=0, b1=0, b2=0, clr=0;
  663. var y=-1, mode="", toRead=0, is1D=true;
  664. var bipl = Math.ceil(w/8)*8;
  665. while((boff>>>3)<off+slen)
  666. {
  667. b1 = U._findDiff(pline, a0+(a0==0?0:1), 1-clr), b2 = U._findDiff(pline, b1, clr); // could be precomputed
  668. var bit =0;
  669. if(fo==1) bit = (data[boff>>>3]>>>(7-(boff&7)))&1;
  670. if(fo==2) bit = (data[boff>>>3]>>>( (boff&7)))&1;
  671. boff++; wrd+=bit;
  672. if(is1D)
  673. {
  674. if(U._lens[clr][wrd]!=null)
  675. {
  676. var dl=U._lens[clr][wrd]; wrd=""; len+=dl;
  677. if(dl<64) { U._addNtimes(line,len,clr); clr=1-clr; len=0; }
  678. }
  679. }
  680. else
  681. {
  682. if(mode=="H")
  683. {
  684. if(U._lens[clr][wrd]!=null)
  685. {
  686. var dl=U._lens[clr][wrd]; wrd=""; len+=dl;
  687. if(dl<64) { U._addNtimes(line,len,clr); a0+=len; clr=1-clr; len=0; toRead--; if(toRead==0) mode=""; }
  688. }
  689. }
  690. else
  691. {
  692. if(wrd=="0001") { wrd=""; U._addNtimes(line,b2-a0,clr); a0=b2; }
  693. if(wrd=="001" ) { wrd=""; mode="H"; toRead=2; }
  694. if(U._dmap[wrd]!=null) { a1 = b1+U._dmap[wrd]; U._addNtimes(line, a1-a0, clr); a0=a1; wrd=""; clr=1-clr; }
  695. }
  696. }
  697. if(wrd.endsWith("000000000001")) // needed for some files
  698. {
  699. if(y>=0) U._writeBits(line, tgt, toff*8+y*bipl);
  700. if(twoDim) {
  701. if(fo==1) is1D = ((data[boff>>>3]>>>(7-(boff&7)))&1)==1;
  702. if(fo==2) is1D = ((data[boff>>>3]>>>( (boff&7)))&1)==1;
  703. boff++;
  704. }
  705. //log("EOL",y, "next 1D:", is1D);
  706. wrd=""; clr=0; y++; a0=0;
  707. pline=U._makeDiff(line); line=[];
  708. }
  709. }
  710. if(line.length==w) U._writeBits(line, tgt, toff*8+y*bipl);
  711. }
  712. UTIF.decode._addNtimes = function(arr, n, val) { for(var i=0; i<n; i++) arr.push(val); }
  713. UTIF.decode._writeBits = function(bits, tgt, boff)
  714. {
  715. for(var i=0; i<bits.length; i++) tgt[(boff+i)>>>3] |= (bits[i]<<(7-((boff+i)&7)));
  716. }
  717. UTIF.decode._decodeLZW=UTIF.decode._decodeLZW=function(){var e,U,Z,u,K=0,V=0,g=0,N=0,O=function(){var S=e>>>3,A=U[S]<<16|U[S+1]<<8|U[S+2],j=A>>>24-(e&7)-V&(1<<V)-1;
  718. e+=V;return j},h=new Uint32Array(4096*4),w=0,m=function(S){if(S==w)return;w=S;g=1<<S;N=g+1;for(var A=0;
  719. A<N+1;A++){h[4*A]=h[4*A+3]=A;h[4*A+1]=65535;h[4*A+2]=1}},i=function(S){V=S+1;K=N+1},D=function(S){var A=S<<2,j=h[A+2],a=u+j-1;
  720. while(A!=65535){Z[a--]=h[A];A=h[A+1]}u+=j},L=function(S,A){var j=K<<2,a=S<<2;h[j]=h[(A<<2)+3];h[j+1]=a;
  721. h[j+2]=h[a+2]+1;h[j+3]=h[a+3];K++;if(K+1==1<<V&&V!=12)V++},T=function(S,A,j,a,n,q){e=A<<3;U=S;Z=a;u=n;
  722. var B=A+j<<3,_=0,t=0;m(q);i(q);while(e<B&&(_=O())!=N){if(_==g){i(q);_=O();if(_==N)break;D(_)}else{if(_<K){D(_);
  723. L(t,_)}else{L(t,t);D(K-1)}}t=_}return u};return T}();
  724. UTIF.tags = {};
  725. //UTIF.ttypes = { 256:3,257:3,258:3, 259:3, 262:3, 273:4, 274:3, 277:3,278:4,279:4, 282:5, 283:5, 284:3, 286:5,287:5, 296:3, 305:2, 306:2, 338:3, 513:4, 514:4, 34665:4 };
  726. // start at tag 250
  727. UTIF._types = function() {
  728. var main = new Array(250); main.fill(0);
  729. main = main.concat([0,0,0,0,4,3,3,3,3,3,0,0,3,0,0,0,3,0,0,2,2,2,2,4,3,0,0,3,4,4,3,3,5,5,3,2,5,5,0,0,0,0,4,4,0,0,3,3,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,2,2,3,5,5,3,0,3,3,4,4,4,3,4,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]);
  730. var rest = {33432: 2, 33434: 5, 33437: 5, 34665: 4, 34850: 3, 34853: 4, 34855: 3, 34864: 3, 34866: 4, 36864: 7, 36867: 2, 36868: 2, 37121: 7, 37377: 10, 37378: 5, 37380: 10, 37381: 5, 37383: 3, 37384: 3, 37385: 3, 37386: 5, 37510: 7, 37520: 2, 37521: 2, 37522: 2, 40960: 7, 40961: 3, 40962: 4, 40963: 4, 40965: 4, 41486: 5, 41487: 5, 41488: 3, 41985: 3, 41986: 3, 41987: 3, 41988: 5, 41989: 3, 41990: 3, 41993: 3, 41994: 3, 41995: 7, 41996: 3, 42032: 2, 42033: 2, 42034: 5, 42036: 2, 42037: 2, 59932: 7};
  731. return {
  732. basic: {
  733. main: main,
  734. rest: rest
  735. },
  736. gps: {
  737. main: [1,2,5,2,5,1,5,5,0,9],
  738. rest: {18:2,29:2}
  739. }
  740. }
  741. }();
  742. UTIF._readIFD = function(bin, data, offset, ifds, depth, prm)
  743. {
  744. var cnt = bin.readUshort(data, offset); offset+=2;
  745. var ifd = {};
  746. if(prm.debug) log(" ".repeat(depth),ifds.length-1,">>>----------------");
  747. for(var i=0; i<cnt; i++)
  748. {
  749. var tag = bin.readUshort(data, offset); offset+=2;
  750. var type = bin.readUshort(data, offset); offset+=2;
  751. var num = bin.readUint (data, offset); offset+=4;
  752. var voff = bin.readUint (data, offset); offset+=4;
  753. var arr = [];
  754. //ifd["t"+tag+"-"+UTIF.tags[tag]] = arr;
  755. if(type== 1 || type==7) { arr = new Uint8Array(data.buffer, (num<5 ? offset-4 : voff), num); }
  756. if(type== 2) { var o0 = (num<5 ? offset-4 : voff), c=data[o0], len=Math.max(0, Math.min(num-1,data.length-o0));
  757. if(c<128 || len==0) arr.push( bin.readASCII(data, o0, len) );
  758. else arr = new Uint8Array(data.buffer, o0, len); }
  759. if(type== 3) { for(var j=0; j<num; j++) arr.push(bin.readUshort(data, (num<3 ? offset-4 : voff)+2*j)); }
  760. if(type== 4
  761. || type==13) { for(var j=0; j<num; j++) arr.push(bin.readUint (data, (num<2 ? offset-4 : voff)+4*j)); }
  762. if(type== 5 || type==10) {
  763. var ri = type==5 ? bin.readUint : bin.readInt;
  764. for(var j=0; j<num; j++) arr.push([ri(data, voff+j*8), ri(data,voff+j*8+4)]); }
  765. if(type== 8) { for(var j=0; j<num; j++) arr.push(bin.readShort (data, (num<3 ? offset-4 : voff)+2*j)); }
  766. if(type== 9) { for(var j=0; j<num; j++) arr.push(bin.readInt (data, (num<2 ? offset-4 : voff)+4*j)); }
  767. if(type==11) { for(var j=0; j<num; j++) arr.push(bin.readFloat (data, voff+j*4)); }
  768. if(type==12) { for(var j=0; j<num; j++) arr.push(bin.readDouble(data, voff+j*8)); }
  769. ifd["t"+tag] = arr;
  770. if(num!=0 && arr.length==0) { log(tag, "unknown TIFF tag type: ", type, "num:",num); if(i==0)return; continue; }
  771. if(prm.debug) log(" ".repeat(depth), tag, type, UTIF.tags[tag], arr);
  772. if(tag==330 && ifd["t272"] && ifd["t272"][0]=="DSLR-A100") { }
  773. else if(tag==330 || tag==34665 || tag==34853 || (tag==50740 && bin.readUshort(data,bin.readUint(arr,0))<300 ) ||tag==61440) {
  774. var oarr = tag==50740 ? [bin.readUint(arr,0)] : arr;
  775. var subfd = [];
  776. for(var j=0; j<oarr.length; j++) UTIF._readIFD(bin, data, oarr[j], subfd, depth+1, prm);
  777. if(tag== 330) ifd.subIFD = subfd;
  778. if(tag==34665) ifd.exifIFD = subfd[0];
  779. if(tag==34853) ifd.gpsiIFD = subfd[0]; //console.log("gps", subfd[0]); }
  780. if(tag==50740) ifd.dngPrvt = subfd[0];
  781. if(tag==61440) ifd.fujiIFD = subfd[0];
  782. }
  783. if(tag==37500 && prm.parseMN) {
  784. var mn = arr;
  785. //console.log(bin.readASCII(mn,0,mn.length), mn);
  786. if(bin.readASCII(mn,0,5)=="Nikon") ifd.makerNote = UTIF["decode"](mn.slice(10).buffer)[0];
  787. else if(bin.readUshort(data,voff)<300 && bin.readUshort(data,voff+4)<=12){
  788. var subsub=[]; UTIF._readIFD(bin, data, voff, subsub, depth+1, prm);
  789. ifd.makerNote = subsub[0];
  790. }
  791. }
  792. }
  793. ifds.push(ifd);
  794. if(prm.debug) log(" ".repeat(depth),"<<<---------------");
  795. return offset;
  796. }
  797. UTIF._writeIFD = function(bin, types, data, offset, ifd)
  798. {
  799. var keys = Object.keys(ifd), knum=keys.length; if(ifd["exifIFD"]) knum--; if(ifd["gpsiIFD"]) knum--;
  800. bin.writeUshort(data, offset, knum); offset+=2;
  801. var eoff = offset + knum*12 + 4;
  802. for(var ki=0; ki<keys.length; ki++)
  803. {
  804. var key = keys[ki]; if(key=="t34665" || key=="t34853") continue;
  805. if(key=="exifIFD") key="t34665"; if(key=="gpsiIFD") key="t34853";
  806. var tag = parseInt(key.slice(1)), type = types.main[tag]; if(type==null) type=types.rest[tag];
  807. if(type==null || type==0) throw new Error("unknown type of tag: "+tag);
  808. //console.log(offset+":", tag, type, eoff);
  809. var val = ifd[key];
  810. if(tag==34665) {
  811. var outp = UTIF._writeIFD(bin, types, data, eoff, ifd["exifIFD"]);
  812. val = [eoff]; eoff = outp[1];
  813. }
  814. if(tag==34853) {
  815. var outp = UTIF._writeIFD(bin, UTIF._types.gps, data, eoff, ifd["gpsiIFD"]);
  816. val = [eoff]; eoff = outp[1];
  817. }
  818. if(type==2) val=val[0]+"\u0000"; var num = val.length;
  819. bin.writeUshort(data, offset, tag ); offset+=2;
  820. bin.writeUshort(data, offset, type); offset+=2;
  821. bin.writeUint (data, offset, num ); offset+=4;
  822. var dlen = [-1, 1, 1, 2, 4, 8, 0, 1, 0, 4, 8, 0, 8][type] * num; //if(dlen<1) throw "e";
  823. var toff = offset;
  824. if(dlen>4) { bin.writeUint(data, offset, eoff); toff=eoff; }
  825. if (type== 1 || type==7) { for(var i=0; i<num; i++) data[toff+i] = val[i]; }
  826. else if(type== 2) { bin.writeASCII(data, toff, val); }
  827. else if(type== 3) { for(var i=0; i<num; i++) bin.writeUshort(data, toff+2*i, val[i]); }
  828. else if(type== 4) { for(var i=0; i<num; i++) bin.writeUint (data, toff+4*i, val[i]); }
  829. else if(type== 5 || type==10) {
  830. var wr = type==5?bin.writeUint:bin.writeInt;
  831. for(var i=0; i<num; i++) {
  832. var v=val[i],nu=v[0],de=v[1]; if(nu==null) throw "e"; wr(data, toff+8*i, nu); wr(data, toff+8*i+4, de); } }
  833. else if(type== 9) { for(var i=0; i<num; i++) bin.writeInt (data, toff+4*i, val[i]); }
  834. else if(type==12) { for(var i=0; i<num; i++) bin.writeDouble(data, toff+8*i, val[i]); }
  835. else throw type;
  836. if(dlen>4) { dlen += (dlen&1); eoff += dlen; }
  837. offset += 4;
  838. }
  839. return [offset, eoff];
  840. }
  841. UTIF.toRGBA8 = function(out, scl)
  842. {
  843. var w = out.width, h = out.height, area = w*h, qarea = area*4, data = out.data;
  844. var img = new Uint8Array(area*4);
  845. //console.log(out);
  846. // 0: WhiteIsZero, 1: BlackIsZero, 2: RGB, 3: Palette color, 4: Transparency mask, 5: CMYK
  847. var intp = (out["t262"] ? out["t262"][0]: 2), bps = (out["t258"]?Math.min(32,out["t258"][0]):1);
  848. //log("interpretation: ", intp, "bps", bps, out);
  849. if(false) {}
  850. else if(intp==0)
  851. {
  852. var bpl = Math.ceil(bps*w/8);
  853. for(var y=0; y<h; y++) {
  854. var off = y*bpl, io = y*w;
  855. if(bps== 1) for(var i=0; i<w; i++) { var qi=(io+i)<<2, px=((data[off+(i>>3)])>>(7- (i&7)))& 1; img[qi]=img[qi+1]=img[qi+2]=( 1-px)*255; img[qi+3]=255; }
  856. if(bps== 4) for(var i=0; i<w; i++) { var qi=(io+i)<<2, px=((data[off+(i>>1)])>>(4-4*(i&1)))&15; img[qi]=img[qi+1]=img[qi+2]=(15-px)* 17; img[qi+3]=255; }
  857. if(bps== 8) for(var i=0; i<w; i++) { var qi=(io+i)<<2, px=data[off+i]; img[qi]=img[qi+1]=img[qi+2]=255-px; img[qi+3]=255; }
  858. }
  859. }
  860. else if(intp==1)
  861. {
  862. var smpls = out["t258"]?out["t258"].length : 1;
  863. var bpl = Math.ceil(smpls*bps*w/8);
  864. if(scl==null) scl=1/256;
  865. for(var y=0; y<h; y++) {
  866. var off = y*bpl, io = y*w;
  867. if(bps== 1) for(var i=0; i<w; i++) { var qi=(io+i)<<2, px=((data[off+(i>>3)])>>(7- (i&7)))&1; img[qi]=img[qi+1]=img[qi+2]=(px)*255; img[qi+3]=255; }
  868. if(bps== 2) for(var i=0; i<w; i++) { var qi=(io+i)<<2, px=((data[off+(i>>2)])>>(6-2*(i&3)))&3; img[qi]=img[qi+1]=img[qi+2]=(px)* 85; img[qi+3]=255; }
  869. if(bps== 8) for(var i=0; i<w; i++) { var qi=(io+i)<<2, px=data[off+i*smpls]; img[qi]=img[qi+1]=img[qi+2]= px; img[qi+3]=255; }
  870. if(bps==16) for(var i=0; i<w; i++) { var qi=(io+i)<<2, o=off+(2*i), px=(data[o+1]<<8)|data[o]; img[qi]=img[qi+1]=img[qi+2]= Math.min(255,~~(px*scl)); img[qi+3]=255; } // ladoga.tif
  871. }
  872. }
  873. else if(intp==2)
  874. {
  875. var smpls = out["t258"]?out["t258"].length : 3;
  876. if(bps== 8)
  877. {
  878. if(smpls==4) for(var i=0; i<qarea; i++) img[i] = data[i];
  879. if(smpls==3) for(var i=0; i< area; i++) { var qi=i<<2, ti=i*3; img[qi]=data[ti]; img[qi+1]=data[ti+1]; img[qi+2]=data[ti+2]; img[qi+3]=255; }
  880. }
  881. else{ // 3x 16-bit channel
  882. if(smpls==4) for(var i=0; i<area; i++) { var qi=i<<2, ti=i*8+1; img[qi]=data[ti]; img[qi+1]=data[ti+2]; img[qi+2]=data[ti+4]; img[qi+3]=data[ti+6]; }
  883. if(smpls==3) for(var i=0; i<area; i++) { var qi=i<<2, ti=i*6+1; img[qi]=data[ti]; img[qi+1]=data[ti+2]; img[qi+2]=data[ti+4]; img[qi+3]=255; }
  884. }
  885. }
  886. else if(intp==3)
  887. {
  888. var map = out["t320"];
  889. var smpls = out["t258"]?out["t258"].length : 1;
  890. for(var i=0; i<area; i++) { var qi=i<<2, mi=data[i*smpls]; img[qi]=(map[mi]>>8); img[qi+1]=(map[256+mi]>>8); img[qi+2]=(map[512+mi]>>8); img[qi+3]=255; }
  891. }
  892. else if(intp==5)
  893. {
  894. var smpls = out["t258"]?out["t258"].length : 4;
  895. var gotAlpha = smpls>4 ? 1 : 0;
  896. for(var i=0; i<area; i++) {
  897. var qi=i<<2, si=i*smpls; var C=255-data[si], M=255-data[si+1], Y=255-data[si+2], K=(255-data[si+3])*(1/255);
  898. img[qi]=~~(C*K+0.5); img[qi+1]=~~(M*K+0.5); img[qi+2]=~~(Y*K+0.5); img[qi+3]=255*(1-gotAlpha)+data[si+4]*gotAlpha;
  899. }
  900. }
  901. else if(intp==6 && out["t278"]) { // only for DSC_1538.TIF
  902. var rps = out["t278"][0];
  903. for(var y=0; y<h; y+=rps) {
  904. var i=(y*w), len = rps*w;
  905. for(var j=0; j<len; j++) {
  906. var qi = 4*(i+j), si = 3*i+4*(j>>>1);
  907. var Y = data[si+(j&1)], Cb=data[si+2]-128, Cr=data[si+3]-128;
  908. var r = Y + ( (Cr >> 2) + (Cr >> 3) + (Cr >> 5) ) ;
  909. var g = Y - ( (Cb >> 2) + (Cb >> 4) + (Cb >> 5)) - ( (Cr >> 1) + (Cr >> 3) + (Cr >> 4) + (Cr >> 5)) ;
  910. var b = Y + ( Cb + (Cb >> 1) + (Cb >> 2) + (Cb >> 6)) ;
  911. img[qi ]=Math.max(0,Math.min(255,r));
  912. img[qi+1]=Math.max(0,Math.min(255,g));
  913. img[qi+2]=Math.max(0,Math.min(255,b));
  914. img[qi+3]=255;
  915. }
  916. }
  917. }
  918. else log("Unknown Photometric interpretation: "+intp);
  919. return img;
  920. }
  921. UTIF.replaceIMG = function(imgs)
  922. {
  923. if(imgs==null) imgs = document.getElementsByTagName("img");
  924. var sufs = ["tif","tiff","dng","cr2","nef"]
  925. for (var i=0; i<imgs.length; i++)
  926. {
  927. var img=imgs[i], src=img.getAttribute("src"); if(src==null) continue;
  928. var suff=src.split(".").pop().toLowerCase();
  929. if(sufs.indexOf(suff)==-1) continue;
  930. var xhr = new XMLHttpRequest(); UTIF._xhrs.push(xhr); UTIF._imgs.push(img);
  931. xhr.open("GET", src); xhr.responseType = "arraybuffer";
  932. xhr.onload = UTIF._imgLoaded; xhr.send();
  933. }
  934. }
  935. UTIF._xhrs = []; UTIF._imgs = [];
  936. UTIF._imgLoaded = function(e)
  937. {
  938. var buff = e.target.response;
  939. var ifds = UTIF.decode(buff); //console.log(ifds);
  940. var vsns = ifds, ma=0, page=vsns[0]; if(ifds[0].subIFD) vsns = vsns.concat(ifds[0].subIFD);
  941. for(var i=0; i<vsns.length; i++) {
  942. var img = vsns[i];
  943. if(img["t258"]==null || img["t258"].length<3) continue;
  944. var ar = img["t256"]*img["t257"];
  945. if(ar>ma) { ma=ar; page=img; }
  946. }
  947. UTIF.decodeImage(buff, page, ifds);
  948. var rgba = UTIF.toRGBA8(page), w=page.width, h=page.height;
  949. var ind = UTIF._xhrs.indexOf(e.target), img = UTIF._imgs[ind];
  950. UTIF._xhrs.splice(ind,1); UTIF._imgs.splice(ind,1);
  951. var cnv = document.createElement("canvas"); cnv.width=w; cnv.height=h;
  952. var ctx = cnv.getContext("2d");
  953. var imgd = new ImageData(new Uint8ClampedArray(rgba.buffer),w,h);
  954. /*imgd = ctx.createImageData(w,h);
  955. for(var i=0; i<rgba.length; i++) imgd.data[i]=rgba[i]; */
  956. ctx.putImageData(imgd,0,0);
  957. img.setAttribute("src",cnv.toDataURL());
  958. }
  959. UTIF._binBE =
  960. {
  961. nextZero : function(data, o) { while(data[o]!=0) o++; return o; },
  962. readUshort : function(buff, p) { return (buff[p]<< 8) | buff[p+1]; },
  963. readShort : function(buff, p) { var a=UTIF._binBE.ui8; a[0]=buff[p+1]; a[1]=buff[p+0]; return UTIF._binBE. i16[0]; },
  964. readInt : function(buff, p) { var a=UTIF._binBE.ui8; a[0]=buff[p+3]; a[1]=buff[p+2]; a[2]=buff[p+1]; a[3]=buff[p+0]; return UTIF._binBE. i32[0]; },
  965. readUint : function(buff, p) { var a=UTIF._binBE.ui8; a[0]=buff[p+3]; a[1]=buff[p+2]; a[2]=buff[p+1]; a[3]=buff[p+0]; return UTIF._binBE.ui32[0]; },
  966. readASCII : function(buff, p, l) { var s = ""; for(var i=0; i<l; i++) s += String.fromCharCode(buff[p+i]); return s; },
  967. readFloat : function(buff, p) { var a=UTIF._binBE.ui8; for(var i=0;i<4;i++) a[i]=buff[p+3-i]; return UTIF._binBE.fl32[0]; },
  968. readDouble : function(buff, p) { var a=UTIF._binBE.ui8; for(var i=0;i<8;i++) a[i]=buff[p+7-i]; return UTIF._binBE.fl64[0]; },
  969. writeUshort: function(buff, p, n) { buff[p] = (n>> 8)&255; buff[p+1] = n&255; },
  970. writeInt : function(buff, p, n) { var a=UTIF._binBE.ui8; UTIF._binBE.i32[0]=n; buff[p+3]=a[0]; buff[p+2]=a[1]; buff[p+1]=a[2]; buff[p+0]=a[3]; },
  971. writeUint : function(buff, p, n) { buff[p] = (n>>24)&255; buff[p+1] = (n>>16)&255; buff[p+2] = (n>>8)&255; buff[p+3] = (n>>0)&255; },
  972. writeASCII : function(buff, p, s) { for(var i = 0; i < s.length; i++) buff[p+i] = s.charCodeAt(i); },
  973. writeDouble: function(buff, p, n)
  974. {
  975. UTIF._binBE.fl64[0] = n;
  976. for (var i = 0; i < 8; i++) buff[p + i] = UTIF._binBE.ui8[7 - i];
  977. }
  978. }
  979. UTIF._binBE.ui8 = new Uint8Array (8);
  980. UTIF._binBE.i16 = new Int16Array (UTIF._binBE.ui8.buffer);
  981. UTIF._binBE.i32 = new Int32Array (UTIF._binBE.ui8.buffer);
  982. UTIF._binBE.ui32 = new Uint32Array (UTIF._binBE.ui8.buffer);
  983. UTIF._binBE.fl32 = new Float32Array(UTIF._binBE.ui8.buffer);
  984. UTIF._binBE.fl64 = new Float64Array(UTIF._binBE.ui8.buffer);
  985. UTIF._binLE =
  986. {
  987. nextZero : UTIF._binBE.nextZero,
  988. readUshort : function(buff, p) { return (buff[p+1]<< 8) | buff[p]; },
  989. readShort : function(buff, p) { var a=UTIF._binBE.ui8; a[0]=buff[p+0]; a[1]=buff[p+1]; return UTIF._binBE. i16[0]; },
  990. readInt : function(buff, p) { var a=UTIF._binBE.ui8; a[0]=buff[p+0]; a[1]=buff[p+1]; a[2]=buff[p+2]; a[3]=buff[p+3]; return UTIF._binBE. i32[0]; },
  991. readUint : function(buff, p) { var a=UTIF._binBE.ui8; a[0]=buff[p+0]; a[1]=buff[p+1]; a[2]=buff[p+2]; a[3]=buff[p+3]; return UTIF._binBE.ui32[0]; },
  992. readASCII : UTIF._binBE.readASCII,
  993. readFloat : function(buff, p) { var a=UTIF._binBE.ui8; for(var i=0;i<4;i++) a[i]=buff[p+ i]; return UTIF._binBE.fl32[0]; },
  994. readDouble : function(buff, p) { var a=UTIF._binBE.ui8; for(var i=0;i<8;i++) a[i]=buff[p+ i]; return UTIF._binBE.fl64[0]; },
  995. writeUshort: function(buff, p, n) { buff[p] = (n)&255; buff[p+1] = (n>>8)&255; },
  996. writeInt : function(buff, p, n) { var a=UTIF._binBE.ui8; UTIF._binBE.i32[0]=n; buff[p+0]=a[0]; buff[p+1]=a[1]; buff[p+2]=a[2]; buff[p+3]=a[3]; },
  997. writeUint : function(buff, p, n) { buff[p] = (n>>>0)&255; buff[p+1] = (n>>>8)&255; buff[p+2] = (n>>>16)&255; buff[p+3] = (n>>>24)&255; },
  998. writeASCII : UTIF._binBE.writeASCII
  999. }
  1000. UTIF._copyTile = function(tb, tw, th, b, w, h, xoff, yoff)
  1001. {
  1002. //log("copyTile", tw, th, w, h, xoff, yoff);
  1003. var xlim = Math.min(tw, w-xoff);
  1004. var ylim = Math.min(th, h-yoff);
  1005. for(var y=0; y<ylim; y++)
  1006. {
  1007. var tof = (yoff+y)*w+xoff;
  1008. var sof = y*tw;
  1009. for(var x=0; x<xlim; x++) b[tof+x] = tb[sof+x];
  1010. }
  1011. }
  1012. UTIF.LosslessJpegDecode = (function(){function t(Z){this.w=Z;this.N=0;this._=0;this.G=0}t.prototype={t:function(Z){this.N=Math.max(0,Math.min(this.w.length,Z))},i:function(){return this.w[this.N++]},l:function(){var Z=this.N;
  1013. this.N+=2;return this.w[Z]<<8|this.w[Z+1]},J:function(){if(this._==0){this.G=this.w[this.N];this.N+=1+(this.G+1>>>8);
  1014. this._=8}return this.G>>>--this._&1},Z:function(Z){var X=this._,s=this.G,E=Math.min(X,Z);Z-=E;X-=E;var Y=s>>>X&(1<<E)-1;
  1015. while(Z>0){s=this.w[this.N];this.N+=1+(s+1>>>8);E=Math.min(8,Z);Z-=E;X=8-E;Y<<=E;Y|=s>>>X&(1<<E)-1}this._=X;
  1016. this.G=s;return Y}};var i={};i.X=function(){return[0,0,-1]};i.s=function(Z,X,s){Z[i.Y(Z,0,s)+2]=X};i.Y=function(Z,X,s){if(Z[X+2]!=-1)return 0;
  1017. if(s==0)return X;for(var E=0;E<2;E++){if(Z[X+E]==0){Z[X+E]=Z.length;Z.push(0);Z.push(0);Z.push(-1)}var Y=i.Y(Z,Z[X+E],s-1);
  1018. if(Y!=0)return Y}return 0};i.B=function(Z,X){var s=0,E=0,Y=0,B=X._,$=X.G,e=X.N;while(!0){if(B==0){$=X.w[e];
  1019. e+=1+($+1>>>8);B=8}Y=$>>>--B&1;s=Z[s+Y];E=Z[s+2];if(E!=-1){X._=B;X.G=$;X.N=e;return E}}return-1};function l(Z){this.z=new t(Z);
  1020. this.D(this.z)}l.prototype={$:function(Z,X){this.Q=Z.i();this.F=Z.l();this.o=Z.l();var s=this.O=Z.i();
  1021. this.L=[];for(var E=0;E<s;E++){var Y=Z.i(),B=Z.i();Z.i();this.L[Y]=E}Z.t(Z.N+X-(6+s*3))},e:function(){var Z=0,X=this.z.i();
  1022. if(this.H==null)this.H={};var s=this.H[X]=i.X(),E=[];for(var Y=0;Y<16;Y++){E[Y]=this.z.i();Z+=E[Y]}for(var Y=0;
  1023. Y<16;Y++)for(var B=0;B<E[Y];B++)i.s(s,this.z.i(),Y+1);return Z+17},W:function(Z){while(Z>0)Z-=this.e()},p:function(Z,X){var s=Z.i();
  1024. if(!this.U){this.U=[]}for(var E=0;E<s;E++){var Y=Z.i(),B=Z.i();this.U[this.L[Y]]=this.H[B>>>4]}this.g=Z.i();
  1025. Z.t(Z.N+X-(2+s*2))},D:function(Z){var X=!1,s=Z.l();if(s!==l.q)return;do{var s=Z.l(),E=Z.l()-2;switch(s){case l.m:this.$(Z,E);
  1026. break;case l.K:this.W(E);break;case l.V:this.p(Z,E);X=!0;break;default:Z.t(Z.N+E);break}}while(!X)},I:function(Z,X){var s=i.B(X,Z);
  1027. if(s==16)return-32768;var E=Z.Z(s);if((E&1<<s-1)==0)E-=(1<<s)-1;return E},B:function(Z,X){var s=this.z,E=this.O,Y=this.F,B=this.I,$=this.g,e=this.o*E,W=this.U;
  1028. for(var p=0;p<E;p++){Z[p]=B(s,W[p])+(1<<this.Q-1)}for(var D=E;D<e;D+=E){for(var p=0;p<E;p++)Z[D+p]=B(s,W[p])+Z[D+p-E]}var I=X;
  1029. for(var m=1;m<Y;m++){for(var p=0;p<E;p++){Z[I+p]=B(s,W[p])+Z[I+p-X]}for(var D=E;D<e;D+=E){for(var p=0;
  1030. p<E;p++){var K=I+D+p,q=Z[K-E];if($==6)q=Z[K-X]+(q-Z[K-E-X]>>>1);Z[K]=q+B(s,W[p])}}I+=X}}};l.m=65475;
  1031. l.K=65476;l.q=65496;l.V=65498;function J(Z){var X=new l(Z),s=X.Q>8?Uint16Array:Uint8Array,E=new s(X.o*X.F*X.O),Y=X.o*X.O;
  1032. X.B(E,Y);return E}return J}())
  1033. })(UTIF, pako);
  1034. })();