XPS Glyphs解析

このエントリは時間がある時にゆっくり書き直す予定。

XPS GlyphsからのText抽出

とりあえず忘備録として。
XPSのGlyphsの仕様は若干複雑なんで、そのためGlyphsを解析して何かをしようとすると面倒に感じるものと思います。その最たる原因はIndices属性によるものです。IndicesはUnicodeStringで定義された文字列を文字毎にどのようにレンダリングしていくものかを定義したものとなっています。
文字毎の定義はセミコロン(;)で囲まれ、その中では基本的に4つの要素がカンマ(,)区切りで表現される。その4要素は先頭から順に、GlyphIndex、AdvanceWidth、uOffset、vOffsetとなっている。下の例だと文字Cに対してAdvanceWidth=80、uOffset=10、vOffset=-30が定義されているということ。
で、WPFとして展開するために適切な座標系変換を行う必要ある。
Pixel単位のフォントサイズは、フォントファミリーとフォントサイズ(FontRenderingEmSize属性, em)から得ることができる(eg. GetCharWidth32)。XPSのデフォルトDPIは96dpiということで、pt = pixel / 96 * 72ということでptベースの座標値が得られる。これを基にWPF座標世界に展開していけばよい。
AdvanceWidthは次の文字へのOffsetと考えても問題なし。これはフォントサイズ(FontRenderingEmSize)に対する割合として値が定義される。

  • Advance Width(XPS Specification 1.0より抜粋)

Advance width indicating placemnet for the subsequent glyph, relative to the origin of the current glyph.
Advance width is a real number with units specified in hundredths of an em.

<Canvas Width="816" Height="1056" xmlns="http://schemas.microsoft.com/xps/2005/06">
    <Glyphs 
           Fill="#ff000000" 
           FontUri="file:///D:/Windows/Fonts/Meiryo.ttc" 
           FontRenderingEmSize="40" 
           StyleSimulations="None" 
           OriginX="20" OriginY="60" 
           Indices=";;,80,10,-30;;" 
           UnicodeString="ABCDE" 
    />
</Canvas>

上をレンダリングした結果が下図。

XPSまわりの参考情報

今日のネタ

この記事に対してこのようなトラックバックがついていた。

たしかにブラウザは色々なことができるようになった。ブラウザだけを組み込んだパソコンが登場したら、それは「家電」といえるものになるのかもしれない。でも、パソコンは家電じゃない、いや家電であるべきではない、と思っている。パソコンって、もっと広がり(拡張性)のあるものだったし、これからもそうあってほしい。Microsoft は、世の中を WPF 一色に染めたいわけじゃない。WPF は、「ひとつの(強力な)選択肢」なのである。
.............
Gates氏もJob氏も、多くの作業がブラウザ経由で処理されるようになったため、コンピュータの役割は徐々に減ってゆくという考えに反対の意を示した。Jobs氏は「コンピュータの価値はこれまでも何度も見直されてきた」と述べ、その後、これはWindowsに限らず、PC全般に関することだと付け加えている。

家電という言葉が適切かどうかはおいといて、「パソコンは家電じゃない、いや家電であるべきではない」ということには賛成です。確かに現在ではほぼすべてのソフトウェアサービスがWEB上に展開され、かつそれらのサービスが新たなビジネスを生み出している、という事実は否めないし、これから先もこの流れは進んでいくと思う。しかし、この事実からOSに進化はないとかいう議論は話が異なると思う。ビジネスサービスという視点でなく、情報技術という視点でもっと様々な可能性を突き詰めるべきだと思うし、まだまだ突き詰められると思う。そしてその結果、人々の生活をより快適にし、かつビジネスを展開できるようなものを生み出していかなくてはならない。

Moonlightがそろそろお披露目されるようです。MoonlightのGoogle Groupではそこらへんの話題は出ていないのだけど。。。これで、SilverlightがWIN,MAC,LINUXの3大OS(?)で動作することになりますね。

Googleからのデスクトップ検索機能の是正要請が反映されるようですね。