Skip to main content

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

Project description

KbitFont

Python PyPI

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

Installation

pip install kbitfont

Usage

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 alpha <= 127 else '██' for alpha 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 alpha <= 127 else '██' for alpha in bitmap_row)
            print(f'{text}*')
        print()
    font.save_kbitx(outputs_dir.joinpath('Athens.kbitx'))


if __name__ == '__main__':
    main()

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'
    font.names.designer_url = 'https://takwolf.com'
    font.names.license_url = 'https://openfontlicense.org'

    font.characters[ord('A')] = 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.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.save_kbits(outputs_dir.joinpath('my-font.kbits'))
    font.save_kbitx(outputs_dir.joinpath('my-font.kbitx'))


if __name__ == '__main__':
    main()

Specifications

Font Struct

Kbits

Kbitx

Dependencies

License

Under the 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.2.tar.gz (117.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.2-py3-none-any.whl (11.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: kbitfont-0.0.2.tar.gz
  • Upload date:
  • Size: 117.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for kbitfont-0.0.2.tar.gz
Algorithm Hash digest
SHA256 a035c43952bf846f1266b78681d32c69e36cc47637ff00bd16812a3fefcd4e5f
MD5 e6882ef25ddf70f1cdad5ecb04492541
BLAKE2b-256 b9dfe1f73d7025045c54b41d3ea1053f8f4552e22b7410905b48b45edd470243

See more details on using hashes here.

Provenance

The following attestation bundles were made for kbitfont-0.0.2.tar.gz:

Publisher: publish.yml on TakWolf/kbitfont

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

  • Download URL: kbitfont-0.0.2-py3-none-any.whl
  • Upload date:
  • Size: 11.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for kbitfont-0.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 de06bf833c0a738c79261a645bf4daac886ee40f87d0cbcc89e3fdbaa9e67745
MD5 8b87ffc22913afb6a4b9f5dc4402b1f3
BLAKE2b-256 c5179c20a3dcbb52971f1d0ab98f88bb1da33d379e735023126ad21c6710b349

See more details on using hashes here.

Provenance

The following attestation bundles were made for kbitfont-0.0.2-py3-none-any.whl:

Publisher: publish.yml on TakWolf/kbitfont

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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