fix(linetype): route placeholder-complex linetypes to the dash path

A linetype element can carry a `complex` record with no renderable content
(shape #0, null style handle, zero scale) — some DWGs store plain dash
elements that way (e.g. ISO03W100 "ISO dash space"). document_complex_lt
treated any `complex.is_some()` as complex and sent the entity down the CPU
apply_along path, which skips the GPU dash shader and its A-type endpoint
alignment. Gate on *renderable* content (non-empty text, or a shape with a
real shape-file handle) so these fall through to resolve_pattern and dash on
the GPU with proper A-type alignment.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Hakan Seven 2026-07-17 02:58:59 +03:00
commit 743dc1026d

View file

@ -153,7 +153,20 @@ pub fn document_complex_lt(document: &CadDocument, name: &str) -> Option<Complex
.line_types
.iter()
.find(|l| l.name.eq_ignore_ascii_case(name))?;
if !lt.elements.iter().any(|e| e.complex.is_some()) {
// Treat the linetype as complex only when an element carries *renderable*
// embedded content — a non-empty text string, or a shape backed by a shape
// file. Some DWGs store dash elements with a placeholder `complex` (shape
// #0, null style handle, zero scale) that draws nothing; routing those
// through the CPU complex-linetype path needlessly skips the normal dash
// shader — and with it the "A"-type endpoint alignment. Fall through to the
// ordinary `resolve_pattern` path for them.
let has_real_complex = lt.elements.iter().any(|e| {
e.complex.as_ref().is_some_and(|cx| match &cx.content {
LineTypeComplexContent::Text { text } => !text.trim().is_empty(),
LineTypeComplexContent::Shape { .. } => !cx.style_handle.is_null(),
})
});
if !has_real_complex {
return None;
}
document_lt_segments(document, name)