|
@@ 626-675 (lines=50) @@
|
| 623 |
|
} |
| 624 |
|
break; |
| 625 |
|
} |
| 626 |
|
case 4: { // Format 4: Segment mapping to delta values |
| 627 |
|
$length = TCPDF_STATIC::_getUSHORT($font, $offset); |
| 628 |
|
$offset += 2; |
| 629 |
|
$offset += 2; // skip version/language |
| 630 |
|
$segCount = floor(TCPDF_STATIC::_getUSHORT($font, $offset) / 2); |
| 631 |
|
$offset += 2; |
| 632 |
|
$offset += 6; // skip searchRange, entrySelector, rangeShift |
| 633 |
|
$endCount = array(); // array of end character codes for each segment |
| 634 |
|
for ($k = 0; $k < $segCount; ++$k) { |
| 635 |
|
$endCount[$k] = TCPDF_STATIC::_getUSHORT($font, $offset); |
| 636 |
|
$offset += 2; |
| 637 |
|
} |
| 638 |
|
$offset += 2; // skip reservedPad |
| 639 |
|
$startCount = array(); // array of start character codes for each segment |
| 640 |
|
for ($k = 0; $k < $segCount; ++$k) { |
| 641 |
|
$startCount[$k] = TCPDF_STATIC::_getUSHORT($font, $offset); |
| 642 |
|
$offset += 2; |
| 643 |
|
} |
| 644 |
|
$idDelta = array(); // delta for all character codes in segment |
| 645 |
|
for ($k = 0; $k < $segCount; ++$k) { |
| 646 |
|
$idDelta[$k] = TCPDF_STATIC::_getUSHORT($font, $offset); |
| 647 |
|
$offset += 2; |
| 648 |
|
} |
| 649 |
|
$idRangeOffset = array(); // Offsets into glyphIdArray or 0 |
| 650 |
|
for ($k = 0; $k < $segCount; ++$k) { |
| 651 |
|
$idRangeOffset[$k] = TCPDF_STATIC::_getUSHORT($font, $offset); |
| 652 |
|
$offset += 2; |
| 653 |
|
} |
| 654 |
|
$gidlen = (floor($length / 2) - 8 - (4 * $segCount)); |
| 655 |
|
$glyphIdArray = array(); // glyph index array |
| 656 |
|
for ($k = 0; $k < $gidlen; ++$k) { |
| 657 |
|
$glyphIdArray[$k] = TCPDF_STATIC::_getUSHORT($font, $offset); |
| 658 |
|
$offset += 2; |
| 659 |
|
} |
| 660 |
|
for ($k = 0; $k < $segCount; ++$k) { |
| 661 |
|
for ($c = $startCount[$k]; $c <= $endCount[$k]; ++$c) { |
| 662 |
|
if ($idRangeOffset[$k] == 0) { |
| 663 |
|
$g = ($idDelta[$k] + $c) % 65536; |
| 664 |
|
} else { |
| 665 |
|
$gid = (floor($idRangeOffset[$k] / 2) + ($c - $startCount[$k]) - ($segCount - $k)); |
| 666 |
|
$g = ($glyphIdArray[$gid] + $idDelta[$k]) % 65536; |
| 667 |
|
} |
| 668 |
|
if ($g < 0) { |
| 669 |
|
$g = 0; |
| 670 |
|
} |
| 671 |
|
$ctg[$c] = $g; |
| 672 |
|
} |
| 673 |
|
} |
| 674 |
|
break; |
| 675 |
|
} |
| 676 |
|
case 6: { // Format 6: Trimmed table mapping |
| 677 |
|
$offset += 4; // skip length and version/language |
| 678 |
|
$firstCode = TCPDF_STATIC::_getUSHORT($font, $offset); |
|
@@ 1095-1146 (lines=52) @@
|
| 1092 |
|
} |
| 1093 |
|
break; |
| 1094 |
|
} |
| 1095 |
|
case 4: { // Format 4: Segment mapping to delta values |
| 1096 |
|
$length = TCPDF_STATIC::_getUSHORT($font, $offset); |
| 1097 |
|
$offset += 2; |
| 1098 |
|
$offset += 2; // skip version/language |
| 1099 |
|
$segCount = floor(TCPDF_STATIC::_getUSHORT($font, $offset) / 2); |
| 1100 |
|
$offset += 2; |
| 1101 |
|
$offset += 6; // skip searchRange, entrySelector, rangeShift |
| 1102 |
|
$endCount = array(); // array of end character codes for each segment |
| 1103 |
|
for ($k = 0; $k < $segCount; ++$k) { |
| 1104 |
|
$endCount[$k] = TCPDF_STATIC::_getUSHORT($font, $offset); |
| 1105 |
|
$offset += 2; |
| 1106 |
|
} |
| 1107 |
|
$offset += 2; // skip reservedPad |
| 1108 |
|
$startCount = array(); // array of start character codes for each segment |
| 1109 |
|
for ($k = 0; $k < $segCount; ++$k) { |
| 1110 |
|
$startCount[$k] = TCPDF_STATIC::_getUSHORT($font, $offset); |
| 1111 |
|
$offset += 2; |
| 1112 |
|
} |
| 1113 |
|
$idDelta = array(); // delta for all character codes in segment |
| 1114 |
|
for ($k = 0; $k < $segCount; ++$k) { |
| 1115 |
|
$idDelta[$k] = TCPDF_STATIC::_getUSHORT($font, $offset); |
| 1116 |
|
$offset += 2; |
| 1117 |
|
} |
| 1118 |
|
$idRangeOffset = array(); // Offsets into glyphIdArray or 0 |
| 1119 |
|
for ($k = 0; $k < $segCount; ++$k) { |
| 1120 |
|
$idRangeOffset[$k] = TCPDF_STATIC::_getUSHORT($font, $offset); |
| 1121 |
|
$offset += 2; |
| 1122 |
|
} |
| 1123 |
|
$gidlen = (floor($length / 2) - 8 - (4 * $segCount)); |
| 1124 |
|
$glyphIdArray = array(); // glyph index array |
| 1125 |
|
for ($k = 0; $k < $gidlen; ++$k) { |
| 1126 |
|
$glyphIdArray[$k] = TCPDF_STATIC::_getUSHORT($font, $offset); |
| 1127 |
|
$offset += 2; |
| 1128 |
|
} |
| 1129 |
|
for ($k = 0; $k < $segCount; ++$k) { |
| 1130 |
|
for ($c = $startCount[$k]; $c <= $endCount[$k]; ++$c) { |
| 1131 |
|
if (isset($subsetchars[$c])) { |
| 1132 |
|
if ($idRangeOffset[$k] == 0) { |
| 1133 |
|
$g = ($idDelta[$k] + $c) % 65536; |
| 1134 |
|
} else { |
| 1135 |
|
$gid = (floor($idRangeOffset[$k] / 2) + ($c - $startCount[$k]) - ($segCount - $k)); |
| 1136 |
|
$g = ($glyphIdArray[$gid] + $idDelta[$k]) % 65536; |
| 1137 |
|
} |
| 1138 |
|
if ($g < 0) { |
| 1139 |
|
$g = 0; |
| 1140 |
|
} |
| 1141 |
|
$subsetglyphs[$g] = true; |
| 1142 |
|
} |
| 1143 |
|
} |
| 1144 |
|
} |
| 1145 |
|
break; |
| 1146 |
|
} |
| 1147 |
|
case 6: { // Format 6: Trimmed table mapping |
| 1148 |
|
$offset += 4; // skip length and version/language |
| 1149 |
|
$firstCode = TCPDF_STATIC::_getUSHORT($font, $offset); |