update tng.
This commit is contained in:
parent
ab8e309268
commit
7197a4e16d
|
@ -92,21 +92,24 @@ PNG.prototype.parseRaw = function(buf) {
|
|||
|
||||
while (i < buf.length) {
|
||||
try {
|
||||
pos = i;
|
||||
len = buf.readUInt32BE(i);
|
||||
i += 4;
|
||||
pos = i;
|
||||
type = buf.slice(i, i + 4);
|
||||
name = type.toString('ascii');
|
||||
i += 4;
|
||||
data = buf.slice(i, i + len);
|
||||
i += len;
|
||||
check = this.crc32(buf.slice(pos, i));
|
||||
crc = buf.readUInt32BE(i);
|
||||
crc = buf.readInt32BE(i);
|
||||
i += 4;
|
||||
critical = !!(~type[0] & 32);
|
||||
public_ = !!(~type[1] & 32);
|
||||
conforming = !!(~type[2] & 32);
|
||||
copysafe = !!(~type[3] & 32);
|
||||
if (crc !== check) {
|
||||
throw new Error(name + ': bad crc');
|
||||
}
|
||||
} catch (e) {
|
||||
if (this.options.debug) throw e;
|
||||
break;
|
||||
|
@ -1200,9 +1203,91 @@ PNG.prototype.decompress = function(buffers) {
|
|||
}, [])));
|
||||
};
|
||||
|
||||
PNG.prototype.crc32 = function(data) {
|
||||
return 0;
|
||||
};
|
||||
/**
|
||||
* node-crc
|
||||
* https://github.com/alexgorbatchev/node-crc
|
||||
* https://github.com/alexgorbatchev/node-crc/blob/master/LICENSE
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright 2014 Alex Gorbatchev
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
PNG.prototype.crc32 = (function() {
|
||||
var crcTable = [
|
||||
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
|
||||
0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
|
||||
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
|
||||
0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
|
||||
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
|
||||
0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
|
||||
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
|
||||
0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
|
||||
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
|
||||
0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
|
||||
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
|
||||
0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
|
||||
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
|
||||
0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
|
||||
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
|
||||
0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
|
||||
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
|
||||
0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
|
||||
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
|
||||
0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
|
||||
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
|
||||
0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
|
||||
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
|
||||
0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
|
||||
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
|
||||
0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
|
||||
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
|
||||
0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
|
||||
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
|
||||
0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
|
||||
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
|
||||
0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
|
||||
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
|
||||
0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
|
||||
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
|
||||
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
|
||||
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
|
||||
0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
|
||||
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
|
||||
0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
|
||||
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
|
||||
0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
|
||||
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
|
||||
];
|
||||
|
||||
return function crc32(buf) {
|
||||
//var crc = previous === 0 ? 0 : ~~previous ^ -1;
|
||||
var crc = -1;
|
||||
for (var i = 0, len = buf.length; i < len; i++) {
|
||||
crc = crcTable[(crc ^ buf[i]) & 0xff] ^ (crc >>> 8);
|
||||
}
|
||||
return crc ^ -1;
|
||||
};
|
||||
})();
|
||||
|
||||
PNG.prototype._debug = function() {
|
||||
if (!this.options.log) return;
|
||||
|
@ -1236,6 +1321,14 @@ function GIF(file, options) {
|
|||
|
||||
options = options || {};
|
||||
|
||||
this.options = options;
|
||||
|
||||
// XXX If the gif is not optimized enough
|
||||
// it may OOM the process with too many frames.
|
||||
// TODO: Implement in PNG reader.
|
||||
this.pixelLimit = this.options.pixelLimit || 7622550;
|
||||
this.totalPixels = 0;
|
||||
|
||||
if (Buffer.isBuffer(file)) {
|
||||
buf = file;
|
||||
file = null;
|
||||
|
@ -1315,7 +1408,7 @@ function GIF(file, options) {
|
|||
while (buf[p] !== 0x00) {
|
||||
// Some gifs screw up their size.
|
||||
// XXX Same for all subblocks?
|
||||
if (buf[p] === 0x3b) {
|
||||
if (buf[p] === 0x3b && p === buf.length - 1) {
|
||||
p--;
|
||||
break;
|
||||
}
|
||||
|
@ -1328,7 +1421,17 @@ function GIF(file, options) {
|
|||
assert.equal(buf.readUInt8(p), 0x00);
|
||||
p += 1;
|
||||
|
||||
if (ext && ext.label === 0xf9) {
|
||||
img.control = ext;
|
||||
}
|
||||
|
||||
this.totalPixels += img.width * img.height;
|
||||
|
||||
this.images.push(img);
|
||||
|
||||
if (this.totalPixels >= this.pixelLimit) {
|
||||
break;
|
||||
}
|
||||
} else if (desc === 0x21) {
|
||||
// Extensions:
|
||||
// http://www.w3.org/Graphics/GIF/spec-gif89a.txt
|
||||
|
@ -1360,6 +1463,7 @@ function GIF(file, options) {
|
|||
this.disposeMethod = ext.disposeMethod;
|
||||
this.useTransparent = ext.useTransparent;
|
||||
} else if (label === 0xff) {
|
||||
// https://wiki.whatwg.org/wiki/GIF#Specifications
|
||||
size = buf.readUInt8(p);
|
||||
p += 1;
|
||||
ext.id = buf.slice(p, p + 8).toString('ascii');
|
||||
|
@ -1373,11 +1477,42 @@ function GIF(file, options) {
|
|||
ext.data.push(buf.slice(p, p + size));
|
||||
p += size;
|
||||
}
|
||||
// http://graphcomp.com/info/specs/ani_gif.html
|
||||
ext.data = new Buffer(ext.data.reduce(function(out, data) {
|
||||
return out.concat(Array.prototype.slice.call(data));
|
||||
}, []));
|
||||
// AnimExts looping extension (identical to netscape)
|
||||
if (ext.id === 'ANIMEXTS' && ext.auth === '1.0') {
|
||||
ext.id = 'NETSCAPE';
|
||||
ext.auth = '2.0';
|
||||
ext.animexts = true;
|
||||
}
|
||||
// Netscape extensions
|
||||
if (ext.id === 'NETSCAPE' && ext.auth === '2.0') {
|
||||
assert.equal(ext.data[0].readUInt8(0), 0x01);
|
||||
ext.numPlays = ext.data[0].readUInt16LE(1);
|
||||
this.numPlays = ext.numPlays;
|
||||
if (ext.data.readUInt8(0) === 0x01) {
|
||||
// Netscape looping extension
|
||||
// http://graphcomp.com/info/specs/ani_gif.html
|
||||
ext.numPlays = ext.data.readUInt16LE(1);
|
||||
this.numPlays = ext.numPlays;
|
||||
} else if (ext.data.readUInt8(0) === 0x02) {
|
||||
// Netscape buffering extension
|
||||
this.minBuffer = ext.data;
|
||||
}
|
||||
}
|
||||
// Adobe XMP extension
|
||||
if (ext.id === 'XMP Data' && ext.auth === 'XMP') {
|
||||
ext.data = ext.data.toString('utf8');
|
||||
this.xmp = ext.xmp;
|
||||
}
|
||||
// ICC extension
|
||||
if (ext.id === 'ICCRGBG1' && ext.auth === '012') {
|
||||
// NOTE: Says size is 4 bytes, not 1? Maybe just buffer size?
|
||||
this.icc = ext.data;
|
||||
}
|
||||
// fractint extension
|
||||
if (ext.id === 'fractint' && /^00[1-7]$/.test(ext.auth)) {
|
||||
// NOTE: Says size is 4 bytes, not 1? Maybe just buffer size?
|
||||
// Size: '!\377\013' == [0x00, 0x15, 0xff, 0x0b]
|
||||
this.fractint = ext.data;
|
||||
}
|
||||
assert.equal(buf.readUInt8(p), 0x00);
|
||||
p += 1;
|
||||
|
@ -1408,7 +1543,9 @@ function GIF(file, options) {
|
|||
}
|
||||
}
|
||||
|
||||
this.images = this.images.map(function(img) {
|
||||
this.images = this.images.map(function(img, imageIndex) {
|
||||
var control = img.control || this;
|
||||
|
||||
img.lzw = new Buffer(img.lzw.reduce(function(out, data) {
|
||||
return out.concat(Array.prototype.slice.call(data));
|
||||
}, []));
|
||||
|
@ -1456,7 +1593,7 @@ function GIF(file, options) {
|
|||
img.samples[idx + 1] = table[b][1];
|
||||
img.samples[idx + 2] = table[b][2];
|
||||
img.samples[idx + 3] = table[b][3];
|
||||
if (this.useTransparent && b === this.transparentColor) {
|
||||
if (control.useTransparent && b === control.transparentColor) {
|
||||
img.samples[idx + 3] = 0;
|
||||
}
|
||||
if (++col >= img.width) {
|
||||
|
|
Loading…
Reference in New Issue