function _putTTfontwidths(&$font, $maxUni)
{
if (file_exists($font['unifilename'] . '.cw127.php')) {
include $font['unifilename'] . '.cw127.php';
$startcid = 128;
} else {
$rangeid = 0;
$range = array();
$prevcid = -2;
$prevwidth = -1;
$interval = false;
$startcid = 1;
}
$cwlen = $maxUni + 1;
// for each character
for ($cid = $startcid; $cid < $cwlen; $cid++) {
if ($cid == 128 && !file_exists($font['unifilename'] . '.cw127.php')) {
if (is_writable(dirname($this->_getfontpath() . 'unifont/x'))) {
$fh = fopen($font['unifilename'] . '.cw127.php', "wb");
$cw127 = '<?php' . "\n";
$cw127 .= '$rangeid=' . $rangeid . ";\n";
$cw127 .= '$prevcid=' . $prevcid . ";\n";
$cw127 .= '$prevwidth=' . $prevwidth . ";\n";
if ($interval) {
$cw127 .= '$interval=true' . ";\n";
} else {
$cw127 .= '$interval=false' . ";\n";
}
$cw127 .= '$range=' . var_export($range, true) . ";\n";
$cw127 .= "?>";
fwrite($fh, $cw127, strlen($cw127));
fclose($fh);
}
}
if ($font['cw'][$cid * 2] == "" && $font['cw'][$cid * 2 + 1] == "") {
continue;
}
$width = (ord($font['cw'][$cid * 2]) << 8) + ord($font['cw'][$cid * 2 + 1]);
if ($width == 65535) {
$width = 0;
}
if ($cid > 255 && (!isset($font['subset'][$cid]) || !$font['subset'][$cid])) {
continue;
}
if (!isset($font['dw']) || isset($font['dw']) && $width != $font['dw']) {
if ($cid == $prevcid + 1) {
if ($width == $prevwidth) {
if ($width == $range[$rangeid][0]) {
$range[$rangeid][] = $width;
} else {
array_pop($range[$rangeid]);
// new range
$rangeid = $prevcid;
$range[$rangeid] = array();
$range[$rangeid][] = $prevwidth;
$range[$rangeid][] = $width;
}
$interval = true;
$range[$rangeid]['interval'] = true;
} else {
if ($interval) {
// new range
$rangeid = $cid;
$range[$rangeid] = array();
$range[$rangeid][] = $width;
} else {
$range[$rangeid][] = $width;
}
$interval = false;
}
} else {
$rangeid = $cid;
$range[$rangeid] = array();
$range[$rangeid][] = $width;
$interval = false;
}
$prevcid = $cid;
$prevwidth = $width;
}
}
$prevk = -1;
$nextk = -1;
$prevint = false;
foreach ($range as $k => $ws) {
$cws = count($ws);
if ($k == $nextk and !$prevint and (!isset($ws['interval']) or $cws < 4)) {
if (isset($range[$k]['interval'])) {
unset($range[$k]['interval']);
}
$range[$prevk] = array_merge($range[$prevk], $range[$k]);
unset($range[$k]);
} else {
$prevk = $k;
}
$nextk = $k + $cws;
if (isset($ws['interval'])) {
if ($cws > 3) {
$prevint = true;
} else {
$prevint = false;
}
unset($range[$k]['interval']);
--$nextk;
} else {
$prevint = false;
}
}
$w = '';
foreach ($range as $k => $ws) {
if (count(array_count_values($ws)) == 1) {
$w .= ' ' . $k . ' ' . ($k + count($ws) - 1) . ' ' . $ws[0];
} else {
$w .= ' ' . $k . ' [ ' . implode(' ', $ws) . ' ]' . "\n";
}
}
$this->_out('/W [' . $w . ' ]');
}