Skip to main content

KbitFont - Python

Python PyPI

A library for handling Bits'N'Picas native save format files (.kbits and .kbitx).

Installation

pip install kbitfont

Usage

Create

import shutil

from examples import build_dir
from kbitfont import KbitFont, KbitGlyph


def main():
    outputs_dir = build_dir.joinpath('create')
    if outputs_dir.exists():
        shutil.rmtree(outputs_dir)
    outputs_dir.mkdir(parents=True)

    font = KbitFont()
    font.props.em_ascent = 14
    font.props.em_descent = 2
    font.props.line_ascent = 14
    font.props.line_descent = 2
    font.props.x_height = 7
    font.props.cap_height = 10

    font.names.version = '1.0.0'
    font.names.family = 'My Font'
    font.names.style = 'Regular'
    font.names.manufacturer = 'Pixel Font Studio'
    font.names.designer = 'TakWolf'
    font.names.description = 'A pixel font'
    font.names.copyright = 'Copyright (c) TakWolf'
    font.names.license_description = 'This Font Software is licensed under the SIL Open Font License, Version 1.1'
    font.names.vendor_url = 'https://github.com/TakWolf/kbitfont-python'
    font.names.designer_url = 'https://takwolf.com'
    font.names.license_url = 'https://openfontlicense.org'

    font.named_glyphs['.notdef'] = KbitGlyph(
        x=0,
        y=14,
        advance=8,
        bitmap=[
            [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF],
            [0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF],
            [0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF],
            [0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF],
            [0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF],
            [0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF],
            [0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF],
            [0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF],
            [0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF],
            [0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF],
            [0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF],
            [0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF],
            [0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF],
            [0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF],
            [0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF],
            [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF],
        ],
    )

    font.characters[65] = KbitGlyph(
        x=0,
        y=14,
        advance=8,
        bitmap=[
            [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
            [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
            [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
            [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
            [0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00],
            [0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00],
            [0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00],
            [0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00],
            [0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00],
            [0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00],
            [0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00],
            [0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00],
            [0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00],
            [0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00],
            [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
            [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
        ],
    )

    font.save_kbits(outputs_dir.joinpath('my-font.kbits'))
    font.save_kbitx(outputs_dir.joinpath('my-font.kbitx'))


if __name__ == '__main__':
    main()

Load Kbits

import shutil

from examples import assets_dir, build_dir
from kbitfont import KbitFont


def main():
    outputs_dir = build_dir.joinpath('load_kbits')
    if outputs_dir.exists():
        shutil.rmtree(outputs_dir)
    outputs_dir.mkdir(parents=True)

    font = KbitFont.load_kbits(assets_dir.joinpath('macintosh', 'Athens.kbits'))
    print(f'name: {font.names.family}')
    print(f'size: {font.props.em_height}')
    print(f'ascent: {font.props.line_ascent}')
    print(f'descent: {font.props.line_descent}')
    print()
    for code_point, glyph in sorted(font.characters.items()):
        print(f'char: {chr(code_point)} ({code_point:04X})')
        print(f'xy: {(glyph.x, glyph.y)}')
        print(f'dimensions: {glyph.dimensions}')
        print(f'advance: {glyph.advance}')
        for bitmap_row in glyph.bitmap:
            text = ''.join('  ' if color <= 127 else '██' for color in bitmap_row)
            print(f'{text}*')
        print()
    font.save_kbits(outputs_dir.joinpath('Athens.kbits'))


if __name__ == '__main__':
    main()

Load Kbitx

import shutil

from examples import assets_dir, build_dir
from kbitfont import KbitFont


def main():
    outputs_dir = build_dir.joinpath('load_kbitx')
    if outputs_dir.exists():
        shutil.rmtree(outputs_dir)
    outputs_dir.mkdir(parents=True)

    font = KbitFont.load_kbitx(assets_dir.joinpath('macintosh', 'Athens.kbitx'))
    print(f'name: {font.names.family}')
    print(f'size: {font.props.em_height}')
    print(f'ascent: {font.props.line_ascent}')
    print(f'descent: {font.props.line_descent}')
    print()
    for code_point, glyph in sorted(font.characters.items()):
        print(f'char: {chr(code_point)} ({code_point:04X})')
        print(f'xy: {(glyph.x, glyph.y)}')
        print(f'dimensions: {glyph.dimensions}')
        print(f'advance: {glyph.advance}')
        for bitmap_row in glyph.bitmap:
            text = ''.join('  ' if color <= 127 else '██' for color in bitmap_row)
            print(f'{text}*')
        print()
    font.save_kbitx(outputs_dir.joinpath('Athens.kbitx'))


if __name__ == '__main__':
    main()

Specifications

Font Struct

Kbits

Kbitx

Dependencies

License

MIT License

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

kbitfont-0.0.11.tar.gz (9.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

kbitfont-0.0.11-py3-none-any.whl (12.8 kB view details)

Uploaded Python 3

File details

Details for the file kbitfont-0.0.11.tar.gz.

File metadata

  • Download URL: kbitfont-0.0.11.tar.gz
  • Upload date:
  • Size: 9.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for kbitfont-0.0.11.tar.gz
Algorithm Hash digest
SHA256 9a9fbc4b1e0eac53fc82b899ed135f326ec626bb7fc9a74c6f32c9411c0bdcd0
MD5 f3f75f320ff69d6f0d6f18d644cfee99
BLAKE2b-256 c4977b8c61d2bc1ec8317f0a1c8ff9712f2aad064db6ab5402f0ed12dce1f223

See more details on using hashes here.

File details

Details for the file kbitfont-0.0.11-py3-none-any.whl.

File metadata

  • Download URL: kbitfont-0.0.11-py3-none-any.whl
  • Upload date:
  • Size: 12.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for kbitfont-0.0.11-py3-none-any.whl
Algorithm Hash digest
SHA256 560fe44aad4e04643c8a26d1a67472b1ca538c8e6efca9695af63627721c5d79
MD5 c44caa1b0eeab1c3b0d040c96fe1231b
BLAKE2b-256 e521cebb5a7fd542a21d10ad628396066ad4e4396a2c41ae55b96d0c374df77a

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.0.11 This release

2 files

0.0.10

2 files

0.0.9

2 files

0.0.8

2 files

0.0.7

2 files

0.0.6

2 files

0.0.5

2 files

0.0.4

2 files

0.0.3

2 files

0.0.2

2 files

0.0.1

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page