Skip to content

Commit

Permalink
feat: toiftool
Browse files Browse the repository at this point in the history
  • Loading branch information
matejcik committed Aug 16, 2023
1 parent 49bee50 commit 6cd174d
Show file tree
Hide file tree
Showing 6 changed files with 147 additions and 41 deletions.
40 changes: 0 additions & 40 deletions core/tools/toif_convert.py

This file was deleted.

20 changes: 19 additions & 1 deletion poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ vulture = "^2.6"

# tools
binsize = "^0.1.3"
toiftool = {path = "./python/tools/toiftool", develop = true, python = ">=3.8"}

[tool.poetry.dev-dependencies]
scan-build = "*"
Expand Down
40 changes: 40 additions & 0 deletions python/tools/toiftool/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# TOIF Tool

A helpful CLI tool to work with TOIFs.

## Installation

The command `toiftool` is available within firmware repository's Poetry shell.

To install the tool separate from the firmware repository, run:

```bash
pip install -e .
```

## Displaying TOIFs

To display a TOIF image in a viewer, run:

```bash
toiftool show <path/to/toif>
```

## Converting TOIFs

To convert to or from TOIF, run:

```bash
toiftool convert <path/to/image.toif> <path/to/output.jpg>
toiftool convert <path/to/image.png> <path/to/output.toif>
```

The in/out format will be determined by the file extension.

## Getting information about TOIFs

To get information about a TOIF, run:

```bash
toiftool info <path/to/toif>
```
19 changes: 19 additions & 0 deletions python/tools/toiftool/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
[tool.poetry]
name = "toiftool"
version = "0.1.0"
description = ""
authors = ["matejcik <[email protected]>"]
readme = "README.md"

[tool.poetry.dependencies]
python = ">=3.8"
trezor = ">=0.13"
click = ">=7.0,<9.0"
Pillow = "^9"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

[tool.poetry.scripts]
toiftool = "toiftool:cli"
68 changes: 68 additions & 0 deletions python/tools/toiftool/toiftool.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
#!/usr/bin/env python3
from typing import BinaryIO

import click
from PIL import Image

from trezorlib import toif


@click.group()
def cli():
"""TOIF toolkit."""


@cli.command()
@click.argument("infile", type=click.File("rb"))
@click.argument("outfile", type=click.File("wb"))
def convert(infile: BinaryIO, outfile: BinaryIO) -> None:
"""Convert any image format to/from TOIF or vice-versa.
\b
Examples:
toiftool convert somefile.jpg outfile.toif
toiftool convert infile.toif outfile.png
\b
# ensure gray-scale output TOIF
mogrify -colorspace gray icon.png
toiftool convert icon.png icon.toif
"""
if infile.name.endswith(".toif") or infile.name == "-":
toi = toif.from_bytes(infile.read())
im = toi.to_image()
im.save(outfile)

elif outfile.name.endswith(".toif") or outfile.name == "-":
im = Image.open(infile)
toi = toif.from_image(im)
outfile.write(toi.to_bytes())

else:
raise click.ClickException("At least one of the arguments must end with .toif")


@cli.command()
@click.argument("toif_file", type=click.File("rb"))
def info(toif_file: BinaryIO) -> None:
"""Print information about TOIF file."""
toif_bytes = toif_file.read()
toi = toif.from_bytes(toif_bytes)
click.echo(f"TOIF file: {toif_file.name}")
click.echo(f"Size: {len(toif_bytes)} bytes")
w, h = toi.size
click.echo(f"Dimensions: {w}x{h}")
click.echo(f"Format: {toi.mode}")


@cli.command()
@click.argument("toif_file", type=click.File("rb"))
def show(toif_file: BinaryIO) -> None:
"""Show TOIF file in a new window."""
toi = toif.from_bytes(toif_file.read())
im = toi.to_image()
im.show()


if __name__ == "__main__":
cli()

0 comments on commit 6cd174d

Please sign in to comment.