フォントイメージを定義したhankaku.txtからfont.sを生成するプログラムを作成した。
hankaku.txt OSASKの半角フォントを定義したファイルで、以下のような形式となっている。
char 0x61 ........ ........ ........ ........ ........ .***.... ....*... .....*.. ..****.. .*...*.. *....*.. *....*.. *...**.. .***.**. ........ ........
font.s では、フォントの最初の文字(文字コード0x00)のアドレスをhankaku_fontとしてtinyos.cから参照できるようにする。
半角フォント1文字は16バイトからなり、256文字分定義する。
font.s
.file "font.s" .global hankaku_font .data hankaku_font: // char 0x00 .byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 // char 0x01 .byte 0x00,0x00,0x38,0x44,0x82,0xaa,0xaa,0x82,0x82,0xaa,0x92,0x44,0x38,0x00,0x00,0x00 ..snip..font.sを生成するプログラムはOCamlで作成した。
makefont.ml
open Core.Std let file_name = "hankaku.txt" let is_skip_line line = let line' = String.strip line in line' = "" || String.get line 0 = '#' let is_char_line line = try String.slice line 0 4 = "char" with _ -> false let pattern_to_int p = String.fold p ~init:0 ~f:(fun acc c -> (acc lsl 1) + (if c = '*' then 1 else 0)) type parse_state = Init | Read_header | Read_data let () = let lines = In_channel.read_lines file_name in let state = ref Init in List.iter lines ~f:(fun line -> if not (is_skip_line line) then if is_char_line line then begin if !state = Read_data then print_newline (); state := Read_header; print_endline ("\t// " ^ line); print_string "\t.byte " end else begin if !state = Read_data then print_string ","; state := Read_data; let img = pattern_to_int line in print_string ("0x" ^ (Printf.sprintf "%02x" img)); end ); print_newline ()OMakeでfont.sを作成できるようにした。
$ omake font.s
ソースコードはgithubにコミットした。
https://github.com/takeisa/tinyos/tree/master/makefont
OCamlは、このような用途のプログラムも簡単に作成できる。
OCamlでの開発では、Emacs + Tuareg + merlin を使っているが、 コード補完が効くし、REPLとしてutopが利用できるのでとても便利。
OCamlを使ってみたい人は、ここを参考に環境構築すれば良いですよ。
0 件のコメント:
コメントを投稿