predictor static method
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);
}