diff --git a/.gitignore b/.gitignore index 7a60b85..1273cf9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ __pycache__/ *.pyc + +out/ diff --git a/generate_pbff.py b/generate_pbff.py index ab5dd4c..811442f 100755 --- a/generate_pbff.py +++ b/generate_pbff.py @@ -43,6 +43,10 @@ def generate_pbff_file(data, out): (top, left, advance, width, height, codepoint) = \ (glyph[x] for x in ('top', 'left', 'advance', 'width', 'height', 'codepoint')) + try: + glyph_bitmap_bits = glyph['bits'] + except KeyError: + glyph_bitmap_bits = [] print('glyph %d%s' % ( codepoint, @@ -56,10 +60,23 @@ def generate_pbff_file(data, out): print('.') print(' %d' % top, file=out) - for x in range(height): + glyph_bitmap_bits_offset = 0 + for y in range(height): if left > 0: print(' ' * left, end='', file=out) - print('#' * width, file=out) + if glyph_bitmap_bits: + for x in range(width): + letter = ' ' + try: + if glyph_bitmap_bits[glyph_bitmap_bits_offset] >= 1: + letter = '#' + except IndexError: + pass + glyph_bitmap_bits_offset += 1 + print(letter, end='', file=out) + print(end='\n', file=out) + else: + print('#' * width, file=out) print('-', file=out) diff --git a/metrics.py b/metrics.py index 0b9d60a..921af9d 100755 --- a/metrics.py +++ b/metrics.py @@ -4,12 +4,13 @@ ############################################################################### # # # Reads font files and outputs metrics json data # -# file based on the font metrics. # +# file based on the font metrics. Can include bitmaps bits. # # # ############################################################################### import argparse import json +import math import os.path import struct import sys @@ -62,6 +63,24 @@ def read_all(self): class FontReader: + def __init__(self, include_bitmaps): + if include_bitmaps: + print('Bitmaps inclusion enabled') + self.include_bitmaps = True + else: + print('Bitmaps inclusion disabled') + self.include_bitmaps = False + + def get_bits_no_padding(self, bytes_iter: bytes, original_length: int) -> list[int]: + bits: list[int] = [] + for byte in bytes_iter: + byte_bits: list[int] = [] + byte_str = format(byte, '08b') + for bit_str in byte_str: + byte_bits.append(int(bit_str)) + bits.extend(reversed(byte_bits)) + return bits[:original_length] + # The actual font reader. def read(self, fh): fh = FileReader(fh) @@ -80,10 +99,13 @@ def read(self, fh): size = None features = 0 - if version >= 2: - (hash_table_size, # B - codepoint_bytes # B - ) = struct.unpack('= 2: + (hash_table_size, # B + codepoint_bytes # B + ) = struct.unpack('= 3: (size, # B @@ -119,9 +141,10 @@ def read(self, fh): glyph_table_data = [] for offset_list in offset_table_data: + # This check can be commented out if a font file raises this exception if (offset_list['offset'] != - fh.bytes_read - first_offset_item_offset): - raise Exception('Offset item at incorrect offset') + fh.bytes_read - first_offset_item_offset): + raise Exception('Offset item at incorrect offset') for codepoint_index in range(offset_list['size']): (codepoint, # B or H, depending on codepoint_bytes offset # B or H, depending on features @@ -149,14 +172,23 @@ def read(self, fh): left, top, advance) = struct.unpack( - '