UNPKG

animationvideo

Version:

Javascript-Libary for animation and audio syncing

128 lines (115 loc) 3.61 kB
import Circle from "./Circle.mjs"; import Color from "color"; const gradientSize = 64; const gradientResolution = 4; const gradientSizeHalf = gradientSize >> 1; class Particle extends Circle { constructor(givenParameter) { super(givenParameter); } static getGradientImage(r, g, b) { let rIndex, gIndex, cr = r >> gradientResolution, cg = g >> gradientResolution, cb = b >> gradientResolution; if (!Particle.Gradient) { Particle.Gradient = new Array(256 >> gradientResolution); for (rIndex = 0; rIndex < Particle.Gradient.length; rIndex++) { Particle.Gradient[rIndex] = new Array(256 >> gradientResolution); for (gIndex = 0; gIndex < Particle.Gradient[rIndex].length; gIndex++) { Particle.Gradient[rIndex][gIndex] = new Array( 256 >> gradientResolution ); } } } if (!Particle.Gradient[cr][cg][cb]) { Particle.Gradient[cr][cg][cb] = Particle.generateGradientImage( cr, cg, cb ); } return Particle.Gradient[cr][cg][cb]; } static generateGradientImage(cr, cg, cb) { let canvas = document.createElement("canvas"); canvas.width = canvas.height = gradientSize; let txtc = canvas.getContext("2d"); txtc.globalAlpha = 1; txtc.globalCompositeOperation = "source-over"; txtc.clearRect(0, 0, gradientSize, gradientSize); let grad = txtc.createRadialGradient( gradientSizeHalf, gradientSizeHalf, 0, gradientSizeHalf, gradientSizeHalf, gradientSizeHalf ); grad.addColorStop( 0, "rgba(" + ((cr << gradientResolution) + (1 << gradientResolution) - 1) + "," + ((cg << gradientResolution) + (1 << gradientResolution) - 1) + "," + ((cb << gradientResolution) + (1 << gradientResolution) - 1) + ",1)" ); grad.addColorStop( 0.3, "rgba(" + ((cr << gradientResolution) + (1 << gradientResolution) - 1) + "," + ((cg << gradientResolution) + (1 << gradientResolution) - 1) + "," + ((cb << gradientResolution) + (1 << gradientResolution) - 1) + ",0.4)" ); grad.addColorStop( 1, "rgba(" + ((cr << gradientResolution) + (1 << gradientResolution) - 1) + "," + ((cg << gradientResolution) + (1 << gradientResolution) - 1) + "," + ((cb << gradientResolution) + (1 << gradientResolution) - 1) + ",0)" ); txtc.fillStyle = grad; txtc.fillRect(0, 0, gradientSize, gradientSize); return canvas; } // draw-methode draw(context, additionalModifier) { if (this.enabled) { // faster than: if (!(this.color instanceof Color && this.color.model === 'rgb')) { if (!this.color || !this.color.color) { this.color = Color(this.color).rgb(); } const color = this.color.color; context.globalCompositeOperation = this.compositeOperation; context.globalAlpha = this.alpha * additionalModifier.alpha; context.imageSmoothingEnabled = (this.scaleX * additionalModifier.widthInPixel) / additionalModifier.width > gradientSize; context.drawImage( Particle.getGradientImage(color[0], color[1], color[2]), 0, 0, gradientSize, gradientSize, this.x - this.scaleX / 2, this.y - this.scaleY / 2, this.scaleX, this.scaleY ); context.imageSmoothingEnabled = true; } } } Particle.Gradient = null; export default Particle;