blob: 141e8c1ad50111f5deed57bc3c642b85285f1fba [file] [log] [blame]
# Lint as: python2, python3
# Copyright 2016 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""ASCII font table for LCM display."""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import copy
from six.moves import range
FONT_WIDTH = 8
FONT_HEIGHT = 16
FONT_PAGES = FONT_HEIGHT / 8
# Customized symbols (overwrite extended ASCII codes)
CURSOR = '\x80\x81'
SMILE = '\x82\x83'
ARROW_UP = '\x84'
ARROW_DOWN = '\x85'
ARROW_LEFT = '\x86'
ARROW_RIGHT = '\x87'
FONT_BITMAP = {
# Standard ASCII characters
'\x20': [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # Space
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
'\x21': [0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, # !
0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00],
'\x22': [0x00, 0x00, 0xf0, 0x30, 0x00, 0xf0, 0x30, 0x00, # "
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
'\x23': [0x00, 0x40, 0xe0, 0x58, 0x40, 0xe0, 0x58, 0x00, # #
0x00, 0x1a, 0x07, 0x02, 0x1a, 0x07, 0x02, 0x00],
'\x24': [0x00, 0x00, 0x60, 0x90, 0x98, 0x30, 0x00, 0x00, # $
0x00, 0x00, 0x06, 0x04, 0x1c, 0x03, 0x00, 0x00],
'\x25': [0x00, 0x20, 0x50, 0x20, 0x80, 0x80, 0x00, 0x00, # %
0x00, 0x01, 0x01, 0x05, 0x0a, 0x04, 0x00, 0x00],
'\x26': [0x00, 0x00, 0x00, 0xc0, 0x20, 0x20, 0x20, 0x00, # &
0x00, 0x00, 0x06, 0x09, 0x0b, 0x0c, 0x0a, 0x00],
'\x27': [0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, # '
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
'\x28': [0x00, 0x00, 0x00, 0x00, 0xc0, 0x30, 0x00, 0x00, # (
0x00, 0x00, 0x00, 0x00, 0x0f, 0x30, 0x00, 0x00],
'\x29': [0x00, 0x00, 0x30, 0xc0, 0x00, 0x00, 0x00, 0x00, # )
0x00, 0x00, 0x30, 0x0f, 0x00, 0x00, 0x00, 0x00],
'\x2a': [0x00, 0x00, 0x20, 0xa0, 0x70, 0xa0, 0x20, 0x00, # *
0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00],
'\x2b': [0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, # +
0x00, 0x01, 0x01, 0x01, 0x0f, 0x01, 0x01, 0x01],
'\x2c': [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # ,
0x00, 0x00, 0x30, 0x1c, 0x04, 0x00, 0x00, 0x00],
'\x2d': [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # -
0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00],
'\x2e': [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # .
0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00],
'\x2f': [0x00, 0x00, 0x00, 0x80, 0x60, 0x18, 0x00, 0x00, # /
0x00, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00],
'\x30': [0x00, 0xe0, 0x10, 0x10, 0x10, 0x10, 0xe0, 0x00, # 0
0x00, 0x07, 0x08, 0x08, 0x08, 0x08, 0x07, 0x00],
'\x31': [0x00, 0x00, 0x20, 0x20, 0xf0, 0x00, 0x00, 0x00, # 1
0x00, 0x00, 0x08, 0x08, 0x0f, 0x08, 0x08, 0x00],
'\x32': [0x00, 0x20, 0x10, 0x10, 0x90, 0x60, 0x00, 0x00, # 2
0x00, 0x0c, 0x0a, 0x09, 0x08, 0x0c, 0x00, 0x00],
'\x33': [0x00, 0x20, 0x10, 0x90, 0x90, 0x60, 0x00, 0x00, # 3
0x00, 0x04, 0x08, 0x08, 0x08, 0x07, 0x00, 0x00],
'\x34': [0x00, 0x00, 0xc0, 0x20, 0x10, 0xf0, 0x00, 0x00, # 4
0x00, 0x01, 0x01, 0x01, 0x09, 0x0f, 0x09, 0x00],
'\x35': [0x00, 0x00, 0xf0, 0x90, 0x90, 0x90, 0x10, 0x00, # 5
0x00, 0x04, 0x08, 0x08, 0x08, 0x08, 0x07, 0x00],
'\x36': [0x00, 0x00, 0xc0, 0xa0, 0x90, 0x90, 0x10, 0x00, # 6
0x00, 0x00, 0x07, 0x08, 0x08, 0x08, 0x07, 0x00],
'\x37': [0x00, 0x30, 0x10, 0x10, 0x10, 0x90, 0x70, 0x00, # 7
0x00, 0x00, 0x00, 0x00, 0x0e, 0x01, 0x00, 0x00],
'\x38': [0x00, 0x60, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, # 8
0x00, 0x07, 0x08, 0x08, 0x08, 0x08, 0x07, 0x00],
'\x39': [0x00, 0xe0, 0x10, 0x10, 0x10, 0x10, 0xe0, 0x00, # 9
0x00, 0x08, 0x09, 0x09, 0x09, 0x05, 0x03, 0x00],
'\x3a': [0x00, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x00, # :
0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00],
'\x3b': [0x00, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x00, # ;
0x00, 0x00, 0x18, 0x0c, 0x04, 0x00, 0x00, 0x00],
'\x3c': [0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x20, 0x00, # <
0x00, 0x01, 0x01, 0x02, 0x04, 0x04, 0x08, 0x00],
'\x3d': [0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, # =
0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00],
'\x3e': [0x00, 0x20, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, # >
0x00, 0x08, 0x04, 0x04, 0x02, 0x01, 0x01, 0x00],
'\x3f': [0x00, 0x00, 0x20, 0x10, 0x10, 0x10, 0xe0, 0x00, # ?
0x00, 0x00, 0x00, 0x08, 0x0a, 0x01, 0x00, 0x00],
'\x40': [0x00, 0xf0, 0x08, 0x88, 0x48, 0xf0, 0x00, 0x00, # @
0x00, 0x0f, 0x10, 0x11, 0x12, 0x0b, 0x00, 0x00],
'\x41': [0x00, 0x00, 0x00, 0xd0, 0x30, 0xc0, 0x00, 0x00, # A
0x00, 0x08, 0x0c, 0x0b, 0x02, 0x0b, 0x0c, 0x08],
'\x42': [0x00, 0x10, 0xf0, 0x90, 0x90, 0x90, 0x60, 0x00, # B
0x00, 0x08, 0x0f, 0x08, 0x08, 0x08, 0x07, 0x00],
'\x43': [0x00, 0xc0, 0x20, 0x10, 0x10, 0x10, 0x30, 0x00, # C
0x00, 0x03, 0x04, 0x08, 0x08, 0x08, 0x04, 0x00],
'\x44': [0x00, 0x10, 0xf0, 0x10, 0x10, 0x20, 0xc0, 0x00, # D
0x00, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x03, 0x00],
'\x45': [0x00, 0x10, 0xf0, 0x90, 0xd0, 0x10, 0x30, 0x00, # E
0x00, 0x08, 0x0f, 0x08, 0x09, 0x08, 0x0c, 0x00],
'\x46': [0x00, 0x10, 0xf0, 0x90, 0xd0, 0x10, 0x30, 0x00, # F
0x00, 0x08, 0x0f, 0x08, 0x01, 0x00, 0x00, 0x00],
'\x47': [0x00, 0xc0, 0x20, 0x10, 0x10, 0x10, 0x30, 0x00, # G
0x00, 0x03, 0x04, 0x08, 0x08, 0x09, 0x07, 0x01],
'\x48': [0x00, 0x10, 0xf0, 0x90, 0x80, 0x90, 0xf0, 0x10, # H
0x00, 0x08, 0x0f, 0x08, 0x00, 0x08, 0x0f, 0x08],
'\x49': [0x00, 0x00, 0x10, 0x10, 0xf0, 0x10, 0x10, 0x00, # I
0x00, 0x00, 0x08, 0x08, 0x0f, 0x08, 0x08, 0x00],
'\x4a': [0x00, 0x00, 0x00, 0x10, 0x10, 0xf0, 0x10, 0x00, # J
0x00, 0x07, 0x08, 0x08, 0x08, 0x07, 0x00, 0x00],
'\x4b': [0x00, 0x10, 0xf0, 0x10, 0x80, 0x50, 0x30, 0x10, # K
0x00, 0x08, 0x0f, 0x09, 0x01, 0x02, 0x0c, 0x08],
'\x4c': [0x00, 0x10, 0xf0, 0x10, 0x00, 0x00, 0x00, 0x00, # L
0x00, 0x08, 0x0f, 0x08, 0x08, 0x08, 0x0e, 0x00],
'\x4d': [0x00, 0x10, 0xf0, 0x70, 0x80, 0x70, 0xf0, 0x10, # M
0x00, 0x08, 0x0f, 0x08, 0x01, 0x08, 0x0f, 0x08],
'\x4e': [0x10, 0xf0, 0x30, 0xc0, 0x00, 0x10, 0xf0, 0x10, # N
0x08, 0x0f, 0x08, 0x00, 0x03, 0x0c, 0x0f, 0x00],
'\x4f': [0x00, 0xc0, 0x20, 0x10, 0x10, 0x10, 0x20, 0xc0, # O
0x00, 0x03, 0x04, 0x08, 0x08, 0x08, 0x04, 0x03],
'\x50': [0x00, 0x10, 0xf0, 0x10, 0x10, 0x10, 0xe0, 0x00, # P
0x00, 0x08, 0x0f, 0x09, 0x01, 0x01, 0x00, 0x00],
'\x51': [0x00, 0xc0, 0x20, 0x10, 0x10, 0x10, 0x20, 0xc0, # Q
0x00, 0x03, 0x04, 0x18, 0x18, 0x18, 0x14, 0x13],
'\x52': [0x00, 0x10, 0xf0, 0x10, 0x10, 0x10, 0xe0, 0x00, # R
0x00, 0x08, 0x0f, 0x09, 0x01, 0x03, 0x04, 0x08],
'\x53': [0x00, 0x60, 0x90, 0x90, 0x90, 0xa0, 0x30, 0x00, # S
0x00, 0x0c, 0x04, 0x08, 0x08, 0x08, 0x07, 0x00],
'\x54': [0x00, 0x30, 0x10, 0x10, 0xf0, 0x10, 0x10, 0x30, # T
0x00, 0x00, 0x00, 0x08, 0x0f, 0x08, 0x00, 0x00],
'\x55': [0x00, 0x10, 0xf0, 0x10, 0x00, 0x10, 0xf0, 0x10, # U
0x00, 0x00, 0x07, 0x08, 0x08, 0x08, 0x07, 0x00],
'\x56': [0x10, 0x70, 0x90, 0x00, 0x00, 0x90, 0x70, 0x10, # V
0x00, 0x00, 0x03, 0x0c, 0x0c, 0x03, 0x00, 0x00],
'\x57': [0x00, 0x10, 0xf0, 0x10, 0x80, 0x10, 0xf0, 0x10, # W
0x00, 0x00, 0x07, 0x08, 0x07, 0x08, 0x07, 0x00],
'\x58': [0x00, 0x10, 0x30, 0x50, 0x80, 0x50, 0x30, 0x10, # X
0x00, 0x08, 0x0c, 0x0a, 0x01, 0x0a, 0x0c, 0x08],
'\x59': [0x00, 0x10, 0x30, 0xd0, 0x00, 0xd0, 0x30, 0x10, # Y
0x00, 0x00, 0x00, 0x08, 0x0f, 0x08, 0x00, 0x00],
'\x5a': [0x00, 0x00, 0x30, 0x10, 0x90, 0x50, 0x30, 0x00, # Z
0x00, 0x00, 0x0c, 0x0a, 0x09, 0x08, 0x0c, 0x00],
'\x5b': [0x00, 0x00, 0x00, 0xf0, 0x10, 0x10, 0x00, 0x00, # [
0x00, 0x00, 0x00, 0x3f, 0x20, 0x20, 0x00, 0x00],
'\x5c': [0x00, 0x18, 0x60, 0x80, 0x00, 0x00, 0x00, 0x00, # \
0x00, 0x00, 0x00, 0x03, 0x1c, 0x00, 0x00, 0x00],
'\x5d': [0x00, 0x10, 0x10, 0xf0, 0x00, 0x00, 0x00, 0x00, # ]
0x00, 0x20, 0x20, 0x3f, 0x00, 0x00, 0x00, 0x00],
'\x5e': [0x00, 0x40, 0x20, 0x18, 0x20, 0x40, 0x00, 0x00, # ^
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
'\x5f': [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # _
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80],
'\x60': [0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, # `
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
'\x61': [0x00, 0x80, 0x40, 0x40, 0x40, 0x40, 0x80, 0x00, # a
0x00, 0x06, 0x09, 0x09, 0x09, 0x05, 0x0f, 0x08],
'\x62': [0x10, 0xf0, 0x80, 0x40, 0x40, 0x40, 0x80, 0x00, # b
0x08, 0x0f, 0x04, 0x08, 0x08, 0x08, 0x07, 0x00],
'\x63': [0x00, 0x80, 0x40, 0x40, 0x40, 0x80, 0xc0, 0x00, # c
0x00, 0x07, 0x08, 0x08, 0x08, 0x08, 0x04, 0x00],
'\x64': [0x00, 0x80, 0x40, 0x40, 0x40, 0x90, 0xf0, 0x00, # d
0x00, 0x07, 0x08, 0x08, 0x08, 0x04, 0x0f, 0x08],
'\x65': [0x00, 0x80, 0x40, 0x40, 0x40, 0x40, 0x80, 0x00, # e
0x00, 0x07, 0x09, 0x09, 0x09, 0x09, 0x09, 0x00],
'\x66': [0x00, 0x40, 0x40, 0xe0, 0x50, 0x50, 0x50, 0x00, # f
0x00, 0x08, 0x08, 0x0f, 0x08, 0x08, 0x08, 0x00],
'\x67': [0x00, 0x80, 0x40, 0x40, 0x40, 0x80, 0xc0, 0x40, # g
0x00, 0x07, 0x28, 0x28, 0x28, 0x24, 0x1f, 0x00],
'\x68': [0x00, 0x10, 0xf0, 0x80, 0x40, 0x40, 0x80, 0x00, # h
0x00, 0x08, 0x0f, 0x08, 0x00, 0x08, 0x0f, 0x08],
'\x69': [0x00, 0x00, 0x40, 0x40, 0xd0, 0x00, 0x00, 0x00, # i
0x00, 0x00, 0x08, 0x08, 0x0f, 0x08, 0x08, 0x00],
'\x6a': [0x00, 0x00, 0x40, 0x40, 0x50, 0xc0, 0x00, 0x00, # j
0x00, 0x20, 0x20, 0x20, 0x20, 0x1f, 0x00, 0x00],
'\x6b': [0x00, 0x10, 0xf0, 0x00, 0x40, 0xc0, 0x40, 0x40, # k
0x00, 0x08, 0x0f, 0x01, 0x03, 0x0c, 0x08, 0x08],
'\x6c': [0x00, 0x00, 0x00, 0x10, 0xf0, 0x00, 0x00, 0x00, # l
0x00, 0x00, 0x08, 0x08, 0x0f, 0x08, 0x08, 0x00],
'\x6d': [0x40, 0xc0, 0x80, 0x40, 0x80, 0x80, 0x40, 0x80, # m
0x08, 0x0f, 0x08, 0x00, 0x0f, 0x08, 0x00, 0x0f],
'\x6e': [0x00, 0x40, 0xc0, 0x80, 0x40, 0x40, 0x80, 0x00, # n
0x00, 0x08, 0x0f, 0x08, 0x00, 0x08, 0x0f, 0x08],
'\x6f': [0x00, 0x80, 0x40, 0x40, 0x40, 0x40, 0x80, 0x00, # o
0x00, 0x07, 0x08, 0x08, 0x08, 0x08, 0x07, 0x00],
'\x70': [0x00, 0x40, 0xc0, 0x80, 0x40, 0x40, 0x80, 0x00, # p
0x00, 0x20, 0x3f, 0x28, 0x08, 0x08, 0x07, 0x00],
'\x71': [0x00, 0x80, 0x40, 0x40, 0x40, 0x80, 0xc0, 0x40, # q
0x00, 0x07, 0x08, 0x08, 0x08, 0x24, 0x3f, 0x20],
'\x72': [0x00, 0x40, 0xc0, 0x80, 0x40, 0x40, 0x40, 0x00, # r
0x00, 0x08, 0x0f, 0x08, 0x08, 0x08, 0x00, 0x00],
'\x73': [0x00, 0x80, 0x40, 0x40, 0x40, 0x40, 0xc0, 0x00, # s
0x00, 0x0c, 0x09, 0x09, 0x09, 0x09, 0x06, 0x00],
'\x74': [0x00, 0x40, 0xe0, 0x40, 0x40, 0x40, 0x00, 0x00, # t
0x00, 0x00, 0x07, 0x08, 0x08, 0x08, 0x04, 0x00],
'\x75': [0x00, 0x40, 0xc0, 0x00, 0x00, 0x40, 0xc0, 0x00, # u
0x00, 0x00, 0x07, 0x08, 0x08, 0x04, 0x0f, 0x08],
'\x76': [0x40, 0xc0, 0x40, 0x00, 0x00, 0x40, 0xc0, 0x40, # v
0x00, 0x00, 0x03, 0x0c, 0x0c, 0x03, 0x00, 0x00],
'\x77': [0x00, 0x40, 0xc0, 0x40, 0x00, 0x40, 0xc0, 0x40, # w
0x00, 0x00, 0x07, 0x08, 0x07, 0x08, 0x07, 0x00],
'\x78': [0x00, 0x40, 0xc0, 0x00, 0x00, 0xc0, 0x40, 0x00, # x
0x00, 0x08, 0x0c, 0x03, 0x03, 0x0c, 0x08, 0x00],
'\x79': [0x00, 0x40, 0xc0, 0x40, 0x00, 0x40, 0xc0, 0x40, # y
0x00, 0x00, 0x21, 0x26, 0x38, 0x06, 0x01, 0x00],
'\x7a': [0x00, 0x00, 0xc0, 0x40, 0x40, 0xc0, 0x40, 0x00, # z
0x00, 0x00, 0x0c, 0x0a, 0x09, 0x08, 0x0c, 0x00],
'\x7b': [0x00, 0x00, 0x00, 0xe0, 0x10, 0x00, 0x00, 0x00, # {
0x00, 0x00, 0x01, 0x0e, 0x10, 0x00, 0x00, 0x00],
'\x7c': [0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, # |
0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00],
'\x7d': [0x00, 0x00, 0x10, 0xe0, 0x00, 0x00, 0x00, 0x00, # }
0x00, 0x00, 0x10, 0x0e, 0x01, 0x00, 0x00, 0x00],
'\x7e': [0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, # ~
0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00],
'\x7f': [0xf8, 0x08, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, # DEL
0x1f, 0x10, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00],
# Customized symbols
CURSOR[0]: [0x00, 0x00, 0xfe, 0x7c, 0xfc, 0xf8, 0xf8, 0xf0,
0x00, 0x00, 0x7f, 0x20, 0x30, 0x10, 0x19, 0x0f],
CURSOR[1]: [0xf0, 0xe0, 0xe0, 0xc0, 0xc0, 0x80, 0x00, 0x00,
0x0f, 0x07, 0x07, 0x03, 0x03, 0x01, 0x00, 0x00],
SMILE[0]: [0x00, 0xc0, 0x30, 0x08, 0x04, 0xf4, 0x02, 0x02,
0x00, 0x03, 0x0c, 0x12, 0x24, 0x28, 0x48, 0x48],
SMILE[1]: [0x02, 0x02, 0xf4, 0x04, 0x08, 0x30, 0xc0, 0x00,
0x48, 0x48, 0x28, 0x24, 0x12, 0x0c, 0x03, 0x00],
ARROW_UP: [0x00, 0x00, 0xc0, 0xf0, 0xf0, 0xc0, 0x00, 0x00,
0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00],
ARROW_DOWN: [0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00,
0x00, 0x00, 0x03, 0x0f, 0x0f, 0x03, 0x00, 0x00],
ARROW_LEFT: [0x00, 0x00, 0x80, 0xc0, 0xc0, 0xe0, 0xf0, 0x00,
0x00, 0x00, 0x01, 0x03, 0x03, 0x07, 0x0f, 0x00],
ARROW_RIGHT: [0x00, 0xf0, 0xe0, 0xc0, 0xc0, 0x80, 0x00, 0x00,
0x00, 0x0f, 0x07, 0x03, 0x03, 0x01, 0x00, 0x00]
}
def GetFont(char):
"""Gets font bitmap for input character.
Args:
char: The character
Returns:
A list of bytes for font bitmap. Return all-zero if input char is not
supported in font table.
"""
try:
return FONT_BITMAP[char]
except KeyError:
return [0x00] * 16
def GetUnderlineFont(char):
"""Gets font bitmap with underline for input character.
Args:
char: The character
Returns:
A list of bytes for font bitmap.
"""
bitmap = copy.deepcopy(GetFont(char))
for byte in range(8, 16):
bitmap[byte] |= 0x40
return bitmap
def GetHighlightFont(char):
"""Gets font bitmap with highlight for input character.
Args:
char: The character
Returns:
A list of bytes for font bitmap.
"""
bitmap = copy.deepcopy(GetFont(char))
for byte in range(16):
bitmap[byte] ^= 0xff
return bitmap