feat(text): TEXTFILL — fill or hollow TrueType glyphs (#260)
TEXTFILL 1 (default) fills TrueType text; TEXTFILL 0 draws it hollow (outline only). Settable directly or via SETVAR, 0/1 or ON/OFF. SHX/LFF stroke fonts are unaffected. Reuses the existing stroke-SDF path: bake_glyph treats a TTF glyph as a stroke (outline) field instead of a signed fill field when TEXTFILL is off. Toggling resets the glyph atlas and re-tessellates text so quads pick up the re-baked tiles. Persisted in user settings. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
694c5b5a7f
commit
3c3ca89d97
5 changed files with 60 additions and 2 deletions
|
|
@ -328,6 +328,7 @@ inventory::submit!(crate::command::CommandRegistration {
|
|||
"TCASE",
|
||||
"TEXTMASK",
|
||||
"TEXTFIT",
|
||||
"TEXTFILL",
|
||||
"TCOUNT",
|
||||
"ARCTEXT",
|
||||
// Jogged radius dimension.
|
||||
|
|
|
|||
|
|
@ -527,6 +527,7 @@ impl OpenCADStudio {
|
|||
cmd if matches!(
|
||||
cmd.split_whitespace().next().unwrap_or(""),
|
||||
"MIRRTEXT"
|
||||
| "TEXTFILL"
|
||||
| "ATTREQ"
|
||||
| "ATTDIA"
|
||||
| "DIMASSOC"
|
||||
|
|
@ -678,6 +679,23 @@ impl OpenCADStudio {
|
|||
.ok_or_else(|| "SETVAR: 0 or 1 required.".into()),
|
||||
None => Ok((format!("MIRRTEXT = {}", h.mirror_text as i32), false)),
|
||||
},
|
||||
// Global (not stored in the drawing): fill vs. hollow
|
||||
// TrueType text. The active tab re-tessellates below.
|
||||
"TEXTFILL" => match &value {
|
||||
Some(v) => parse_bool(v)
|
||||
.map(|b| {
|
||||
crate::scene::text::sdf_atlas::set_textfill(b);
|
||||
(format!("TEXTFILL = {}", b as i32), true)
|
||||
})
|
||||
.ok_or_else(|| "SETVAR: 0 or 1 required.".into()),
|
||||
None => Ok((
|
||||
format!(
|
||||
"TEXTFILL = {}",
|
||||
crate::scene::text::sdf_atlas::textfill() as i32
|
||||
),
|
||||
false,
|
||||
)),
|
||||
},
|
||||
"ATTREQ" => match &value {
|
||||
Some(v) => parse_bool(v)
|
||||
.map(|b| {
|
||||
|
|
@ -1227,6 +1245,11 @@ impl OpenCADStudio {
|
|||
}
|
||||
Err(e) => self.command_line.push_error(&e),
|
||||
}
|
||||
// TEXTFILL reset the glyph atlas; re-tessellate so text picks
|
||||
// up the re-baked filled / hollow tiles.
|
||||
if name == "TEXTFILL" {
|
||||
self.tabs[i].scene.bump_geometry();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue