Skip to content

Latest commit

 

History

History
81 lines (62 loc) · 2.89 KB

encoding.MD

File metadata and controls

81 lines (62 loc) · 2.89 KB

Especification of the PIXLZR' codification

History

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.

Especification

# 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.