canvas.js 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. Canvas = {
  2. c_x : 0,
  3. c_y : 0,
  4. c_wx : 0,
  5. c_wy : 0,
  6. ctx : null,
  7. prevStyle: "",
  8. mouseDown: function (e) {
  9. var evt = e.event || window.event;
  10. e.stop();
  11. console.log('mouse ' + evt.which + '/' + evt.button + ' down:' +
  12. (evt.clientX - Canvas.c_x) + "," + (evt.clientY - Canvas.c_y));
  13. },
  14. mouseUp: function (e) {
  15. var evt = e.event || window.event;
  16. e.stop();
  17. console.log('mouse ' + evt.which + '/' + evt.button + ' up:' +
  18. (evt.clientX - Canvas.c_x) + "," + (evt.clientY - Canvas.c_y));
  19. },
  20. mouseMove: function (e) {
  21. var evt = e.event || window.event;
  22. console.log('mouse ' + evt.which + '/' + evt.button + ' up:' +
  23. (evt.clientX - Canvas.c_x) + "," + (evt.clientY - Canvas.c_y));
  24. },
  25. keyDown: function (e) {
  26. e.stop();
  27. console.log("keydown: " + e.key + "(" + e.code + ")");
  28. },
  29. keyUp : function (e) {
  30. e.stop();
  31. console.log("keyup: " + e.key + "(" + e.code + ")");
  32. },
  33. ctxDisable: function (e) {
  34. evt = e.event || window.event;
  35. /* Stop propagation if inside canvas area */
  36. if ((evt.clientX >= Canvas.c_x) && (evt.clientX < (Canvas.c_x + Canvas.c_wx)) &&
  37. (evt.clientY >= Canvas.c_y) && (evt.clientY < (Canvas.c_y + Canvas.c_wy))) {
  38. e.stop();
  39. return false;
  40. };
  41. },
  42. init: function (id, width, height, keyDown, keyUp, mouseDown, mouseUp, mouseMove) {
  43. console.log(">> init_canvas");
  44. Canvas.id = id;
  45. if (! keyDown) keyDown = Canvas.keyDown;
  46. if (! keyUp) keyUp = Canvas.keyUp;
  47. if (! mouseDown) mouseDown = Canvas.mouseDown;
  48. if (! mouseUp) mouseUp = Canvas.mouseUp;
  49. if (! mouseMove) mouseMove = Canvas.mouseMove;
  50. var c = $(Canvas.id);
  51. document.addEvent('keydown', keyDown);
  52. document.addEvent('keyup', keyUp);
  53. c.addEvent('mousedown', mouseDown);
  54. c.addEvent('mouseup', mouseUp);
  55. c.addEvent('mousemove', mouseMove);
  56. /* Work around right and middle click browser behaviors */
  57. document.addEvent('click', Canvas.ctxDisable);
  58. document.body.addEvent('contextmenu', Canvas.ctxDisable);
  59. c.width = width;
  60. c.height = height;
  61. Canvas.c_x = c.getPosition().x;
  62. Canvas.c_y = c.getPosition().y;
  63. Canvas.c_wx = c.getSize().x;
  64. Canvas.c_wy = c.getSize().y;
  65. if (! c.getContext) return;
  66. Canvas.ctx = c.getContext('2d');
  67. Canvas.prevStyle = "";
  68. console.log("<< init_canvas");
  69. },
  70. clear: function () {
  71. Canvas.ctx.clearRect(0, 0, Canvas.c_wx, Canvas.c_wy);
  72. var c = $(Canvas.id);
  73. c.width = 640;
  74. c.height = 20;
  75. },
  76. stop: function () {
  77. var c = $(Canvas.id);
  78. document.removeEvents('keydown');
  79. document.removeEvents('keyup');
  80. c.removeEvents('mousedown');
  81. c.removeEvents('mouseup');
  82. c.removeEvents('mousemove');
  83. /* Work around right and middle click browser behaviors */
  84. document.removeEvents('click');
  85. document.body.removeEvents('contextmenu');
  86. },
  87. draw: function () {
  88. /* Border */
  89. Canvas.ctx.stroke();
  90. Canvas.ctx.rect(0, 0, Canvas.c_wx, Canvas.c_wy);
  91. Canvas.ctx.stroke();
  92. /*
  93. // Does not work in firefox
  94. var himg = new Image();
  95. himg.src = "head_ani2.gif"
  96. Canvas.ctx.drawImage(himg, 10, 10);
  97. */
  98. /* Test array image data */
  99. //var img = Canvas.ctx.createImageData(50, 50);
  100. var img = Canvas.ctx.getImageData(0, 0, 50, 50);
  101. for (y=0; y< 50; y++) {
  102. for (x=0; x< 50; x++) {
  103. img.data[(y*50 + x)*4 + 0] = 255 - parseInt((255 / 50) * y);
  104. img.data[(y*50 + x)*4 + 1] = parseInt((255 / 50) * y);
  105. img.data[(y*50 + x)*4 + 2] = parseInt((255 / 50) * x);
  106. img.data[(y*50 + x)*4 + 3] = 255;
  107. }
  108. }
  109. Canvas.ctx.putImageData(img, 100, 100);
  110. },
  111. rgbxImage: function(x, y, width, height, arr) {
  112. /* Old firefox and Opera don't support createImageData */
  113. var img = Canvas.ctx.getImageData(0, 0, width, height);
  114. for (var i=0; i < (width * height); i++) {
  115. img.data[i*4 + 0] = arr[i*4 + 0];
  116. img.data[i*4 + 1] = arr[i*4 + 1];
  117. img.data[i*4 + 2] = arr[i*4 + 2];
  118. img.data[i*4 + 3] = 255; // Set Alpha
  119. }
  120. Canvas.ctx.putImageData(img, x, y);
  121. },
  122. fillRect: function(x, y, width, height, color) {
  123. var newStyle = "rgb(" + color[0] + "," + color[1] + "," + color[2] + ")";
  124. if (newStyle != Canvas.prevStyle) {
  125. Canvas.ctx.fillStyle = newStyle;
  126. prevStyle = newStyle;
  127. }
  128. Canvas.ctx.fillRect(x, y, width, height);
  129. },
  130. copyImage: function(old_x, old_y, new_x, new_y, width, height) {
  131. Canvas.ctx.drawImage($(Canvas.id), old_x, old_y, width, height,
  132. new_x, new_y, width, height);
  133. },
  134. /* Translate DOM key event to keysym value */
  135. getKeysym: function(e) {
  136. evt = e.event || window.event;
  137. var keysym;
  138. /* Remap modifier and special keys */
  139. switch ( evt.keyCode ) {
  140. case 8 : keysym = 0xFF08; break; // BACKSPACE
  141. case 9 : keysym = 0xFF09; break; // TAB
  142. case 13 : keysym = 0xFF0D; break; // ENTER
  143. case 27 : keysym = 0xFF1B; break; // ESCAPE
  144. case 45 : keysym = 0xFF63; break; // INSERT
  145. case 46 : keysym = 0xFFFF; break; // DELETE
  146. case 36 : keysym = 0xFF50; break; // HOME
  147. case 35 : keysym = 0xFF57; break; // END
  148. case 33 : keysym = 0xFF55; break; // PAGE_UP
  149. case 34 : keysym = 0xFF56; break; // PAGE_DOWN
  150. case 37 : keysym = 0xFF51; break; // LEFT
  151. case 38 : keysym = 0xFF52; break; // UP
  152. case 39 : keysym = 0xFF53; break; // RIGHT
  153. case 40 : keysym = 0xFF54; break; // DOWN
  154. case 112 : keysym = 0xFFBE; break; // F1
  155. case 113 : keysym = 0xFFBF; break; // F2
  156. case 114 : keysym = 0xFFC0; break; // F3
  157. case 115 : keysym = 0xFFC1; break; // F4
  158. case 116 : keysym = 0xFFC2; break; // F5
  159. case 117 : keysym = 0xFFC3; break; // F6
  160. case 118 : keysym = 0xFFC4; break; // F7
  161. case 119 : keysym = 0xFFC5; break; // F8
  162. case 120 : keysym = 0xFFC6; break; // F9
  163. case 121 : keysym = 0xFFC7; break; // F10
  164. case 122 : keysym = 0xFFC8; break; // F11
  165. case 123 : keysym = 0xFFC9; break; // F12
  166. case 16 : keysym = 0xFFE1; break; // SHIFT
  167. case 17 : keysym = 0xFFE3; break; // CONTROL
  168. case 18 : keysym = 0xFFE7; break; // ALT
  169. default : keysym = evt.keyCode; break;
  170. }
  171. /* Remap symbols */
  172. switch (keysym) {
  173. case 186 : keysym = 59; break; // ; (IE)
  174. case 187 : keysym = 61; break; // = (IE)
  175. case 188 : keysym = 44; break; // , (Mozilla, IE)
  176. case 109 : // - (Mozilla)
  177. if (Browser.Engine.gecko)
  178. keysym = 45; break;
  179. case 189 : keysym = 45; break; // - (IE)
  180. case 190 : keysym = 46; break; // . (Mozilla, IE)
  181. case 191 : keysym = 47; break; // / (Mozilla, IE)
  182. case 192 : keysym = 96; break; // ` (Mozilla, IE)
  183. case 219 : keysym = 91; break; // [ (Mozilla, IE)
  184. case 220 : keysym = 92; break; // \ (Mozilla, IE)
  185. case 221 : keysym = 93; break; // ] (Mozilla, IE)
  186. case 222 : keysym = 39; break; // ' (Mozilla, IE)
  187. }
  188. /* Remap shifted and unshifted keys */
  189. if (!!evt.shiftKey) {
  190. switch (keysym) {
  191. case 48 : keysym = 41 ; break; // ) (shifted 0)
  192. case 49 : keysym = 33 ; break; // ! (shifted 1)
  193. case 50 : keysym = 64 ; break; // @ (shifted 2)
  194. case 51 : keysym = 35 ; break; // # (shifted 3)
  195. case 52 : keysym = 36 ; break; // $ (shifted 4)
  196. case 53 : keysym = 37 ; break; // % (shifted 5)
  197. case 54 : keysym = 94 ; break; // ^ (shifted 6)
  198. case 55 : keysym = 38 ; break; // & (shifted 7)
  199. case 56 : keysym = 42 ; break; // * (shifted 8)
  200. case 57 : keysym = 40 ; break; // ( (shifted 9)
  201. case 59 : keysym = 58 ; break; // : (shifted `)
  202. case 61 : keysym = 43 ; break; // + (shifted ;)
  203. case 44 : keysym = 60 ; break; // < (shifted ,)
  204. case 45 : keysym = 95 ; break; // _ (shifted -)
  205. case 46 : keysym = 62 ; break; // > (shifted .)
  206. case 47 : keysym = 63 ; break; // ? (shifted /)
  207. case 96 : keysym = 126; break; // ~ (shifted `)
  208. case 91 : keysym = 123; break; // { (shifted [)
  209. case 92 : keysym = 124; break; // | (shifted \)
  210. case 93 : keysym = 125; break; // } (shifted ])
  211. case 39 : keysym = 34 ; break; // " (shifted ')
  212. }
  213. } else if ((keysym >= 65) && (keysym <=90)) {
  214. /* Remap unshifted A-Z */
  215. keysym += 32;
  216. }
  217. return keysym;
  218. }
  219. };