Sexta-feira, dia 10/02/2023
, minha segunda aula teórica de FeMec no ano.
Eu tinha um tempinho livre, então rabisquei uma especificação:
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.
# | Tamanho (oc) | Acumulado (oc) | Grupo | Elemento | Valor |
---|---|---|---|---|---|
0 | 6 | 6 | Cabeçalho | Números Mágicos | b"PIXLZR" |
1 | 3 | 9 | Cabeçalho | Versão | 0 , 0 , 1 |
2 | 4 | 13 | Cabeçalho | Largura | u32 |
3 | 4 | 17 | Cabeçalho | Altura | u32 |
4 | 4 | 21 | Cabeçalho | Largura de Bloco | u32 |
5 | 4 | 25 | Cabeçalho | Altura de Bloco | u32 |
. | . | .. | .. | .. | |
n | 5 | n + 5 | Bloco | Números Mágicos | b"block" |
n | 4 | n + 9 | Bloco | Valor do bloco | f32 |
n | 4 | n + 13 | Bloco | Tamanho do bloco QOI | u32 |
n | m | n + m | Bloco | Bloco QOI |
PIXLZR := HEADER + BLOCKS
HEADER := PIXLZR_MAGIC_NUMBERS + PIXLZR_VERSION + WIDTH + HEIGHT + BLOCK_WIDTH + BLOCK_HEIGHT
PIXLZR_MAGIC_NUMBERS = b"PIXLZR"
PIXLZR_VERSION = [0, 0, 1]
WIDTH, HEIGHT, BLOCK_WIDTH, BLOCK_HEIGHT := inteiro sem sinal de 4 octetos
BLOCKS := BLOCK[]
BLOCK := PIXLZR_BLOCK_MAGIC_NUMBERS + BLOCK_VALUE + QOI_IMAGE_LENGTH + QOI_IMAGE
PIXLZR_BLOCK_MAGIC_NUMBERS = b"block"
BLOCK_VALUE := flutuante de 4 octetos
QOI_IMAGE_LENGTH := inteiro sem sinal de 4 octetos
QOI_IMAGE := lista de octetos
E, finalmente:
PIXLZR :=
HEADER :=
b"PIXLZR"
[0, 0, 1]
WIDTH
HEIGHT
BLOCK_WIDTH
BLOCK_HEIGHT
BLOCKS := [
b"block"
BLOCK_VALUE
QOI_IMAGE_LENGTH
QOI_IMAGE
]