predictor static method

Uint8List predictor(
  1. Uint8List data, {
  2. required int predictor,
  3. required int colors,
  4. required int bitsPerComponent,
  5. required int columns,
})

Implementation

static Uint8List predictor(Uint8List data, {required int predictor, required int colors, required int bitsPerComponent, required int columns}) {
  if (predictor <= 1) return data;
  final int bytesPerPixel = ((colors * bitsPerComponent) / 8).ceil().clamp(1, 64).toInt();
  final int rowLength = ((columns * colors * bitsPerComponent) / 8).ceil();
  if (predictor == 2) return _tiffPredictor(data, colors: colors, bitsPerComponent: bitsPerComponent, columns: columns);
  final List<int> out = <int>[];
  final Uint8List previous = Uint8List(rowLength);
  int index = 0;
  while (index + 1 <= data.length) {
    final int filter = data[index++];
    final int available = data.length - index;
    final int take = available < rowLength ? available : rowLength;
    if (take <= 0) break;
    final Uint8List row = Uint8List(rowLength);
    row.setRange(0, take, data, index);
    index += take;
    switch (filter) {
      case 0:
        break;
      case 1:
        for (int i = bytesPerPixel; i < rowLength; i++) {
          row[i] = (row[i] + row[i - bytesPerPixel]) & 0xFF;
        }
        break;
      case 2:
        for (int i = 0; i < rowLength; i++) {
          row[i] = (row[i] + previous[i]) & 0xFF;
        }
        break;
      case 3:
        for (int i = 0; i < rowLength; i++) {
          final int left = i >= bytesPerPixel ? row[i - bytesPerPixel] : 0;
          row[i] = (row[i] + ((left + previous[i]) >> 1)) & 0xFF;
        }
        break;
      case 4:
        for (int i = 0; i < rowLength; i++) {
          final int left = i >= bytesPerPixel ? row[i - bytesPerPixel] : 0;
          final int up = previous[i];
          final int upLeft = i >= bytesPerPixel ? previous[i - bytesPerPixel] : 0;
          row[i] = (row[i] + _paeth(left, up, upLeft)) & 0xFF;
        }
        break;
      default:
        break;
    }
    out.addAll(row);
    previous.setAll(0, row);
  }
  return Uint8List.fromList(out);
}