Comparing version 1.3.0 to 2.0.0
{ | ||
"name": "utif", | ||
"description": "Fast and advanced TIFF decoder", | ||
"version": "1.3.0", | ||
"version": "2.0.0", | ||
"homepage": "https://github.com/photopea/UTIF.js", | ||
@@ -22,5 +22,5 @@ "author": "photopea (https://github.com/photopea)", | ||
"dependencies": { | ||
"jpgjs": "github:notmasteryet/jpgjs", | ||
"jpgjs": "github:makr28/jpgjs", | ||
"pako": "^1.0.5" | ||
} | ||
} |
@@ -5,3 +5,3 @@ # UTIF.js | ||
* Supports Black & White, Grayscale, RGB and Paletted images | ||
* Supports Fax 3 and Fax 4 (CCITT), LZW, PackBits and other compressions | ||
* Supports Fax 3 and Fax 4 (CCITT), JPEG, LZW, PackBits and other compressions (1,3,4,5,6,7,8,32773,32809) | ||
* E.g. [this 8 MPix image](//www.photopea.com/api/img/G4.TIF) with Fax 4 compression is just 56 kB ( [Open in Photopea](https://www.photopea.com?p=%7B%22files%22:%5B%22//www.photopea.com/api/img/G4.TIF%22%5D%7D) ) | ||
@@ -8,0 +8,0 @@ |
543
UTIF.js
@@ -15,3 +15,3 @@ | ||
(function(UTIF, pako){ | ||
(function(UTIF, pako, JpegDecoder){ | ||
@@ -24,7 +24,4 @@ UTIF.encodeImage = function(rgba, w, h, metadata) | ||
}; | ||
if (metadata) { | ||
for (var i in metadata) { | ||
idf[i] = metadata[i]; | ||
} | ||
} | ||
if (metadata) for (var i in metadata) idf[i] = metadata[i]; | ||
var prfx = new Uint8Array(UTIF.encode([idf])); | ||
@@ -76,3 +73,2 @@ var img = new Uint8Array(rgba); | ||
UTIF.decodeImages = function(buff, ifds) | ||
@@ -82,3 +78,3 @@ { | ||
var id = UTIF._binBE.readASCII(data, 0, 2); | ||
for(var ii=0; ii<ifds.length; ii++) | ||
@@ -92,10 +88,11 @@ { | ||
var cmpr = img["t259"][0]; //delete img["t259"]; | ||
var cmpr = img["t259"] ? img["t259"][0] : 1; //delete img["t259"]; | ||
var fo = img["t266"] ? img["t266"][0] : 1; //delete img["t266"]; | ||
if(img["t284"] && img["t284"][0]==2) log("PlanarConriguration 2 should not be used!"); | ||
if(img["t284"] && img["t284"][0]==2) log("PlanarConfiguration 2 should not be used!"); | ||
var bipp = (img["t258"]?Math.min(32,img["t258"][0]):1) * (img["t277"]?img["t277"][0]:1); // bits per pixel | ||
var bipl = Math.ceil(img.width*bipp/8)*8; | ||
var soff = img["t273"]; if(soff==null) soff = img["t324"]; | ||
var bcnt = img["t279"]; if(cmpr==1 && soff.length==1) bcnt = [Math.ceil(img.height*img.width*bipp/8)|0]; if(bcnt==null) bcnt = img["t325"]; | ||
var bytes = new Uint8Array(Math.ceil(img.width*img.height*bipp/8)|0), bilen = 0; | ||
var bcnt = img["t279"]; if(cmpr==1 && soff.length==1) bcnt = [img.height*(bipl>>>3)]; if(bcnt==null) bcnt = img["t325"]; | ||
var bytes = new Uint8Array(img.height*(bipl>>>3)), bilen = 0; | ||
@@ -113,3 +110,5 @@ if(img["t322"]!=null) // tiled | ||
UTIF.decode._decompress(img, data, soff[i], bcnt[i], cmpr, tbuff, 0, fo); | ||
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); | ||
// Might be required for 7 too. Need to check | ||
if (cmpr==6) bytes = tbuff; | ||
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); | ||
} | ||
@@ -124,3 +123,3 @@ bilen = bytes.length*8; | ||
UTIF.decode._decompress(img, data, soff[i], bcnt[i], cmpr, bytes, Math.ceil(bilen/8)|0, fo); | ||
bilen += (img.width * bipp * rps); | ||
bilen += bipl * rps; | ||
} | ||
@@ -140,2 +139,3 @@ bilen = Math.min(bilen, bytes.length*8); | ||
else if(cmpr==5) UTIF.decode._decodeLZW(data, off, tgt, toff); | ||
else if(cmpr==6) UTIF.decode._decodeOldJPEG(img, data, off, len, tgt, toff); | ||
else if(cmpr==7) UTIF.decode._decodeNewJPEG(img, data, off, len, tgt, toff); | ||
@@ -151,6 +151,8 @@ 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]; } | ||
var noc = (img["t277"]?img["t277"][0]:1), h = (img["t278"] ? img["t278"][0] : img.height), bpr = img.width*noc; | ||
//console.log(noc); | ||
for(var y=0; y<h; y++) { | ||
//log(noc); | ||
for(var y=0; y<h; y++) | ||
{ | ||
var ntoff = toff+y*bpr; | ||
if(noc==3) for(var j= 3; j<bpr; j+=3) { | ||
if(noc==3) for(var j= 3; j<bpr; j+=3) | ||
{ | ||
tgt[ntoff+j ] = (tgt[ntoff+j ] + tgt[ntoff+j-3])&255; | ||
@@ -160,3 +162,3 @@ tgt[ntoff+j+1] = (tgt[ntoff+j+1] + tgt[ntoff+j-2])&255; | ||
} | ||
else for(var j=noc; j<bpr; j++) tgt[ntoff+j] = (tgt[ntoff+j] + tgt[ntoff+j-noc])&255; | ||
else for(var j=noc; j<bpr; j++) tgt[ntoff+j] = (tgt[ntoff+j] + tgt[ntoff+j-noc])&255; | ||
} | ||
@@ -181,11 +183,11 @@ } | ||
7,6,8,5,9,4,10,3,11,12,2,0,1,13,14 ] ]; | ||
//struct decode *dindex; | ||
var ver0, ver1, vpred, hpred, csize; | ||
var i, min, max, step=0, huff=0, split=0, row, col, len, shl, diff; | ||
console.log(data.slice(off,off+100)); | ||
log(data.slice(off,off+100)); | ||
ver0 = data[off]; off++; | ||
ver1 = data[off]; off++; | ||
console.log(ver0.toString(16), ver1.toString(16), len); | ||
log(ver0.toString(16), ver1.toString(16), len); | ||
} | ||
@@ -195,39 +197,39 @@ | ||
{ | ||
//throw "e"; | ||
//console.log("_decodeNewJPEG", off, toff); | ||
if (typeof JpegDecoder=="undefined") { log("jpg.js required for handling JPEG compressed images"); return; } | ||
if (typeof JpegDecoder=="undefined") { log("jpg.js required for handling JPEG compressed images"); return; } | ||
var tables = img["t347"], tlen = tables ? tables.length : 0, buff = new Uint8Array(tlen + len); | ||
var tables = img["t347"], tlen = tables ? tables.length : 0, buff = new Uint8Array(tlen + len); | ||
if (tables) { | ||
if (tables) | ||
{ | ||
var SOI = 216, EOI = 217, boff = 0; | ||
for (var i=0; i<(tlen-1); i++) { | ||
// Skip EOI marker from JPEGTables | ||
if (tables[i]==255 && tables[i+1]==EOI) break; | ||
buff[boff++] = tables[i]; | ||
} | ||
for (var i=0; i<(tlen-1); i++) | ||
{ | ||
// Skip EOI marker from JPEGTables | ||
if (tables[i]==255 && tables[i+1]==EOI) break; | ||
buff[boff++] = tables[i]; | ||
} | ||
// Skip SOI marker from data | ||
var byte1 = data[off], byte2 = data[off + 1]; | ||
if (byte1!=255 || byte2!=SOI) { | ||
buff[boff++] = byte1; | ||
buff[boff++] = byte2; | ||
} | ||
for (var i=2; i<len; i++) buff[boff++] = data[off+i]; | ||
} | ||
else | ||
for (var i=0; i<len; i++) buff[i] = data[off+i]; | ||
// Skip SOI marker from data | ||
var byte1 = data[off], byte2 = data[off + 1]; | ||
if (byte1!=255 || byte2!=SOI) | ||
{ | ||
buff[boff++] = byte1; | ||
buff[boff++] = byte2; | ||
} | ||
for (var i=2; i<len; i++) buff[boff++] = data[off+i]; | ||
} | ||
else for (var i=0; i<len; i++) buff[i] = data[off+i]; | ||
if(img["t262"]==32803) { // lossless JPEG (used in DNG files) is not available in JpegDecoder. | ||
if(img["t262"]==32803) // lossless JPEG (used in DNG files) is not available in JpegDecoder. | ||
{ | ||
var bps = img["t258"][0], dcdr = new LosslessJpegDecoder(); | ||
var out = dcdr.decode(buff), olen=out.length; | ||
if(false) {} | ||
else if(bps==16) for(var i=0; i<olen; i++) { tgt[toff++] = (out[i]&255); tgt[toff++] = (out[i]>>>8); } | ||
else if(bps==12) { | ||
for(var i=0; i<olen; i+=2) { tgt[toff++] = (out[i]>>>4); tgt[toff++] = ((out[i]<<4)|(out[i+1]>>>8))&255; tgt[toff++] = out[i+1]&255; } | ||
} | ||
else if(bps==12) for(var i=0; i<olen; i+=2) { tgt[toff++] = (out[i]>>>4); tgt[toff++] = ((out[i]<<4)|(out[i+1]>>>8))&255; tgt[toff++] = out[i+1]&255; } | ||
else throw "unsupported bit depth "+bps; | ||
} | ||
else { | ||
else | ||
{ | ||
var parser = new JpegDecoder(); parser.parse(buff); | ||
@@ -237,17 +239,207 @@ var decoded = parser.getData(parser.width, parser.height); | ||
} | ||
//console.log(out); | ||
//throw "e"; | ||
//throw "e"; | ||
// PhotometricInterpretation is 6 (YCbCr) for JPEG, but after decoding we populate data in | ||
// RGB format, so updating the tag value | ||
if(img["t262"][0] == 6) img["t262"][0] = 2; | ||
// PhotometricInterpretation is 6 (YCbCr) for JPEG, but after decoding we populate data in | ||
// RGB format, so updating the tag value | ||
if(img["t262"][0] == 6) img["t262"][0] = 2; | ||
} | ||
UTIF.decode._decodeOldJPEGInit = function(img, data, off, len) | ||
{ | ||
var SOI = 216, EOI = 217, DQT = 219, DHT = 196, DRI = 221, SOF0 = 192, SOS = 218; | ||
var joff = 0, soff = 0, tables, sosMarker, isTiled = false, i, j, k; | ||
var jpgIchgFmt = img["t513"], jifoff = jpgIchgFmt ? jpgIchgFmt[0] : 0; | ||
var jpgIchgFmtLen = img["t514"], jiflen = jpgIchgFmtLen ? jpgIchgFmtLen[0] : 0; | ||
var soffTag = img["t324"] || img["t273"] || jpgIchgFmt; | ||
var ycbcrss = img["t530"], ssx = 0, ssy = 0; | ||
var spp = img["t277"]?img["t277"][0]:1; | ||
var jpgresint = img["t515"]; | ||
if(soffTag) | ||
{ | ||
soff = soffTag[0]; | ||
isTiled = (soffTag.length > 1); | ||
} | ||
if(!isTiled) | ||
{ | ||
if(data[off]==255 && data[off+1]==SOI) return { jpegOffset: off }; | ||
if(jpgIchgFmt!=null) | ||
{ | ||
if(data[off+jifoff]==255 && data[off+jifoff+1]==SOI) joff = off+jifoff; | ||
else log("JPEGInterchangeFormat does not point to SOI"); | ||
if(jpgIchgFmtLen==null) log("JPEGInterchangeFormatLength field is missing"); | ||
else if(jifoff >= soff || (jifoff+jiflen) <= soff) log("JPEGInterchangeFormatLength field value is invalid"); | ||
if(joff != null) return { jpegOffset: joff }; | ||
} | ||
} | ||
if(ycbcrss!=null) { ssx = ycbcrss[0]; ssy = ycbcrss[1]; } | ||
if(jpgIchgFmt!=null) | ||
if(jpgIchgFmtLen!=null) | ||
if(jiflen >= 2 && (jifoff+jiflen) <= soff) | ||
{ | ||
if(data[off+jifoff+jiflen-2]==255 && data[off+jifoff+jiflen-1]==SOI) tables = new Uint8Array(jiflen-2); | ||
else tables = new Uint8Array(jiflen); | ||
for(i=0; i<tables.length; i++) tables[i] = data[off+jifoff+i]; | ||
log("Incorrect JPEG interchange format: using JPEGInterchangeFormat offset to derive tables"); | ||
} | ||
else log("JPEGInterchangeFormat+JPEGInterchangeFormatLength > offset to first strip or tile"); | ||
if(tables == null) | ||
{ | ||
var ooff = 0, out = []; | ||
out[ooff++] = 255; out[ooff++] = SOI; | ||
var qtables = img["t519"]; | ||
if(qtables==null) throw "JPEGQTables tag is missing"; | ||
for(i=0; i<qtables.length; i++) | ||
{ | ||
out[ooff++] = 255; out[ooff++] = DQT; out[ooff++] = 0; out[ooff++] = 67; out[ooff++] = i; | ||
for(j=0; j<64; j++) out[ooff++] = data[off+qtables[i]+j]; | ||
} | ||
for(k=0; k<2; k++) | ||
{ | ||
var htables = img[(k == 0) ? "t520" : "t521"]; | ||
if(htables==null) throw (((k == 0) ? "JPEGDCTables" : "JPEGACTables") + " tag is missing"); | ||
for(i=0; i<htables.length; i++) | ||
{ | ||
out[ooff++] = 255; out[ooff++] = DHT; | ||
//out[ooff++] = 0; out[ooff++] = 67; out[ooff++] = i; | ||
var nc = 19; | ||
for(j=0; j<16; j++) nc += data[off+htables[i]+j]; | ||
out[ooff++] = (nc >>> 8); out[ooff++] = nc & 255; | ||
out[ooff++] = (i | (k << 4)); | ||
for(j=0; j<16; j++) out[ooff++] = data[off+htables[i]+j]; | ||
for(j=0; j<nc; j++) out[ooff++] = data[off+htables[i]+16+j]; | ||
} | ||
} | ||
out[ooff++] = 255; out[ooff++] = SOF0; | ||
out[ooff++] = 0; out[ooff++] = 8 + 3*spp; out[ooff++] = 8; | ||
out[ooff++] = (img.height >>> 8) & 255; out[ooff++] = img.height & 255; | ||
out[ooff++] = (img.width >>> 8) & 255; out[ooff++] = img.width & 255; | ||
out[ooff++] = spp; | ||
if(spp==1) { out[ooff++] = 1; out[ooff++] = 17; out[ooff++] = 0; } | ||
else for(i=0; i<3; i++) | ||
{ | ||
out[ooff++] = i + 1; | ||
out[ooff++] = (i != 0) ? 17 : (((ssx & 15) << 4) | (ssy & 15)); | ||
out[ooff++] = i; | ||
} | ||
if(jpgresint!=null && jpgresint[0]!=0) | ||
{ | ||
out[ooff++] = 255; out[ooff++] = DRI; out[ooff++] = 0; out[ooff++] = 4; | ||
out[ooff++] = (jpgresint[0] >>> 8) & 255; | ||
out[ooff++] = jpgresint[0] & 255; | ||
} | ||
tables = new Uint8Array(out); | ||
} | ||
var sofpos = -1; | ||
i = 0; | ||
while(i < (tables.length - 1)) { | ||
if(tables[i]==255 && tables[i+1]==SOF0) { sofpos = i; break; } | ||
i++; | ||
} | ||
if(sofpos == -1) | ||
{ | ||
var tmptab = new Uint8Array(tables.length + 10 + 3*spp); | ||
tmptab.set(tables); | ||
var tmpoff = tables.length; | ||
sofpos = tables.length; | ||
tables = tmptab; | ||
tables[tmpoff++] = 255; tables[tmpoff++] = SOF0; | ||
tables[tmpoff++] = 0; tables[tmpoff++] = 8 + 3*spp; tables[tmpoff++] = 8; | ||
tables[tmpoff++] = (img.height >>> 8) & 255; tables[tmpoff++] = img.height & 255; | ||
tables[tmpoff++] = (img.width >>> 8) & 255; tables[tmpoff++] = img.width & 255; | ||
tables[tmpoff++] = spp; | ||
if(spp==1) { tables[tmpoff++] = 1; tables[tmpoff++] = 17; tables[tmpoff++] = 0; } | ||
else for(i=0; i<3; i++) | ||
{ | ||
tables[tmpoff++] = i + 1; | ||
tables[tmpoff++] = (i != 0) ? 17 : (((ssx & 15) << 4) | (ssy & 15)); | ||
tables[tmpoff++] = i; | ||
} | ||
} | ||
if(data[soff]==255 && data[soff+1]==SOS) | ||
{ | ||
var soslen = (data[soff+2]<<8) | data[soff+3]; | ||
sosMarker = new Uint8Array(soslen+2); | ||
sosMarker[0] = data[soff]; sosMarker[1] = data[soff+1]; sosMarker[2] = data[soff+2]; sosMarker[3] = data[soff+3]; | ||
for(i=0; i<(soslen-2); i++) sosMarker[i+4] = data[soff+i+4]; | ||
} | ||
else | ||
{ | ||
sosMarker = new Uint8Array(2 + 6 + 2*spp); | ||
var sosoff = 0; | ||
sosMarker[sosoff++] = 255; sosMarker[sosoff++] = SOS; | ||
sosMarker[sosoff++] = 0; sosMarker[sosoff++] = 6 + 2*spp; sosMarker[sosoff++] = spp; | ||
if(spp==1) { sosMarker[sosoff++] = 1; sosMarker[sosoff++] = 0; } | ||
else for(i=0; i<3; i++) | ||
{ | ||
sosMarker[sosoff++] = i+1; sosMarker[sosoff++] = (i << 4) | i; | ||
} | ||
sosMarker[sosoff++] = 0; sosMarker[sosoff++] = 63; sosMarker[sosoff++] = 0; | ||
} | ||
return { jpegOffset: off, tables: tables, sosMarker: sosMarker, sofPosition: sofpos }; | ||
} | ||
UTIF.decode._decodeOldJPEG = function(img, data, off, len, tgt, toff) | ||
{ | ||
if(typeof JpegDecoder=="undefined") { log("jpg.js required for handling JPEG compressed images"); return; } | ||
var i, dlen, tlen, buff, buffoff; | ||
var jpegData = UTIF.decode._decodeOldJPEGInit(img, data, off, len); | ||
if(jpegData.jpegOffset!=null) | ||
{ | ||
dlen = off+len-jpegData.jpegOffset; | ||
buff = new Uint8Array(dlen); | ||
for(i=0; i<dlen; i++) buff[i] = data[jpegData.jpegOffset+i]; | ||
} | ||
else | ||
{ | ||
tlen = jpegData.tables.length; | ||
buff = new Uint8Array(tlen + jpegData.sosMarker.length + len + 2); | ||
buff.set(jpegData.tables); | ||
buffoff = tlen; | ||
buff[jpegData.sofPosition+5] = (img.height >>> 8) & 255; buff[jpegData.sofPosition+6] = img.height & 255; | ||
buff[jpegData.sofPosition+7] = (img.width >>> 8) & 255; buff[jpegData.sofPosition+8] = img.width & 255; | ||
if(data[off]!=255 || data[off+1]!=SOS) | ||
{ | ||
buff.set(jpegData.sosMarker, bufoff); | ||
bufoff += sosMarker.length; | ||
} | ||
for(i=0; i<len; i++) buff[bufoff++] = data[off+i]; | ||
buff[bufoff++] = 255; buff[bufoff++] = EOI; | ||
} | ||
var parser = new JpegDecoder(); parser.parse(buff); | ||
var decoded = parser.getData(parser.width, parser.height); | ||
for (var i=0; i<decoded.length; i++) tgt[toff + i] = decoded[i]; | ||
// PhotometricInterpretation is 6 (YCbCr) for JPEG, but after decoding we populate data in | ||
// RGB format, so updating the tag value | ||
if(img["t262"][0] == 6) img["t262"][0] = 2; | ||
} | ||
UTIF.decode._decodePackBits = function(data, off, len, tgt, toff) | ||
{ | ||
var sa = new Int8Array(data.buffer), ta = new Int8Array(tgt.buffer), lim = off+len; | ||
while(off<lim) { | ||
while(off<lim) | ||
{ | ||
var n = sa[off]; off++; | ||
@@ -258,2 +450,3 @@ if(n>=0 && n<128) for(var i=0; i< n+1; i++) { ta[toff]=sa[off]; toff++; off++; } | ||
} | ||
UTIF.decode._decodeThunder = function(data, off, len, tgt, toff) | ||
@@ -263,3 +456,4 @@ { | ||
var lim = off+len, qoff = toff*2, px = 0; | ||
while(off<lim) { | ||
while(off<lim) | ||
{ | ||
var b = data[off], msk = (b>>>6), n = (b&63); off++; | ||
@@ -274,3 +468,4 @@ if(msk==3) { px=(n&15); tgt[qoff>>>1] |= (px<<(4*(1-qoff&1))); qoff++; } | ||
UTIF.decode._dmap = { "1":0,"011":1,"000011":2,"0000011":3, "010":-1,"000010":-2,"0000010":-3 }; | ||
UTIF.decode._lens = ( function() { | ||
UTIF.decode._lens = ( function() | ||
{ | ||
var addKeys = function(lens, arr, i0, inc) { for(var i=0; i<arr.length; i++) lens[arr[i]] = i0 + i*inc; } | ||
@@ -302,3 +497,4 @@ | ||
addKeys(lensB, termB, 0, 1); addKeys(lensB, makeB, 64,64); addKeys(lensB, makeA, 1792,64); | ||
return [lensW, lensB]; } )(); | ||
return [lensW, lensB]; | ||
} )(); | ||
@@ -311,2 +507,3 @@ UTIF.decode._decodeG4 = function(data, off, slen, tgt, toff, w, fo) | ||
var y=0, mode="", toRead=0; | ||
var bipl = Math.ceil(w/8)*8; | ||
@@ -320,4 +517,6 @@ while((boff>>>3)<off+slen) | ||
boff++; wrd+=bit; | ||
if(mode=="H") { | ||
if(U._lens[clr][wrd]!=null) { | ||
if(mode=="H") | ||
{ | ||
if(U._lens[clr][wrd]!=null) | ||
{ | ||
var dl=U._lens[clr][wrd]; wrd=""; len+=dl; | ||
@@ -327,3 +526,4 @@ if(dl<64) { U._addNtimes(line,len,clr); a0+=len; clr=1-clr; len=0; toRead--; if(toRead==0) mode=""; } | ||
} | ||
else { | ||
else | ||
{ | ||
if(wrd=="0001") { wrd=""; U._addNtimes(line,b2-a0,clr); a0=b2; } | ||
@@ -333,4 +533,5 @@ if(wrd=="001" ) { wrd=""; mode="H"; toRead=2; } | ||
} | ||
if(line.length==w && mode=="") { | ||
U._writeBits(line, tgt, toff*8+y*w); | ||
if(line.length==w && mode=="") | ||
{ | ||
U._writeBits(line, tgt, toff*8+y*bipl); | ||
clr=0; y++; a0=0; | ||
@@ -344,3 +545,5 @@ pline=U._makeDiff(line); line=[]; | ||
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]; } | ||
UTIF.decode._makeDiff = function(line) { | ||
UTIF.decode._makeDiff = function(line) | ||
{ | ||
var out = []; if(line[0]==1) out.push(0,1); | ||
@@ -350,2 +553,3 @@ for(var i=1; i<line.length; i++) if(line[i-1]!=line[i]) out.push(i, line[i]); | ||
} | ||
UTIF.decode._decodeG3 = function(data, off, slen, tgt, toff, w, fo) | ||
@@ -357,2 +561,3 @@ { | ||
var y=-1, mode="", toRead=0, is1D=false; | ||
var bipl = Math.ceil(w/8)*8; | ||
while((boff>>>3)<off+slen) | ||
@@ -366,4 +571,6 @@ { | ||
if(is1D) { | ||
if(U._lens[clr][wrd]!=null) { | ||
if(is1D) | ||
{ | ||
if(U._lens[clr][wrd]!=null) | ||
{ | ||
var dl=U._lens[clr][wrd]; wrd=""; len+=dl; | ||
@@ -373,5 +580,8 @@ if(dl<64) { U._addNtimes(line,len,clr); clr=1-clr; len=0; } | ||
} | ||
else { | ||
if(mode=="H") { | ||
if(U._lens[clr][wrd]!=null) { | ||
else | ||
{ | ||
if(mode=="H") | ||
{ | ||
if(U._lens[clr][wrd]!=null) | ||
{ | ||
var dl=U._lens[clr][wrd]; wrd=""; len+=dl; | ||
@@ -381,3 +591,4 @@ if(dl<64) { U._addNtimes(line,len,clr); a0+=len; clr=1-clr; len=0; toRead--; if(toRead==0) mode=""; } | ||
} | ||
else { | ||
else | ||
{ | ||
if(wrd=="0001") { wrd=""; U._addNtimes(line,b2-a0,clr); a0=b2; } | ||
@@ -388,4 +599,5 @@ if(wrd=="001" ) { wrd=""; mode="H"; toRead=2; } | ||
} | ||
if(wrd.endsWith("000000000001")) { // needed for some files | ||
if(y>=0) U._writeBits(line, tgt, toff*8+y*w); | ||
if(wrd.endsWith("000000000001")) // needed for some files | ||
{ | ||
if(y>=0) U._writeBits(line, tgt, toff*8+y*bipl); | ||
if(fo==1) is1D = ((data[boff>>>3]>>>(7-(boff&7)))&1)==1; | ||
@@ -401,3 +613,3 @@ if(fo==2) is1D = ((data[boff>>>3]>>>( (boff&7)))&1)==1; | ||
} | ||
if(line.length==w) U._writeBits(line, tgt, toff*8+y*w); | ||
if(line.length==w) U._writeBits(line, tgt, toff*8+y*bipl); | ||
} | ||
@@ -414,4 +626,5 @@ | ||
{ | ||
if(UTIF.decode._lzwTab==null) { | ||
var tb=new Uint32Array(0xffff), tn=new Uint16Array(0xffff), chr=new Uint8Array(2e6); | ||
if(UTIF.decode._lzwTab==null) | ||
{ | ||
var tb=new Uint32Array(0xffff), tn=new Uint16Array(0xffff), chr=new Uint8Array(2e6); | ||
for(var i=0; i<256; i++) { chr[i<<2]=i; tb[i]=i<<2; tn[i]=1; } | ||
@@ -426,10 +639,12 @@ UTIF.decode._lzwTab = [tb,tn,chr]; | ||
var v = 0, Code = 0, OldCode = 0; | ||
while(true) { | ||
while(true) | ||
{ | ||
v = (data[boff>>>3]<<16) | (data[(boff+8)>>>3]<<8) | data[(boff+16)>>>3]; | ||
Code = ( v>>(24-(boff&7)-bits) ) & ((1<<bits)-1); boff+=bits; | ||
if(Code==EoiCode) break; | ||
if(Code==ClearCode) { | ||
if(Code==ClearCode) | ||
{ | ||
bits=9; totl = 258; chrl = 258<<2; | ||
v = (data[boff>>>3]<<16) | (data[(boff+8)>>>3]<<8) | data[(boff+16)>>>3]; | ||
@@ -440,3 +655,4 @@ Code = ( v>>(24-(boff&7)-bits) ) & ((1<<bits)-1); boff+=bits; | ||
} | ||
else if(Code<totl) { | ||
else if(Code<totl) | ||
{ | ||
var cd = tab[Code], cl = tln[Code]; | ||
@@ -446,3 +662,4 @@ copy(chr,cd,tgt,toff,cl); toff += cl; | ||
if(OldCode>=totl) { tab[totl] = chrl; chr[tab[totl]] = cd[0]; tln[totl]=1; chrl=(chrl+1+3)&~0x03; totl++; } | ||
else { | ||
else | ||
{ | ||
tab[totl] = chrl; | ||
@@ -453,3 +670,3 @@ var nit = tab[OldCode], nil = tln[OldCode]; | ||
tln[totl]=nil; totl++; | ||
chrl=(chrl+nil+3)&~0x03; | ||
@@ -459,5 +676,7 @@ } | ||
} | ||
else { | ||
else | ||
{ | ||
if(OldCode>=totl) { tab[totl] = chrl; tln[totl]=0; totl++; } | ||
else { | ||
else | ||
{ | ||
tab[totl] = chrl; | ||
@@ -468,4 +687,4 @@ var nit = tab[OldCode], nil = tln[OldCode]; | ||
tln[totl]=nil; totl++; | ||
copy(chr,chrl,tgt,toff,nil); toff += nil; | ||
copy(chr,chrl,tgt,toff,nil); toff += nil; | ||
chrl=(chrl+nil+3)&~0x03; | ||
@@ -478,36 +697,37 @@ } | ||
} | ||
UTIF.decode._copyData = function(s,so,t,to,l) { for(var i=0;i<l;i+=4) { t[to+i]=s[so+i]; t[to+i+1]=s[so+i+1]; t[to+i+2]=s[so+i+2]; t[to+i+3]=s[so+i+3]; } } | ||
UTIF.tags = {254:"NewSubfileType",255:"SubfileType",256:"ImageWidth",257:"ImageLength",258:"BitsPerSample",259:"Compression",262:"PhotometricInterpretation",266:"FillOrder", | ||
269:"DocumentName",270:"ImageDescription",271:"Make",272:"Model",273:"StripOffset",274:"Orientation",277:"SamplesPerPixel",278:"RowsPerStrip", | ||
279:"StripByteCounts",280:"MinSampleValue",281:"MaxSampleValue",282:"XResolution",283:"YResolution",284:"PlanarConfiguration",285:"PageName", | ||
286:"XPosition",287:"YPosition", | ||
292:"T4Options",296:"ResolutionUnit",297:"PageNumber",305:"Software",306:"DateTime",315:"Artist",316:"HostComputer",317:"Predictor",320:"ColorMap", | ||
321:"HalftoneHints",322:"TileWidth", | ||
323:"TileLength",324:"TileOffset",325:"TileByteCounts",330:"SubIFDs",336:"DotRange",338:"ExtraSample",339:"SampleFormat", 347:"JPEGTables", | ||
512:"JPEGProc",513:"JPEGInterchangeFormat",514:"JPEGInterchangeFormatLength",519:"JPEGQTables",520:"JPEGDCTables",521:"JPEGACTables", | ||
529:"YCbCrCoefficients",530:"YCbCrSubSampling",531:"YCbCrPositioning",532:"ReferenceBlackWhite",700:"XMP", | ||
33421:"CFARepeatPatternDim",33422:"CFAPattern",33432:"Copyright",33434:"ExposureTime",33437:"FNumber",33723:"IPTC/NAA",34377:"Photoshop", | ||
34665:"ExifIFD",34850:"ExposureProgram",34853:"GPSInfo",34855:"ISOSpeedRatings",34858:"TimeZoneOffset",34859:"SelfTimeMode", | ||
36867:"DateTimeOriginal",36868:"DateTimeDigitized", | ||
37377:"ShutterSpeedValue",37378:"ApertureValue",37380:"ExposureBiasValue",37383:"MeteringMode",37385:"Flash",37386:"FocalLength", | ||
37390:"FocalPlaneXResolution",37391:"FocalPlaneYResolution",37392:"FocalPlaneResolutionUnit",37393:"ImageNumber",37398:"TIFF/EPStandardID",37399:"SensingMethod", | ||
37500:"MakerNote",37510:"UserComment", | ||
40092:"XPComment",40094:"XPKeywords", | ||
40961:"ColorSpace",40962:"PixelXDimension",40963:"PixelXDimension",41486:"FocalPlaneXResolution",41487:"FocalPlaneYResolution",41488:"FocalPlaneResolutionUnit", | ||
41985:"CustomRendered",41986:"ExposureMode",41987:"WhiteBalance",41990:"SceneCaptureType", | ||
50706:"DNGVersion",50707:"DNGBackwardVersion",50708:"UniqueCameraModel",50709:"LocalizedCameraModel",50710:"CFAPlaneColor", | ||
50711:"CFALayout",50712:"LinearizationTable",50713:"BlackLevelRepeatDim",50714:"BlackLevel",50716:"BlackLevelDeltaV",50717:"WhiteLevel", | ||
50718:"DefaultScale",50719:"DefaultCropOrigin", | ||
50720:"DefaultCropSize",50733:"BayerGreenSplit",50738:"AntiAliasStrength", | ||
50721:"ColorMatrix1",50722:"ColorMatrix2",50723:"CameraCalibration1",50724:"CameraCalibration2",50727:"AnalogBalance",50728:"AsShotNeutral", | ||
50730:"BaselineExposure",50731:"BaselineNoise",50732:"BaselineSharpness",50734:"LinearResponseLimit",50735:"CameraSerialNumber",50736:"LensInfo",50739:"ShadowScale", | ||
50740:"DNGPrivateData",50741:"MakerNoteSafety",50778:"CalibrationIlluminant1",50779:"CalibrationIlluminant2",50780:"BestQualityScale", | ||
50781:"RawDataUniqueID",50827:"OriginalRawFileName",50829:"ActiveArea",50830:"MaskedAreas",50931:"CameraCalibrationSignature",50932:"ProfileCalibrationSignature", | ||
50935:"NoiseReductionApplied",50936:"ProfileName",50937:"ProfileHueSatMapDims",50938:"ProfileHueSatMapData1",50939:"ProfileHueSatMapData2", | ||
50940:"ProfileToneCurve",50941:"ProfileEmbedPolicy",50942:"ProfileCopyright", | ||
50964:"ForwardMatrix1",50965:"ForwardMatrix2",50966:"PreviewApplicationName",50967:"PreviewApplicationVersion",50969:"PreviewSettingsDigest", | ||
50970:"PreviewColorSpace",50971:"PreviewDateTime",50972:"RawImageDigest", | ||
51008:"OpcodeList1",51009:"OpcodeList2",51022:"OpcodeList3",51041:"NoiseProfile",51089:"OriginalDefaultFinalSize", | ||
51090:"OriginalBestQualityFinalSize",51091:"OriginalDefaultCropSize",51125:"DefaultUserCrop"}; | ||
269:"DocumentName",270:"ImageDescription",271:"Make",272:"Model",273:"StripOffset",274:"Orientation",277:"SamplesPerPixel",278:"RowsPerStrip", | ||
279:"StripByteCounts",280:"MinSampleValue",281:"MaxSampleValue",282:"XResolution",283:"YResolution",284:"PlanarConfiguration",285:"PageName", | ||
286:"XPosition",287:"YPosition", | ||
292:"T4Options",296:"ResolutionUnit",297:"PageNumber",305:"Software",306:"DateTime",315:"Artist",316:"HostComputer",317:"Predictor",320:"ColorMap", | ||
321:"HalftoneHints",322:"TileWidth", | ||
323:"TileLength",324:"TileOffset",325:"TileByteCounts",330:"SubIFDs",336:"DotRange",338:"ExtraSample",339:"SampleFormat", 347:"JPEGTables", | ||
512:"JPEGProc",513:"JPEGInterchangeFormat",514:"JPEGInterchangeFormatLength",519:"JPEGQTables",520:"JPEGDCTables",521:"JPEGACTables", | ||
529:"YCbCrCoefficients",530:"YCbCrSubSampling",531:"YCbCrPositioning",532:"ReferenceBlackWhite",700:"XMP", | ||
33421:"CFARepeatPatternDim",33422:"CFAPattern",33432:"Copyright",33434:"ExposureTime",33437:"FNumber",33723:"IPTC/NAA",34377:"Photoshop", | ||
34665:"ExifIFD",34850:"ExposureProgram",34853:"GPSInfo",34855:"ISOSpeedRatings",34858:"TimeZoneOffset",34859:"SelfTimeMode", | ||
36867:"DateTimeOriginal",36868:"DateTimeDigitized", | ||
37377:"ShutterSpeedValue",37378:"ApertureValue",37380:"ExposureBiasValue",37383:"MeteringMode",37385:"Flash",37386:"FocalLength", | ||
37390:"FocalPlaneXResolution",37391:"FocalPlaneYResolution",37392:"FocalPlaneResolutionUnit",37393:"ImageNumber",37398:"TIFF/EPStandardID",37399:"SensingMethod", | ||
37500:"MakerNote",37510:"UserComment", | ||
40092:"XPComment",40094:"XPKeywords", | ||
40961:"ColorSpace",40962:"PixelXDimension",40963:"PixelXDimension",41486:"FocalPlaneXResolution",41487:"FocalPlaneYResolution",41488:"FocalPlaneResolutionUnit", | ||
41985:"CustomRendered",41986:"ExposureMode",41987:"WhiteBalance",41990:"SceneCaptureType", | ||
50706:"DNGVersion",50707:"DNGBackwardVersion",50708:"UniqueCameraModel",50709:"LocalizedCameraModel",50710:"CFAPlaneColor", | ||
50711:"CFALayout",50712:"LinearizationTable",50713:"BlackLevelRepeatDim",50714:"BlackLevel",50716:"BlackLevelDeltaV",50717:"WhiteLevel", | ||
50718:"DefaultScale",50719:"DefaultCropOrigin", | ||
50720:"DefaultCropSize",50733:"BayerGreenSplit",50738:"AntiAliasStrength", | ||
50721:"ColorMatrix1",50722:"ColorMatrix2",50723:"CameraCalibration1",50724:"CameraCalibration2",50727:"AnalogBalance",50728:"AsShotNeutral", | ||
50730:"BaselineExposure",50731:"BaselineNoise",50732:"BaselineSharpness",50734:"LinearResponseLimit",50735:"CameraSerialNumber",50736:"LensInfo",50739:"ShadowScale", | ||
50740:"DNGPrivateData",50741:"MakerNoteSafety",50778:"CalibrationIlluminant1",50779:"CalibrationIlluminant2",50780:"BestQualityScale", | ||
50781:"RawDataUniqueID",50827:"OriginalRawFileName",50829:"ActiveArea",50830:"MaskedAreas",50931:"CameraCalibrationSignature",50932:"ProfileCalibrationSignature", | ||
50935:"NoiseReductionApplied",50936:"ProfileName",50937:"ProfileHueSatMapDims",50938:"ProfileHueSatMapData1",50939:"ProfileHueSatMapData2", | ||
50940:"ProfileToneCurve",50941:"ProfileEmbedPolicy",50942:"ProfileCopyright", | ||
50964:"ForwardMatrix1",50965:"ForwardMatrix2",50966:"PreviewApplicationName",50967:"PreviewApplicationVersion",50969:"PreviewSettingsDigest", | ||
50970:"PreviewColorSpace",50971:"PreviewDateTime",50972:"RawImageDigest", | ||
51008:"OpcodeList1",51009:"OpcodeList2",51022:"OpcodeList3",51041:"NoiseProfile",51089:"OriginalDefaultFinalSize", | ||
51090:"OriginalBestQualityFinalSize",51091:"OriginalDefaultCropSize",51125:"DefaultUserCrop"}; | ||
@@ -521,4 +741,5 @@ 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 }; | ||
//console.log(">>>----------------"); | ||
for(var i=0; i<cnt; i++) { | ||
//log(">>>----------------"); | ||
for(var i=0; i<cnt; i++) | ||
{ | ||
var tag = bin.readUshort(data, offset); offset+=2; | ||
@@ -544,8 +765,9 @@ var type = bin.readUshort(data, offset); offset+=2; | ||
//log(tag, type, UTIF.tags[tag], arr); | ||
if(tag== 330) for(var j=0; j<num; j++) UTIF._readIFD(bin, data, arr[j], ifds); | ||
if(tag==330) for(var j=0; j<num; j++) UTIF._readIFD(bin, data, arr[j], ifds); | ||
//if(tag==34665) UTIF._readIFD(bin, data, arr[0], ifds); | ||
} | ||
//console.log("<<<---------------"); | ||
//log("<<<---------------"); | ||
return offset; | ||
} | ||
UTIF._writeIFD = function(bin, data, offset, ifd) | ||
@@ -558,3 +780,4 @@ { | ||
for(var ki=0; ki<keys.length; ki++) { | ||
for(var ki=0; ki<keys.length; ki++) | ||
{ | ||
var key = keys[ki]; | ||
@@ -591,20 +814,34 @@ var tag = parseInt(key.slice(1)), type = UTIF.ttypes[tag]; if(type==null) throw "unknown type of tag: "+tag; | ||
if(false) {} | ||
else if(intp==0) { | ||
if(bps== 1) for(var i=0; i<area; i++) { var qi=i<<2, px=((data[i>>3])>>(7- (i&7)))& 1; img[qi]=img[qi+1]=img[qi+2]=( 1-px)*255; img[qi+3]=255; } | ||
if(bps== 4) for(var i=0; i<area; i++) { var qi=i<<2, px=((data[i>>1])>>(4-4*(i&1)))&15; img[qi]=img[qi+1]=img[qi+2]=(15-px)* 17; img[qi+3]=255; } | ||
if(bps== 8) for(var i=0; i<area; i++) { var qi=i<<2, px=data[i]; img[qi]=img[qi+1]=img[qi+2]=255-px; img[qi+3]=255; } | ||
else if(intp==0) | ||
{ | ||
var bpl = Math.ceil(bps*w/8); | ||
for(var y=0; y<h; y++) { | ||
var off = y*bpl, io = y*w; | ||
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; } | ||
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; } | ||
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; } | ||
} | ||
} | ||
else if(intp==1) { | ||
if(bps== 1) for(var i=0; i<area; i++) { var qi=i<<2, px=((data[i>>3])>>(7- (i&7)))&1; img[qi]=img[qi+1]=img[qi+2]=(px)*255; img[qi+3]=255; } | ||
if(bps== 2) for(var i=0; i<area; i++) { var qi=i<<2, px=((data[i>>2])>>(6-2*(i&3)))&3; img[qi]=img[qi+1]=img[qi+2]=(px)* 85; img[qi+3]=255; } | ||
if(bps== 8) for(var i=0; i<area; i++) { var qi=i<<2, px=data[i]; img[qi]=img[qi+1]=img[qi+2]= px; img[qi+3]=255; } | ||
if(bps==16) for(var i=0; i<area; i++) { var qi=i<<2, px=data[2*i+isLE]; img[qi]=img[qi+1]=img[qi+2]= Math.min(255,px); img[qi+3]=255; } // ladoga.tif | ||
else if(intp==1) | ||
{ | ||
var bpl = Math.ceil(bps*w/8); | ||
for(var y=0; y<h; y++) { | ||
var off = y*bpl, io = y*w; | ||
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; } | ||
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; } | ||
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]= px; img[qi+3]=255; } | ||
if(bps==16) for(var i=0; i<w; i++) { var qi=(io+i)<<2, px=data[off+(2*i+isLE)]; img[qi]=img[qi+1]=img[qi+2]= Math.min(255,px); img[qi+3]=255; } // ladoga.tif | ||
} | ||
} | ||
else if(intp==2) { | ||
if(bps== 8) { // this needs to be simplified ... how many channels are there??? | ||
if(out["t338"]) { | ||
else if(intp==2) | ||
{ | ||
if(bps== 8) // this needs to be simplified ... how many channels are there??? | ||
{ | ||
if(out["t338"]) | ||
{ | ||
if(out["t338"][0]>0) for(var i=0; i<qarea; i++) img[i] = data[i]; // sometimes t338 is 1 or 2 in case of Alpha | ||
else for(var i=0; i<qarea; i+=4) { img[i] = data[i]; img[i+1] = data[i+1]; img[i+2] = data[i+2]; img[i+3] = 255; } | ||
} | ||
else { | ||
else | ||
{ | ||
var smpls = out["t258"]?out["t258"].length : 3; | ||
@@ -618,7 +855,9 @@ if(smpls==4) for(var i=0; i<qarea; i++) img[i] = data[i]; | ||
} | ||
else if(intp==3) { | ||
else if(intp==3) | ||
{ | ||
var map = out["t320"]; | ||
for(var i=0; i<area; i++) { var qi=i<<2, mi=data[i]; img[qi]=(map[mi]>>8); img[qi+1]=(map[256+mi]>>8); img[qi+2]=(map[512+mi]>>8); img[qi+3]=255; } | ||
} | ||
else if(intp==5) for(var i=0; i<area; i++) { | ||
else if(intp==5) for(var i=0; i<area; i++) | ||
{ | ||
var qi=i<<2; var C=255-data[qi], M=255-data[qi+1], Y=255-data[qi+2], K=(255-data[qi+3])*(1/255); | ||
@@ -634,4 +873,6 @@ img[qi]=Math.round(C*K); img[qi+1]=Math.round(M*K); img[qi+2]=Math.round(Y*K); img[qi+3]=255; | ||
var imgs = document.getElementsByTagName("img"); | ||
for (var i=0; i<imgs.length; i++) { | ||
var img=imgs[i], src=img.getAttribute("src"), suff=src.split(".").pop().toLowerCase(); | ||
for (var i=0; i<imgs.length; i++) | ||
{ | ||
var img=imgs[i], src=img.getAttribute("src"); if(src==null) continue; | ||
var suff=src.split(".").pop().toLowerCase(); | ||
if(suff!="tif" && suff!="tiff") continue; | ||
@@ -643,2 +884,3 @@ var xhr = new XMLHttpRequest(); UTIF._xhrs.push(xhr); UTIF._imgs.push(img); | ||
} | ||
UTIF._xhrs = []; UTIF._imgs = []; | ||
@@ -661,3 +903,4 @@ UTIF._imgLoaded = function(e) | ||
UTIF._binBE = { | ||
UTIF._binBE = | ||
{ | ||
nextZero : function(data, o) { while(data[o]!=0) o++; return o; }, | ||
@@ -675,7 +918,6 @@ readUshort : function(buff, p) { return (buff[p]<< 8) | buff[p+1]; }, | ||
writeASCII : function(buff, p, s) { for(var i = 0; i < s.length; i++) buff[p+i] = s.charCodeAt(i); }, | ||
writeDouble: function(buff, p, n) { | ||
writeDouble: function(buff, p, n) | ||
{ | ||
UTIF._binBE.fl64[0] = n; | ||
for (var i = 0; i < 8; i++) { | ||
buff[p + i] = UTIF._binBE.ui8[7 - i]; | ||
} | ||
for (var i = 0; i < 8; i++) buff[p + i] = UTIF._binBE.ui8[7 - i]; | ||
} | ||
@@ -690,3 +932,4 @@ } | ||
UTIF._binLE = { | ||
UTIF._binLE = | ||
{ | ||
nextZero : UTIF._binBE.nextZero, | ||
@@ -703,3 +946,3 @@ readUshort : function(buff, p) { return (buff[p+1]<< 8) | buff[p]; }, | ||
{ | ||
//console.log("copyTile", tw, th, w, h, xoff, yoff); | ||
//log("copyTile", tw, th, w, h, xoff, yoff); | ||
var xlim = Math.min(tw, w-xoff); | ||
@@ -715,3 +958,3 @@ var ylim = Math.min(th, h-yoff); | ||
})(UTIF, pako); | ||
})(); | ||
})(UTIF, pako, JpegDecoder); | ||
})(); |
GitHub dependency
Supply chain riskContains a dependency which resolves to a GitHub URL. Dependencies fetched from GitHub specifiers are not immutable can be used to inject untrusted code or reduce the likelihood of a reproducible install.
Found 1 instance in 1 package
GitHub dependency
Supply chain riskContains a dependency which resolves to a GitHub URL. Dependencies fetched from GitHub specifiers are not immutable can be used to inject untrusted code or reduce the likelihood of a reproducible install.
Found 1 instance in 1 package
45325
809
Updatedjpgjs@github:makr28/jpgjs