// Some exterior variables and functions, like curr_color_r // are defined into "brush-helper.js" & "presets.js" function chrome(a) { this.init(a) } chrome.prototype = { context: null, prevMouseX: null, prevMouseY: null, points: null, count: null, reset: function() { this.points = new Array(); this.count = 0; }, initContext: function( ctx ) { ctx.lineJoin = "round"; ctx.lineCap = "round"; ctx.lineWidth = curr_line_width; ctx.globalCompositeOperation = curr_composite_op; }, init: function (a) { this.context = a; this.reset(); }, destroy: function () { }, strokeStart: function (x, y) { this.initContext( this.context ); this.prevMouseX = x; this.prevMouseY = y; }, stroke: function (x, y) { var b, a, g; this.points.push([x, y]); this.context.beginPath(); this.context.moveTo(this.prevMouseX, this.prevMouseY); this.context.lineTo(x, y); this.context.stroke(); for( var i = 0; i < this.points.length; i++ ) { b = this.points[i][0] - this.points[this.count][0]; a = this.points[i][1] - this.points[this.count][1]; g = b * b + a * a; if (g < 1000) { //this.context.strokeStyle = color_rnd_str( 0.1 ); this.context.strokeStyle = color_rnd_str_verb( curr_color_r, curr_color_g, curr_color_b, 0.1*curr_opacity ); this.context.beginPath(); this.context.moveTo(this.points[this.count][0] + (b * 0.2), this.points[this.count][1] + (a * 0.2)); this.context.lineTo(this.points[i][0] - (b * 0.2), this.points[i][1] - (a * 0.2)); this.context.stroke() } } this.prevMouseX = x; this.prevMouseY = y; this.count++; }, strokeEnd: function (x, y) { } }; function fur(a) { this.init(a) } fur.prototype = { context: null, points: null, count: null, prevMouseX: null, prevMouseY: null, reset: function() { this.points = new Array(); this.count = 0; }, initContext: function( ctx ) { ctx.lineJoin = "round"; ctx.lineCap = "round"; ctx.lineWidth = curr_line_width; ctx.strokeStyle = curr_color_str(0.1*curr_opacity); }, init: function (a) { this.context = a; this.reset(); }, destroy: function () { }, strokeStart: function (x, y) { this.initContext( this.context ); this.prevMouseX = x; this.prevMouseY = y; }, stroke: function (x, y) { var b, a, g; this.points.push([x, y]); this.context.beginPath(); this.context.moveTo(this.prevMouseX, this.prevMouseY); this.context.lineTo(x, y); this.context.stroke(); for( var i = 0; i < this.points.length; i++ ) { b = this.points[i][0] - this.points[this.count][0]; a = this.points[i][1] - this.points[this.count][1]; g = b * b + a * a; if (g < 2000 && Math.random() > g / 2000) { this.context.beginPath(); this.context.moveTo(x + (b * 0.5), y + (a * 0.5)); this.context.lineTo(x - (b * 0.5), y - (a * 0.5)); this.context.stroke(); } } this.prevMouseX = x; this.prevMouseY = y; this.count++; }, strokeEnd: function (x, y) { } }; function longfur(a) { this.init(a) } longfur.prototype = { context: null, points: null, count: null, reset: function() { this.points = new Array(); this.count = 0; }, initContext: function( ctx ) { ctx.lineJoin = "round"; ctx.lineCap = "round"; ctx.lineWidth = curr_line_width; ctx.globalCompositeOperation = curr_composite_op; ctx.strokeStyle = curr_color_str(0.05*curr_opacity); }, init: function (a) { this.context = a; this.reset(); }, destroy: function () { }, strokeStart: function (x, y) { this.initContext( this.context ); }, stroke: function (x, y) { var e, b, a, h; this.points.push([x, y]); for( var i = 0; i < this.points.length; i++ ) { e = -Math.random(); b = this.points[i][0] - this.points[this.count][0]; a = this.points[i][1] - this.points[this.count][1]; h = b * b + a * a; if (h < 4000 && Math.random() > h / 4000) { this.context.beginPath(); this.context.moveTo(this.points[this.count][0] + (b * e), this.points[this.count][1] + (a * e)); this.context.lineTo(this.points[i][0] - (b * e) + Math.random() * 2, this.points[i][1] - (a * e) + Math.random() * 2); this.context.stroke(); } } this.count++; }, strokeEnd: function (x, y) { } }; function circles(a) { this.init(a); } circles.prototype = { context: null, prevMouseX: null, prevMouseY: null, points: null, count: null, reset: function() { this.points = new Array(); }, initContext: function( ctx ) { ctx.lineJoin = "round"; ctx.lineCap = "round"; ctx.lineWidth = curr_line_width; ctx.globalCompositeOperation = curr_composite_op; ctx.strokeStyle = curr_color_str(0.1*curr_opacity); }, init: function (ctx) { this.context = ctx; this.reset(); }, destroy: function () { }, strokeStart: function (x, y) { this.initContext( this.context ); this.prevMouseX = x; this.prevMouseY = y; }, stroke: function ( x, y ) { this.points.push([x, y]); var l = x - this.prevMouseX; var k = y - this.prevMouseY; var h = Math.sqrt(l * l + k * k) * 2; var f = Math.floor(x / 100) * 100 + 50; var c = Math.floor(y / 100) * 100 + 50; var j = Math.floor(Math.random() * 10); var a = h / j; for (var g = 0; g < j; g++) { this.context.beginPath(); this.context.arc(f, c, (j - g) * a, 0, Math.PI * 2, true); this.context.stroke(); } this.prevMouseX = x; this.prevMouseY = y; }, strokeEnd: function (ctx, x, y) { } }; function grid(a) { this.init(a) } grid.prototype = { context: null, reset: function() { }, initContext: function( ctx ) { ctx.lineJoin = "round"; ctx.lineCap = "round"; ctx.lineWidth = curr_line_width; ctx.globalCompositeOperation = curr_composite_op; //if( darker_supported ) //{ // ctx.globalCompositeOperation = "darker" //} ctx.strokeStyle = curr_color_str(0.01*curr_opacity); }, init: function (a) { this.context = a; }, destroy: function () { }, strokeStart: function (x, y) { this.initContext( this.context ); }, stroke: function (x, y) { var a = Math.round(x / 50) * 50; var g = Math.round(y / 50) * 50; var c = (a - x) * 10; var b = (g - y) * 10; for( var e = 0; e < 50; e++ ) { this.context.beginPath(); this.context.moveTo(a, g); this.context.quadraticCurveTo(x + Math.random() * c, y + Math.random() * b, a, g); this.context.stroke() } }, strokeEnd: function (x, y) { } }; function bargs(c) { var b, a = []; for (b = 1; b < arguments.length; b++) { a.push(arguments[b]); } return function () { return c.apply(this, a) } } function ribbon(a) { this.init(a) } ribbon.prototype = { context: null, mouseX: null, mouseY: null, painters: null, interval: null, reset: function() { if( this.interval ) clearInterval( this.interval ); this.mouseX = SCREEN_WIDTH / 2; this.mouseY = SCREEN_HEIGHT / 2; this.painters = new Array(); for( var i = 0; i < 50; i++ ) { this.painters.push( { dx: SCREEN_WIDTH / 2, dy: SCREEN_HEIGHT / 2, ax: 0, ay: 0, div: 0.1, ease: Math.random() * 0.2 + 0.6 } ) } var self = this; this.shouldDraw = false; this.interval = setInterval(bargs(function (c) { c.update(); return false }, this), 1000 / 60) //this.interval = setInterval( function (){ self.update(); return false }, 1000 / 60 ); }, initContext: function( ctx ) { ctx.lineJoin = "round"; ctx.lineCap = "round"; ctx.lineWidth = curr_line_width; ctx.strokeStyle = curr_color_str(0.05*curr_opacity); ctx.globalCompositeOperation = curr_composite_op; }, init: function (a) { this.context = a; this.reset(); }, destroy: function () { clearInterval( this.interval ); }, strokeStart: function (x, y) { this.shouldDraw = false; //if( this.interval ) // clearInterval( this.interval ); this.initContext( this.context ); this.mouseX = x; this.mouseY = y; for (var i = 0; i < this.painters.length; i++) { this.painters[i].dx = x; this.painters[i].dy = y; } this.shouldDraw = true; }, stroke: function (x, y) { this.mouseX = x; this.mouseY = y; this.shouldDraw = true; }, strokeEnd: function (x, y) { }, update: function () { var d = 0; if( this.shouldDraw ) for (var i = 0; i < this.painters.length; i++) { var painter = this.painters[i]; this.context.beginPath(); this.context.moveTo( painter.dx, painter.dy ); painter.ax = (painter.ax + (painter.dx - this.mouseX) * painter.div) * painter.ease; painter.ay = (painter.ay + (painter.dy - this.mouseY) * painter.div) * painter.ease; painter.dx -= painter.ax; painter.dy -= painter.ay; d += painter.ax*painter.ax + painter.ay*painter.ay; this.context.lineTo( painter.dx, painter.dy); this.context.stroke(); } if( d < 1 ) { this.shouldDraw = false; } } }; function shaded(a) { this.init(a) } shaded.prototype = { context: null, prevMouseX: null, prevMouseY: null, points: null, count: null, reset: function() { this.points = new Array(); this.count = 0; }, initContext: function( ctx ) { ctx.lineJoin = "round"; ctx.lineCap = "round"; ctx.lineWidth = curr_line_width; ctx.globalCompositeOperation = curr_composite_op; }, init: function (a) { this.context = a; this.reset(); }, destroy: function () { }, strokeStart: function (x, y) { this.initContext( this.context ); this.prevMouseX = x; this.prevMouseY = y; }, stroke: function (x, y) { var b, a, g; this.points.push([x, y]); for (var i = 0; i < this.points.length; i++) { b = this.points[i][0] - this.points[this.count][0]; a = this.points[i][1] - this.points[this.count][1]; g = b * b + a * a; if (g < 1000) { var alpha = (1 - (g / 1000)) * 0.1; this.context.strokeStyle = curr_color_str(alpha*curr_opacity); this.context.beginPath(); this.context.moveTo(this.points[this.count][0], this.points[this.count][1]); this.context.lineTo(this.points[i][0], this.points[i][1]); this.context.stroke(); } } this.prevMouseX = x; this.prevMouseY = y; this.count++; }, strokeEnd: function (b, a) { } }; function sketchy(a) { this.init(a) } sketchy.prototype = { context: null, prevMouseX: null, prevMouseY: null, points: null, count: null, reset: function() { this.points = new Array(); this.count = 0; }, initContext: function( ctx ) { ctx.lineJoin = "round"; ctx.lineCap = "round"; ctx.lineWidth = curr_line_width; ctx.strokeStyle = curr_color_str( 0.05*curr_opacity ); ctx.globalCompositeOperation = curr_composite_op; }, init: function (a) { this.context = a; this.reset(); }, destroy: function () { }, strokeStart: function (x, y) { this.initContext( this.context ); this.prevMouseX = x; this.prevMouseY = y; }, stroke: function (x, y) { var b, a, g; this.points.push([x, y]); this.context.strokeStyle = curr_color_str( 0.05*curr_opacity ); this.context.beginPath(); this.context.moveTo(this.prevMouseX, this.prevMouseY); this.context.lineTo(x, y); this.context.stroke(); for( var i = 0; i < this.points.length; i++ ) { b = this.points[i][0] - this.points[this.count][0]; a = this.points[i][1] - this.points[this.count][1]; g = b * b + a * a; if (g < 4000 && Math.random() > g / 2000) { this.context.beginPath(); this.context.moveTo(this.points[this.count][0] + (b * 0.3), this.points[this.count][1] + (a * 0.3)); this.context.lineTo(this.points[i][0] - (b * 0.3), this.points[i][1] - (a * 0.3)); this.context.stroke(); } } this.prevMouseX = x; this.prevMouseY = y; this.count++; }, strokeEnd: function (x, y) { } }; function squares(a) { this.init(a); } squares.prototype = { context: null, prevMouseX: null, prevMouseY: null, reset: function() { }, initContext: function( ctx ) { ctx.lineJoin = "round"; ctx.lineCap = "round"; ctx.globalCompositeOperation = curr_composite_op; ctx.strokeStyle = curr_color_str( curr_opacity ); ctx.fillStyle = curr_color_bg_str( curr_opacity ); ctx.lineWidth = curr_line_width; }, init: function (a) { this.context = a; }, destroy: function () { }, strokeStart: function (x, y) { this.initContext( this.context ); this.prevMouseX = x; this.prevMouseY = y; }, stroke: function (x, y) { var b = x - this.prevMouseX; var a = y - this.prevMouseY; var g = 1.57079633; var e = Math.cos(g) * b - Math.sin(g) * a; var c = Math.sin(g) * b + Math.cos(g) * a; this.context.beginPath(); this.context.moveTo(this.prevMouseX - e, this.prevMouseY - c); this.context.lineTo(this.prevMouseX + e, this.prevMouseY + c); this.context.lineTo(x + e, y + c); this.context.lineTo(x - e, y - c); this.context.lineTo(this.prevMouseX - e, this.prevMouseY - c); this.context.fill(); this.context.stroke(); this.prevMouseX = x; this.prevMouseY = y; }, strokeEnd: function (x, y) { } }; function web(a) { this.init(a) } web.prototype = { context: null, prevMouseX: null, prevMouseY: null, points: null, count: null, reset: function() { this.points = new Array(); this.count = 0 }, initContext: function( ctx ) { ctx.lineJoin = "round"; ctx.lineCap = "round"; ctx.lineWidth = curr_line_width; ctx.globalCompositeOperation = curr_composite_op; //ctx.strokeStyle = "rgba(0, 0, 0, 0.5)"; ctx.strokeStyle = curr_color_str( 0.5*curr_opacity ); }, init: function (a) { this.context = a; this.reset(); }, destroy: function () { }, strokeStart: function (x, y) { this.initContext( this.context ); this.prevMouseX = x; this.prevMouseY = y; }, stroke: function (x, y) { var b, a, g; this.points.push([x, y]); this.context.strokeStyle = curr_color_str( 0.5*curr_opacity ); this.context.beginPath(); this.context.moveTo(this.prevMouseX, this.prevMouseY); this.context.lineTo(x, y); this.context.stroke(); this.context.strokeStyle = curr_color_str( 0.1*curr_opacity ); for (var i = 0; i < this.points.length; i++) { b = this.points[i][0] - this.points[this.count][0]; a = this.points[i][1] - this.points[this.count][1]; g = b * b + a * a; if (g < 2500 && Math.random() > 0.9) { this.context.beginPath(); this.context.moveTo(this.points[this.count][0], this.points[this.count][1]); this.context.lineTo(this.points[i][0], this.points[i][1]); this.context.stroke(); } } this.prevMouseX = x; this.prevMouseY = y; this.count++; }, strokeEnd: function (x, y) { } }; function koch(a) { this.init(a) } koch.prototype = { context: null, reset: function() { }, initContext: function( ctx ) { ctx.lineJoin = "round"; ctx.lineCap = "round"; ctx.lineWidth = curr_line_width; ctx.strokeStyle = curr_color_str(0.1*curr_opacity); }, init: function (a) { this.context = a; this.reset(); }, destroy: function () { }, strokeStart: function (b, a) { this.initContext( this.context ); }, draw_line: function( x1, y1, x2, y2, v ) { if( 0 == v ) { this.context.beginPath(); this.context.moveTo(x1, y1); this.context.lineTo(x2, y2); this.context.stroke(); } else { var dx = x2-x1; var dy = y2-y1; var x01 = x1 + dx * 0.3333; var x02 = x1 + dx * 0.6667; var y01 = y1 + dy * 0.3333; var y02 = y1 + dy * 0.6667; var x0m = x1 + dx + dy/2; var y0m = y1 + dy - dx/2; this.draw_line( x1, y1, x01, y01, v-1 ); this.draw_line( x01, y01, x0m, y0m, v-1 ); this.draw_line( x0m, y0m, x02, y02, v-1 ); this.draw_line( x02, y02, x2, y2, v-1 ); } }, draw_snow: function( x, y, r, n, a, v ) { var d = Math.PI*2 / n; var prev_a = a; var next_a = a + d; var i = 0; for( i = 0; i < n; ++i ) { var x1 = x + Math.sin( prev_a ) * r; var x2 = x + Math.sin( next_a ) * r; var y1 = y + Math.cos( prev_a ) * r; var y2 = y + Math.cos( next_a ) * r; prev_a = next_a; next_a += d; this.draw_line( x1, y1, x2, y2, v ); } }, stroke: function (x, y) { var a = Math.random() * Math.PI * 2; var r = Math.random() * 10 + 10; var n = Math.round(Math.random() * 4) + 3; var v = Math.round(Math.random() * 3) + 2; this.draw_snow( x, y, r, n, a, v ); }, strokeEnd: function (b, a) { } }; function drunk_master(a) { this.init(a) } drunk_master.prototype = { context: null, prevMouseX: null, prevMouseY: null, //points: null, //count: null, reset: function() { }, initContext: function( ctx ) { ctx.lineJoin = "round"; ctx.lineCap = "round"; ctx.lineWidth = curr_line_width; ctx.strokeStyle = curr_color_str(0.1*curr_opacity); }, init: function (a) { this.context = a; this.reset(); }, destroy: function () { }, strokeStart: function (x, y) { this.initContext( this.context ); this.prevMouseX = x; this.prevMouseY = y; }, draw_line: function( x1, y1, x2, y2, turn, v ) { turn = Math.random() * Math.PI * 2; var dx = x2-x1; var dy = y2-y1; if( 0 == v ) { this.context.beginPath(); this.context.moveTo(x1, y1); this.context.lineTo(x2, y2); this.context.lineTo(x2+(dx>1?dx:1), y2+(dy>1?dy:1)); this.context.stroke(); } else { var x01 = x1 + dx * 0.3333; var x02 = x1 + dx * 0.6667; var y01 = y1 + dy * 0.3333; var y02 = y1 + dy * 0.6667; //var x0m = x1 + dx - dy/2; //var y0m = y1 + dy - dx/2; var x0m = x1 + dx / 2; var y0m = y1 + dy / 2; var len = Math.sqrt( dx*dx + dy*dy ); var a = Math.atan2( dx, dy ); // turn around x0m, y0m by "turn", R = len/3 var offset = len / 3; x0m += Math.sin( a + turn ) * offset; y0m += Math.cos( a + turn ) * offset; this.draw_line( x1, y1, x01, y01, turn, v-1 ); this.draw_line( x01, y01, x0m, y0m, turn, v-1 ); this.draw_line( x0m, y0m, x02, y02, turn, v-1 ); this.draw_line( x02, y02, x2, y2, turn, v-1 ); } }, stroke: function (x, y) { var dx = x - this.prevMouseX; var dy = y - this.prevMouseY; var dst = Math.sqrt( dx*dx + dy*dy ); var turn = 0; var n = Math.round(Math.random() * dst / 3); if( n > 5 ) n = 5; this.draw_line( this.prevMouseX, this.prevMouseY, x, y, turn, n ); this.prevMouseX = x; this.prevMouseY = y; }, strokeEnd: function (b, a) { } }; function eraser(a, width) { this.init(a, (width) ) } eraser.prototype = { context: null, prevMouseX: null, prevMouseY: null, width: 1, cursor: "default", reset: function() { }, initContext: function( ctx ) { ctx.lineJoin = "round"; //['round','bevel','miter']; ctx.lineCap = "butt"; //['butt','round','square']; ctx.lineWidth = this.width; //curr_line_width; ctx.strokeStyle = color_str( curr_color_bg_r, curr_color_bg_g, curr_color_bg_b, 0.3*curr_opacity); ctx.globalCompositeOperation = "source-over"; }, init: function (a, width) { this.context = a; this.width = width; this.reset(); }, destroy: function () { }, strokeStart: function (x, y) { this.prevMouseX = x; this.prevMouseY = y; this.initContext( this.context ); }, strokeLine: function( x1, y1, x2, y2, w ) { this.context.lineWidth = w; this.context.beginPath(); this.context.moveTo( x1, y1 ); this.context.lineTo( x2, y2 ); this.context.stroke(); }, stroke: function (x, y) { //this.context.beginPath(); //this.context.moveTo( this.prevMouseX, this.prevMouseY ); //this.context.lineTo( x, y ); //this.context.stroke(); this.strokeLine( this.prevMouseX, this.prevMouseY, x, y, this.width ); this.strokeLine( this.prevMouseX, this.prevMouseY, x, y, this.width * 0.75 ); this.strokeLine( this.prevMouseX, this.prevMouseY, x, y, this.width / 2 ); this.prevMouseX = x; this.prevMouseY = y; }, strokeEnd: function (x, y) { } }; function simple(a) { this.init(a) } simple.prototype = { context: null, prevMouseX: null, prevMouseY: null, points: null, count: null, reset: function() { this.points = new Array(); this.count = 0; }, initContext: function( ctx ) { ctx.lineJoin = "round"; ctx.lineCap = "round"; ctx.lineWidth = curr_line_width; ctx.globalCompositeOperation = curr_composite_op; ctx.strokeStyle = curr_color_str(curr_opacity); }, init: function (a) { this.context = a; this.reset(); }, destroy: function () { }, strokeStart: function (x, y) { this.initContext( this.context ); this.prevMouseX = x; this.prevMouseY = y; }, stroke: function (x, y) { this.context.beginPath(); this.context.moveTo(this.prevMouseX, this.prevMouseY); this.context.lineTo(x, y); this.context.stroke(); this.prevMouseX = x; this.prevMouseY = y; }, strokeEnd: function (x, y) { } }; function oribbon(a) { this.init(a) } oribbon.prototype = { context: null, mouseX: null, mouseY: null, painters: null, interval: null, reset: function() { //if( this.interval ) //clearInterval( this.interval ); this.mouseX = SCREEN_WIDTH / 2; this.mouseY = SCREEN_HEIGHT / 2; this.painters = new Array(); for( var i = 0; i < 50; i++ ) { this.painters.push( { dx: SCREEN_WIDTH / 2, dy: SCREEN_HEIGHT / 2, ax: 0, ay: 0, div: 0.1, ease: Math.random() * 0.2 + 0.6 } ) } var self = this; this.shouldDraw = false; this.interval = setInterval(bargs(function (c) { c.update(); return false }, this), 1000 / 60) }, initContext: function( ctx ) { ctx.lineJoin = "round"; ctx.lineCap = "round"; ctx.lineWidth = curr_line_width; ctx.strokeStyle = curr_color_str(0.5*curr_opacity); ctx.globalCompositeOperation = curr_composite_op; }, init: function (a) { this.context = a; this.reset(); }, destroy: function () { clearInterval( this.interval ); }, strokeStart: function (mouseX, mouseY) { this.shouldDraw = false; //if( this.interval ) //clearInterval( this.interval ); this.initContext( this.context ); this.mouseX = mouseX; this.mouseY = mouseY; for (var i = 0; i < this.painters.length; i++) { this.painters[i].dx = mouseX; this.painters[i].dy = mouseY; } this.shouldDraw = true; }, stroke: function (mouseX, mouseY) { this.shouldDraw = true; this.mouseX = mouseX; this.mouseY = mouseY; }, strokeEnd: function () { }, update: function () { var painter = this.painters[10]; this.context.beginPath(); this.context.moveTo( painter.dx, painter.dy ); painter.dx -= painter.ax = (painter.ax + (painter.dx - this.mouseX) * painter.div) * painter.ease; painter.dy -= painter.ay = (painter.ay + (painter.dy - this.mouseY) * painter.div) * painter.ease; this.context.lineTo( painter.dx, painter.dy); this.context.stroke(); } }; function curvy(a) { this.init(a) } curvy.prototype = { context: null, prevMouseX: null, prevMouseY: null, points: null, count: null, reset: function () { this.prevMouseX = mouseX; this.prevMouseY = mouseY; this.points = new Array(); }, initContext: function( ctx ) { ctx.lineCap = "round"; ctx.lineWidth = curr_line_width; ctx.strokeStyle = curr_color_str(0.5*curr_opacity); ctx.globalCompositeOperation = curr_composite_op; }, init: function (a) { this.context = a; this.context.lineWidth = curr_line_width; this.count = 0 this.reset(); }, destroy: function () { }, strokeStart: function (mouseX, mouseY) { this.context.strokeStyle = curr_color_str(0.5*curr_opacity); //this.mouseX = mouseX; //this.mouseY = mouseY; }, stroke: function (mouseX, mouseY) { var CTL_PNT1_DIST = 10, CTL_PNT2_DIST = 20, START = 30, e, start, cOne, cTwo, oldStroke, sliced; this.points.push([mouseX, mouseY]); this.context.beginPath(); this.context.moveTo(this.prevMouseX, this.prevMouseY); this.context.lineTo(mouseX, mouseY); this.context.stroke(); function getPoint(xAgo, pnts) { var index = pnts.length - xAgo, i; for (i=index; i< pnts.length; i++) { if (pnts[i]) { return pnts[i]; } } } oldStroke = this.context.strokeStyle; this.context.strokeStyle = curr_color_str(0.5*curr_opacity); this.context.beginPath(); start = getPoint(START, this.points); cOne = getPoint(CTL_PNT1_DIST, this.points); cTwo = getPoint(CTL_PNT2_DIST, this.points); this.context.moveTo(start[0],start[1]); this.context.bezierCurveTo(cOne[0], cOne[1], cTwo[0], cTwo[1], mouseX, mouseY); this.context.stroke(); this.context.strokeStyle = oldStroke; this.prevMouseX = mouseX; this.prevMouseY = mouseY; this.count++; }, strokeEnd: function (mouseX, mouseY) {} }; function rlines( a ) { this.init( a ); } rlines.prototype = { context: null, prevMouseX: null, prevMouseY: null, points: null, count: null, reset: function () { this.prevMouseX = mouseX; this.prevMouseY = mouseY; this.points = new Array(); }, initContext: function( ctx ) { ctx.lineWidth = curr_line_width; ctx.strokeStyle = curr_color_str(0.5*curr_opacity); ctx.globalCompositeOperation = curr_composite_op; }, init: function (a) { this.context = a; this.context.lineWidth = curr_line_width; this.count = 0 this.reset(); }, destroy: function() { }, strokeStart: function( mouseX, mouseY ) { this.prevMouseX = mouseX; this.prevMouseY = mouseY; }, stroke: function( mouseX, mouseY ) { var i, dx, dy, d; this.points.push( [ mouseX, mouseY ] ); this.context.strokeStyle = curr_color_str(0.5*curr_opacity); this.context.beginPath(); this.context.moveTo(this.prevMouseX, this.prevMouseY); this.context.lineTo(mouseX, mouseY); this.context.stroke(); this.context.strokeStyle = curr_color_str(0.5*curr_opacity); <!-- for (i = 0; i < this.points.length; i++) { dx = this.points[i][0] - this.points[this.count][0]; dy = this.points[i][1] - this.points[this.count][1]; d = dx * dx + dy * dy; if (d < 4000 && Math.random() > d / 2000) { this.context.beginPath(); this.context.moveTo( this.points[this.count][0] + (dx * 0.3), this.points[this.count][1] + (dy * 0.3)); this.context.lineTo( this.points[i][0] - (dx * 0.3), this.points[i][1] - (dy * 0.3)); this.context.stroke(); } } this.prevMouseX = mouseX; this.prevMouseY = mouseY; this.count ++; }, strokeEnd: function() { } };