@@ 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); |