///|
fn pdf_decode_tiff_predictor(
colors : Int,
bits_per_component : Int,
columns : Int,
data : BytesView,
) -> @core.PdfBytes raise @core.PdfError {
if bits_per_component != 8 {
raise PredictorNotSupported(2)
}
let scanline_width = pdf_predictor_scanline_width(
colors, bits_per_component, columns,
)
let output : Array[Byte] = [ for byte in data => byte ]
for line in 0..<(data.length() / scanline_width) {
let line_start = line * scanline_width
let mut position = colors
while position < scanline_width {
let index = line_start + position
output[index] = ((
output[index - colors].to_int() + output[index].to_int()
) %
256).to_byte()
position += 1
}
}
Bytes::from_array(output)
}
///|
fn pdf_encode_tiff_predictor(
colors : Int,
bits_per_component : Int,
columns : Int,
data : BytesView,
) -> @core.PdfBytes raise @core.PdfError {
if bits_per_component != 8 {
raise PredictorNotSupported(2)
}
let scanline_width = pdf_predictor_scanline_width(
colors, bits_per_component, columns,
)
let output : Array[Byte] = [ for byte in data => byte ]
for line in 0..<(data.length() / scanline_width) {
let line_start = line * scanline_width
let mut position = colors
while position < scanline_width {
let index = line_start + position
output[index] = pdf_predictor_wrapping_byte(
data[index].to_int() - data[index - colors].to_int(),
)
position += 1
}
}
Bytes::from_array(output)
}