TTFフォントのテーブルディレクトリーのチェックサムのうち、 'head'テーブルだけは、checkSumAdjustmentを考慮した特別な計算が必要となる。
流通している ttc2ttf のうち、 ASS_Help3r、 Beerはこれに従っているが、 K. Takeshi および、 それから派生した TrueType Collection を True Type Font にバラす は、checkSumAdjustmentを考慮せず、厳密に言うと壊れたTTFを生成してしまう。
FontForgeでTTCからTTFを生成した場合、 checkSumAdjustmentは正しく設定される。
TTFのcheckSumAdjustmentは明快だが、 数カ所あるTTCのcheckSumAdjustmentたちは仕様がはっきりしないようだ。
TTFの場合は仕様書に書いてあるとおりにやれば良い。
分かりやすく言うと、
「オフセットテーブル、テーブルディレクトリーの全部、および全テーブル」…(★)
のチェックサムが 0xB1B0AFBA になるように逆算した値を書けば良い。
具体的には、任意の(最終的な値と必ずしも一致しない)値 x が記入された状態で(★)のチェックサムを取り、
結果を 0xB1B0AFBA + x から引き算したもので x を上書きすれば良い。
仕様書では x=0 としている。
ところで、この計算をするためには、headテーブルのテーブルディレクトリーが完成していないといけない。
それにはheadテーブルのチェックサムをまず計算する必要があるが、
そのときは checkSumAdjustmentの4バイト(この段階では任意の x )はスキップする(チェックサムに加えない)。
後からサムを検証するとき、checkSumAdjustmentをスキップしないと計算が合わないのはそのためだ。
注意事項として、(★)は、「ファイルの頭から末尾まで」とは必ずしも一致しない。 テーブルとテーブルの間に4バイトの位置合わせ以上の隙間があるかもしれないし、 ファイル内の最後のテーブルの末尾の後にゴミデータがあるかもしれない。 特に、TTCでは、「ファイルの頭から末尾まで」と(★)が異なることは明白だ。
仕様書には the entire font とあるが、 フォント全体とはフォントファイル全体ではなく(★)の意味と解釈しないと、 観測値と合わない。 早い話が、オフセットテーブルとテーブルディレクトリーのチェックサムだけ計算したら、 後は各テーブルディレクトリーに格納済みのチェックサムを全部足せば良い。
TTCのcheckSumAdjustment(一般に複数ある)について、 (★)の考え方で計算が合うのは、 確認したなかでは、mingliu.ttc と msgothic.ttc のみだった。 ほかは一致しなかった。なかにはheadテーブルのチェックサム自体がやはり間違っているものもあった。 TTCのcheckSumAdjustmentについては、作成ツールがいい加減ということもあるだろうが、 もっとさかのぼって、仕様書自体にあいまいさをなくすための補足説明があるべきだろう。
この点について、1997年に、 TrueType Q&Aに 「checkSumAdjustment value in ttc font」として、そのままの質問が寄せられている。 残念ながら、回答者も問題の意味を理解しておらず、参考にならない。 「仕様書があいまいなため、現在、次の○とおりの実装が存在しています。 わたしの解釈で最も正しいのは…」のような答をしてほしいところだが、 なぜheadテーブルが複数必要なのですか、と問い返すだけで終わっている。 名前がheadだからヘッダーに一つだけあるとでも思ったのだろう。
上述のように、 mingliu.ttc と msgothic.ttc については、(★)のようにアルゴリズムを説明でき、 それが「正しい」解釈だと考えられるが、 現時点では、そのほかのTTCについて「どう間違っているか」までは解明できなかった。 simsun.ttc は、理論値4E5ACF9B、実際の値4E5AB6ABなど (★)とわずかに違う方法を取っていると推定される。 Windows標準のTTCでもよく分からない状態なので、フリーフォントなどは推して知るべしだ。
可能性としては「計算にTTCのヘッダまで含める」「フォント全体という仕様書の言葉をファイル全体と解釈する」などが考えられる。 後者の場合、数カ所あるcheckSumAdjustmentがデータ生成中にだんだん埋まっていくため、 どのタイミングで和を計算するかが問題になる。直感的に言って、その方法のはずがない。 最もありそうなシナリオは、変換元のTTFファイルのheadテーブルをそのままコピーして整合しなくなっている、ということだが…。
この値が違っていても事実上何も害はなく(チェックサムにすら関係しない)、 逆にどうでもいい値だからこそ、適当なままなのだろう。