mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-11-22 23:48:12 +00:00
add documentation about toif
This commit is contained in:
parent
b41c1c3e4d
commit
6a3cf02396
@ -2,3 +2,4 @@
|
|||||||
|
|
||||||
* [TREZOR OS API](api.md)
|
* [TREZOR OS API](api.md)
|
||||||
* [TREZOR OS Bootloader](bootloader.md)
|
* [TREZOR OS Bootloader](bootloader.md)
|
||||||
|
* [TREZOR OS Image Format](toif.md)
|
||||||
|
52
docs/toif.md
Normal file
52
docs/toif.md
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
#TREZOR Optimized Image Format
|
||||||
|
|
||||||
|
##Header
|
||||||
|
|
||||||
|
| offset | length | name | description |
|
||||||
|
|-------:|-------:|------|-------------|
|
||||||
|
| 0x0000 | 3 | magic | `TOI` |
|
||||||
|
| 0x0003 | 1 | fmt | data format: `f` or `g` (see below) |
|
||||||
|
| 0x0004 | 2 | width | width of the image (big endian) |
|
||||||
|
| 0x0006 | 2 | height | height of the image (big endian) |
|
||||||
|
| 0x0008 | 4 | datasize | length of the compressed data (big endian) |
|
||||||
|
| 0x000A | ? | data | compressed data (see below) |
|
||||||
|
|
||||||
|
##Format
|
||||||
|
|
||||||
|
TOI currently supports 2 variants:
|
||||||
|
|
||||||
|
* `f`: full-color, file extension `.toif`
|
||||||
|
* `g`: gray-scale, file extension `.toig`
|
||||||
|
|
||||||
|
###Full-color
|
||||||
|
|
||||||
|
For each pixel a big endian 16-bit value is used. First 5 bits are used for red component, next 6 bits are green, final 5 bits are blue, so it looks like this:
|
||||||
|
|
||||||
|
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|
||||||
|
|----|----|----|----|----|----|---|---|---|---|---|---|---|---|---|---|
|
||||||
|
| R | R | R | R | R | G | G | G | G | G | G | B | B | B | B | B |
|
||||||
|
|
||||||
|
###Gray-scale
|
||||||
|
|
||||||
|
Each pixel is encoded using a 4-bit value. Each byte contains color of two pixels, so it looks like this:
|
||||||
|
|
||||||
|
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|
||||||
|
|---|---|---|---|---|---|---|---|
|
||||||
|
| Po | Po | Po | Po | Pe | Pe | Pe | Pe |
|
||||||
|
|
||||||
|
Where Po is odd pixel and Pe is even pixel.
|
||||||
|
|
||||||
|
##Compression
|
||||||
|
|
||||||
|
Pixel data is compressed using DEFLATE algorithm with 10-bit sliding window and no header. This can be achieved with ZLIB library by using the following:
|
||||||
|
|
||||||
|
``` python
|
||||||
|
import zlib
|
||||||
|
z = zlib.compressobj(level=9, wbits=10)
|
||||||
|
zdata = z.compress(pixeldata) + z.flush()
|
||||||
|
zdata = zdata[2:-4] # strip header and checksum
|
||||||
|
```
|
||||||
|
|
||||||
|
##Tools
|
||||||
|
|
||||||
|
* [png2toi](../tools/png2toi) - tool for converting PNG into TOI format
|
@ -54,11 +54,11 @@ def process_image(ifn):
|
|||||||
f.write(bytes('TOIg', 'ascii'))
|
f.write(bytes('TOIg', 'ascii'))
|
||||||
f.write(struct.pack('>HH', w, h))
|
f.write(struct.pack('>HH', w, h))
|
||||||
if im.mode == 'RGB':
|
if im.mode == 'RGB':
|
||||||
data = process_rgb(w, h, pix)
|
pixeldata = process_rgb(w, h, pix)
|
||||||
else:
|
else:
|
||||||
data = process_grayscale(w, h, pix)
|
pixeldata = process_grayscale(w, h, pix)
|
||||||
z = zlib.compressobj(level=9, wbits=10)
|
z = zlib.compressobj(level=9, wbits=10)
|
||||||
zdata = z.compress(data) + z.flush()
|
zdata = z.compress(pixeldata) + z.flush()
|
||||||
zdata = zdata[2:-4] # strip header and checksum
|
zdata = zdata[2:-4] # strip header and checksum
|
||||||
f.write(struct.pack('>I', len(zdata)))
|
f.write(struct.pack('>I', len(zdata)))
|
||||||
f.write(zdata)
|
f.write(zdata)
|
||||||
|
Loading…
Reference in New Issue
Block a user