文字をスプライトに出力するdll

タイトル通り+いくつかの機能を持つdllを作成しました。

このdllは、別の大きなシステムの一部として使うことを想定していますので、単体では非常に扱いづらいと思います。使えないこともないですが。

機能説明

五つの機能を持ちます。

  1. 出力先のスプライトを指定する機能。
  2. そのスプライトのどのセルのどこから書き始めるかを指定する機能。
  3. 条件と文字を与えて、その場合どれだけの大きさになるかを取得する機能。
  4. 1で指定したスプライトに2で指定した位置から、3と同じ条件で文字を書き込む機能。
  5. 1で指定したスプライトを一色で塗りつぶす機能。
  6. 1で指定したスプライトをファイル名を指定してbmpとして保存する機能。

※注意。文字列ではなく一つの文字のみ扱います。

機能1:スプライト指定機能

例文

lsp 100,":a;>1280,480,#FFFFFF",0,0 ; 640*480の大きさのアルファブレンド型、全透明のスプライトを作成する。
exec_dll "font.dll/sp,100,0" ; そのスプライトの、0番目のセルを指定する。
getret %0 ; %0に指定したスプライト番号がそのまま入っている。

※注意点1:作成していないスプライト番号を指定した場合の動作は保証しない。
※注意点2:同様に、存在しないセル番号を指定した場合の動作も保証しない。

機能2:位置指定機能

例文

exec_dll "font.dll/pos,320,240" ; それぞれ、スプライト上のx座標とy座標。文字を書く時に、ここで指定した位置が左上になる。
getret %0 ; %0にx座標が入っている。この場合320
getret $0 ; $0にy座標を文字列化したものが入っている。この場合"240"

※注意点:この座標はスプライトを変更したり、文字を書き込んだりしても変化しない。連続して文字を表示し文章にしたい場合は、各出力毎にこの機能で位置を操作しなければならない。

機能3:フォント情報取得機能

例文

exec_dll "font.dll/info,MS Pゴシック,24,48,255,255,255,400,0,0,0,字" ; MS Pゴシックで、幅24ドット(半角時)、高さ48ドット、色は真っ白、線の太さは400(デフォルト)、斜体なし、打ち消し線なし、下線なしで、「字」と表示した場合どうなるか問い合わせている。
getret $0 ; ","で区切られた6つの数値が入っている。
split $0,",",%1,%2,%3,%4,%5,%6
; %1,%2 は、文字の余白も含めた領域の幅と高さが入っている。
; %3,%4 は、余白を除いた部分へのオフセットが入っている。
; %5,%6 は、余白を除いた領域の幅と高さが入っている。
; 文字を連続して文章にするのであれば、通常、次の文字は%1(+自分で設定した文字間スペース)だけ、書き始めx座標を増やすようにする。(右への横書きの場合)

機能4:フォント出力機能

例文(ほぼ機能3とかぶる)

; 事前に機能1と機能2を実行していること。
exec_dll "font.dll/write,MS Pゴシック,24,48,255,255,255,400,0,0,0,字" ; MS Pゴシックで、幅24ドット(半角時)、高さ48ドット、色は真っ白、線の太さは400(デフォルト)、斜体なし、打ち消し線なし、下線なしで、「字」と表示させる。
; 表示されるスプライトは機能1で指定。位置は機能2で指定。
getret $0 ; ","で区切られた6つの数値が入っている。
split $0,",",%1,%2,%3,%4,%5,%6
; %1,%2 は、文字の余白も含めた領域の幅と高さが入っている。
; %3,%4 は、余白を除いた部分へのオフセットが入っている。
; %5,%6 は、余白を除いた領域の幅と高さが入っている。
getret %0 ; 成功したかどうかが入っている。0は失敗、1は成功。そのまま表示した場合、文字がわずかでもスプライトからはみ出す場合、失敗する。
if %0=1 msp 100,0,0 ; スプライトの内容が変化したことをNScripter本体に告げる。nsluaなら、NSInvalidate()を使用するのがよい。
; この後、print ないし NSUpdate()で実際に画面に反映される。

例文は機能3とほぼ同じ。ただし、事前に機能1と機能2を実行しておく必要がある。
※注意点1:スプライトはアルファブレンドでもコピーでもどちらでも構わない。dllの方で判別して書き込み方を変える。
※注意点2:線の太さは0〜1000の数字だが、実際にやってみると、「通常」と「太い」程度の差しか出ない。
※注意点3:打ち消し線、下線は機能してないようだ。今後の課題。

機能5:クリアー機能

例文

exec_dll "font.dll/clear,255,255,255" ; 機能1で指定したスプライトのセルを、(あれば)マスク画像も含めて白で埋める。
; NScripterのマスク画像は、白が透明部分なので、白で埋めることで全部透明になる。

いちいちスプライトをつくり直すのではなく、こちらでクリアーさせるべき。

機能6:保存機能

例文

exec_dll "font.dll/outpout,filname.bmp" ; filename.bmpの名前で現在指定されたスプライトをbmp形式で保存する。

様々に加工したスプライトを保存するのに使えます。
スプライトいじりDLL機能追加 - 永字八法との相性もよいと思われます。

まとめ

これによって、テキストウィンドウをスプライトで代替させる素地ができたことになる。
とは言え、表示文のパース、表示途中での色・フォント・サイズ変更、ルビ、禁則処理等が必要になるが、そこはnsluaでの作業が現実的であるので、そちらに譲る。