フォント TrueType 構造解析 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(cmap)
(cmap)
2,183行: 2,183行:
  
 
[[メディア:IMPACT TAG cmap TebleInfo.txt|IMPACT_TAG_cmap_TebleInfo.txt]]
 
[[メディア:IMPACT TAG cmap TebleInfo.txt|IMPACT_TAG_cmap_TebleInfo.txt]]
 +
 
 
 
 
  
2,190行: 2,191行:
  
 
■Format0
 
■Format0
 +
<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: 200px; ">型</th>
 +
  <th style = "width: 200px; ">Name</th>
 +
  <th>説明</th>
 +
</tr>
 +
<tr>
 +
  <td>unsigned int</td>
 +
  <td>usFormat</td>
 +
  <td>0 フォーマット番号</td>
 +
</tr>
 +
<tr  style = " background: #eeeeee;" >
 +
  <td>unsigned int</td>
 +
  <td>usLength</td>
 +
  <td>サブテーブルの長さ</td>
 +
</tr>
 +
<tr>
 +
  <td>unsigned int</td>
 +
  <td>usLanguage</td>
 +
  <td>言語コード番号</td>
 +
</tr>
 +
<tr  style = " background: #eeeeee;" >
 +
  <td>unsigned char</td>
 +
  <td>ucGlyphIndex[256]</td>
 +
  <td>配列番号が文字コードで、その値がグリフ番号となる形式。</td>
 +
</tr>
 +
</table>
 +
 +
 
 +
 +
■Format4
 +
■Format0
 +
<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: 200px; ">型</th>
 +
  <th style = "width: 200px; ">Name</th>
 +
  <th>説明</th>
 +
</tr>
 +
<tr>
 +
  <td>unsigned int</td>
 +
  <td>usFormat</td>
 +
  <td>0 フォーマット番号</td>
 +
</tr>
 +
<tr  style = " background: #eeeeee;" >
 +
  <td>unsigned int</td>
 +
  <td>usLength</td>
 +
  <td>サブテーブルの長さ</td>
 +
</tr>
 +
<tr>
 +
  <td>unsigned int</td>
 +
  <td>usLanguage</td>
 +
  <td>言語コード番号</td>
 +
</tr>
 +
<tr  style = " background: #eeeeee;" >
 +
  <td>unsigned short</td>
 +
  <td>usSegCountX2</td>
 +
  <td>セグメント数の2倍の値</td>
 +
</tr>
 +
<tr>
 +
  <td>unsigned int</td>
 +
  <td>usSearchRage</td>
 +
  <td></td>
 +
</tr>
 +
<tr  style = " background: #eeeeee;" >
 +
  <td>unsigned short</td>
 +
  <td>usEntrySelector</td>
 +
  <td></td>
 +
</tr>
 +
<tr>
 +
  <td>unsigned int</td>
 +
  <td>usRangeShift</td>
 +
  <td></td>
 +
</tr>
 +
<tr  style = " background: #eeeeee;" >
 +
  <td>unsigned short</td>
 +
  <td>usEndCode[unSegCountX2/2]</td>
 +
  <td></td>
 +
</tr>
 +
<tr>
 +
  <td>unsigned int</td>
 +
  <td>usReservePad</td>
 +
  <td>予約=0</td>
 +
</tr>
 +
<tr  style = " background: #eeeeee;" >
 +
  <td>unsigned short</td>
 +
  <td>usStartCode[unSegCountX2/2]</td>
 +
  <td></td>
 +
</tr>
 +
<tr>
 +
  <td>unsigned int</td>
 +
  <td>usIdDelta[unSegCountX2/2]</td>
 +
  <td></td>
 +
</tr>
 +
<tr  style = " background: #eeeeee;" >
 +
  <td>unsigned short</td>
 +
  <td>usIdRangeOffset[unSegCountX2/2]</td>
 +
  <td></td>
 +
</tr>
 +
<tr>
 +
  <td>unsigned int</td>
 +
  <td>usGlyphIndexArray[Variables]</td>
 +
  <td>要素数はテーブルの長さのあまり分</td>
 +
</tr>
 +
</table>
 +
 +
 Format4は疎な文字コード領域毎にグリフIDを付与する方式です。例えばUnicode文字コード0x20~0x7fは連番でGlyphIDの3から156に対応して、次の区画の…と繰り返して定義していくような感じです。但し、文字コードに対応するGIDの算出方法はもう少し複雑な内容になります。
 +
 +
 +
 例えばセグメントが以下のように定義されていて
 +
 +
<Syntaxhighlight2 lang="text">
 +
      Element  EndCode      StartCode        idDelta  idRangeOffset
 +
====================================================================
 +
0x0000(    0)    0x007e        0x0020        0xffe3        0x0000
 +
0x0001(    1)    0x017f        0x00a0        0x0000        0x00c2
 +
0x0002(    2)    0x0192        0x0192        0xff14        0x0000
 +
 +
 +
0x0061(  97)    0xffff        0xffff        0x0001        0x0000
 +
 +
GlyphIndexArray                        Value
 +
====================================================
 +
GlyphIndexArray[0x0000(00000)]:0x00ac(  172)
 +
 +
GlyphIndexArray[0x002c(00044)]:0x00cf(  207)
 +
 +
 +
</Syntaxhighlight2>
 +
 +
 文字コードGlyphIDの変換には大きく2とおりの決定方法があります。まず一つ目の方法でみつける方式の例として、文字コード0x20について見てみます。
 +
 +
 0x20がEndcodeの値より小さいことが成立する最大のエレメント番号をみつけます。今回の場合は7eより小さいということでElement番号 0 が対象になります。そして、そのときのStartCodeは0x20で0x20がStartCodeの値より同じ、あるいは、大きいかを比較して成立しない場合は、GIDは 0 になります。今回は成立するので、次の手順に進みます。次は以下の演算を行います。(算出したい対象の文字コード:0x20)-(StartCode:0x20) + (idDelta:0xffe3) & 0xFFFFの値を算出します。今回の場合0x0003がその結果になるのでGID3に文字コード0x20の文字の形が格納されていることを意味します。
 +
 +
 もうひとつの計算方法はidDeltaが00となっているのエレメントが計算対象になる文字コードです例えば 0xa0の文字コードだとidDelta=00が対象になります。最初の計算方法と同じように、0xa0がEndcodeの値より小さいことが成立する最大のエレメント番号をみつけます。今回の場合は17fより小さいということでElement番号 1の行が対象になります。そして、StartCodeとくらべて同じか大きいなら、次の演算をします。(算出したい対象の文字コード:0xa0)-(StartCode:0xa0)= 0 + (idRangeOffset:c2を計算します。idRangeOffsetがc2のところからc2だけ進んだところにある番号がGIDになります。セグメントになっているエレメントは全部で0x61まであるので、エレメント総数:0x97 -  idRageOffsetのエレメント番号位置:0x1=0x96。そうすると(idRangeOffset:c2)-(算出した値:0x96)=2C。GlyphIndexArrayの配列番号2Cの値が0x00cf(207)がGlyphIDになります。
 +
 +
 +
 ちょっと複雑ですが、cmapのformt4はこのように利用する形式です。
 +
 +
 
  
 
== '''関連記事''' ==
 
== '''関連記事''' ==

2022年9月8日 (木) 00:00時点における版



個人用ツール
名前空間

変種
操作
案内
ツールボックス