aboutsummaryrefslogtreecommitdiff
path: root/webAO/utils
diff options
context:
space:
mode:
authorstonedDiscord <Tukz@gmx.de>2022-03-09 07:34:56 +0100
committerGitHub <noreply@github.com>2022-03-09 07:34:56 +0100
commit91c3769a78e59924a73db6c759844a9026e8da00 (patch)
tree64ce4ac3e786b31a935be40438d5dc831121f055 /webAO/utils
parent63a282481d033640a87f97b74f31136410c93717 (diff)
parentcb6a2ddb36d27abd12a6d0b9aa493194d4c242a2 (diff)
Merge pull request #100 from caleb-mabry/webp-support
WebAO Partial Image Fixes
Diffstat (limited to 'webAO/utils')
-rw-r--r--webAO/utils/calculateGifLength.js27
-rw-r--r--webAO/utils/calculateWebpLength.js22
-rw-r--r--webAO/utils/calculatorHandler.js7
-rw-r--r--webAO/utils/getCookie.js26
-rw-r--r--webAO/utils/setCookie.js10
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..1df0ba9
--- /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;
diff --git a/webAO/utils/calculateWebpLength.js b/webAO/utils/calculateWebpLength.js
new file mode 100644
index 0000000..1b422a0
--- /dev/null
+++ b/webAO/utils/calculateWebpLength.js
@@ -0,0 +1,22 @@
+const calculateWebpLength = (webpFile) => {
+ const d = new Uint8Array(webpFile);
+ // https://developers.google.com/speed/webp/docs/riff_container#animation
+ let duration = 0;
+ for (let 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
+ const 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;
diff --git a/webAO/utils/calculatorHandler.js b/webAO/utils/calculatorHandler.js
new file mode 100644
index 0000000..7686573
--- /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,
+};
diff --git a/webAO/utils/getCookie.js b/webAO/utils/getCookie.js
new file mode 100644
index 0000000..3be0733
--- /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;
diff --git a/webAO/utils/setCookie.js b/webAO/utils/setCookie.js
new file mode 100644
index 0000000..9734eae
--- /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;