Friday, 10
of February of 2023
(10/02/2023
), my second teoric FeMec class in the year.
As I had a little of free time, I drafted an specification:
Decidi, no momento, terceirizar a codificação do bloco para o modelo QOI (Quite Ok Image Format / Formato de Imagem Bem Ok).
Na semana seguinte, investiguei que necessitaria realizar uma estruturação baseada em objetos para efetivamente criar uma API decente.
Do sábado 18/02
a terça-feira 21/02
, consegui implementar com sucesso a especificação.
Na manhã do dia seguinte (Quarta-feira de Cinzas, 22/02
), pesquisei por um visualizador de imagens aberto feito em Rust, e cheguei ao Emulsion.
Em cerca de cinco minutos explorando o GitHub do projeto, descobri quais linhas deveria alterar (de duas funções em src/image_cache/image_loader.rs
, detect_format
e simple_load_image
).
Após algumas horas de trabalho, incluindo alterações na crate image
(que resultarão em uma ramificação da mesma, porém inclusa na ramificação do emulsion), tive sucesso.
# | Size (oc) | Accumulated (oc) | Group | Element | Value |
---|---|---|---|---|---|
0 | 6 | 6 | Header | Magic Numbers | b"PIXLZR" |
1 | 3 | 9 | Header | Version | 0 , 0 , 1 |
2 | 4 | 13 | Header | Width | u32 |
3 | 4 | 17 | Header | Height | u32 |
4 | 4 | 21 | Header | Block's Width | u32 |
5 | 4 | 25 | Header | Block's Height | u32 |
6 | ? | 6 + ? | Header | [u32; ..] |
|
. | . | .. | .. | .. | |
n | 5 | n + 5 | Block | Magic Numbers | b"block" |
n | 4 | n + 9 | Block | Value of the block | f32 |
n | 4 | n + 13 | Block | Size of the QOI block | u32 =: m |
n | m | n + m | Block | QOI Block |
PIXLZR := HEADER + BLOCKS
HEADER := PIXLZR_MAGIC_NUMBERS + PIXLZR_VERSION + WIDTH + HEIGHT + BLOCK_WIDTH + BLOCK_HEIGHT + LINE_LENGTHS
PIXLZR_MAGIC_NUMBERS = b"PIXLZR"
PIXLZR_VERSION = [0, 0, 1]
WIDTH, HEIGHT, BLOCK_WIDTH, BLOCK_HEIGHT := unsigned int of 4 octets
LINE_LENGTHS := array do unsigned ints of 4 octets each; size is the vertical amount of blocks
BLOCKS := BLOCK[]
BLOCK := PIXLZR_BLOCK_MAGIC_NUMBERS + BLOCK_VALUE + QOI_IMAGE_LENGTH + QOI_IMAGE
PIXLZR_BLOCK_MAGIC_NUMBERS = b"block"
BLOCK_VALUE := float of 4 octets
QOI_IMAGE_LENGTH := unsigned int of 4 octets
QOI_IMAGE := list of octets
And, finally, the most recent version is:
PIXLZR :=
HEADER :=
b"PIXLZR"
[0, 0, 1]
WIDTH
HEIGHT
BLOCK_WIDTH
BLOCK_HEIGHT
LINE_LENGTHS
BLOCKS := [
b"block"
BLOCK_VALUE
QOI_IMAGE_LENGTH
QOI_IMAGE
]
LINE_LENGTHS
is used to encode and decode in parallel.