/* Third party utility functions */ | |
// Turn a base64 string into a blob. | |
// From https://gist.github.com/gauravmehla/7a7dfd87dd7d1b13697b6e894426615f | |
function b64toBlob(b64Data, contentType, sliceSize) { | |
var contentType = contentType || ''; | |
var sliceSize = sliceSize || 512; | |
var byteCharacters = atob(b64Data); | |
var byteArrays = []; | |
for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) { | |
var slice = byteCharacters.slice(offset, offset + sliceSize); | |
var byteNumbers = new Array(slice.length); | |
for (var i = 0; i < slice.length; i++) { | |
byteNumbers[i] = slice.charCodeAt(i); | |
} | |
var byteArray = new Uint8Array(byteNumbers); | |
byteArrays.push(byteArray); | |
} | |
return new Blob(byteArrays, { type: contentType }); | |
} | |
// Turn an image into a b64 string. | |
// From https://stackoverflow.com/questions/6150289/how-can-i-convert-an-image-into-base64-string-using-javascript | |
function blobTob64(url, callback) { | |
var xhr = new XMLHttpRequest(); | |
xhr.onload = function () { | |
var reader = new FileReader(); | |
reader.onloadend = function () { | |
callback(reader.result); | |
} | |
reader.readAsDataURL(xhr.response); | |
}; | |
xhr.open('GET', url); | |
xhr.responseType = 'blob'; | |
xhr.send(); | |
} | |
/* | |
MIT LICENSE | |
Copyright 2011 Jon Leighton | |
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. | |
*/ | |
// From: https://gist.github.com/jonleighton/958841 | |
function base64ArrayBuffer(arrayBuffer) { | |
var base64 = '' | |
var encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' | |
var bytes = new Uint8Array(arrayBuffer) | |
var byteLength = bytes.byteLength | |
var byteRemainder = byteLength % 3 | |
var mainLength = byteLength - byteRemainder | |
var a, b, c, d | |
var chunk | |
// Main loop deals with bytes in chunks of 3 | |
for (var i = 0; i < mainLength; i = i + 3) { | |
// Combine the three bytes into a single integer | |
chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2] | |
// Use bitmasks to extract 6-bit segments from the triplet | |
a = (chunk & 16515072) >> 18 // 16515072 = (2^6 - 1) << 18 | |
b = (chunk & 258048) >> 12 // 258048 = (2^6 - 1) << 12 | |
c = (chunk & 4032) >> 6 // 4032 = (2^6 - 1) << 6 | |
d = chunk & 63 // 63 = 2^6 - 1 | |
// Convert the raw binary segments to the appropriate ASCII encoding | |
base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d] | |
} | |
// Deal with the remaining bytes and padding | |
if (byteRemainder == 1) { | |
chunk = bytes[mainLength] | |
a = (chunk & 252) >> 2 // 252 = (2^6 - 1) << 2 | |
// Set the 4 least significant bits to zero | |
b = (chunk & 3) << 4 // 3 = 2^2 - 1 | |
base64 += encodings[a] + encodings[b] + '==' | |
} else if (byteRemainder == 2) { | |
chunk = (bytes[mainLength] << 8) | bytes[mainLength + 1] | |
a = (chunk & 64512) >> 10 // 64512 = (2^6 - 1) << 10 | |
b = (chunk & 1008) >> 4 // 1008 = (2^6 - 1) << 4 | |
// Set the 2 least significant bits to zero | |
c = (chunk & 15) << 2 // 15 = 2^4 - 1 | |
base64 += encodings[a] + encodings[b] + encodings[c] + '=' | |
} | |
return base64 | |
} | |