Graphic OLED 100x16 pixels interface

Dependents:   mbed_nicovideo_search_api mbed_recent_nicovideo_display_pub

misaki2cpp

美咲フォントからC++コードの作成プログラム。

/media/uploads/va009039/misaki2cpp.py

misaki2cpp.py

#coding: UTF-8
# misaki2cpp.py 2014/8/5

def r90(bitmap): # 右に90度回転
    bitmap2 = [0x00] * 8
    mask2 = 0x01
    for bit in bitmap:
        mask = 0x80
        for n in range(8):
            if bit & (mask>>n):
                bitmap2[n] |= mask2
        mask2 <<= 1
    return bitmap2

def cpp_bitmap(encoding, bitmap):
    bitmap_r90 = r90(bitmap)
    s = "{0x%04x,{" % encoding
    for i in range(7):
        s += "0x%02x" % bitmap[i]
        if i <= 5:
            s += ","
    s += "}},"
    utf8_str = unichr(encoding).encode('utf-8')
    s += " // "
    for b in utf8_str:
        s += "\\x%02x" % ord(b)
    return s

def view_bitmap(bitmap):
    s = ""
    for bit in bitmap:
        s += "// "
        for x in range(8):
            if (bit<<x) & 0x80:
                s += u"■"
            else:
                s += u"□"
        s += "\n"
    return s

def get_bdf(f):
    bitmap_start = False
    chars_count = 0
    while 1:
        line = f.readline()
        if line == None:
            break
        if chars_count == 0: print "// " + line,
        s = line.split()
        if s[0] == "CHARS":
            chars = int(s[1])
        elif s[0] == "ENDFONT":
            assert chars == chars_count
            break
        elif s[0] == "ENCODING":
            encoding = int(s[1])
        elif s[0] == "BITMAP":
            bitmap_start = True
            bitmap = []
        elif s[0] == "ENDCHAR":
            chars_count += 1
            assert len(bitmap) == 8
            yield (encoding, bitmap)
            bitmap_start = False
        elif bitmap_start:
            bitmap.append(int(s[0], 16))
    return

def hexstr(str):
    s = "len=%d " % len(str)
    for c in str:
        s += "[%02x]" % ord(c)
    return s

if __name__ == "__main__":
    import argparse
    import tarfile

    parser = argparse.ArgumentParser()
    parser.add_argument('-f', dest='filename', nargs=1, default="misaki_bdf_2012-06-03.tar.gz")
    parser.add_argument('-e', dest='extract', nargs=1, default="misaki_gothic.bdf")
    parser.add_argument('-l', dest='list', action='store_true')
    args = parser.parse_args()

    fh = tarfile.open(args.filename, 'r')
    if args.list:
        fh.list()
    f = fh.extractfile(args.extract)

    bitmap_by_unicode = {}
    for (encoding,bitmap) in get_bdf(f):
        jis_str = "\x1b$B" + chr(encoding>>8) + chr(encoding & 255) + "\x1b(B"
        try:
            uni_str = unicode(jis_str, 'iso2022_jp')
        except UnicodeDecodeError: # 機種依存コード
            pass
        else:
            assert uni_str.encode('iso2022_jp') == jis_str
            utf8_str = uni_str.encode('utf-8')
            assert not ord(uni_str) in bitmap_by_unicode
            bitmap_by_unicode[ord(uni_str)] = bitmap

    unicode_lists = sorted(bitmap_by_unicode)

    print """\
#include "GraphicOLED.h"

struct stfont {
    uint16_t unicode;
    uint8_t bitmap[8];
};

static struct stfont misaki_gothic[] = {"""

    for k in unicode_lists:
        bitmap = bitmap_by_unicode[k]
        print cpp_bitmap(k, r90(bitmap))

    print """\
};"""