Files
armorpaint/base/Assets/plugins/import_tiff.js
T

30 lines
36 KiB
JavaScript
Raw Normal View History

2023-02-08 14:51:54 +01:00
// Fast and advanced TIFF decoder by photopea
// https://github.com/photopea/UTIF.js
var UTIF={},pako=null;function log(){console.log(arguments)}!function(x,A){function r(r,e){this.message=r,this.g=e}function e(r){this.message="JPEG error: "+r}function t(){this.M=null,this.B=-1}function U(r,e){for(var t,i,n=0,a=[],o=16;0<o&&!r[o-1];)o--;a.push({children:[],index:0});var f,s=a[0];for(t=0;t<o;t++){for(i=0;i<r[t];i++){for((s=a.pop()).children[s.index]=e[n];0<s.index;)s=a.pop();for(s.index++,a.push(s);a.length<=t;)a.push(f={children:[],index:0}),s.children[s.index]=f.children,s=f;n++}t+1<o&&(a.push(f={children:[],index:0}),s.children[s.index]=f.children,s=f)}return a[0].children}function I(t,i,n,r,e,o,f,a,s,h){function d(){if(0<I)return A>>--I&1;if(255===(A=t[i++])){var r=t[i++];if(r){if(220===r&&E){i+=2;var e=t[i++]<<8|t[i++];if(0<e&&e!==n.g)throw new O("Found DNL marker (0xFFDC) while parsing scan data",e)}throw new C("unexpected marker "+(A<<8|r).toString(16))}}return A>>>(I=7)}function u(r){for(;;){if("number"==typeof(r=r[d()]))return r;if("object"!==(void 0===r?"undefined":L(r)))throw new C("invalid huffman sequence")}}function l(r){for(var e=0;0<r;)e=e<<1|d(),r--;return e}function c(r){if(1===r)return 1===d()?1:-1;var e=l(r);return 1<<r-1<=e?e:e+(-1<<r)+1}for(var v,g,_,w,b,p,m,E=9<arguments.length&&void 0!==h&&h,y=n.P,U=i,A=0,I=0,B=0,M=0,k=r.length,D=n.S?0===o?0===a?function(r,e){var t=u(r.D);t=0===t?0:c(t)<<s,r.a[e]=r.m+=t}:function(r,e){r.a[e]|=d()<<s}:0===a?function(r,e){if(0<B)B--;else for(var t=o;t<=f;){var i=u(r.o),n=15&i;if(i>>=4,0==n){if(i<15){B=l(i)+(1<<i)-1;break}t+=16}else t+=i,r.a[e+J[t]]=c(n)*(1<<s),t++}}:function(r,e){for(var t,i=o,n=0;i<=f;){t=e+J[i];var a=r.a[t]<0?-1:1;switch(M){case 0:if(t=15&(n=u(r.o)),n>>=4,0===t)M=n<15?(B=l(n)+(1<<n),4):(n=16,1);else{if(1!==t)throw new C("invalid ACn encoding");v=c(t),M=n?2:3}continue;case 1:case 2:r.a[t]?r.a[t]+=a*(d()<<s):0===--n&&(M=2===M?3:0);break;case 3:r.a[t]?r.a[t]+=a*(d()<<s):(r.a[t]=v<<s,M=0);break;case 4:r.a[t]&&(r.a[t]+=a*(d()<<s))}i++}4!==M||0===--B&&(M=0)}:function(r,e){var t=u(r.D);for(t=0===t?0:c(t),r.a[e]=r.m+=t,t=1;t<64;){var i=u(r.o),n=15&i;if(i>>=4,0==n){if(i<15)break;t+=16}else t+=i,r.a[e+J[t]]=c(n),t++}},F=0,G=1===k?r[0].c*r[0].l:y*n.O;F<G;){var N=e?Math.min(G-F,e):G;for(g=0;g<k;g++)r[g].m=0;if(B=0,1===k){var S=r[0];for(b=0;b<N;b++)D(S,64*((S.c+1)*(F/S.c|0)+F%S.c)),F++}else for(b=0;b<N;b++){for(g=0;g<k;g++)for(p=(S=r[g]).h,m=S.j,_=0;_<m;_++)for(w=0;w<p;w++)D(S,64*((S.c+1)*((F/y|0)*S.j+_)+(F%y*S.h+w)));F++}if(I=0,(S=P(t,i))&&S.f&&((0,_util.warn)("decodeScan - unexpected MCU data, current marker is: "+S.f),i=S.offset),!(S=S&&S.F)||S<=65280)throw new C("marker was not found");if(!(65488<=S&&S<=65495))break;i+=2}return(S=P(t,i))&&S.f&&((0,_util.warn)("decodeScan - unexpected Scan data, current marker is: "+S.f),i=S.offset),i-U}function B(r,e){for(var t=e.c,i=e.l,n=new Int16Array(64),a=0;a<i;a++)for(var o=0;o<t;o++){var f=64*((e.c+1)*a+o),s=n,h=e.G,d=e.a;if(!h)throw new C("missing required Quantization Table.");for(var u=0;u<64;u+=8){var l=d[f+u],c=d[f+u+1],v=d[f+u+2],g=d[f+u+3],_=d[f+u+4],w=d[f+u+5],b=d[f+u+6],p=d[f+u+7];if(l*=h[u],0==(c|v|g|_|w|b|p))l=5793*l+512>>10,s[u]=l,s[u+1]=l,s[u+2]=l,s[u+3]=l,s[u+4]=l,s[u+5]=l,s[u+6]=l,s[u+7]=l;else{c*=h[u+1],v*=h[u+2],g*=h[u+3],_*=h[u+4],w*=h[u+5];var m=5793*l+128>>8,E=5793*_+128>>8,y=v,U=b*=h[u+6];E=(m=m+E+1>>1)-E,l=3784*y+1567*U+128>>8,y=1567*y-3784*U+128>>8,w=(_=(_=2896*(c-(p*=h[u+7]))+128>>8)+(w<<=4)+1>>1)-w,g=(p=(p=2896*(c+p)+128>>8)+(g<<=4)+1>>1)-g,U=(m=m+(U=l)+1>>1)-U,y=(E=E+y+1>>1)-y,l=2276*_+3406*p+2048>>12,_=3406*_-2276*p+2048>>12,p=l,l=799*g+4017*w+2048>>12,g=4017*g-799*w+2048>>12,w=l,s[u]=m+p,s[u+7]=m-p,s[u+1]=E+w,s[u+6]=E-w,s[u+2]=y+g,s[u+5]=y-g,s[u+3]=U+_,s[u+4]=U-_}}for(h=0;h<8;++h)l=s[h],0==((c=s[h+8])|(v=s[h+16])|(g=s[h+24])|(_=s[h+32])|(w=s[h+40])|(b=s[h+48])|(p=s[h+56]))?(l=(l=5793*l+8192>>14)<-2040?0:2024<=l?255:l+2056>>4,d[f+h]=l,d[f+h+8]=l,d[f+h+16]=l,d[f+h+24]=l,d[f+h+32]=l,d[f+h+40]=l,d[f+h+48]=l,d[f+h+56]=l):(m=5793*l+2048>>12,E=5793*_+2048>>12,l=3784*(y=v)+1567*(U=b)+2048>>12,y=1567*y-3784*U+2048>>12,U=l,w=(_=(_=2896*(c-p)+2048>>12)+w+1>>1)-w,g=(p=(p=2896*(c+p)+2
// Register as ArmorPaint plugin
let import_tiff = function(path, done) {
2024-04-02 15:45:49 +02:00
let b = data_get_blob(path);
let ifds = UTIF.decode(b);
UTIF.decodeImage(b, ifds[0]);
let rgba = UTIF.toRGBA8(ifds[0]);
let image = image_from_bytes(rgba.buffer, ifds[0].width, ifds[0].height);
return image;
2023-02-08 14:51:54 +01:00
}
2024-04-02 15:45:49 +02:00
let plugin = plugin_create();
let formats = path_texture_formats;
let importers = path_texture_importers;
2023-02-08 14:51:54 +01:00
formats.push("tif");
formats.push("tiff");
2024-01-21 09:53:08 +01:00
importers.set("tif", import_tiff);
importers.set("tiff", import_tiff);
2023-02-08 14:51:54 +01:00
plugin.delete = function() {
formats.splice(formats.indexOf("tif"), 1);
formats.splice(formats.indexOf("tiff"), 1);
2024-01-21 09:53:08 +01:00
importers.delete("tif");
importers.delete("tiff");
2023-02-08 14:51:54 +01:00
};