Spaces:
Runtime error
Runtime error
(function() { | |
function SiriWave(opt) { | |
opt = opt || {}; | |
this.phase = 0; | |
this.run = false; | |
// UI vars | |
this.ratio = opt.ratio || window.devicePixelRatio || 1; | |
this.width = this.ratio * (opt.width || 320); | |
this.width_2 = this.width / 2; | |
this.width_4 = this.width / 4; | |
this.height = this.ratio * (opt.height || 50); | |
this.height_2 = this.height / 2; | |
this.MAX = (this.height_2) - 4; | |
// Constructor opt | |
this.amplitude = opt.amplitude || 1; | |
this.speed = opt.speed || 0.2; | |
this.frequency = opt.frequency || 6; | |
this.color = (function hex2rgb(hex){ | |
var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; | |
hex = hex.replace(shorthandRegex, function(m,r,g,b) { return r + r + g + g + b + b; }); | |
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); | |
return result ? | |
parseInt(result[1],16).toString()+','+parseInt(result[2], 16).toString()+','+parseInt(result[3], 16).toString() | |
: null; | |
})(opt.color || '#6366f1') || '99,102,241'; | |
// Canvas | |
this.canvas = document.createElement('canvas'); | |
this.canvas.width = this.width; | |
this.canvas.height = this.height; | |
this.canvas.style.width = '100%'; | |
this.canvas.style.height = '100%'; | |
this.canvas.style.borderRadius = '4px'; | |
this.container = opt.container || document.body; | |
this.container.appendChild(this.canvas); | |
this.ctx = this.canvas.getContext('2d'); | |
// Start | |
if (opt.autostart) { | |
this.start(); | |
} | |
} | |
SiriWave.prototype._GATF_cache = {}; | |
SiriWave.prototype._globAttFunc = function(x) { | |
if (SiriWave.prototype._GATF_cache[x] == null) { | |
SiriWave.prototype._GATF_cache[x] = Math.pow(4/(4+Math.pow(x,4)), 4); | |
} | |
return SiriWave.prototype._GATF_cache[x]; | |
}; | |
SiriWave.prototype._xpos = function(i) { | |
return this.width_2 + i * this.width_4; | |
}; | |
SiriWave.prototype._ypos = function(i, attenuation) { | |
var att = (this.MAX * this.amplitude) / attenuation; | |
return this.height_2 + this._globAttFunc(i) * att * Math.sin(this.frequency * i - this.phase); | |
}; | |
SiriWave.prototype._drawLine = function(attenuation, color, width){ | |
this.ctx.moveTo(0,0); | |
this.ctx.beginPath(); | |
this.ctx.strokeStyle = color; | |
this.ctx.lineWidth = width || 1; | |
var i = -2; | |
while ((i += 0.01) <= 2) { | |
var y = this._ypos(i, attenuation); | |
if (Math.abs(i) >= 1.90) y = this.height_2; | |
this.ctx.lineTo(this._xpos(i), y); | |
} | |
this.ctx.stroke(); | |
}; | |
SiriWave.prototype._clear = function() { | |
this.ctx.globalCompositeOperation = 'destination-out'; | |
this.ctx.fillRect(0, 0, this.width, this.height); | |
this.ctx.globalCompositeOperation = 'source-over'; | |
}; | |
SiriWave.prototype._draw = function() { | |
if (this.run === false) return; | |
this.phase = (this.phase + Math.PI*this.speed) % (2*Math.PI); | |
this._clear(); | |
this._drawLine(-2, 'rgba(' + this.color + ',0.1)'); | |
this._drawLine(-6, 'rgba(' + this.color + ',0.2)'); | |
this._drawLine(4, 'rgba(' + this.color + ',0.4)'); | |
this._drawLine(2, 'rgba(' + this.color + ',0.6)'); | |
this._drawLine(1, 'rgba(' + this.color + ',1)', 1.5); | |
if (window.requestAnimationFrame) { | |
requestAnimationFrame(this._draw.bind(this)); | |
return; | |
}; | |
setTimeout(this._draw.bind(this), 20); | |
}; | |
SiriWave.prototype.start = function() { | |
this.phase = 0; | |
this.run = true; | |
this._draw(); | |
}; | |
SiriWave.prototype.stop = function() { | |
this.phase = 0; | |
this.run = false; | |
}; | |
SiriWave.prototype.setSpeed = function(v) { | |
this.speed = v; | |
}; | |
SiriWave.prototype.setNoise = SiriWave.prototype.setAmplitude = function(v) { | |
this.amplitude = Math.max(Math.min(v, 1), 0); | |
}; | |
if (typeof define === 'function' && define.amd) { | |
define(function(){ return SiriWave; }); | |
return; | |
}; | |
window.SiriWave = SiriWave; | |
})(); |