2017年8月11日金曜日

VB GIMP Unicode 特殊文字で悩む 続報

何事もそうですが、 試して見て分かる事ってあります。
今回の GIMP 用の Private Font の PUA 表示ツール もそうです。
それにしても、
フォントも、WPF のバインディングも、... 、 難しい。


最初は簡単に考えていて、そのうち、泥沼に足を突っ込んでいた事に気付く ... 。
今の心境です。

夏の暑い時期に複雑なプログラムを弄り廻していて、ぐちゃぐちゃにしてしまう ... 。
そんな過去の経験から、 真夏はあまり複雑な事はしたくないのですが。
盛夏は、どうしても、思考能力が低下します ... 。
冷静になれれば良いのですが、 暑い 暑い ... 。


前回、 VB GIMP Unicode 特殊文字で悩む で、書いた様に、
最初のものは
  描画のタイミング と User Interface
  不足グリフ Fall Back
  フォントシステムの相違 Windows vs FreeType
この3点に問題があります。

とても、これらは 解消出来そうにない のですが、
更に、 幾つかの 解消すべき 点 もあります。
  ハードコーディングしていた指定ディレクトリの一般化!
  GIMP バージョンの更新への対応!
  グリフがそのフォントのものか否か?
  PUA にデータを持つフォントか否か?
です。

この辺りなら、何とか、対処出来そうです。


テスト用に決め打ちしていたディレクトリ名を汎用化して、
個人プロファイルから、該当しそうなものを列挙すれば良いのですね。
ここまで来てしまえば、 少し、書き加えて、
他の非公式な プライベート フォント ディレクトリ へもアクセスは容易です。
フォントが入っているフォルダを選択すれば良い訳ですから。
更に、
フォントから、 GlyphTypeFace を取得して、 ごにょ ごにょ すれば、
グリフの有無は調べられますから。

こんなコードですね。  ごにょ ごにょ 部分は省略。  CharacterToGlyphMap がデータを持ってますので、Loop して ... 。.
        Dim tf As Typeface = Me.SomeControl.FontFamily.GetTypefaces(0)
        Dim tg As New GlyphTypeface

        If tf.TryGetGlyphTypeface(tg) Then
           Dim tmap = tg.CharacterToGlyphMap
           'Routine
           'What You Need

        End If

よし、 Bind して Trigger で、また、 ごにょ ごにょ! だぁ。  ごにょ ごにょ ≒ 試行錯誤 or 七転八倒。.

と、字で書くのは簡単。

Class を書き直し、
xaml を弄り、     (結局、別の Project で 1から書き降ろし)、.
code behind (VB) と にらめっこ。
ふぅ、ふぅ、 と溜息の連続。
Error Message の山との格闘です。

動かない 動かない ... 。


でも、 ようやく、
山を越しました。  合計、 2 Solutions 3 Projects を経て。.




これで、 PUA を実際に表示させなくても、 有無は分かる様になりましたし、
どの文字 (グリフ) が、そのフォントに含まれているか、
言い換えれば、Fall Back の結果として表示されているもの を 区別可能 になりました。

  図右、オレンジ色で囲んだ部分が目に見える 訂正箇所 です。 
  最初のものと見た目は似ていますが、 Code は全くの別物 ... 。
  ColorText と表示した CheckBox の値に応じて、 グリフの有無で表示色が変わります。 (右図参照)
  Triggers (含む、Multi-trigger ) で実現しています。
  GIMP で お馴染み の 「Aa」 なら欧米語圏、「永」なら日本語、も、 Lang: として示しています。
  そして、 フォント選択後に、PUA のデータ有無 を、 右端の HasPUA で表示しています。
  GIMP 2.8 ベースですが、将来の Version Up に備えて .gimp- で始まるものから選択が可能ですし、
  GIMP 既定フォルダ以外のフォルダを指定する事も出来ます。
  どのフォルダを選んでいるか を StausBar に設けた TextBlock に明示させています。  図では個人名を修正。.
  この切り替えや指定は、 ContextMenu 及び MySetting で実装しました。 .
  

でも、
難解なのが、やはり、 この  Fall Back の件。
差し当たり、 色分けして、 区別はしているものの、
GIMP の FreeType が組み合わせる フォント群 と、
デフォルトで得られる Windows WPF のそれ  ( Windows の Font System ) とは、結果が異なるのです。
PUA に置かれた文字の選択が、このツールの目的ではありますが、
可能なら、この辺り (代替えフォントによって字形が異なるものがある点) も、双方で類似の結果が欲しい処ですから。

最初に作ったもの (Project) では、
経験的に、幾つかのフォントを対象に試験して、
複合フォントを設定して逃げていたのですが、
自信が ... ない。

どんなロジックにすれば良いものやら ... 。

数が少なければ、 虱潰しに試して行く方法も考えられますが、
未知の今後導入されるであろうフォントに対しては ... 上手く行くのか?。
自分の環境のみなら、いざ知らず、 別の環境や OS バージョンの更新で変わる可能性だって ... 。.

   恐らく、
   Windows の System Font Folder にある Globalxxx.CompositeFont 群 と、
   GIMP の font.d に収められている .conf ファイル群 とを、
   読み較べ、 
   GIMP と同じ参照順を設定した 複合フォント を WPF 上で 指定してやらなければ、
   双方で同期する事は出来ないのかな? とも思うのですが、
   代替えのグリフを正確に埋める為に、 この作業をするのは、 ... 、 しんどい!。  嫌になる!。.


詰まる処、 複合フォント指定 を 棚上げ した状態で、
取り敢えず、 Fix とします。

                ここは触りたくないなぁ ... 。


どうも、
素人には手に負えない部分を触ってしまった様です。

   軽いものを書く心算が、どうも、重くなる 傾向がありますね。  コマッタ モンダ。.


0 件のコメント:

コメントを投稿