|
1 | | -import os, pixie, strformat, unicode, xrays |
| 1 | +import os, pixie, pixie/fontformats/opentype, strformat, tables, unicode, xrays |
2 | 2 |
|
3 | 3 | proc wh(image: Image): Vec2 = |
4 | 4 | ## Return with and height as a size vector. |
@@ -1048,6 +1048,52 @@ block: |
1048 | 1048 | var typeface = readTypeface("tests/fonts/Roboto-Regular_1.ttf") |
1049 | 1049 | doAssert typeface.getKerningAdjustment('T'.Rune, 'e'.Rune) == -99.0 |
1050 | 1050 |
|
| 1051 | +block: |
| 1052 | + proc writeBe16(data: var string, offset, value: int) = |
| 1053 | + data[offset] = char((value shr 8) and 0xff) |
| 1054 | + data[offset + 1] = char(value and 0xff) |
| 1055 | + |
| 1056 | + let originalData = readFile("tests/fonts/Roboto-Regular_1.ttf") |
| 1057 | + let original = parseOpenType(originalData) |
| 1058 | + |
| 1059 | + var |
| 1060 | + targetRune: Rune |
| 1061 | + targetGlyphId = -1 |
| 1062 | + glyphOffset = -1 |
| 1063 | + |
| 1064 | + for rune, glyphId in original.cmap.runeToGlyphId.pairs: |
| 1065 | + let glyphIndex = glyphId.int |
| 1066 | + if glyphIndex == 0 or glyphIndex + 1 >= original.glyf.offsets.len: |
| 1067 | + continue |
| 1068 | + |
| 1069 | + let |
| 1070 | + startOffset = original.glyf.offsets[glyphIndex].int |
| 1071 | + endOffset = original.glyf.offsets[glyphIndex + 1].int |
| 1072 | + glyphLen = endOffset - startOffset |
| 1073 | + |
| 1074 | + if glyphLen >= 16: |
| 1075 | + targetRune = rune |
| 1076 | + targetGlyphId = glyphIndex |
| 1077 | + glyphOffset = startOffset |
| 1078 | + break |
| 1079 | + |
| 1080 | + doAssert targetGlyphId >= 0 |
| 1081 | + |
| 1082 | + var mutated = originalData |
| 1083 | + writeBe16(mutated, glyphOffset + 0, 0xffff) # Composite glyph. |
| 1084 | + writeBe16(mutated, glyphOffset + 2, 0) |
| 1085 | + writeBe16(mutated, glyphOffset + 4, 0) |
| 1086 | + writeBe16(mutated, glyphOffset + 6, 0) |
| 1087 | + writeBe16(mutated, glyphOffset + 8, 0) |
| 1088 | + writeBe16(mutated, glyphOffset + 10, 0x0002) # ARGS_ARE_XY_VALUES. |
| 1089 | + writeBe16(mutated, glyphOffset + 12, targetGlyphId) |
| 1090 | + mutated[glyphOffset + 14] = '\0' |
| 1091 | + mutated[glyphOffset + 15] = '\0' |
| 1092 | + |
| 1093 | + let font = parseOpenType(mutated) |
| 1094 | + doAssertRaises PixieError: |
| 1095 | + discard font.getGlyphPath(targetRune) |
| 1096 | + |
1051 | 1097 | block: |
1052 | 1098 | var font = readFont("tests/fonts/Inter-Regular.ttf") |
1053 | 1099 | font.size = 26 |
|
0 commit comments