フォント TrueType 構造解析のソースを表示
新しいページはコチラ
移動:
案内
,
検索
[[フォント]]に戻る。 == 概要 == 仕様書はAppleのホームページに掲載されています。この記事で頑張って読みこみたいと思います。 [https://developer.apple.com/fonts/TrueType-Reference-Manual/ https://developer.apple.com/fonts/TrueType-Reference-Manual/] プログラムを使ってフォント構造をなんらかの方法で処理して理解を助けるようなものを作りたいと思います。できればPDFでグリフ番号も取得しつつ、フォントが埋め込めるくらいまではいきたい。 まずは、FreeTypeが動かせる環境を構築します。そうすると、カラー絵文字処理用のlibpngもいるんだそうな。ということはその圧縮メカニズムを司るzlibもいるんだって。というわけで [[FreeTypeをコンパイル]]にその道中どんなこと作業が必要なのかをまとめます。 [[FreeTypeを使う]]で基本的な操作から、ちょっとした使い方くらいをやってみます。 だいぶと逸れましたが、目的を達成しようと思うと、やっぱりFontファイルの構造を理解しないと駄目ですね。アップルのページを見ながら考えてみます。せっかくなので、C++でフォントのImpact.ttfのバイナリファイルを読み込んで、プログラムによって分解しながら解析してみようと思います。まずはヘッダー情報とテーブルの配置情報が上の方に詰まってるみたいなので、読み込んでみようと思います。理解した情報をテキストに吐き出すということをやってみます。途中、簡易freetypeみたいなことをして遊ぶことを目的にやっていけば、自分でフォントを描画するsvgファイルを作ってみたりできて楽しそう。サブセットを作るための礎を築くことが出来そうな気がしています。ちょっと時間かかりそうだな。もっと若い時に頑張ってみればよかったかも。 力技のプログラムで分解します。カッコいいクラスとかは作る気が無いです。よっぽど繰り返し同じようなプログラムを書いてるなこれって思ったら、なんかやるかもしれないですけど。例外処理とかやる気なし。エラーが出始めても見返せないくらいの奴にしてやりますよ。 === '''構造''' === ttfファイルの構造を以下に示します。 全体としては、ヘッダ部 12byte と TAGと呼ばれる4文字のコードに意味付けがされていて、TAGとその内容という構成が可変長でファイル全体のほとんどを占めます。とくに文字の形に関する情報を持つglyfというタグが容量が大きくなります。ヘッダ部につづいて、それぞれのTAGテーブルがどこに配置されているかを示した情報が1つのTAGあたり16Byteで位置情報を記載しています。これをTAGテーブル部と呼びます。そのあとにそれぞれのタグの値に対応するテーブル部とよばれる大きい容量の領域が続きます。TAGには、フォントファイル内で必ず定義されるべきものと、オプションのものがあります。またフォントファイルの形式毎にも必須となるTAGの違いがあります。OpenTypeフォントのotfやそのコレクションファイルである。otcファイルも一部のTAG情報が独立しているもののほとんど同じような構造になっています。TrueTypeと同じ意味を持っているTAGもあります。TrueTypeのコレクションであるttcもttcだけが扱うTAGがあります。 *'''ヘッダ部(ファイル先頭から12Byte固定 アドレス0x0000 0000 ~ 0x0000000b)''' <table style="width: 100%; text-align: left; border-collapse: collapse; border-spacing: 0;"> <tr style=" background: #778ca3; border-right: solid 1px #778ca3; color: #ffffff;"> <th style="width: 50px;">バイト数</th> <th style="width: 140px;">型</th> <th style="width: 150px;">名前</th> <th>説明</th> </tr> <tr> <td>4</td> <td>unsigned int</td> <td>sfntVersion</td> <td>ttf outline 0x00010000</td> </tr> <tr style=" background: #eeeeee;"> <td>2</td> <td>unsigned short</td> <td>numTables</td> <td>TAGテーブル数</td> </tr> <tr> <td>2</td> <td>unsigned short</td> <td>searchRange</td> <td>TAGテーブル数から決定</td> </tr> <tr style=" background: #eeeeee;"> <td>2</td> <td>unsigned short</td> <td>entrySelector</td> <td>TAGテーブル数から決定</td> </tr> <tr> <td>2</td> <td>unsigned short</td> <td>rangeShift</td> <td>TAGテーブル数から決定</td> </tr> </table> entrySelectorはTAG テーブル数が 16(0x10) 以下なら 3。17(0x11) 以上 32(0x20)以下なら4。33(0x21) 以上 64((0x40))以下なら5。の、ように2^n<=TAGテーブル数となるようなnの最大値がentrySelectorです。 searchRangeは 16 * 2^(entrySelector)という値です。 rangeShiftは16 * TAGテーブル数 - entrySelector という値です。 TAGテーブル数から計算できるこれらの値は、よくわからない意味不明の操作をしているように感じますが、TAGテーブルの範囲を計算するために必要となるような値になっています。無くても原理がわかっていれば、再度計算できますけど、また計算するという時間を減らすために備わっていると考えてよいでしょう。なんどもなんども、読み込むかもしれませんので、計算量の節約に役立つのかもしれません。上記の値にヘッダ部自体が使う12byteをふくめると最初のテーブルへのoffsetが求まります。 == '''関連記事''' == :[[フォント OpenType 構造解析]] : [[FreeTypeをコンパイル]] :[[FreeTypeを使う]] [[フォント]]に戻る。
フォント TrueType 構造解析
に戻る。
個人用ツール
ログイン
名前空間
ページ
議論
変種
表示
閲覧
ソースを表示
履歴表示
操作
検索
案内
メインページ
コミュニティ・ポータル
最近の出来事
最近の更新
おまかせ表示
ヘルプ
ツールボックス
リンク元
関連ページの更新状況
特別ページ