Skip to main content

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

Project description

KbitFont - Python

Python PyPI

KbitFont is a library for parsing 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

Project details


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.7.tar.gz (8.1 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.7-py3-none-any.whl (11.1 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: kbitfont-0.0.7.tar.gz
  • Upload date:
  • Size: 8.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","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.7.tar.gz
Algorithm Hash digest
SHA256 ffdd8019bc7793696df434692cd55e54c743c52e922d989639d3eb339eaa0bab
MD5 47654be71727ea79bb401e6064d78edd
BLAKE2b-256 67e307ce18c33f6bc927c559e3e2ae2bc55a9c10cfeb484587b8fc7cce05db4e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: kbitfont-0.0.7-py3-none-any.whl
  • Upload date:
  • Size: 11.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","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.7-py3-none-any.whl
Algorithm Hash digest
SHA256 7b595173c2dfb577b92690c8fbc7278c93d51ad351c61dc9204edf3a1573c490
MD5 259a2ae9c6fbec3597d4358484c5ad9b
BLAKE2b-256 7b9a0353ef6d976c110db98408de2c4e70abe835e59e57c46c275a4fe5400bf5

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page