Comparing version 1.0.0 to 1.0.1
519
libgif.js
@@ -1,318 +0,307 @@ | ||
(function(root, factory) { | ||
if (typeof define === 'function' && define.amd) { | ||
define([], factory); | ||
} else if (typeof exports === 'object') { | ||
module.exports = factory(); | ||
} else { | ||
root.SuperGif = factory(); | ||
} | ||
}(this, function() { | ||
var bitsToNum = function(ba) { | ||
return ba.reduce(function(s, n) { | ||
return s * 2 + n; | ||
}, 0); | ||
}; | ||
var bitsToNum = function(ba) { | ||
return ba.reduce(function(s, n) { | ||
return s * 2 + n; | ||
}, 0); | ||
}; | ||
var byteToBitArr = function(bite) { | ||
var a = []; | ||
for (var i = 7; i >= 0; i--) { | ||
a.push(!!(bite & (1 << i))); | ||
} | ||
return a; | ||
}; | ||
var byteToBitArr = function(bite) { | ||
var a = []; | ||
for (var i = 7; i >= 0; i--) { | ||
a.push(!!(bite & (1 << i))); | ||
} | ||
return a; | ||
}; | ||
var Stream = function(data) { | ||
this.data = data; | ||
this.len = this.data.length; | ||
this.pos = 0; | ||
var Stream = function(data) { | ||
this.data = data; | ||
this.len = this.data.length; | ||
this.pos = 0; | ||
this.readByte = function() { | ||
if (this.pos >= this.data.length) { | ||
throw new Error('Attempted to read past end of stream.'); | ||
} | ||
if (data instanceof Uint8Array) | ||
return data[this.pos++]; | ||
else | ||
return data.charCodeAt(this.pos++) & 0xFF; | ||
}; | ||
this.readByte = function() { | ||
if (this.pos >= this.data.length) { | ||
throw new Error('Attempted to read past end of stream.'); | ||
} | ||
if (data instanceof Uint8Array) | ||
return data[this.pos++]; | ||
else | ||
return data.charCodeAt(this.pos++) & 0xFF; | ||
}; | ||
this.readBytes = function(n) { | ||
var bytes = []; | ||
for (var i = 0; i < n; i++) { | ||
bytes.push(this.readByte()); | ||
} | ||
return bytes; | ||
}; | ||
this.readBytes = function(n) { | ||
var bytes = []; | ||
for (var i = 0; i < n; i++) { | ||
bytes.push(this.readByte()); | ||
} | ||
return bytes; | ||
}; | ||
this.read = function(n) { | ||
var s = ''; | ||
for (var i = 0; i < n; i++) { | ||
s += String.fromCharCode(this.readByte()); | ||
} | ||
return s; | ||
}; | ||
this.read = function(n) { | ||
var s = ''; | ||
for (var i = 0; i < n; i++) { | ||
s += String.fromCharCode(this.readByte()); | ||
} | ||
return s; | ||
}; | ||
var a = this.readBytes(2); | ||
return (a[1] << 8) + a[0]; | ||
}; | ||
}; | ||
var a = this.readBytes(2); | ||
return (a[1] << 8) + a[0]; | ||
}; | ||
var lzwDecode = function(minCodeSize, data) { | ||
var readCode = function(size) { | ||
var code = 0; | ||
for (var i = 0; i < size; i++) { | ||
if (data.charCodeAt(pos >> 3) & (1 << (pos & 7))) { | ||
code |= 1 << i; | ||
} | ||
pos++; | ||
} | ||
return code; | ||
}; | ||
var lzwDecode = function(minCodeSize, data) { | ||
var readCode = function(size) { | ||
var code = 0; | ||
for (var i = 0; i < size; i++) { | ||
if (data.charCodeAt(pos >> 3) & (1 << (pos & 7))) { | ||
code |= 1 << i; | ||
} | ||
pos++; | ||
} | ||
return code; | ||
}; | ||
var output = []; | ||
var output = []; | ||
var clearCode = 1 << minCodeSize; | ||
var eoiCode = clearCode + 1; | ||
var clearCode = 1 << minCodeSize; | ||
var eoiCode = clearCode + 1; | ||
var codeSize = minCodeSize + 1; | ||
var codeSize = minCodeSize + 1; | ||
var dict = []; | ||
var dict = []; | ||
var clear = function() { | ||
dict = []; | ||
codeSize = minCodeSize + 1; | ||
for (var i = 0; i < clearCode; i++) { | ||
dict[i] = [i]; | ||
} | ||
dict[clearCode] = []; | ||
dict[eoiCode] = null; | ||
var clear = function() { | ||
dict = []; | ||
codeSize = minCodeSize + 1; | ||
for (var i = 0; i < clearCode; i++) { | ||
dict[i] = [i]; | ||
} | ||
dict[clearCode] = []; | ||
dict[eoiCode] = null; | ||
}; | ||
}; | ||
var code; | ||
var last; | ||
var code; | ||
var last; | ||
while (true) { | ||
last = code; | ||
code = readCode(codeSize); | ||
while (true) { | ||
last = code; | ||
code = readCode(codeSize); | ||
if (code === clearCode) { | ||
clear(); | ||
continue; | ||
} | ||
if (code === eoiCode) break; | ||
if (code === clearCode) { | ||
clear(); | ||
continue; | ||
} | ||
if (code === eoiCode) break; | ||
if (code < dict.length) { | ||
if (last !== clearCode) { | ||
dict.push(dict[last].concat(dict[code][0])); | ||
} | ||
} else { | ||
if (code !== dict.length) throw new Error('Invalid LZW code.'); | ||
dict.push(dict[last].concat(dict[last][0])); | ||
} | ||
output.push.apply(output, dict[code]); | ||
if (dict.length === (1 << codeSize) && codeSize < 12) { | ||
codeSize++; | ||
} | ||
if (code < dict.length) { | ||
if (last !== clearCode) { | ||
dict.push(dict[last].concat(dict[code][0])); | ||
} | ||
} else { | ||
if (code !== dict.length) throw new Error('Invalid LZW code.'); | ||
dict.push(dict[last].concat(dict[last][0])); | ||
} | ||
output.push.apply(output, dict[code]); | ||
return output; | ||
}; | ||
if (dict.length === (1 << codeSize) && codeSize < 12) { | ||
codeSize++; | ||
} | ||
} | ||
return output; | ||
}; | ||
var parseGIF = function(st, handler) { | ||
handler || (handler = {}); | ||
var ct = []; | ||
for (var i = 0; i < entries; i++) { | ||
ct.push(st.readBytes(3)); | ||
} | ||
return ct; | ||
}; | ||
var parseGIF = function(st, handler) { | ||
handler || (handler = {}); | ||
var readSubBlocks = function() { | ||
var size, data; | ||
data = ''; | ||
do { | ||
size = st.readByte(); | ||
data += st.read(size); | ||
} while (size !== 0); | ||
return data; | ||
}; | ||
var ct = []; | ||
for (var i = 0; i < entries; i++) { | ||
ct.push(st.readBytes(3)); | ||
} | ||
return ct; | ||
}; | ||
var parseHeader = function() { | ||
var hdr = {}; | ||
hdr.sig = st.read(3); | ||
hdr.ver = st.read(3); | ||
hdr.width = st.readUnsigned(); | ||
hdr.height = st.readUnsigned(); | ||
var readSubBlocks = function() { | ||
var size, data; | ||
data = ''; | ||
do { | ||
size = st.readByte(); | ||
data += st.read(size); | ||
} while (size !== 0); | ||
return data; | ||
}; | ||
var bits = byteToBitArr(st.readByte()); | ||
hdr.gctFlag = bits.shift(); | ||
hdr.colorRes = bitsToNum(bits.splice(0, 3)); | ||
hdr.sorted = bits.shift(); | ||
hdr.gctSize = bitsToNum(bits.splice(0, 3)); | ||
var parseHeader = function() { | ||
var hdr = {}; | ||
hdr.sig = st.read(3); | ||
hdr.ver = st.read(3); | ||
hdr.width = st.readUnsigned(); | ||
hdr.height = st.readUnsigned(); | ||
hdr.bgColor = st.readByte(); | ||
if (hdr.gctFlag) { | ||
hdr.gct = parseCT(1 << (hdr.gctSize + 1)); | ||
} | ||
handler.hdr && handler.hdr(hdr); | ||
}; | ||
var bits = byteToBitArr(st.readByte()); | ||
hdr.gctFlag = bits.shift(); | ||
hdr.colorRes = bitsToNum(bits.splice(0, 3)); | ||
hdr.sorted = bits.shift(); | ||
hdr.gctSize = bitsToNum(bits.splice(0, 3)); | ||
var parseExt = function(block) { | ||
var parseGCExt = function(block) { | ||
var bits = byteToBitArr(st.readByte()); | ||
block.disposalMethod = bitsToNum(bits.splice(0, 3)); | ||
block.userInput = bits.shift(); | ||
block.transparencyGiven = bits.shift(); | ||
hdr.bgColor = st.readByte(); | ||
if (hdr.gctFlag) { | ||
hdr.gct = parseCT(1 << (hdr.gctSize + 1)); | ||
} | ||
handler.hdr && handler.hdr(hdr); | ||
}; | ||
block.delayTime = st.readUnsigned(); | ||
var parseExt = function(block) { | ||
var parseGCExt = function(block) { | ||
var bits = byteToBitArr(st.readByte()); | ||
block.disposalMethod = bitsToNum(bits.splice(0, 3)); | ||
block.userInput = bits.shift(); | ||
block.transparencyGiven = bits.shift(); | ||
block.transparencyIndex = st.readByte(); | ||
block.delayTime = st.readUnsigned(); | ||
block.terminator = st.readByte(); | ||
block.transparencyIndex = st.readByte(); | ||
handler.gce && handler.gce(block); | ||
}; | ||
block.terminator = st.readByte(); | ||
var parseComExt = function(block) { | ||
block.comment = readSubBlocks(); | ||
handler.com && handler.com(block); | ||
}; | ||
handler.gce && handler.gce(block); | ||
}; | ||
var parsePTExt = function(block) { | ||
block.ptHeader = st.readBytes(12); | ||
block.ptData = readSubBlocks(); | ||
handler.pte && handler.pte(block); | ||
}; | ||
var parseComExt = function(block) { | ||
block.comment = readSubBlocks(); | ||
handler.com && handler.com(block); | ||
}; | ||
var parseAppExt = function(block) { | ||
var parseNetscapeExt = function(block) { | ||
block.iterations = st.readUnsigned(); | ||
block.terminator = st.readByte(); | ||
handler.app && handler.app.NETSCAPE && handler.app.NETSCAPE(block); | ||
}; | ||
var parsePTExt = function(block) { | ||
block.ptHeader = st.readBytes(12); | ||
block.ptData = readSubBlocks(); | ||
handler.pte && handler.pte(block); | ||
}; | ||
var parseUnknownAppExt = function(block) { | ||
block.appData = readSubBlocks(); | ||
handler.app && handler.app[block.identifier] && handler.app[block.identifier](block); | ||
}; | ||
var parseAppExt = function(block) { | ||
var parseNetscapeExt = function(block) { | ||
block.iterations = st.readUnsigned(); | ||
block.terminator = st.readByte(); | ||
handler.app && handler.app.NETSCAPE && handler.app.NETSCAPE(block); | ||
}; | ||
block.identifier = st.read(8); | ||
block.authCode = st.read(3); | ||
switch (block.identifier) { | ||
case 'NETSCAPE': | ||
parseNetscapeExt(block); | ||
break; | ||
default: | ||
parseUnknownAppExt(block); | ||
break; | ||
} | ||
}; | ||
var parseUnknownAppExt = function(block) { | ||
block.appData = readSubBlocks(); | ||
handler.app && handler.app[block.identifier] && handler.app[block.identifier](block); | ||
}; | ||
var parseUnknownExt = function(block) { | ||
block.data = readSubBlocks(); | ||
handler.unknown && handler.unknown(block); | ||
}; | ||
block.identifier = st.read(8); | ||
block.authCode = st.read(3); | ||
switch (block.identifier) { | ||
case 'NETSCAPE': | ||
parseNetscapeExt(block); | ||
break; | ||
default: | ||
parseUnknownAppExt(block); | ||
break; | ||
} | ||
}; | ||
block.label = st.readByte(); | ||
switch (block.label) { | ||
case 0xF9: | ||
block.extType = 'gce'; | ||
parseGCExt(block); | ||
break; | ||
case 0xFE: | ||
block.extType = 'com'; | ||
parseComExt(block); | ||
break; | ||
case 0x01: | ||
block.extType = 'pte'; | ||
parsePTExt(block); | ||
break; | ||
case 0xFF: | ||
block.extType = 'app'; | ||
parseAppExt(block); | ||
break; | ||
default: | ||
block.extType = 'unknown'; | ||
parseUnknownExt(block); | ||
break; | ||
} | ||
var parseUnknownExt = function(block) { | ||
block.data = readSubBlocks(); | ||
handler.unknown && handler.unknown(block); | ||
}; | ||
block.label = st.readByte(); | ||
switch (block.label) { | ||
case 0xF9: | ||
block.extType = 'gce'; | ||
parseGCExt(block); | ||
break; | ||
case 0xFE: | ||
block.extType = 'com'; | ||
parseComExt(block); | ||
break; | ||
case 0x01: | ||
block.extType = 'pte'; | ||
parsePTExt(block); | ||
break; | ||
case 0xFF: | ||
block.extType = 'app'; | ||
parseAppExt(block); | ||
break; | ||
default: | ||
block.extType = 'unknown'; | ||
parseUnknownExt(block); | ||
break; | ||
} | ||
}; | ||
var parseImg = function(img) { | ||
var deinterlace = function(pixels, width) { | ||
var newPixels = new Array(pixels.length); | ||
var rows = pixels.length / width; | ||
var cpRow = function(toRow, fromRow) { | ||
var fromPixels = pixels.slice(fromRow * width, (fromRow + 1) * width); | ||
newPixels.splice.apply(newPixels, [toRow * width, width].concat(fromPixels)); | ||
}; | ||
var parseImg = function(img) { | ||
var deinterlace = function(pixels, width) { | ||
var newPixels = new Array(pixels.length); | ||
var rows = pixels.length / width; | ||
var cpRow = function(toRow, fromRow) { | ||
var fromPixels = pixels.slice(fromRow * width, (fromRow + 1) * width); | ||
newPixels.splice.apply(newPixels, [toRow * width, width].concat(fromPixels)); | ||
}; | ||
var offsets = [0, 4, 2, 1]; | ||
var steps = [8, 8, 4, 2]; | ||
var offsets = [0, 4, 2, 1]; | ||
var steps = [8, 8, 4, 2]; | ||
var fromRow = 0; | ||
for (var pass = 0; pass < 4; pass++) { | ||
for (var toRow = offsets[pass]; toRow < rows; toRow += steps[pass]) { | ||
cpRow(toRow, fromRow) | ||
fromRow++; | ||
} | ||
} | ||
var fromRow = 0; | ||
for (var pass = 0; pass < 4; pass++) { | ||
for (var toRow = offsets[pass]; toRow < rows; toRow += steps[pass]) { | ||
cpRow(toRow, fromRow) | ||
fromRow++; | ||
} | ||
} | ||
return newPixels; | ||
}; | ||
return newPixels; | ||
}; | ||
img.leftPos = st.readUnsigned(); | ||
img.topPos = st.readUnsigned(); | ||
img.width = st.readUnsigned(); | ||
img.height = st.readUnsigned(); | ||
img.leftPos = st.readUnsigned(); | ||
img.topPos = st.readUnsigned(); | ||
img.width = st.readUnsigned(); | ||
img.height = st.readUnsigned(); | ||
var bits = byteToBitArr(st.readByte()); | ||
img.lctFlag = bits.shift(); | ||
img.interlaced = bits.shift(); | ||
img.sorted = bits.shift(); | ||
img.reserved = bits.splice(0, 2); | ||
img.lctSize = bitsToNum(bits.splice(0, 3)); | ||
var bits = byteToBitArr(st.readByte()); | ||
img.lctFlag = bits.shift(); | ||
img.interlaced = bits.shift(); | ||
img.sorted = bits.shift(); | ||
img.reserved = bits.splice(0, 2); | ||
img.lctSize = bitsToNum(bits.splice(0, 3)); | ||
if (img.lctFlag) { | ||
img.lct = parseCT(1 << (img.lctSize + 1)); | ||
} | ||
if (img.lctFlag) { | ||
img.lct = parseCT(1 << (img.lctSize + 1)); | ||
} | ||
img.lzwMinCodeSize = st.readByte(); | ||
img.lzwMinCodeSize = st.readByte(); | ||
var lzwData = readSubBlocks(); | ||
var lzwData = readSubBlocks(); | ||
img.pixels = lzwDecode(img.lzwMinCodeSize, lzwData); | ||
img.pixels = lzwDecode(img.lzwMinCodeSize, lzwData); | ||
img.pixels = deinterlace(img.pixels, img.width); | ||
} | ||
img.pixels = deinterlace(img.pixels, img.width); | ||
} | ||
handler.img && handler.img(img); | ||
}; | ||
handler.img && handler.img(img); | ||
}; | ||
var parseBlock = function() { | ||
var block = {}; | ||
block.sentinel = st.readByte(); | ||
var parseBlock = function() { | ||
var block = {}; | ||
block.sentinel = st.readByte(); | ||
case '!': | ||
block.type = 'ext'; | ||
parseExt(block); | ||
break; | ||
case ',': | ||
block.type = 'img'; | ||
parseImg(block); | ||
break; | ||
case ';': | ||
block.type = 'eof'; | ||
handler.eof && handler.eof(block); | ||
break; | ||
default: | ||
} | ||
case '!': | ||
block.type = 'ext'; | ||
parseExt(block); | ||
break; | ||
case ',': | ||
block.type = 'img'; | ||
parseImg(block); | ||
break; | ||
case ';': | ||
block.type = 'eof'; | ||
handler.eof && handler.eof(block); | ||
break; | ||
default: | ||
} | ||
if (block.type !== 'eof') setTimeout(parseBlock, 0); | ||
if (block.type !== 'eof') setTimeout(parseBlock, 0); | ||
}; | ||
var parse = function() { | ||
@@ -829,3 +818,3 @@ parseHeader(); | ||
return SuperGif; | ||
})); | ||
export default SuperGif; | ||
module.exports = SuperGif; |
{ | ||
"name": "gif-js", | ||
"version": "1.0.0", | ||
"version": "1.0.1", | ||
"description": "", | ||
@@ -5,0 +5,0 @@ "main": "libgif.js", |
21933
685