///|
fn pdf_ccitt_encode_read_run(
input : @core.BitStream,
max_columns : Int,
) -> (Bool, Int) raise @core.PdfError {
if max_columns <= 0 {
raise InvalidCCITTData
}
let iswhite = input.get_bit()
let mut length = 1
while length < max_columns {
let position = input.position()
let next = input.get_bit()
if next == iswhite {
length += 1
} else {
input.seek(position)
return (iswhite, length)
}
}
(iswhite, length)
}
///|
fn pdf_ccitt_encode_g3_1d_view(
data : BytesView,
columns : Int,
rows : Int,
) -> @core.PdfBytes raise @core.PdfError {
if columns <= 0 || rows < 0 {
raise InvalidCCITTData
}
let row_bytes = (columns - 1) / 8 + 1
if rows > 0 && row_bytes > data.length() / rows {
raise InvalidCCITTData
}
let input = @core.bitstream_of_view(data)
let output = @core.bit_writer_new()
let mut rows_left = rows
let mut columns_left = columns
while rows_left > 0 {
let (iswhite, length) = pdf_ccitt_encode_read_run(input, columns_left)
if !iswhite && columns_left == columns {
pdf_ccitt_write_run(output, true, 0)
}
pdf_ccitt_write_run(output, iswhite, length)
columns_left -= length
if columns_left == 0 {
input.align()
columns_left = columns
rows_left -= 1
}
}
pdf_ccitt_write_eol(output)
pdf_ccitt_write_eol(output)
output.to_bytes()
}
///|
fn pdf_ccitt_line_from_data(
data : BytesView,
columns : Int,
row : Int,
) -> Array[Int] raise @core.PdfError {
let row_bytes = (columns - 1) / 8 + 1
let row_start = row * row_bytes
if row_start + row_bytes > data.length() {
raise EndOfInput
}
let line : Array[Int] = []
for column in 0..> shift) & 1)
}
line
}
///|
fn pdf_ccitt_encode_g4_view(
data : BytesView,
columns : Int,
rows : Int,
) -> @core.PdfBytes raise @core.PdfError {
if columns <= 0 || rows < 0 {
raise InvalidCCITTData
}
let row_bytes = (columns - 1) / 8 + 1
if rows > 0 && row_bytes > data.length() / rows {
raise InvalidCCITTData
}
let output = @core.bit_writer_new()
let whiteval = 1
let blackval = 0
let mut reference = pdf_ccitt_blank_line(columns, whiteval)
for row in 0..= -3 && delta <= 3 {
pdf_ccitt_write_mode(output, CCITTVertical(delta))
column = a1
white = !white
} else {
pdf_ccitt_write_mode(output, CCITTHorizontal)
pdf_ccitt_write_run(output, white, a1 - column)
pdf_ccitt_write_run(output, !white, a2 - a1)
column = a2
}
}
}
reference = line
}
pdf_ccitt_write_mode(output, CCITTEOFB)
output.to_bytes()
}