/* @module to-float32 */ 'use strict' var toab = require('to-array-buffer') var isFloat = require('is-float-array') var clamp = require('clamp') var flat = require('arr-flatten') var isBase64 = require('is-base64') module.exports = function tou8 (src, detectFloat) { if (!src) return null if (src.data) src = src.data // shortcut uint8s if (src instanceof Uint8Array) return src if (src instanceof Uint8ClampedArray) return new Uint8Array(src.buffer) if (detectFloat == null) detectFloat = true // if at least one component is an array - flatten data if (Array.isArray(src)) { for (var i = 0; i < src.length; i++) { if (src[i] && src[i].length != null) { src = flat(src) break } } } // convert float to int if (isFloat(src)) { if (detectFloat) { // if at least one pixel is more than 1, then does not convert input array for (var i = 0; i < src.length; i++) { if (src[i] > 1 || src[i] < 0) { return uninfinite(new Uint8Array(src), src) } } } var pixels = new Uint8Array(src.length) for (var i = 0; i < src.length; i++) { pixels[i] = clamp(src[i], 0, 1) * 255 } return uninfinite(pixels, src) } // array-ish if (src.length != null && typeof src !== 'string') { return uninfinite(new Uint8Array(src), src) } // non-array var buf = toab(src) if (!buf) return null return uninfinite(new Uint8Array(buf), src) } // disclose infinities function uninfinite(u, src) { for (var i = 0; i < src.length; i++) { if (src[i] === Infinity) u[i] = 255 } return u }