Socket
Socket
Sign inDemoInstall

utif

Package Overview
Dependencies
1
Maintainers
2
Versions
11
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 1.3.0 to 2.0.0

4

package.json
{
"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 @@

@@ -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);
})();
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc