def jpeg.block.ac.symbol
gralha-jpeg-decode@0.1.0.1 · jpeg.bend:380
import gralha-jpeg-decode@0.1.0.1/jpeg.bend as Jpeg
import Base
import gralha-text-scan@0.1.0.1/scan.bend as U
import gralha-bytes@0.1.0.1/bytes.bend as Bin
380def jpeg.block.ac.symbol(read: JPEGRead, +coefficients: Bin.Bytes, +predictor: U32, +offset: U32, +index: U32, next: U32 -> JPEGBlock -> JPEGBlock) -> JPEGBlock:
381 JPEGRead{symbol, stream} = read
382 +rs = symbol
383 +input = stream
384 +count = (rs % 16 : U32)
385 +pos = (index + rs / 16 : U32)
386 +end = U32.is_eq(rs, 0)
387 +zero = U32.is_eq(rs, 240)
388 +ok = jpeg.stream.valid(input) && (end || (zero && U32.is_le((index + 16 : U32), 64)) || (U32.is_gt(count, 0) && U32.is_le(count, 10) && U32.is_lt(pos, 64)))
389 +skip = end || Bool.not(ok)
390 +result = U.branch(JPEGBlock, skip || zero, _ => JPEGBlock{U.choose(JPEGStream, ok, input, jpeg.stream.invalid(input)), coefficients, predictor},
391 _ => jpeg.block.ac.bits(jpeg.bits(input, count), count, coefficients, predictor, offset, pos, _ => block => block))
392 next(U.choose(U32, skip, 64, U.choose(U32, zero, (index + 16 : U32), U32.inc(pos))))(result)
393
394@unsafe