viewport.html 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. <!DOCTYPE html>
  2. <html>
  3. <head><title>Viewport Test</title>
  4. <link rel="stylesheet" href="viewport.css">
  5. <!--
  6. <meta name="apple-mobile-web-app-capable" content="yes" />
  7. <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
  8. -->
  9. <meta name=viewport content="width=device-width, initial-scale=1.0, user-scalable=no">
  10. </head>
  11. <body>
  12. <div class="flex-layout">
  13. <div>
  14. Canvas:
  15. <input id="move-selector" type="button" value="Move"
  16. onclick="toggleMove();">
  17. <br>
  18. </div>
  19. <div class="container flex-box">
  20. <canvas id="canvas" class="canvas">
  21. Canvas not supported.
  22. </canvas>
  23. <br>
  24. </div>
  25. <div>
  26. <br>
  27. Results:<br>
  28. <textarea id="messages" style="font-size: 9;" cols=80 rows=8></textarea>
  29. </div>
  30. </div>
  31. </body>
  32. <!--
  33. <script type='text/javascript'
  34. src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script>
  35. -->
  36. <script src="../include/util.js"></script>
  37. <script src="../include/webutil.js"></script>
  38. <script src="../include/base64.js"></script>
  39. <script src="../include/keysymdef.js"></script>
  40. <script src="../include/keyboard.js"></script>
  41. <script src="../include/input.js"></script>
  42. <script src="../include/display.js"></script>
  43. <script>
  44. var msg_cnt = 0, iterations,
  45. penDown = false, doMove = false,
  46. inMove = false, lastPos = {},
  47. padW = 0, padH = 0,
  48. display, ctx, keyboard, mouse;
  49. var newline = "\n";
  50. if (Util.Engine.trident) {
  51. var newline = "<br>\n";
  52. }
  53. function message(str) {
  54. console.log(str);
  55. cell = $D('messages');
  56. cell.textContent += msg_cnt + ": " + str + newline;
  57. cell.scrollTop = cell.scrollHeight;
  58. msg_cnt++;
  59. }
  60. function mouseButton(x, y, down, bmask) {
  61. //msg = 'mouse x,y: ' + x + ',' + y + ' down: ' + down;
  62. //msg += ' bmask: ' + bmask;
  63. //message(msg);
  64. if (doMove) {
  65. if (down && !inMove) {
  66. inMove = true;
  67. lastPos = {'x': x, 'y': y};
  68. } else if (!down && inMove) {
  69. inMove = false;
  70. //dirtyRedraw();
  71. }
  72. return;
  73. }
  74. if (down && ! penDown) {
  75. penDown = true;
  76. ctx.beginPath();
  77. ctx.moveTo(x, y);
  78. } else if (!down && penDown) {
  79. penDown = false;
  80. ctx.closePath();
  81. }
  82. }
  83. function mouseMove(x, y) {
  84. var deltaX, deltaY;
  85. if (inMove) {
  86. //deltaX = x - lastPos.x; // drag viewport
  87. deltaX = lastPos.x - x; // drag frame buffer
  88. //deltaY = y - lastPos.y; // drag viewport
  89. deltaY = lastPos.y - y; // drag frame buffer
  90. lastPos = {'x': x, 'y': y};
  91. display.viewportChangePos(deltaX, deltaY);
  92. return;
  93. }
  94. if (penDown) {
  95. ctx.lineTo(x, y);
  96. ctx.stroke();
  97. }
  98. }
  99. function dirtyRedraw() {
  100. if (inMove) {
  101. // Wait for user to stop moving viewport
  102. return;
  103. }
  104. var d = display.getCleanDirtyReset();
  105. for (i = 0; i < d.dirtyBoxes.length; i++) {
  106. //showBox(d.dirtyBoxes[i], "dirty[" + i + "]: ");
  107. drawArea(d.dirtyBoxes[i]);
  108. }
  109. }
  110. function drawArea(b) {
  111. var data = [], pixel, x, y;
  112. //message("draw "+b.x+","+b.y+" ("+b.w+","+b.h+")");
  113. for (var i = 0; i < b.w; i++) {
  114. x = b.x + i;
  115. for (var j = 0; j < b.h; j++) {
  116. y = b.y + j;
  117. pixel = (j * b.w * 4 + i * 4);
  118. data[pixel + 0] = ((x * y) / 13) % 256;
  119. data[pixel + 1] = ((x * y) + 392) % 256;
  120. data[pixel + 2] = ((x + y) + 256) % 256;
  121. data[pixel + 3] = 255;
  122. }
  123. }
  124. //message("i: " + i + ", j: " + j + ", pixel: " + pixel);
  125. display.blitImage(b.x, b.y, b.w, b.h, data, 0);
  126. }
  127. function toggleMove() {
  128. if (doMove) {
  129. doMove = false;
  130. $D('move-selector').style.backgroundColor = "";
  131. $D('move-selector').style.color = "";
  132. } else {
  133. doMove = true;
  134. $D('move-selector').style.backgroundColor = "black";
  135. $D('move-selector').style.color = "lightgray";
  136. }
  137. }
  138. function detectPad() {
  139. var c = $D('canvas'), p = c.parentNode;
  140. c.width = 10;
  141. c.height = 10;
  142. padW = c.offsetWidth - 10;
  143. padH = c.offsetHeight - 10;
  144. message("padW: " + padW + ", padH: " + padH);
  145. }
  146. function doResize() {
  147. var p = $D('canvas').parentNode;
  148. message("doResize1: [" + (p.offsetWidth - padW) +
  149. "," + (p.offsetHeight - padH) + "]");
  150. display.viewportChangeSize(p.offsetWidth - padW, p.offsetHeight - padH);
  151. /*
  152. var pos, new_w, new_h;pos
  153. pos = Util.getPosition($D('canvas').parentNode);
  154. new_w = window.innerWidth - pos.x;
  155. new_h = window.innerHeight - pos.y;
  156. display.viewportChangeSize(new_w, new_h);
  157. */
  158. }
  159. window.onload = function() {
  160. detectPad();
  161. display = new Display({'target': $D('canvas')});
  162. display.resize(1600, 1024);
  163. display.set_viewport(true);
  164. ctx = display.get_context();
  165. mouse = new Mouse({'target': $D('canvas'),
  166. 'onMouseButton': mouseButton,
  167. 'onMouseMove': mouseMove});
  168. mouse.grab();
  169. Util.addEvent(window, 'resize', doResize);
  170. // Shrink viewport for first resize call so that the
  171. // scrollbars are disabled
  172. display.viewportChangeSize(10, 10);
  173. setTimeout(doResize, 1);
  174. setInterval(dirtyRedraw, 50);
  175. message("Display initialized");
  176. };
  177. </script>
  178. </html>