汎用プラグイン

comfont.aux2

概要

PSDToolKit利用者向けの合成フォントもどきプラグイン

詳細説明

comfont

comfontは、AviUtl2のテキストを文字種ごとに異なるフォントで表示するためのプラグインです。
漢字、かな、カナ、記号、欧文、数字、その他の7種類に対して、フォント、サイズ、ベースライン、
字送り、垂直比率、水平比率を設定できます。

同じ文字種に複数のフォントを登録すると、各文字のグリフを収録している最初のフォントを使用します。
例えば漢字の1行目にStd、2行目にPr6を指定すると、Stdにない文字だけをPr6で補えます。

インストールしただけでは表示は変わりません。defaultを編集するか新しいプロファイルを作り、
使用するテキスト側でそのプロファイル名を指定してください。

動作環境

  • AviUtl2 v2.1.1以降(v2.1.2で動作確認)
  • PSDToolKit2(合成フォント字幕または合成フォント名前表示を使う場合のみ)

インストール

  1. 配布されている*.au2pkg.zipを、解凍せずAviUtl2のプレビュー画面へドラッグ&ドロップします。
  2. 表示された内容を確認してインストールします。
  3. AviUtl2を再起動します。
  4. 設定プラグイン設定合成フォント…を開けることを確認します。

パッケージでインストールされる主な機能ファイルは次のとおりです。

  • Plugin/comfont.aux2 — プロファイルエディターと合成フォント処理
  • Alias/合成フォントテキスト.object — 通常のテキスト用
  • Alias/合成フォント字幕.object — PSDToolKit2の字幕用
  • Alias/合成フォント名前表示.object — PSDToolKit2で現在話しているキャラクター名の表示用

アンインストールは、AviUtl2のその他パッケージ情報から行えます。

最初のプロファイルを作る

  1. 設定プラグイン設定合成フォント…を開きます。
  2. 新規…を押し、上部の名前をsubtitleなど分かりやすい名前へ変更します。
  3. 一覧から文字種を選び、フォントと補正値を入力して適用を押します。
  4. 必要な文字種を設定したら保存を押します。
  5. 後述する合成フォントテキストまたは合成フォント字幕で、保存したプロファイル名を指定します。

組み込みのdefaultプロファイルをそのまま編集しても構いません。初期状態のdefaultはすべて
補正なしで、現在の表示を変更しません。defaultは名前の変更と削除ができません。

プロファイルエディター

設定項目

項目 内容
フォント 選択した文字種へ使用するフォント
単位 サイズ、ベースライン、字送りを%またはpxで指定
サイズ %では100が等倍、pxでは絶対サイズ
ベース 0が補正なし。正の値で文字を上へ移動
字送り 0が補正なし。正の値で文字間を広げる
垂直 (%) 100が等倍
水平 (%) 100が等倍

垂直比率と水平比率は、単位の選択にかかわらず常に%です。サイズ、垂直比率、水平比率には
0より大きい値を指定してください。%pxを切り替えても入力値は自動換算されません。

フォントが(変更なし)の行は候補から除外され、その行の補正値も適用されません。

CtrlまたはShiftを押しながら行を選ぶと、複数行をまとめて編集できます。最後に選択した行の
値が編集欄へ表示され、適用すると選択中のすべての行へ同じ設定が入ります。

フォントの優先順位

  • + — 選択行と同じ文字種へ候補行を追加
  • — 選択中の追加行を削除
  • / — 同じ文字種内で優先順位を変更

候補は上から順に確認され、対象文字を収録している最初のフォントと、その行に設定した補正値が
使われます。各文字種の先頭行は削除できません。

プレビュー

文字種別では文字種ごとのまとまりを、混在比較では異なる文字種が隣接した状態を確認できます。
ベースラインガイドと字形境界ガイドは、それぞれのアイコンで表示を切り替えられます。ガイドの状態は
編集用で、プロファイルには保存されません。

プレビューは各文字種の先頭行を比較するためのものです。+で追加した候補行への自動切り替えは、
実際の合成フォントテキストまたは合成フォント字幕で確認してください。

特殊文字…では、共有記号の固定分類を確認できます。主な分類はがカナ、が記号、
漢字です。

保存と反映

  • 適用 — 編集内容を画面とプレビューへ反映します。ファイルには保存しません。
  • 保存 — プロファイルを保存し、追加フォントも確認します。画面は開いたままです。
  • OK — プロファイルを保存して画面を閉じます。追加フォントの確認は行いません。
  • キャンセル — 最後に保存した後の変更を破棄して画面を閉じます。

プロファイルはAviUtl2のアプリケーションデータにある
compositefont/profiles.jsonへ保存されます。設定ファイルは約1秒間隔で確認され、変更後の描画から
反映されます。プロファイルの変更だけならAviUtl2を再起動する必要はありません。

プロファイル名は文字種ごとの設定を呼び出すための名前です。AviUtl2標準テキストのフォント一覧には
表示されません。

通常のテキストへ使う

PSDToolKit2を使わないテキストには、同梱の合成フォントテキストを使用します。

  1. オブジェクト追加メニューから合成フォントテキストを追加します。
  2. テキスト欄の先頭にあるsettingsを編集します。
local settings = {
    profile = "subtitle",
    text = [=[国LINE123国]=],
}
  • profileにはエディターで保存したプロファイル名を指定します。
  • textには表示する本文を入力します。通常の引用符や改行はそのまま使用できます。
  • 本文に]=]を含める場合は、区切りを[==[]==]へ変更します。

文字サイズ、字間、行間、文字色、装飾、揃えは、通常のテキストオブジェクトと同じ項目で設定します。

PSDToolKit2の字幕へ使う

合成フォント字幕は、PSDToolKit2のセリフ準備@PSDToolKitから取得した字幕へプロファイルを
適用します。

  1. 最初に置くやつ@PSDToolKitを上のレイヤーへ配置します。
  2. セリフ準備@PSDToolKitを配置し、キャラクターIDとテキストを設定します。
  3. その下のレイヤーへ合成フォント字幕を追加します。
  4. 合成フォント字幕のテキスト欄にあるsettingsを編集します。
local settings = {
    id = "ずんだもん",
    profile = "subtitle",
}
  • idにはセリフ準備のキャラクターID、または"L3"のようなレイヤー指定を設定します。
  • profileにはエディターで保存したプロファイル名を指定します。

文字サイズ、字間、行間、文字色、装飾、揃えは合成フォント字幕側のテキスト設定を使用します。
表示速度を設定している場合は、セリフ準備@PSDToolKitの文字列が更新されるたびに、文字送りが
先頭から再開されます。

PSDToolKit2のキャラクター名を表示する

合成フォント名前表示は、現在のフレームで有効なセリフ準備@PSDToolKitのうち、開始時刻が
最も新しいキャラクターのIDを表示します。

  1. 合成フォント字幕と同様に、最初に置くやつ@PSDToolKitセリフ準備@PSDToolKitを配置します。
  2. 表示したいレイヤーへ合成フォント名前表示を追加します。
  3. テキスト欄のsettings.profileへ使用するプロファイル名を設定します。

同じ開始時刻のセリフが複数ある場合は、キャラクターIDの辞書順で最後のものを表示します。
文字サイズ、字間、行間、文字色、装飾、揃えは合成フォント名前表示側のテキスト設定を使用します。

追加フォント

システムへインストールしていないフォントも利用できます。

  1. AviUtl2のアプリケーションデータにあるcompositefont/fontsへフォントファイルを置きます。
  2. 合成フォントエディターで保存を押します。
  3. 新しいフォントが配置された旨のメッセージを確認し、AviUtl2を再起動します。

compositefont/fontsがない場合は作成してください。エディターで一度保存を押すことでも作成されます。

対応形式はTTF、OTF、TTC、OTCです。サブフォルダー内も読み取ります。通常インストールでは
C:\ProgramData\aviutl2\compositefont\fonts、ポータブル構成ではAviUtl2本体横の
data\compositefont\fontsが目安です。

保存を押すと、新しいファイルだけをAviUtl2のFont/compositefontへコピーします。同名ファイルは
上書きしません。別のサブフォルダーへ同名ファイルを複数置かないでください。フォントの利用条件は
各フォントのライセンスに従ってください。

文字種

文字種 主な対象
漢字 CJK漢字、部首、画、など
かな ひらがな、結合濁点・半濁点
カナ 全角・半角カタカナ、、半角濁点・半濁点
記号 句読点、記号、絵文字、など
欧文 半角ASCIIの英字
数字 半角・全角を含むUnicodeの数値文字
その他 空白、全角英字、アクセント付き欧文、その他の言語など

現在の制限

  • decoratedecorate_layoutは、本文中にある次のAviUtl2基本書式タグを解析し、タグの表記を
    維持したまま可視文字だけへ合成フォントを適用します。

    • <#[文字色][,影・縁色]>、リセットの<#>
    • <s[サイズ][,フォント][,BIS][,縁取りサイズ]>、リセットの<s>
    • <@[フォント][,0~6/BIS]>、リセットの<@>
    • 太字・斜体・取り消し線を追加または解除する<@+BIS><@-BIS>

    Bは太字、Iは斜体、Sは取り消し線です。複数指定する場合はBIのように続けて記述します。
    色は6桁RGBか、標準プリセット名のwhiteredyellowgreenaquablue
    magentablackに対応します。SDKから名前を取得できないカスタム色プリセットは未対応です。

  • 書式の優先順位は、常に「本文中の入力タグ、comfontプロファイル、テキストオブジェクトの既定値」
    の順です。優先順位は属性ごとに判定し、複数属性を持つタグでも、実際に指定されたフィールドだけが
    プロファイルより優先されます。入力タグのリセット後は、該当属性へのプロファイル適用を再開します。

  • 上記以外のタグ、未知のタグ、引数や構文が不正なタグが本文に1つでもある場合は、安全のため本文全体を
    加工せず返します。表示速度、待機、表示クリア、座標移動、ルビ、Lua制御スクリプト、コメントなどは
    対応していません。閉じていない半角の<も同様です。全角のは通常の文字として使えます。

  • Luaが実行時に生成した動的文字列は、自動では合成フォント化されません。動的文字列へ適用する場合は、
    生成後の最終文字列をLua側から明示的にdecorateまたはdecorate_layoutへ渡してください。

  • decorateまたはdecorate_layoutへ存在しないプロファイル名、不正な補正値、制御文字と衝突する
    フォント名を渡した場合は、表示を壊さないよう元の本文を返します。decorate_layoutの補正量は0
    なります。

  • プロファイル名はAviUtl2標準のフォント一覧には表示されません。settings.profileで指定してください。

  • 新しく追加した実フォントの反映にはAviUtl2の再起動が必要です。

  • 混在フォントの上端見切れ補正は、行頭がDirectWriteで等幅と判定されるフォントかつ2文字以上の行に
    適用します。比例フォントはカーニングや合字を壊さないよう、通常の文字種別変換だけを行います。

制御スクリプトから使う

同梱エイリアスを使わず、標準テキストオブジェクトから直接呼び出すこともできます。テキスト欄へ
次のLua制御文字を記述します。obj.mes()はテキストオブジェクト内で使用してください。

<?
local compositefont = obj.module("compositefont")
local font, size, _, _, _, _, _, spacing = obj.getfont()
local text = compositefont.decorate_layout(
    "任意のテキスト ABC123", "subtitle", size, spacing, font
)
obj.mes(text)
?>

decorate_layout(text, profile?, base_font_size?, base_char_spacing?, base_font_family?)

文字種ごとの設定をAviUtl2制御文字へ変換した文字列を返す推奨APIです。等幅の先頭フォントと
後続フォントで文字の高さが異なる場合は、行頭1文字のサイズと縦横比を一時的に補正して上側の描画領域を確保します。
行全体を<p>で囲まず、字送りも次の1文字で相殺するため、本文の配置と横幅は変わりません。
対応済みの基本書式タグを含む場合も、入力タグの書式を優先し、可視文字だけを変換します。
互換性のため第2戻り値も残していますが、常に0であり座標補正は不要です。同梱の
「合成フォントテキスト」と「合成フォント字幕」はこのAPIを使用します。

decorate(text, profile?, base_font_size?, base_char_spacing?)

文字種ごとの設定をAviUtl2制御文字へ変換した文字列を返します。profileを省略するとdefault
使用します。サイズと字間を渡すと、ベースラインと字送りを現在のテキスト設定に合わせて計算します。
対応済みの基本書式タグを含む場合も、入力タグの書式を優先し、可視文字だけを変換します。
既存スクリプトとの互換用で、混在フォントの上端見切れ補正は行いません。

resolve(character, profile?, base_font_size?)

1個のUnicodeスカラー値に適用する設定を8個の値で返します。

local font, size_ratio, baseline, tracking,
      vertical, horizontal, category, rule_id =
    compositefont.resolve("漢", "subtitle", 64)

戻り値は、フォント名、サイズ倍率、ベースライン量、字送り量、垂直倍率、水平倍率、文字種名、
使用したルールIDの順です。ベースライン量と字送り量は基準サイズを1とする比率、垂直・水平は
倍率です。空文字、複数のUnicodeスカラー値、存在しないプロファイルはエラーになります。

その他の関数

  • resolve_codepoint(codepoint, profile?, base_font_size?) — Unicodeコードポイントでresolveと同じ結果を取得
  • api_version() — 現在のスクリプトモジュールAPIバージョン10を取得

px単位の行をresolveする場合はbase_font_sizeを渡してください。省略すると、フォントと垂直・
水平比率だけが適用対象になります。

将来設計

ネイティブ文字run適用とSDK対応後の移行は未実装のロードマップです。現行構成についての説明も
含みますが、将来部分の詳細はSDK側の仕様が確定したときに調整します。

ネイティブ文字run適用

現在のAviUtl2 SDKには、テキストのレイアウト直前に文字runを差し替える公開コールバックが
ありません。そのため、現行版はcompositefont.decorateでAviUtl2制御文字を生成します。

将来、SDKに次のような境界が追加された場合は、プロファイル形式や文字分類を変えず、適用部分だけを
ネイティブバックエンドへ交換します。次のシグネチャは必要な情報を示す概念例であり、確定APIでは
ありません。

resolve_text_runs(text, base_format) -> [
  { range, font_family, size_ratio, baseline, tracking, vertical, horizontal }
]
profiles.json + text + FontManagerのグリフ情報
                    |
                    v
             resolve_text_runs
                    |
             ResolvedTextRun[]
                    |
          +---------+----------+
          |                    |
          v                    v
 ControlTagBackend       NativeSdkBackend
 (現在のdecorate)       (将来実装)

共通文字run

バックエンドから独立したResolvedTextRunと文字run解決処理は、将来の交換に備えて現行コードにも
実装されています。各runは次の情報を持ちます。

  • 元テキスト上のUTF-8バイト範囲
  • DirectWriteやWindows API用のUTF-16コード単位範囲
  • フォント、サイズ、ベースライン、字送り、垂直比率、水平比率をまとめた補正値
  • 補正を持たず元の文字を維持する改行run

文字分類、フォールバック、グリフの有無の判定はこの共通層で行い、隣接する同じ補正値は1つのrunへ
まとめます。現在実装されている適用先は、runを<@><s><gw><tw><th><p>
変換するControlTagBackendだけです。NativeSdkBackendは未実装です。

SDK対応後の移行

SDKに文字run解決コールバックが追加された場合は、次の順序で対応します。

  1. SDKが使うrangeの単位を確認し、UTF-8またはUTF-16範囲へ対応させる。
  2. NativeSdkBackendを追加し、共通の補正値をSDKの構造体へ変換する。
  3. プロファイル選択とコールバック登録だけをAviUtl2との連携層へ追加する。
  4. ネイティブ経路では制御文字を生成せず、元テキストとrun配列をホストへ渡す。
  5. decorateは既存プロジェクトとPSDToolKit2向けの互換APIとして残す。

文字分類、フォールバック順、profiles.json、エディターの保存形式は維持し、SDK固有の型は共通層へ
持ち込みません。これにより、AviUtl2側のDirectWriteレイアウト、キャッシュ、縦書き、装飾を保った
まま合成フォントを適用できる構成を目指します。

既存制御文字との共存

現行版は対応済みの基本書式タグと可視文字をトークン化し、入力タグの書式状態と合成フォントの補正を
属性ごとに合成します。入力タグは元の表記を維持し、合成フォントがrunごとに補正タグをリセットしても、
入力側の有効な書式と効果範囲が変わらないよう必要な状態を復元します。対応外、未知、不正なタグが1つでも
ある場合は、部分的な変換を行わず本文全体をそのまま返します。

未確定事項

  • 標準テキストオブジェクトと合成フォントプロファイルを関連付けるSDK上の方法
  • コールバックのrange単位、寿命、呼び出しスレッドなどの契約
  • run解決結果のキャッシュ。必要性を計測してから導入し、導入する場合はプロファイル設定の更新状態、
    本文、基準フォントサイズ、基準字間をキーの候補とする

開発

cargo fmt --all -- --check
cargo test --workspace --all-targets --locked
cargo clippy --workspace --all-targets --locked -- -D warnings
au2 release

au2 releaseの成果物はrelease/へ生成されます。