diff options
Diffstat (limited to 'webAO/utils')
| -rw-r--r-- | webAO/utils/calculateGifLength.js | 27 | ||||
| -rw-r--r-- | webAO/utils/calculateWebpLength.js | 22 | ||||
| -rw-r--r-- | webAO/utils/calculatorHandler.js | 7 | ||||
| -rw-r--r-- | webAO/utils/getCookie.js | 26 | ||||
| -rw-r--r-- | webAO/utils/setCookie.js | 10 |
5 files changed, 92 insertions, 0 deletions
diff --git a/webAO/utils/calculateGifLength.js b/webAO/utils/calculateGifLength.js new file mode 100644 index 0000000..a57264d --- /dev/null +++ b/webAO/utils/calculateGifLength.js @@ -0,0 +1,27 @@ + /** + * Adds up the frame delays to find out how long a GIF is + * I totally didn't steal this + * @param {data} gifFile the GIF data + */ +const calculateGifLength = (gifFile) => { + const d = new Uint8Array(gifFile); + // Thanks to http://justinsomnia.org/2006/10/gif-animation-duration-calculation/ + // And http://www.w3.org/Graphics/GIF/spec-gif89a.txt + let duration = 0; + for (let i = 0; i < d.length; i++) { + // Find a Graphic Control Extension hex(21F904__ ____ __00) + if (d[i] === 0x21 + && d[i + 1] === 0xF9 + && d[i + 2] === 0x04 + && d[i + 7] === 0x00) { + // Swap 5th and 6th bytes to get the delay per frame + const delay = (d[i + 5] << 8) | (d[i + 4] & 0xFF); + + // Should be aware browsers have a minimum frame delay + // e.g. 6ms for IE, 2ms modern browsers (50fps) + duration += delay < 2 ? 10 : delay; + } + } + return duration * 10; + } + export default calculateGifLength
\ No newline at end of file diff --git a/webAO/utils/calculateWebpLength.js b/webAO/utils/calculateWebpLength.js new file mode 100644 index 0000000..38da7c1 --- /dev/null +++ b/webAO/utils/calculateWebpLength.js @@ -0,0 +1,22 @@ +const calculateWebpLength = (webpFile) => { + let d = new Uint8Array(webpFile); + // https://developers.google.com/speed/webp/docs/riff_container#animation + let duration = 0; + for (var i = 0; i < d.length; i++) { + // Find ANMF header (41 4E 4D 46) + if (d[i] === 0x41 + && d[i + 1] === 0x4E + && d[i + 2] === 0x4D + && d[i + 3] === 0x46) { + // Swap 5th and 6th bytes to get the delay per frame + let delay = (d[i + 21] << 8) | (d[i + 20] & 0xFF); + + // Should be aware browsers have a minimum frame delay + // e.g. 6ms for IE, 2ms modern browsers (50fps) + duration += delay < 2 ? 10 : delay; + } + } + return duration; +} + +export default calculateWebpLength
\ No newline at end of file diff --git a/webAO/utils/calculatorHandler.js b/webAO/utils/calculatorHandler.js new file mode 100644 index 0000000..5ed8a43 --- /dev/null +++ b/webAO/utils/calculatorHandler.js @@ -0,0 +1,7 @@ +import calculateGifLength from "./calculateGifLength"; +import calculateWebpLength from "./calculateWebpLength"; + +export default { + '.gif': calculateGifLength, + '.webp': calculateWebpLength +}
\ No newline at end of file diff --git a/webAO/utils/getCookie.js b/webAO/utils/getCookie.js new file mode 100644 index 0000000..000c870 --- /dev/null +++ b/webAO/utils/getCookie.js @@ -0,0 +1,26 @@ +/** + * read a cookie from storage + * got this from w3schools + * https://www.w3schools.com/js/js_cookies.asp + * @param {String} cname The name of the cookie to return + */ +const getCookie = (cname) => { + try { + const name = `${cname}=`; + const decodedCookie = decodeURIComponent(document.cookie); + const ca = decodedCookie.split(';'); + for (let i = 0; i < ca.length; i++) { + let c = ca[i]; + while (c.charAt(0) === ' ') { + c = c.substring(1); + } + if (c.indexOf(name) === 0) { + return c.substring(name.length, c.length); + } + } + return ''; + } catch (error) { + return ''; + } + } + export default getCookie;
\ No newline at end of file diff --git a/webAO/utils/setCookie.js b/webAO/utils/setCookie.js new file mode 100644 index 0000000..d3699a2 --- /dev/null +++ b/webAO/utils/setCookie.js @@ -0,0 +1,10 @@ +/** + * set a cookie + * the version from w3schools expects these to expire + * @param {String} cname The name of the cookie to return + * @param {String} value The value of that cookie option + */ + const setCookie = (cname, value) => { + document.cookie = `${cname}=${value}`; + } + export default setCookie
\ No newline at end of file |
