You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
2.0 KiB
97 lines
2.0 KiB
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.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; |
|
} |