blob: ab8682a48354f6e97bd0456f4dc7231be5201bfb (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
/**
* Adds up the chunk delays to find out how long a APNG is
* @param {data} apngFile the APNG data
*/
const calculateApngLength = (apngFile) => {
const d = new Uint8Array(apngFile);
// https://wiki.mozilla.org/APNG_Specification#.60fcTL.60:_The_Frame_Control_Chunk
let duration = 0;
for (let i = 0; i < d.length; i++) {
// Find fcTL header (66 63 54 4C)
if (d[i] === 0x66
&& d[i + 1] === 0x63
&& d[i + 2] === 0x54
&& d[i + 3] === 0x4C) {
// numerator and denominator
const delayNum = Number(d[i + 23]);
const delayDen = Number(d[i + 25]);
let delay;
// minimum is 100ms
if (delayDen === 0) {
delay = delayNum / 100;
} else {
delay = delayNum / delayDen;
}
duration += delay;
}
}
return duration * 10;
};
export default calculateApngLength;
|