(bytes: Uint8Array)
| 67 | } |
| 68 | |
| 69 | function readCommandBounds(bytes: Uint8Array): Readonly<{ cmdOffset: number; cmdEnd: number }> { |
| 70 | if (bytes.byteLength < HEADER_SIZE) { |
| 71 | throw new Error(`drawlist too small for header (len=${String(bytes.byteLength)})`); |
| 72 | } |
| 73 | |
| 74 | const cmdOffset = u32(bytes, 16); |
| 75 | const cmdBytes = u32(bytes, 20); |
| 76 | const cmdEnd = cmdOffset + cmdBytes; |
| 77 | if (cmdBytes === 0) return { cmdOffset, cmdEnd }; |
| 78 | if (cmdOffset < HEADER_SIZE || cmdOffset > bytes.byteLength) { |
| 79 | throw new Error( |
| 80 | `drawlist cmdOffset out of bounds (cmdOffset=${String(cmdOffset)}, len=${String(bytes.byteLength)})`, |
| 81 | ); |
| 82 | } |
| 83 | if (cmdEnd < cmdOffset || cmdEnd > bytes.byteLength) { |
| 84 | throw new Error( |
| 85 | `drawlist cmd range out of bounds (cmdOffset=${String(cmdOffset)}, cmdBytes=${String(cmdBytes)}, len=${String(bytes.byteLength)})`, |
| 86 | ); |
| 87 | } |
| 88 | return { cmdOffset, cmdEnd }; |
| 89 | } |
| 90 | |
| 91 | export function parseCommandHeaders(bytes: Uint8Array): readonly DrawlistCommandHeader[] { |
| 92 | const { cmdOffset, cmdEnd } = readCommandBounds(bytes); |
no test coverage detected