decode method
Implementation
RitoPrimitiveList decode(Uint8List bytes) {
if (bytes.length > ritoMaxWireBytes) {
throw const FormatException('RITODL1 exceeds the byte limit.');
}
final reader = RitoBinaryReader(bytes);
reader.expectMagic(_magic, 'primitive list magic');
final version = reader.uint32('primitive list version');
if (version != formatVersion) {
reader.fail('unsupported primitive list version: $version');
}
final ratio = reader.float64('primitive list ratio');
if (ratio <= 0) {
reader.fail('primitive list ratio must be positive');
}
final count = reader.count('primitive count');
final commands = <RitoPrimitive>[];
final runs = <(int, _RitoTextReference)>[];
for (var index = 0; index < count; index += 1) {
commands.add(_primitive(reader, runs, index));
}
final tables = _readTextTables(reader);
for (final (index, run) in runs) {
final resolved = _resolveTextRun(reader, run, tables);
commands[index] = switch (resolved) {
RitoPaintText() => RitoPrimitiveText(resolved),
RitoPaintRuby() => RitoPrimitiveRuby(resolved),
};
}
reader.finish('primitive list');
return RitoPrimitiveList(
formatVersion: version,
ratio: ratio,
commands: commands,
);
}