증상
MDM 데스크톱 앱(vendored rhwp 0.7.2)에서 사용자 피드백으로 확인된 이슈입니다.
- HWP 문서에서 도형 리사이즈 핸들을 반대편 너머로 여러 번 드래그하다 보면 도형이 갑자기 화면에서 사라집니다.
- Ctrl+Z 로 되돌리기도 동작하지 않습니다.
- IR(문서 모델)에는 도형이 남아 있지만 렌더러 출력이 비어 시각적으로 "지워진 것처럼" 보입니다.
재현 문서: 사용자 로컬 HWP (공개 불가). 유사한 도형 포함 HWP에서 재현 가능.
루트 원인 (document_core/commands/object_ops.rs)
set_shape_properties_native 경로에서 width/height 에 대한 최소값 검증이 없습니다.
studio가 리사이즈 드래그 중 width=0 또는 height=0 을 setShapeProperties 로 전송하면:
-
Rectangle — object_ops.rs:1755-1760
```rust
let w = rect.common.width as i32;
let h = rect.common.height as i32;
rect.x_coords = [0, w, w, 0];
rect.y_coords = [0, 0, h, h];
```
w=0, h=0 이면 x_coords=[0,0,0,0] / y_coords=[0,0,0,0] 로 붕괴.
-
Group — object_ops.rs:1764-1777
```rust
if let Some(nw) = new_w {
group.shape_attr.current_width = nw;
// original_width는 유지 (스케일 기준)
}
```
current_width=0 이면 current/original 스케일 비율이 0 이 되어 자식 전부 0배 렌더링.
apply_common_obj_attr_from_json (object_ops.rs:1402-1403) 역시 동일하게 raw u32 를 그대로 기록합니다.
관련: Ctrl+Z 미작동 (별도 이슈)
코어에는 save_snapshot_native / restore_snapshot_native 스냅샷 API가 이미 존재합니다 (document.rs:305-343). studio 측에서 리사이즈 드래그 시작 시점에 saveSnapshot 을 호출하지 않는 것으로 보이며, 이 때문에 중간 0-width 상태를 undo 스택에 잡지 못합니다. 이 부분은 studio 쪽 범위라 별도 이슈/PR로 분리하는 게 적절해 보입니다.
제안 수정안
table_ops.rs:572 의 MIN_CELL_SIZE: u32 = 200 (≈0.7mm) 전례를 따라 MIN_SHAPE_SIZE: u32 = 200 을 도입하고 두 지점에서 clamp:
apply_common_obj_attr_from_json 의 width/height 할당 시 .max(MIN_SHAPE_SIZE)
set_shape_properties_native 의 new_w/new_h 읽기 시점에 .max(MIN_SHAPE_SIZE)
회귀 테스트 3개도 함께 포함:
resize_to_zero_width_clamps_to_min
rectangle_coords_nonzero_after_shrink_to_zero
repeated_zero_resize_does_not_corrupt_state
PR 준비했습니다 (devel 대상). 승인 주시면 push 하겠습니다. 기존 MDM→rhwp 역기여 맥락 (#153, #154) 의 연장선입니다.
환경
- rhwp 0.7.2 (vendored in MDM)
- 재현 플랫폼: macOS (Tauri v2 데스크톱 앱)
증상
MDM 데스크톱 앱(vendored rhwp 0.7.2)에서 사용자 피드백으로 확인된 이슈입니다.
재현 문서: 사용자 로컬 HWP (공개 불가). 유사한 도형 포함 HWP에서 재현 가능.
루트 원인 (
document_core/commands/object_ops.rs)set_shape_properties_native경로에서 width/height 에 대한 최소값 검증이 없습니다.studio가 리사이즈 드래그 중 width=0 또는 height=0 을
setShapeProperties로 전송하면:Rectangle —
object_ops.rs:1755-1760```rust
let w = rect.common.width as i32;
let h = rect.common.height as i32;
rect.x_coords = [0, w, w, 0];
rect.y_coords = [0, 0, h, h];
```
w=0, h=0이면x_coords=[0,0,0,0]/y_coords=[0,0,0,0]로 붕괴.Group —
object_ops.rs:1764-1777```rust
if let Some(nw) = new_w {
group.shape_attr.current_width = nw;
// original_width는 유지 (스케일 기준)
}
```
current_width=0이면current/original스케일 비율이 0 이 되어 자식 전부 0배 렌더링.apply_common_obj_attr_from_json(object_ops.rs:1402-1403) 역시 동일하게 rawu32를 그대로 기록합니다.관련: Ctrl+Z 미작동 (별도 이슈)
코어에는
save_snapshot_native/restore_snapshot_native스냅샷 API가 이미 존재합니다 (document.rs:305-343). studio 측에서 리사이즈 드래그 시작 시점에saveSnapshot을 호출하지 않는 것으로 보이며, 이 때문에 중간 0-width 상태를 undo 스택에 잡지 못합니다. 이 부분은 studio 쪽 범위라 별도 이슈/PR로 분리하는 게 적절해 보입니다.제안 수정안
table_ops.rs:572의MIN_CELL_SIZE: u32 = 200(≈0.7mm) 전례를 따라MIN_SHAPE_SIZE: u32 = 200을 도입하고 두 지점에서 clamp:apply_common_obj_attr_from_json의 width/height 할당 시.max(MIN_SHAPE_SIZE)set_shape_properties_native의new_w/new_h읽기 시점에.max(MIN_SHAPE_SIZE)회귀 테스트 3개도 함께 포함:
resize_to_zero_width_clamps_to_minrectangle_coords_nonzero_after_shrink_to_zerorepeated_zero_resize_does_not_corrupt_statePR 준비했습니다 (devel 대상). 승인 주시면 push 하겠습니다. 기존 MDM→rhwp 역기여 맥락 (#153, #154) 의 연장선입니다.
환경