decodeStripPlan function

StripPlan decodeStripPlan(
  1. Uint8List bytes
)

Decodes a buffer produced by encodeStripPlan. Throws on a version or structure mismatch (producer and consumer ship together; a mismatch is a programming error, and callers treat any throw as "no plan").

Implementation

StripPlan decodeStripPlan(Uint8List bytes) {
  final sw = Stopwatch()..start();
  final r = _PlanReader(bytes);
  final version = r.u8();
  if (version != _planFormatVersion) {
    throw StateError('strip plan version $version != $_planFormatVersion');
  }
  final totalFlushPoints = r.u32();
  final deviceWidth = r.u32();
  final deviceHeight = r.u32();
  final matrix =
      PdfMatrix(r.f64(), r.f64(), r.f64(), r.f64(), r.f64(), r.f64());
  final tolerance = r.f64();
  final slugGlyphs = r.u8() != 0;
  final slugQuadCount = r.u32();
  final slugFallbackOutlineRuns = r.u32();
  final slugFallbackOrdinalCount = r.u32();
  final slugFallbackOrdinals = <int>[
    for (var i = 0; i < slugFallbackOrdinalCount; i++) r.u32(),
  ];
  final batchCount = r.u32();
  final batches = <StripBatchData>[];
  for (var i = 0; i < batchCount; i++) {
    final flushOrdinal = r.u32();
    final stripCount = r.u32();
    final atlasWidth = r.u32();
    final atlasHeight = r.u32();
    final atlasPixels = r.rawBytes();
    final chunkCount = r.u32();
    final chunks = <StripChunkData>[];
    for (var c = 0; c < chunkCount; c++) {
      final quads = r.u32();
      chunks.add(StripChunkData(
        r.u32(),
        r.f32List(quads * 8),
        r.f32List(quads * 8),
        r.i32List(quads * 4),
        r.u16List(quads * 6),
      ));
    }
    batches.add(StripBatchData.raw(flushOrdinal, chunks, atlasPixels,
        atlasWidth, atlasHeight, stripCount));
  }
  final slugBatchCount = r.u32();
  final slugBatches = <SlugBatchData>[];
  for (var i = 0; i < slugBatchCount; i++) {
    final flushOrdinal = r.u32();
    final quadCount = r.u32();
    final atlasWidth = r.u32();
    final atlasHeight = r.u32();
    final cellHeight = r.f64();
    final atlasPixels = r.rawBytes();
    final chunkCount = r.u32();
    final chunks = <SlugChunkData>[];
    for (var c = 0; c < chunkCount; c++) {
      final quads = r.u32();
      chunks.add(SlugChunkData(
        r.f32List(quads * 8),
        r.f32List(quads * 8),
        r.i32List(quads * 4),
        r.u16List(quads * 6),
      ));
    }
    slugBatches.add(SlugBatchData(flushOrdinal, chunks, atlasPixels, atlasWidth,
        atlasHeight, quadCount, cellHeight));
  }
  final plan = StripPlan(
    totalFlushPoints: totalFlushPoints,
    deviceWidth: deviceWidth,
    deviceHeight: deviceHeight,
    pageToDevice: matrix,
    tolerance: tolerance,
    batches: batches,
    slugGlyphs: slugGlyphs,
    slugBatches: slugBatches,
    slugQuadCount: slugQuadCount,
    slugFallbackOutlineRuns: slugFallbackOutlineRuns,
    slugFallbackOrdinals: slugFallbackOrdinals,
  );
  decodeStripPlanMicros += sw.elapsedMicroseconds;
  return plan;
}