parseSegments static method

List<UJbig2Segment> parseSegments(
  1. Uint8List data
)

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;
}