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