public static function parseData($data)
{
$ary = unpack('nsegCountx2/' . 'nsearchRange/' . 'nentrySelector/' . 'nrangeShift', substr($data, 0, 8));
$ary['segCount'] = $ary['segCountx2'] / 2;
$ary['endCount'] = array();
$bytePos = 8;
for ($i = 0; $i < $ary['segCount']; $i++) {
$ar = unpack('nendCount', substr($data, $bytePos, 2));
$ary['endCount'][$i] = $ar['endCount'];
$bytePos += 2;
}
$ar = unpack('nreservedPad', substr($data, $bytePos, 2));
$bytePos += 2;
$ary['reservedPad'] = $ar['reservedPad'];
$ary['startCount'] = array();
for ($i = 0; $i < $ary['segCount']; $i++) {
$ar = unpack('nstartCount', substr($data, $bytePos, 2));
$ary['startCount'][$i] = $ar['startCount'];
$bytePos += 2;
}
$ary['idDelta'] = array();
for ($i = 0; $i < $ary['segCount']; $i++) {
$ar = unpack('nidDelta', substr($data, $bytePos, 2));
$ary['idDelta'][$i] = self::shiftToSigned($ar['idDelta']);
$bytePos += 2;
}
$ary['idRangeOffset'] = array();
for ($i = 0; $i < $ary['segCount']; $i++) {
$ar = unpack('nidRangeOffset', substr($data, $bytePos, 2));
$ary['idRangeOffset'][$i] = $ar['idRangeOffset'] >> 1;
$bytePos += 2;
}
$ary['glyphIndexArray'] = array();
for (; $bytePos < strlen($data); $bytePos += 2) {
$ar = unpack('nglyphIndex', substr($data, $bytePos, 2));
$ary['glyphIndexArray'][] = $ar['glyphIndex'];
}
$ary['glyphNumbers'] = array();
for ($segmentNum = 0; $segmentNum < $ary['segCount']; $segmentNum++) {
if ($ary['idRangeOffset'][$segmentNum] == 0) {
$delta = $ary['idDelta'][$segmentNum];
for ($code = $ary['startCount'][$segmentNum]; $code <= $ary['endCount'][$segmentNum]; $code++) {
$ary['glyphNumbers'][$code] = ($code + $delta) % 65536;
}
} else {
$code = $ary['startCount'][$segmentNum];
$glyphIndex = $ary['idRangeOffset'][$segmentNum] - ($ary['segCount'] - $segmentNum) - 1;
while ($code <= $ary['endCount'][$segmentNum]) {
if (isset($ary['glyphIndexArray'][$glyphIndex])) {
$ary['glyphNumbers'][$code] = $ary['glyphIndexArray'][$glyphIndex];
}
$code++;
$glyphIndex++;
}
}
}
$ary['mapData'] = str_repeat("", 8192);
// Fill the index
foreach ($ary['glyphNumbers'] as $charCode => $glyph) {
$ary['mapData'][$charCode * 2] = chr($glyph >> 8);
$ary['mapData'][$charCode * 2 + 1] = chr($glyph & 0xff);
}
return $ary;
}