import { EVENT } from './enums'; export function create(dataview) { return { 'offset': 0, 'size': dataview.byteLength, 'view': dataview, }; } export function u8(d) { const value = d.view.getUint8(d.offset); d.offset += 1; return value; } export function u16(d) { const value = d.view.getUint16(d.offset, true); d.offset += 2; return value; } export function u32(d) { const value = d.view.getUint32(d.offset, true); d.offset += 4; return value; } export function f32(d) { const value = d.view.getFloat32(d.offset, true); d.offset += 4; return value; } function f32array(d, count) { const array = new Float32Array(d.view.buffer, d.offset, count); d.offset += count * 4; return array; } export function align(d, to) { while (d.offset % to !== 0) { d.offset++; } } export function event(d) { const event = {}; event.type = u8(d); switch (event.type) { case EVENT.PREDRAW: { event.x = f32(d); event.y = f32(d); break; } case EVENT.SET_COLOR: { event.color = u32(d); break; } case EVENT.SET_WIDTH: { event.width = u16(d); break; } case EVENT.STROKE: { // point_count + width align to 4 bytes :D const point_count = u16(d); const width = u16(d); const color = u32(d); align(d, 4); event.width = width; event.color = color; event.points = f32array(d, point_count * 2); break; } case EVENT.IMAGE: case EVENT.IMAGE_MOVE: { event.image_id = u32(d); event.x = f32(d); event.y = f32(d); break; } case EVENT.UNDO: case EVENT.REDO: { break; } case EVENT.ERASER: { event.stroke_id = u32(d); break; } default: { console.error('fuck', event.type); console.trace(); process.exit(1); } } return event; }