-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcanvas.js
95 lines (87 loc) · 3.52 KB
/
canvas.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*
************************
** By **
** Nicola Klemenc **
** github.com/nicklem **
************************
*/
var CANVAS = ( function() {
var canvas , ctx , imgData ;
var init = function() {
if( typeof canvas === "undefined" ) { canvas = document.querySelector( "canvas" ) ; } ;
var newWidth = canvas.width !== window.innerWidth ;
var newHeight = canvas.height !== window.innerHeight ;
if( newWidth || newHeight ) {
// TODO: check proper canvas re-init on resize
canvas.width = window.innerWidth || 300 ;
canvas.height = window.innerHeight || 300 ;
ctx = canvas.getContext( "2d" ) ;
imgData = ctx.getImageData( 0 , 0 , canvas.width , canvas.height ) ;
}
return this;
}
var getCanvas = function() { return canvas ; } ;
var getWidth = function() { return canvas.width ; } ;
var getHeight = function() { return canvas.height ; } ;
var getOffsetTop = function() { return canvas.offsetTop ; } ;
var getOffsetLeft = function() { return canvas.offsetLeft ; } ;
var putImageData = function() { ctx.putImageData( imgData, 0 , 0 ); } ;
var colorRGB ;
var updateColorLevelArr = function() {
colorRGB = [] ;
var R = 0 , G = 1 , B = 2 ;
var innerColor = OPT.getInnerColor() ;
var rimColor = OPT.getRimColor() ;
var haloColor = OPT.getHaloColor() ;
var outerColor = OPT.getOuterColor() ;
var iters = OPT.getOptionData().iter.value ;
var haloDecay = OPT.getOptionData().haloDecay.value ;
var brightness = OPT.getOptionData().brightness.value ;
for( var col = iters ; col >= 0 ; col-- ) {
var brightnessDecay = 1 / Math.exp( col * haloDecay / 100 ) ;
var bezierFactor = col / iters ;
var brightMulti = brightnessDecay * brightness ;
colorRGB.push( [
MATH.bezier4( innerColor[ R ] , rimColor[ R ] , haloColor[R] , outerColor[ R ] , bezierFactor ) * brightMulti ,
MATH.bezier4( innerColor[ G ] , rimColor[ G ] , haloColor[G] , outerColor[ G ] , bezierFactor ) * brightMulti ,
MATH.bezier4( innerColor[ B ] , rimColor[ B ] , haloColor[B] , outerColor[ B ] , bezierFactor ) * brightMulti
] ) ;
}
return this ;
} ;
var draw = function draw() {
var R = 0 , G = 1 , B = 2 ;
var mThreadData = ITER.getThreadData() ;
// console.log( mThreadData ) ;
var threadIndex , threadDataLength;
var numThreads = mThreadData.length ;
for( threadIndex = 0 ; threadIndex < numThreads ; threadIndex += 1 ) {
threadDataEl = mThreadData[ threadIndex ] ;
threadDataLength = threadDataEl.length ;
for( p = 0 ; p < threadDataLength ; p+=1 ) {
RGBAPixOffset = ( threadDataLength * threadIndex + p ) * 4 ;
imgData.data[ RGBAPixOffset ] = colorRGB[ threadDataEl[ p ] ][ R ] ;
imgData.data[ RGBAPixOffset + 1 ] = colorRGB[ threadDataEl[ p ] ][ G ] ;
imgData.data[ RGBAPixOffset + 2 ] = colorRGB[ threadDataEl[ p ] ][ B ] ;
imgData.data[ RGBAPixOffset + 3 ] = 255 ; // alpha
}
}
putImageData( imgData ) ;
return this ;
} ;
var redraw = function redraw( mThreadData ) {
updateColorLevelArr() ;
draw() ;
return this ;
} ;
return {
"init" : init ,
"getCanvas" : getCanvas ,
"getWidth" : getWidth ,
"getHeight" : getHeight ,
"redraw" : redraw ,
"updateColorLevelArr" : updateColorLevelArr ,
"getOffsetTop" : getOffsetTop ,
"getOffsetLeft" : getOffsetLeft ,
} ;
} () ) ;