diff options
author | Toomas Soome <tsoome@FreeBSD.org> | 2022-02-02 12:26:09 +0000 |
---|---|---|
committer | Toomas Soome <tsoome@FreeBSD.org> | 2022-02-02 12:26:09 +0000 |
commit | c0f397da86d3d6af94e900630eb1652ba0133e75 (patch) | |
tree | 9c7755a79124ee44ae890ea34cbea7769c1e744d /bin/bmpf.py | |
parent | cee3932f8c02a220d70e48949c7c5ca6e98dfef4 (diff) |
import terminus-font-4.49.1vendor/terminus/terminus-font-4.49.1vendor/terminus
Diffstat (limited to 'bin/bmpf.py')
-rw-r--r-- | bin/bmpf.py | 147 |
1 files changed, 0 insertions, 147 deletions
diff --git a/bin/bmpf.py b/bin/bmpf.py deleted file mode 100644 index 36ba446d3712..000000000000 --- a/bin/bmpf.py +++ /dev/null @@ -1,147 +0,0 @@ -# -# Copyright (c) 2018 Dimitar Toshkov Zhekov <dimitar.zhekov@gmail.com> -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of -# the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# - -import bdf - - -class Char: - def __init__(self, code, name, width, data): - self.code = code - self.name = name - self.width = width - self.data = data - - - @staticmethod - def from_bdf(char, fbbox): - delta_yoff = char.bbx.yoff - fbbox.yoff # ~DSB - - if delta_yoff < 0: - raise Exception('char %d: BBX yoff < FONTBOUNDINGBOX yoff' % char.code) - - if char.dwidth.x >= 0: - if char.bbx.xoff >= 0: - width = max(char.bbx.width + char.bbx.xoff, char.dwidth.x) - dst_xoff = char.bbx.xoff - else: - width = max(char.bbx.width, char.dwidth.x - char.bbx.xoff) - dst_xoff = 0 - else: - dst_xoff = max(char.bbx.xoff - char.dwidth.x, 0) - width = char.bbx.width + dst_xoff - - if width > bdf.WIDTH_MAX: - raise Exception('char %d: output width > %d' % (char.code, bdf.WIDTH_MAX)) - - height = fbbox.height - src_row_size = char.bbx.row_size() - dst_row_size = (width + 7) >> 3 - dst_ymax = height - delta_yoff - dst_ymin = dst_ymax - char.bbx.height - compat_row = dst_xoff == 0 and width >= char.bbx.width - - if compat_row and src_row_size == dst_row_size and dst_ymin == 0 and dst_ymax == height: - data = char.data - elif dst_ymin < 0: - raise Exception('char %d: start row %d' % (char.code, dst_ymin)) - elif compat_row: - src_byte_no = 0 - data = bytearray(dst_ymin * dst_row_size) - line_fill = bytes(dst_row_size - src_row_size) - - for dst_y in range(dst_ymin, dst_ymax): - data += char.data[src_byte_no : src_byte_no + src_row_size] + line_fill - src_byte_no += src_row_size - - data += bytes(delta_yoff * dst_row_size) - else: - data = bytearray(dst_row_size * height) - - for dst_y in range(dst_ymin, dst_ymax): - src_byte_no = (dst_y - dst_ymin) * src_row_size - dst_byte_no = dst_y * dst_row_size + (dst_xoff >> 3) - - src_bit_no = 7 - dst_bit_no = 7 - (dst_xoff & 7) - - for _ in range(0, char.bbx.width): - if char.data[src_byte_no] & (1 << src_bit_no): - data[dst_byte_no] |= (1 << dst_bit_no) - - if src_bit_no > 0: - src_bit_no -= 1 - else: - src_bit_no = 7 - src_byte_no += 1 - - if dst_bit_no > 0: - dst_bit_no -= 1 - else: - dst_bit_no = 7 - dst_byte_no += 1 - - return Char(char.code, char.props.get('STARTCHAR'), width, data) - - - def row_size(self): - return (self.width + 7) >> 3 - - - def write(self, output, max_width, yoffset): - output.write_line(b'STARTCHAR %s\nENCODING %d' % (self.name, self.code)) - output.write_line(b'SWIDTH %d 0\nDWIDTH %d 0' % (round(self.width * 1000 / max_width), self.width)) - output.write_line(b'BBX %d %d 0 %d' % (self.width, len(self.data) / self.row_size(), yoffset)) - output.write_line(b'BITMAP\n' + bdf.Char.bitmap(self.data, self.row_size()) + b'ENDCHAR') - - -class Font(bdf.Font): - def __init__(self): - bdf.Font.__init__(self) - self.min_width = bdf.WIDTH_MAX - self.avg_width = 0 - - - def _read(self, input): - bdf.Font._read(self, input) - self.chars = [Char.from_bdf(char, self.bbx) for char in self.chars] - self.bbx.xoff = 0 - total_width = 0 - - for char in self.chars: - self.min_width = min(self.min_width, char.width) - self.bbx.width = max(self.bbx.width, char.width) - total_width += char.width - - self.avg_width = round(total_width / len(self.chars)) - self.props.set('FONTBOUNDINGBOX', bytes(str(self.bbx), 'ascii')) - return self - - - @staticmethod - def read(input): - return Font()._read(input) # pylint: disable=protected-access - - - def get_proportional(self): - return int(self.bbx.width > self.min_width) - - - def write(self, output): - for [name, value] in self.props: - output.write_prop(name, value) - - for char in self.chars: - char.write(output, self.bbx.width, self.bbx.yoff) - - output.write_line(b'ENDFONT') |