"use strict"; /* Copyright (C) 2012 by Jeremy P. White This file is part of spice-html5. spice-html5 is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. spice-html5 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with spice-html5. If not, see . */ /*---------------------------------------------------------------------------- ** Utility settings and functions for Spice **--------------------------------------------------------------------------*/ var DEBUG = 0; var DUMP_DRAWS = false; var DUMP_CANVASES = false; /*---------------------------------------------------------------------------- ** combine_array_buffers ** Combine two array buffers. ** FIXME - this can't be optimal. See wire.js about eliminating the need. **--------------------------------------------------------------------------*/ function combine_array_buffers(a1, a2) { var in1 = new Uint8Array(a1); var in2 = new Uint8Array(a2); var ret = new ArrayBuffer(a1.byteLength + a2.byteLength); var out = new Uint8Array(ret); var o = 0; var i; for (i = 0; i < in1.length; i++) out[o++] = in1[i]; for (i = 0; i < in2.length; i++) out[o++] = in2[i]; return ret; } /*---------------------------------------------------------------------------- ** hexdump_buffer **--------------------------------------------------------------------------*/ function hexdump_buffer(a) { var mg = new Uint8Array(a); var hex = ""; var str = ""; var last_zeros = 0; for (var i = 0; i < mg.length; i++) { var h = Number(mg[i]).toString(16); if (h.length == 1) hex += "0"; hex += h + " "; str += String.fromCharCode(mg[i]); if ((i % 16 == 15) || (i == (mg.length - 1))) { while (i % 16 != 15) { hex += " "; i++; } if (last_zeros == 0) console.log(hex + " | " + str); if (hex == "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ") { if (last_zeros == 1) { console.log("."); last_zeros++; } else if (last_zeros == 0) last_zeros++; } else last_zeros = 0; hex = str = ""; } } } /*---------------------------------------------------------------------------- ** FIXME FIXME FIXME - web key code to scan code mapping ** This is really atrocious code. At the end of the day, we need to ** map keystrokes generated by the browser into the scan codes required ** by spice. This table was literally built by me pressing keys on my keyboard ** and typing the resulting value in by hand. ** I'm sure Europeans will hate me, and the Chinese will likely *never* ** talk to me. **--------------------------------------------------------------------------*/ var scanmap = []; var codei = 1; scanmap[27] = codei++; scanmap['1'.charCodeAt(0)] = codei++; scanmap['2'.charCodeAt(0)] = codei++; scanmap['3'.charCodeAt(0)] = codei++; scanmap['4'.charCodeAt(0)] = codei++; scanmap['5'.charCodeAt(0)] = codei++; scanmap['6'.charCodeAt(0)] = codei++; scanmap['7'.charCodeAt(0)] = codei++; scanmap['8'.charCodeAt(0)] = codei++; scanmap['9'.charCodeAt(0)] = codei++; scanmap['0'.charCodeAt(0)] = codei++; scanmap[109] = codei++; scanmap['='.charCodeAt(0)] = codei++; scanmap[8] = codei++; scanmap[9] = codei++; scanmap['Q'.charCodeAt(0)] = codei++; scanmap['W'.charCodeAt(0)] = codei++; scanmap['E'.charCodeAt(0)] = codei++; scanmap['R'.charCodeAt(0)] = codei++; scanmap['T'.charCodeAt(0)] = codei++; scanmap['Y'.charCodeAt(0)] = codei++; scanmap['U'.charCodeAt(0)] = codei++; scanmap['I'.charCodeAt(0)] = codei++; scanmap['O'.charCodeAt(0)] = codei++; scanmap['P'.charCodeAt(0)] = codei++; scanmap[219] = codei++; scanmap[221] = codei++; scanmap[13] = codei++; scanmap[17] = codei++; scanmap['A'.charCodeAt(0)] = codei++; scanmap['S'.charCodeAt(0)] = codei++; scanmap['D'.charCodeAt(0)] = codei++; scanmap['F'.charCodeAt(0)] = codei++; scanmap['G'.charCodeAt(0)] = codei++; scanmap['H'.charCodeAt(0)] = codei++; scanmap['J'.charCodeAt(0)] = codei++; scanmap['K'.charCodeAt(0)] = codei++; scanmap['L'.charCodeAt(0)] = codei++; scanmap[';'.charCodeAt(0)] = codei++; scanmap[222] = codei++; scanmap[192] = codei++; scanmap[16] = codei++; scanmap[220] = codei++; scanmap['Z'.charCodeAt(0)] = codei++; scanmap['X'.charCodeAt(0)] = codei++; scanmap['C'.charCodeAt(0)] = codei++; scanmap['V'.charCodeAt(0)] = codei++; scanmap['B'.charCodeAt(0)] = codei++; scanmap['N'.charCodeAt(0)] = codei++; scanmap['M'.charCodeAt(0)] = codei++; scanmap[188] = codei++; scanmap[190] = codei++; scanmap[191] = codei++; codei++; // right shift seems to be same scanmap[106] = codei++; scanmap[18] = codei++; scanmap[' '.charCodeAt(0)] = codei++; scanmap[20] = codei++; scanmap[112] = codei++; scanmap[113] = codei++; scanmap[114] = codei++; scanmap[115] = codei++; scanmap[116] = codei++; scanmap[117] = codei++; scanmap[118] = codei++; scanmap[119] = codei++; scanmap[120] = codei++; scanmap[121] = codei++; scanmap[144] = codei++; scanmap[145] = codei++; // Scroll lock scanmap[103] = codei++; scanmap[104] = codei++; scanmap[105] = codei++; codei++;// skip minus; scanmap[100] = codei++; scanmap[101] = codei++; scanmap[102] = codei++; scanmap[107] = codei++; scanmap[97] = codei++; scanmap[98] = codei++; scanmap[99] = codei++; scanmap[96] = codei++; scanmap[110] = codei++; // F11 + 12 go up at 87/88, after the less codei = 87; scanmap[122] = codei++; scanmap[123] = codei++; codei = 99; scanmap[42] = codei++; codei++; // skip alt scanmap[19] = codei++; // break scanmap[36] = codei++; // home scanmap[38] = codei++; // up scanmap[33] = codei++; // page up scanmap[37] = codei++; // left scanmap[39] = codei++; // right scanmap[35] = codei++; // end scanmap[40] = codei++; // down scanmap[34] = codei++; // page down scanmap[45] = codei++; // insert scanmap[46] = codei++; // delete function keycode_to_start_scan(code) { if (scanmap[code] === undefined) { alert('no map for ' + code); return 0; } if (scanmap[code] < 0x100) { return scanmap[code]; } else { return 0xe0 | ((scanmap[code] - 0x100) << 8); } } function keycode_to_end_scan(code) { if (scanmap[code] === undefined) return 0; if (scanmap[code] < 0x100) { return scanmap[code] | 0x80; } else { return 0x80e0 | ((scanmap[code] - 0x100) << 8); } }