forked from 1b-agent/opencadstudio-upstream
fix(shx): unifont subshapes are two-byte codes
Since 2026.39 reads `unifont 1.0` files (isocp.shx and its family among them) instead of falling back to a substitute, a glyph built from a subshape went wrong: code 7 is followed by a two-byte code point in a unifont, but only big fonts read two bytes, so the low byte ran on as a drawing opcode. ISOCP's `9` came out at x-height as a small bowl. Fixes #1556 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
41fb37505b
commit
f17279244f
1 file changed
+19
-9
+19
-9
@@ -544,16 +544,26 @@ fn interpret(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
7 => {
|
7 => {
|
||||||
let mut sub = *b.get(i).unwrap_or(&0) as u16;
|
let two_bytes = |i: usize| {
|
||||||
i += 1;
|
((*b.get(i).unwrap_or(&0) as u16) << 8) | *b.get(i + 1).unwrap_or(&0) as u16
|
||||||
// A big font references subshapes by a two-byte code:
|
};
|
||||||
// `7, 0, hi, lo`.
|
// A unifont names its subshape by a two-byte code point
|
||||||
if file.kind == ShxKind::Bigfont && sub == 0 {
|
// (`7, hi, lo`); read as one byte, the low byte ran on as an
|
||||||
let hi = *b.get(i).unwrap_or(&0) as u16;
|
// opcode and the glyph came out mangled (ISOCP's `9`, #1556).
|
||||||
let lo = *b.get(i + 1).unwrap_or(&0) as u16;
|
// A big font uses `7, 0, hi, lo`; a shape file one byte.
|
||||||
|
let sub = if file.kind == ShxKind::Unifont {
|
||||||
i += 2;
|
i += 2;
|
||||||
sub = (hi << 8) | lo;
|
two_bytes(i - 2)
|
||||||
}
|
} else {
|
||||||
|
let sub = *b.get(i).unwrap_or(&0) as u16;
|
||||||
|
i += 1;
|
||||||
|
if file.kind == ShxKind::Bigfont && sub == 0 {
|
||||||
|
i += 2;
|
||||||
|
two_bytes(i - 2)
|
||||||
|
} else {
|
||||||
|
sub
|
||||||
|
}
|
||||||
|
};
|
||||||
if !skipping && sub != 0 && sub != shape_number {
|
if !skipping && sub != 0 && sub != shape_number {
|
||||||
interpret(file, sub, st, cur, out, depth + 1);
|
interpret(file, sub, st, cur, out, depth + 1);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user