Updated PaintWeb to the latest snapshot.
[moodle/mihaisucan.git] / lib / paintweb / tests / gsoc2009 / 0001-perf / test10.js
blob81d32dd2e6a172a205cc99eedc328c00adaebe1b
1 /*
2  * © 2009 ROBO Design
3  * http://www.robodesign.ro
4  *
5  * $Date: 2009-05-13 14:32:21 +0300 $
6  */
8 function tool_pencil (app) {
9   profiler.start('pencil.constructor');
11   var _self = this,
12       context = app.layer.context,
13       mouse = app.mouse,
14       width = app.image.width,
15       height = app.image.height;
17   this.mousedown = function (ev) {
18     _self.x = ev.x_;
19     _self.y = ev.y_;
20     return true;
21   };
23   this.mousemove = function (points) {
24     if (!mouse.buttonDown) {
25       return false;
26     }
28     var i = 0, x = 0, y = 0,
29         n = points.length;
31     context.beginPath();
32     context.moveTo(_self.x, _self.y);
34     while (i < n) {
35       x = points[i++];
36       y = points[i++];
37       context.lineTo(x, y);
38     }
39     _self.x = x;
40     _self.y = y;
42     context.stroke();
43     context.closePath();
45     return true;
46   };
48   this.mouseup = function (ev) {
49     return _self.mousemove(ev);
50   };
52   profiler.stop('pencil.constructor');
55 var PaintWebInstance = new (function () {
56   var _self = this;
57   this.layer = {canvas: null, context: null};
58   this.tool = null;
59   this.doc = document;
60   this.win = window;
61   this.mouse = {x: 0, y: 0, buttonDown: false};
62   this.image = {width: 0, height: 0, zoom: 1};
64   var MathRound = Math.round,
65       mouse = this.mouse,
66       image = this.image,
67       tool = null,
68       mousemove_timer = null,
69       mousemove_points = [],
70       mousemove_delay = 100,
71       setInterval = window.setInterval,
72       clearInterval = window.clearInterval;
74   function init () {
75     profiler.start('init');
77     var canvas = _self.doc.getElementById('imageView');
79     _self.layer.canvas = canvas;
80     _self.layer.context = canvas.getContext('2d');
81     _self.image.width = canvas.width;
82     _self.image.height = canvas.height;
84     _self.tool = new tool_pencil(_self);
85     tool = _self.tool;
87     canvas.addEventListener('mouseover', _self.ev_canvas, false);
88     canvas.addEventListener('mouseout',  _self.ev_canvas, false);
89     canvas.addEventListener('mousedown', _self.ev_canvas, false);
90     canvas.addEventListener('mousemove', _self.ev_canvas, false);
91     canvas.addEventListener('mouseup',   _self.ev_canvas, false);
93     profiler.stop('init');
94   };
96   // The general-purpose event handler. This function just determines the mouse 
97   // position relative to the canvas element.
98   this.ev_canvas = function (ev) {
99     if (!tool) {
100       return false;
102     }
103     
104     switch (ev.type) {
105       case 'mousedown':
106         if (mouse.buttonDown) {
107           return false;
108         }
109         _self.mousemove_flush();
110         mouse.buttonDown = true;
111         break;
113       case 'mouseup':
114         if (!mouse.buttonDown) {
115           return false;
116         }
117         _self.mousemove_flush();
118         mouse.buttonDown = false;
119         break;
121       case 'mouseover':
122         if ('mousemove' in tool) {
123           mousemove_points = [];
124           mousemove_timer = setInterval(_self.mousemove_flush, mousemove_delay);
125         }
126         return true;
128       case 'mouseout':
129         if (mousemove_timer) {
130           clearInterval(mousemove_timer);
131           mousemove_timer = null;
132           _self.mousemove_flush();
133         }
134         return true;
135     }
137     if (!('x_' in ev)) {
138       if ('layerX' in ev) {
139         if (image.zoom == 1) {
140           ev.x_ = mouse.x = ev.layerX;
141           ev.y_ = mouse.y = ev.layerY;
142         } else {
143           ev.x_ = mouse.x = MathRound(ev.layerX / image.zoom);
144           ev.y_ = mouse.y = MathRound(ev.layerY / image.zoom);
145         }
146       } else if ('offsetX' in ev) {
147         if (image.zoom == 1) {
148           ev.x_ = mouse.x = ev.offsetX;
149           ev.y_ = mouse.y = ev.offsetY;
150         } else {
151           ev.x_ = mouse.x = MathRound(ev.offsetX / image.zoom);
152           ev.y_ = mouse.y = MathRound(ev.offsetY / image.zoom);
153         }
154       }
155     }
157     if (ev.type == 'mousemove' && 'mousemove' in tool) {
158       mousemove_points.push(ev.x_, ev.y_);
159       ev.preventDefault();
160       return true;
161     } else if (ev.type in tool && tool[ev.type](ev)) {
162       ev.preventDefault();
163       return true;
164     } else {
165       return false;
166     }
167   };
169   this.mousemove_flush = function () {
170     if ('mousemove' in tool && '0' in mousemove_points) {
171       tool.mousemove(mousemove_points);
172     }
173     mousemove_points = [];
174   };
176   init();
177 })();
179 // vim:set spell spl=en fo=wan1croqlt tw=80 ts=2 sw=2 sts=2 sta et ai cin fenc=utf-8 ff=unix: