なでしこさんで東雲フォントをIchigoJam向けに変換
今週もあっという間に日曜日 (川柳)
深夜は前日大したことしてないはずなのにクソザコナメクジなのでぼーっとしたり寝倒したり。
午前中は意識は保ったが記事は書けず。
午後はクソ寝倒して爆死。
というわけで、今週も頭が致命的にクソ悪くてバカで無能でカスでクズでクソザコナメクジなので、数ヶ月前から書きたいアレが書けず。
雑プログラムもそろそろアドベントカレンダー向けに温存したい気がするが……やっぱり生成負荷の低さで選んじゃう。頭が悪いので。
にゃーん。
今回やったこと
なでしこで、東雲フォントの1文字のデータをIchigoJam用のキャラクターパターンデータに変換する。
とりあえず、今回は16×16のデータにのみ対応する。
※IchigoJamはjig.jpの登録商標です。
プログラム
東雲フォントをIchigoJam向けに変換 (プログラム貯蔵庫)
使い方
まず、東雲フォントのデータをテキストエディタなどで開く。
16×16、装飾なしのゴシック体は shnmk16.bdf、明朝体は shnmk16min.bdf である。
使いたい文字のJISの文字コード (Shift_JIS ではない) を調べ、それを検索する。
たとえば、なでしこの「な」の文字コードは「244a」である。
「STARTCHAR」に続いてその文字コードがある所に、該当の文字のフォントデータがある。
使いたい文字のデータを見つけたら、そのデータ本体の部分を今回のプログラムで用意した入力欄にコピペする。
「な」の場合、明朝体のデータは以下のものである。
0400
0240
0380
3e10
040c
0412
0820
0820
1020
1020
2020
03e0
0438
0424
03c0
0000データを入力欄に入力し、入力欄からフォーカスを外すと、変換が行われる。
このデータは、以下のように変換される。
これは、1行目から順に、左上・右上・左下・右下用のキャラクターパターンを表している。
(16×16のフォントを、8×8のキャラクターパターン4個で表している)
4,2,3,62,4,4,8,8,
0,64,128,16,12,18,32,32,
16,16,32,3,4,4,3,0,
32,32,32,224,56,36,192,0,改行を消すのは比較的容易にできること、および複数の文字をまとめて表示するなど利用方法の柔軟性を確保することを目的として、1キャラクター分ずつ分けて出力することにした。
たとえば、これを以下のように IchigoJam のプログラムに埋め込むことができる。
(もちろん、1回の POKE で全てのキャラクターパターンをメモリに書き込むようにしてもよい)
10 POKE #700,4,2,3,62,4,4,8,8
20 POKE #708,0,64,128,16,12,18,32,32
30 POKE #710,16,16,32,3,4,4,3,0
40 POKE #718,32,32,32,224,56,36,192,0
50 PRINT CHR$(#E0,#E1)
60 PRINT CHR$(#E2,#E3)このプログラムを IchigoJam に書き込んだあと、OK2 命令で「OK」表示をしないようにし、VIDEO7 で拡大表示に切り替えてから実行すると、以下のように表示された。
実装のポイント
説明の出力
●(AでBへ)リンク作成とは
定数のリンクは「A」のDOM部品作成。
その「href」にBをDOM属性設定。
「document」の「createTextNode」を[A]でJSメソッド実行。
リンクにそれをDOM子要素追加。
ここまで。
「16×16の」のラベル作成。
「東雲フォント」で「http://openlab.ring.gr.jp/efont/shinonome/」へリンク作成。
「の文字データを」のラベル作成。
改行作成。
「IchigoJam」で「https://ichigojam.net/」へリンク作成。
「用のキャラクターパターンに変換します。」のラベル作成。
改行作成。
「※IchigoJamはjig.jpの登録商標です。」のラベル作成。
2回、改行作成。リンクの部品を作成して画面に追加する「リンク作成」関数を定義し、これを用いて何をするかを画面に出力した。
入出力欄の生成
「フォントのデータを入力:」のラベル作成。
改行作成。
「(BITMAP の次の行から、ENDCHAR の前の行まで)」のラベル作成。
改行作成。
フォント入力欄は空のテキストエリア作成。
それの「rows」に「17」をDOM属性設定。
それの「cols」に「40」をDOM属性設定。
2回、改行作成。
「変換結果:」のラベル作成。
改行作成。
変換結果欄は空のテキストエリア作成。
それの「rows」に「5」をDOM属性設定。
それの「cols」に「40」をDOM属性設定。
それの「readonly」に「true」をDOM属性設定。
改行作成。
コピーボタンは「コピー」のボタン作成。
コピーインジケータは空のラベル作成。フォントのデータを貼り付ける入力欄
変換結果を表示する出力欄
変換結果をコピーするボタン
それらの説明ラベル
を画面に配置する。
変換処理
フォント入力欄の変更された時には
定数のフォント文字列はフォント入力欄のテキスト取得して改行で区切る。
定数のフォントデータは空配列。
位置で0から15まで繰り返す。
定数の要素値は「0x{フォント文字列@位置}」を整数変換。
もし、それを非数判定ならば
フォントデータに0を配列追加。
違えば
フォントデータに要素値を配列追加。
ここまで。
ここまで。
定数の変換結果は空配列。
要素オフセットで[0,8]を反復
ビットオフセットで[8,0]を反復
定数の文字データは空配列。
行オフセットで0から7まで繰り返す
定数の今要素はフォントデータ@(要素オフセット+行オフセット)。
文字データにAND(SHIFT_R(今要素,ビットオフセット),0xff)を配列追加。
ここまで。
文字データを「,」で配列結合して変換結果に配列追加。
ここまで。
ここまで。
変換結果に空を配列追加。
変換結果を「,{改行}」で配列結合して変換結果欄にテキスト設定。
ここまで。まず、入力されたフォントデータを数値の配列に変換する。
今回は、16×16の文字を表すデータが入力されると仮定し、サイズを決め打ちしている。
入力が16進数であることを指定して文字列を整数に変換する命令は無さそうなので、「0x」をつけて「整数変換」を使うことで実現した。
次に、このフォントデータを並べかえ、IchigoJam 用のキャラクターパターンデータにする。
「反復」と「繰り返す」を用いてデータを取得した。
最後に、変換結果を出力欄に設定する。
最後の要素のあとにも区切り文字と改行をつけるため、空文字列を追加してから結合した。
変換結果のコピー処理
変数のコピーインジケータタイマーIDは未定義。
コピーボタンのクリックされた時には
コピーインジケータタイマーIDの変数型確認。
もし、それが「undefined」と等しく無いならば
コピーインジケータタイマーIDのタイマー停止。
ここまで。
変換結果欄のテキスト取得してクリップボード設定。
コピーインジケータに「コピーしました。」をテキスト設定。
1秒後には
コピーインジケータに空をテキスト設定。
コピーインジケータタイマーIDは未定義。
ここまで。
コピーインジケータタイマーIDはそれ。
ここまで。コピーボタンが押された際、以下を行う。
まだコピーインジケータが表示されている場合、それを消す処理をキャンセルする
出力欄の内容をクリップボードにコピーする
「コピーしました。」というメッセージ (コピーインジケータ) を表示する
コピーインジケータを消す処理を予約する
NG集
関数の引数に配列
定数の今要素はフォントデータ@(要素オフセット+行オフセット)。
文字データにAND(SHIFT_R(今要素,ビットオフセット),0xff)を配列追加。のかわりに
文字データにAND(SHIFT_R(フォントデータ@(要素オフセット+行オフセット),ビットオフセット),0xff)を配列追加。としたところ、
関数『SHIFT_R』で引数1個が指定されましたが、2個の引数を指定してください。
というエラーになった。
二次元配列を使う際に添字をカンマ区切りで指定する仕様になっているため、関数の引数の区切りのつもりで書いたコンマが添字の区切りとして認識されたと考えられる。
条件分岐に連文
コピーインジケータタイマーIDの変数型確認。
もし、それが「undefined」と等しく無いならばのかわりに
もし、コピーインジケータタイマーIDの変数型確認して「undefined」と等しく無いならばとしたところ、
未解決の単語があります: [関数『変数型確認』して] 次の命令の可能性があります: - Aの変数型確認 - AがBと等無
というエラーになった。
おわりに
なでしこさんで、16×16の東雲フォントの文字データを IchigoJam 向けに変換する最低限の処理ができた。
本当は、美咲フォントピッカーみたいに文字列を入力して東雲フォントで表示した画像に変換でき、フォントも選択できるやつを作りたい。
しかし、頭が悪いので作れるか (特に、作るための時間が取れるか) がわからない。
だが、今回のプログラムがあれば、今年のアドベントカレンダーで東雲フォントを使うのが手動などで変換するのと比べてかなり楽になるだろう。


コメント