Skip to content

Task #712: wrap=TopAndBottom 음수 vert_offset 표 침범 정정 (closes #712)#714

Open
planet6897 wants to merge 6 commits intoedwardkim:develfrom
planet6897:pr-task712
Open

Task #712: wrap=TopAndBottom 음수 vert_offset 표 침범 정정 (closes #712)#714
planet6897 wants to merge 6 commits intoedwardkim:develfrom
planet6897:pr-task712

Conversation

@planet6897
Copy link
Copy Markdown
Contributor

Summary

  • samples/2022년 국립국어원 업무계획.hwp 36 페이지 상단 12x5 일정 표가 직전 1x3 인라인 TAC 제목 표 안쪽으로 ~12-16 px 침범하던 결함 정정 (#712)
  • Root cause: HwpUnit=u32 라서 음수 vertical_offset (예: -1796 HU) 이 unsigned 양수 (4294965500u32) 으로 저장되어 > 0 게이트가 무력화. 후속 as i32 캐스트에서 음수가 적용 → PartialTable 표가 위로 점프
  • 정정: src/renderer/layout/table_partial.rssrc/renderer/layout.rs 의 두 게이트를 signed 비교 (vertical_offset as i32) > 0 로 변환. 비-Partial 경로의 기존 클램프 raw_y.max(y_start) 와 동등 효과
  • 순수 코드 변경 14 라인 (주석 포함)

Test plan

  • cargo build
  • cargo test --release — 1252 passed, 0 failed (회귀 0)
  • cargo test --test issue_712 — TDD RED→GREEN (침범 12.17 → 0 px)
  • 181 샘플 페이지 수 횡단 비교 — diff 0
  • 분할 연결 페이지 (is_continuation=true) 가드 무영향 확인

관련 자료

  • 수행 계획서: mydocs/plans/task_m100_712.md
  • 구현 계획서: mydocs/plans/task_m100_712_impl.md
  • Stage 1-5 보고서: mydocs/working/task_m100_712_stage{1..4}.md
  • 최종 보고서: mydocs/report/task_m100_712_report.md

🤖 Generated with Claude Code

@planet6897
Copy link
Copy Markdown
Contributor Author

연관 PR (samples/2022년 국립국어원 업무계획.hwp)

본 PR 은 samples/2022년 국립국어원 업무계획.hwp 의 페이지 분할 결함 정정 시리즈 중 두 번째.

순서 PR Issue 본질 결함 위치
1 #644 #643 페이지 분할 드리프트 5축 정합 6 페이지 마지막 줄 (40→35 페이지로 정정)
2 #714 (본 PR) #712 u32 음수 vert_offset 게이트 31 페이지 상단 12x5 표 침범
3 #715 #713 인트라-로우 분할 orphan(<25px) 가드 31 페이지 하단 row 8 sliver 분할

권장 merge 순서: #644#714#715. 각 PR 은 베이스가 stream/devel 이며 상호 conflict 0 (merge-tree 점검 완료).

통합 검증: stream/devel + 3 PR 통합 빌드에서 cargo test --release 1252 passed, 0 failed.

planet6897 and others added 6 commits May 9, 2026 08:57
Issue edwardkim#712 — 2022 국립국어원 업무계획 p31 wrap=TopAndBottom 음수
vert offset 12x5 표가 직전 inline TAC 1x3 제목 표 안쪽으로
~16 px 침범하는 결함의 수행 계획서.

베이스라인 확인:
- stream/devel 에서도 동일 결함 재현 (Task edwardkim#643 회귀 아님)
- pi=586 IR: vert=문단(-1796 HU), LINE_SEG vpos=69196..0 [vpos-reset@line1]

의심 영역:
- src/renderer/layout.rs:2667-2679 (PartialTable pt_y_start 가드 vertical_offset>0)
- src/renderer/layout.rs:1500-1548 (VPOS_CORR Task edwardkim#412/edwardkim#643)

가설 H1/H2/H3 정의, 6 stage 계획.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
TDD 6 stage 정의:
- Stage 1 RED: tests/regression_task712.rs (pi=586 외곽 상단 ≥ pi=585 외곽 하단)
- Stage 2 분석: RHWP_TASK712_DEBUG 인스트루먼트 일시 추가, 가설 H1/H2/H3 확정
- Stage 3 GREEN: 핀포인트 정정 + RED PASS
- Stage 4 회귀: cargo test --release 1221+, 골든 SVG
- Stage 5 광범위: samples 전수 SVG 비교
- Stage 6 보고: closes edwardkim#712 + stream/devel PR

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
tests/issue_712.rs 신규 — pi=586 12x5 표 외곽 상단 y ≥ pi=585 1x3
표 외곽 하단 y 단언. 페이지 인덱스를 하드코딩하지 않고 pi=585/586
동시 등장 페이지를 동적 탐색하여 Task edwardkim#643 적용 여부와 무관하게
결함 검증.

RED 확인:
  page_index=35 (page_count=40)
  pi585=[98.25..137.11] pi586=[124.93..1004.31]
  침범=12.17 px (cell 기준), ~15.94 px (outer 기준)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Root cause:
  HwpUnit = u32 (src/model/mod.rs:21) 라서 음수 vertical_offset
  (예: -1796 HU = 0xFFFFF8FC = 4294965500u32) 이 unsigned 양수로
  저장됨. `vertical_offset > 0` u32 비교 게이트가 음수 비트표현도
  통과시키고, 후속 `as i32` 캐스트에서 음수가 그대로 적용 →
  PartialTable 표가 음수만큼 위로 점프, 직전 inline TAC 표 영역
  침범 (~12-16 px).

  비-Partial 경로 (table_layout.rs:1069+) 는 동일 분기에
  `pushed = raw_y.max(y_start)` 클램프가 있어 음수 무력화. Partial
  경로에는 클램프가 없어 본 결함 표면화.

정정:
  - src/renderer/layout/table_partial.rs:62-71 — gate 를 signed 비교
    `(vertical_offset as i32) > 0` 로 변경. 양수만 적용, 0/음수는
    y_start 유지 (비-Partial 경로 효과와 동등).
  - src/renderer/layout.rs:2673-2685 — pt_y_start 게이트 동일 정정.

검증:
  - tests/issue_712.rs PASS (pi586=[148.88..1028.25], 침범 0)
  - cargo test --release: 1252 passed, 0 failed, 5 ignored (회귀 0)
  - 페이지 37 (분할 표 연결) 회귀 확인 — !is_continuation 가드로 분할
    연결 분기는 무영향.

Stage 2 분석 보고서 + Stage 3 GREEN 보고서 동봉.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- cargo test --release: 1252 passed, 0 failed, 5 ignored
- 181 샘플 페이지 수 횡단 비교: diff 0 (회귀 0)
- 결함 페이지(36) pi=586 [124.93..1004.31] → [148.88..1028.25] 정상
- 분할 연결 페이지(37) is_continuation=true 가드로 무영향

순수 패치 14 라인 (주석 포함), 기능 변경 = 2 게이트의 비교 연산자 변환.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
samples/2022년 국립국어원 업무계획.hwp 36 페이지 상단 12x5 일정 표가
직전 1x3 인라인 TAC 제목 표 안쪽으로 ~12-16 px 침범하던 결함 정정.

Root cause: HwpUnit=u32 라서 음수 vertical_offset (예: -1796 HU)이
unsigned 양수 비트표현 (4294965500u32) 으로 저장되어 `> 0` 게이트가
무력화. 후속 `as i32` 캐스트에서 음수가 적용되어 표가 위로 점프.

정정: 두 곳의 게이트 (table_partial.rs, layout.rs) 를 signed 비교
`(vertical_offset as i32) > 0` 로 변환. 비-Partial 경로의 기존 클램프
`raw_y.max(y_start)` 와 동등한 효과로 음수 offset 무력화.

검증:
- tests/issue_712.rs RED→GREEN 전환 (침범 12.17→0 px)
- cargo test --release: 1252 passed, 0 failed
- 181 샘플 페이지 수 회귀 0
- 분할 연결 페이지(is_continuation=true) 가드 무영향 확인

순수 코드 변경 14 라인 (주석 포함).

closes edwardkim#712

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant