parseSegments static method
Implementation
static List<UJbig2Segment> parseSegments(Uint8List data) {
final List<UJbig2Segment> segments = <UJbig2Segment>[];
int offset = 0;
int guard = 0;
while (offset + 11 <= data.length && guard < 10000) {
guard++;
final int number = _u32(data, offset);
final int flags = data[offset + 4];
final int type = flags & 0x3F;
final bool pageAssociationLarge = (flags & 0x40) != 0;
int position = offset + 5;
final int referredFlags = data[position];
int referredCount = (referredFlags >> 5) & 7;
if (referredCount == 7) {
referredCount = _u32(data, position) & 0x1FFFFFFF;
position += 4 + ((referredCount + 8) >> 3);
} else {
position += 1;
}
final int referenceSize = number <= 256 ? 1 : (number <= 65536 ? 2 : 4);
final List<int> referred = <int>[];
for (int i = 0; i < referredCount; i++) {
if (position + referenceSize > data.length) break;
referred.add(referenceSize == 1 ? data[position] : (referenceSize == 2 ? _u16(data, position) : _u32(data, position)));
position += referenceSize;
}
position += pageAssociationLarge ? 4 : 1;
if (position + 4 > data.length) break;
final int length = _u32(data, position);
position += 4;
final int end = length == 0xFFFFFFFF ? data.length : (position + length > data.length ? data.length : position + length);
segments.add(UJbig2Segment(number: number, type: type, dataStart: position, dataEnd: end, referred: referred));
if (length == 0xFFFFFFFF) break;
offset = end;
}
return segments;
}