배경
PR #551 의 Task #528 (옛한글 PUA → KS X 1026-1:2007 자모 변환) cherry-pick 머지 후 작업지시자 시각 판정 중 발견된 후속 결함.
결함
옛한글 PUA 코드포인트가 정상적으로 자모 시퀀스로 매핑되어 시각 출력은 정합 (`exam_kor p17` PUA 잔존 0 + Hangul Jamo 102 정상 표시). 그러나 폰트 매트릭스 (글자폭 / advance / 줄간격 등) 계산 이 PUA char 1글자 기준으로 유지되어 있어 자모 시퀀스 (3-4 char) 와 정합 안 됨.
작업지시자 인용:
폰트 매트릭스 계산도 이에 따라 갱신되어야 겠네요.
본질 (가설)
Task #528 의 정정 (Stage 3, commit `a15847c`) 이 Option A — 렌더러 draw_text 시점 변환 채택:
- `run.text` 는 IR 와 동일하게 PUA char 1글자 보존
- `display_text` 필드 (Composer) + draw_text 시점 변환 (svg.rs / web_canvas.rs)
- `char_offsets` / `char_start` / `line_chars` 등 인덱싱 불변성 유지
→ 인덱싱 불변성 유지의 trade-off: 폰트 매트릭스 계산 (예: `estimate_text_width`, char advance 등) 이 `run.text` 의 PUA 1글자 폭으로 계산되어 실제 표시되는 자모 시퀀스의 글자폭과 다름.
가능한 영향:
- Square wrap / 줄바꿈 위치 — 글자폭이 짧게 계산되어 줄에 더 많은 글자가 들어가는 것으로 인식 (실제 출력은 더 넓음)
- 줄간격 — 자모 합자의 height 가 PUA 추정값과 다를 가능성
- TAC / 인라인 그림과의 정합 — 글자폭 차이로 인한 위치 오차
정정 후보 (Stage 1 진단 후 결정)
옵션 A — display_text 기반 매트릭스 계산
`run.text` 가 아닌 `display_text` (또는 `map_pua_old_hangul(run.text)`) 를 매트릭스 계산에 사용. 인덱싱 (char_offsets) 은 별도 분기로 PUA 1글자 기준 유지.
옵션 B — IR 단계에서 변환 (Composer 영역)
draw_text 시점 변환을 IR 변환 시점으로 이동. char_offsets 도 자모 시퀀스 기준으로 재계산. 광범위 영향 (12+ 모듈) 가능성.
옵션 C — Option A 보강 (글자폭만 별도 계산)
draw_text 시점 변환 유지 + `estimate_text_width` 등 폰트 매트릭스 함수만 자모 시퀀스 기준으로 계산.
진단 절차
```bash
rhwp dump samples/exam_kor.hwp -s 0 -p 17 # pi=17 의 line_segs / char_offsets 점검
rhwp export-svg samples/exam_kor.hwp -p 16 -o output/debug/ # SVG 의 글자 위치 비교
```
한컴 2010/2020 PDF 와 비교하여 글자 위치 / 줄바꿈 / 줄간격 영역의 정합도 측정.
의존성
환경
배경
PR #551 의 Task #528 (옛한글 PUA → KS X 1026-1:2007 자모 변환) cherry-pick 머지 후 작업지시자 시각 판정 중 발견된 후속 결함.
결함
옛한글 PUA 코드포인트가 정상적으로 자모 시퀀스로 매핑되어 시각 출력은 정합 (`exam_kor p17` PUA 잔존 0 + Hangul Jamo 102 정상 표시). 그러나 폰트 매트릭스 (글자폭 / advance / 줄간격 등) 계산 이 PUA char 1글자 기준으로 유지되어 있어 자모 시퀀스 (3-4 char) 와 정합 안 됨.
작업지시자 인용:
본질 (가설)
Task #528 의 정정 (Stage 3, commit `a15847c`) 이 Option A — 렌더러 draw_text 시점 변환 채택:
→ 인덱싱 불변성 유지의 trade-off: 폰트 매트릭스 계산 (예: `estimate_text_width`, char advance 등) 이 `run.text` 의 PUA 1글자 폭으로 계산되어 실제 표시되는 자모 시퀀스의 글자폭과 다름.
가능한 영향:
정정 후보 (Stage 1 진단 후 결정)
옵션 A — display_text 기반 매트릭스 계산
`run.text` 가 아닌 `display_text` (또는 `map_pua_old_hangul(run.text)`) 를 매트릭스 계산에 사용. 인덱싱 (char_offsets) 은 별도 분기로 PUA 1글자 기준 유지.
옵션 B — IR 단계에서 변환 (Composer 영역)
draw_text 시점 변환을 IR 변환 시점으로 이동. char_offsets 도 자모 시퀀스 기준으로 재계산. 광범위 영향 (12+ 모듈) 가능성.
옵션 C — Option A 보강 (글자폭만 별도 계산)
draw_text 시점 변환 유지 + `estimate_text_width` 등 폰트 매트릭스 함수만 자모 시퀀스 기준으로 계산.
진단 절차
```bash
rhwp dump samples/exam_kor.hwp -s 0 -p 17 # pi=17 의 line_segs / char_offsets 점검
rhwp export-svg samples/exam_kor.hwp -p 16 -o output/debug/ # SVG 의 글자 위치 비교
```
한컴 2010/2020 PDF 와 비교하여 글자 위치 / 줄바꿈 / 줄간격 영역의 정합도 측정.
의존성
환경