PicoPDF

TrueTypeデータ読み込み 🔗

TTF形式はグリフ数分のglyf、locaテーブルを抽出する必要がある。
locaテーブルにはglyfテーブルの長さの情報が入っている。
glyfテーブルにはグリフのアウトライン情報が格納されている。
関連するテーブルをまとめると以下のようになる。

graph LR;
    subgraph head
        indexToLocFormat;
    end
    
    subgraph maxp
        numGlyphs;
    end
    
    subgraph hhea
        numberOfHMetrics;
    end
    
    subgraph hmtx
        hMetrics["hMetrics[numGlyphs]"];
        leftSideBearings["leftSideBearings[numGlyphs - numberOfHMetrics]"];
    end
    
    subgraph loca
        direction LR;
        offsets0["offsets[0]"];
        offsets1["offsets[1]"];
        offsets2["offsets[2]"];
        offsets3["offsets[3]"];
        offsetsx["offsets[...]"];
        offsetslast["offsets[numGlyphs + 1]"];
    end
    
    subgraph glyf
        direction LR;
        glyf0["GID 0 (.notdef)"];
        glyf1["GID 1"];
        glyf2["GID 2"];
        glyflast["GID numGlyphs"];
    end
    
    numGlyphs --> hMetrics;
    numGlyphs --> leftSideBearings;
    numGlyphs --> loca;
    numberOfHMetrics --> leftSideBearings;
    indexToLocFormat --> loca;
    offsets1    --"offsets[0]~offsets[1]の差分"--> glyf0;
    offsets2    --"offsets[1]~offsets[2]の差分"--> glyf1;
    offsets3    --"offsets[2]~offsets[3]の差分"--> glyf2;
    offsetslast --"offsets[numGlyphs]~offsets[numGlyphs + 1]の差分"--> glyflast;

locaテーブル 🔗

locaの配列の差分がglyfの長さになる。
アウトライン情報がない場合は差分がゼロ(offsets[GID] == offsets[GID + 1])になる。
headのindexToLocFormatが0の場合、locaは実際のオフセットを2で割った値が格納されている。

glyfテーブル 🔗

グリフデータにはSimple glyphとComposite glyphがある。
どちらも座標データのみであるため、抽出を行うだけであれば中身を解析する必要はない。
headのindexToLocFormatが0の場合、2バイトアライメントにする必要がある。