Skip to content

Task #577: 셀 내부 단독 TopAndBottom 이미지 1라인 오프셋 정정 (closes #577)#580

Closed
planet6897 wants to merge 4 commits into
edwardkim:develfrom
planet6897:pr-task577
Closed

Task #577: 셀 내부 단독 TopAndBottom 이미지 1라인 오프셋 정정 (closes #577)#580
planet6897 wants to merge 4 commits into
edwardkim:develfrom
planet6897:pr-task577

Conversation

@planet6897

Copy link
Copy Markdown
Contributor

Summary

exam_science.hwp 페이지 1 — 2번 문제 보기 ⑤(및 ②④) 이미지 하단이 cell-clip 영역을 약 10.81 px 초과하여 잘려 보이던 결함을 정정합니다. text_wrap=TopAndBottom AND vert_rel_to=Para 인 비-TAC Picture 가 셀에 들어 있을 때 compute_object_position 호출에 사용하던 para_ylayout_composed_paragraph 의 advance(line_height ≈ 15.32 px) 를 포함하고 있어 이미지가 anchor 라인 한 줄만큼 아래로 밀려 있던 문제입니다. anchor 시점 좌표 para_y_before_compose 를 사용하도록 정정합니다.

Root cause

src/renderer/layout/table_layout.rs:1547.. 비-TAC Picture 분기:

관측 image_y - cell_y = 19.10 px
  = pad_top(3.78) + line_height(15.32, lh=1150 HU)
정정 후 image_y - cell_y = 3.78 px = pad_top   ← HWP IR 정합

Change

src/renderer/layout/table_layout.rs 1 hunk (+14/-3). 조건 부 anchor_y 도입:

let anchor_y = if matches!(pic.common.text_wrap, TextWrap::TopAndBottom)
              && matches!(pic.common.vert_rel_to, VertRelTo::Para)
{ para_y_before_compose } else { para_y };

picture_footnote.rs::compute_object_position 자체는 무변경(다른 호출처 회귀 방지).

Verification

  • exam_science.hwp 1페이지 보기 ①~⑤ 모두 image_y - cell_y = 3.78 px (= pad_top) 정합. cell-clip 내부 정상 배치.
  • LAYOUT_OVERFLOW 변화:
    • exam_science.hwp: 9.5 px → 3.4 px
    • mel-001.hwp: 8건(3.5~18.8 px) → 0건
  • 부수 효과: 비-TAC TopAndBottom 셀 내부 이미지 다수에 동일 산식 정정 적용 → 일부 페이지의 좌표가 IR vpos 정합 방향(LAYOUT_OVERFLOW 가 줄어드는 방향)으로 이동. 신규 회귀 없음.

Test plan

  • cargo build --release
  • cargo test --release --lib (1118 passed)
  • samples/exam_science.hwp 1페이지 보기 ①~⑤ 좌표 정합 확인
  • samples/mel-001.hwp 21페이지 회귀 비교 — LAYOUT_OVERFLOW 8→0건

Documents

  • 수행 계획서: mydocs/plans/task_m100_577.md
  • 구현 계획서: mydocs/plans/task_m100_577_impl.md
  • 단계별 보고서: mydocs/working/task_m100_577_stage{1..3}.md
  • 최종 보고서: mydocs/report/task_m100_577_report.md

closes #577

planet6897 added 4 commits May 4, 2026 16:38
…1라인 오프셋)

- 수행 계획서·구현 계획서 작성
- exam_science.hwp 1페이지 보기 표 5개 이미지 모두 cell-clip 영역을 19.10px 오프셋만큼 초과 확인
- 산식 확정: para_y(advanced) = cell_y + pad_top + line_height(=15.32px) → compute_object_position에 전달
- 수정 범위: text_wrap=TopAndBottom AND vert_rel_to=Para 인 비-TAC Picture 분기에 한정
table_layout.rs 비-TAC Picture 분기에서 vert_rel_to=Para AND text_wrap=TopAndBottom 인 경우
layout_composed_paragraph 가 advance 시킨 para_y 대신 para_y_before_compose 를 anchor 로
사용하도록 수정. exam_science 2번 보기 ⑤ (및 ②④) 이미지가 line_height(약 15.32px) 만큼
아래로 밀려 cell-clip 을 벗어나던 결함 정정.

cargo build/test 통과. clippy 는 사전 존재 에러(layout.rs:313-314 doc_lazy_continuation)만
검출되며 본 변경과 무관.
…W 제거)

exam_science.hwp 1페이지 보기 ①~⑤ 모두 image_y - cell_y = pad_top(3.78px) 로 정정.
LAYOUT_OVERFLOW 변화: exam_science 9.5→3.4px, mel-001 8건→0건.
부수 효과로 일부 페이지의 좌표가 IR vpos 정합 방향으로 이동했으며 신규 회귀 없음.
셀 내부 단독 TopAndBottom 이미지 1라인 오프셋 정정 작업 종결.
exam_science 보기 ①~⑤ 모두 셀 내부 정합, mel-001 LAYOUT_OVERFLOW 8건 → 0건.
승인 후 local/devel 로 merge 권고.
edwardkim added a commit that referenced this pull request May 5, 2026
PR #580 (Task #577, @planet6897 PR / Jaeook Ryu commit author) 1차 검토:
- 본질 결함: 셀 내부 비-TAC TopAndBottom + vert_rel_to=Para Picture 의
  anchor 시점 좌표로 para_y (advance 후) 사용 → image_y - cell_y =
  pad_top(3.78) + line_height(15.32) = 19.10 px (cell-clip ~10.81 px 초과)
- 본질 정정: text_wrap=TopAndBottom AND vert_rel_to=Para 양 조건에만
  para_y_before_compose 사용 (HWP IR anchor 시점 정합) +
  compute_object_position 자체 무변경 (다른 호출처 회귀 차단)
- 단일 파일 본질 (table_layout.rs +22/-3)
- 정량 측정: image_y - cell_y 19.10 → 3.78 px / LAYOUT_OVERFLOW
  exam_science 9.5→3.4 / mel-001 8건→0건
- PR mergeable=CONFLICTING (PR base 시점 차이 추정),
  본질 cherry-pick (0acd13a) 충돌 0
- 본 환경 임시 검증: cargo test --lib --release 1131 passed (회귀 0) /
  clippy 0건

권장 처리: 옵션 A — 핀셋 cherry-pick + 결정적 검증 + 광범위 sweep +
WASM + 작업지시자 시각 판정.
edwardkim added a commit that referenced this pull request May 5, 2026
…ixture 1,614 페이지 회귀 0 + exam_science page 1/4 의도된 정정
edwardkim added a commit that referenced this pull request May 5, 2026
…m 이미지 1라인 오프셋 정정 — @planet6897 / Jaeook Ryu 1 commit + 시각 판정 ★ 통과)

PR #580 (Task #577, @planet6897 PR / Jaeook Ryu commit author):
- 본질 결함: 셀 내부 비-TAC TopAndBottom + vert_rel_to=Para Picture 의
  anchor 시점 좌표로 para_y (advance 후) 사용 →
  image_y - cell_y = pad_top(3.78) + line_height(15.32) = 19.10 px
  (cell-clip ~10.81 px 초과)
- 본질 정정: text_wrap=TopAndBottom AND vert_rel_to=Para 양 조건에만
  para_y_before_compose 사용 (HWP IR anchor 시점 정합) +
  compute_object_position 자체 무변경 (다른 호출처 회귀 차단)
- 단일 파일 본질 (table_layout.rs +22/-3)
- 정량 측정: image_y - cell_y 19.10 → 3.78 px / LAYOUT_OVERFLOW
  exam_science 9.5→3.4 / mel-001 8건→0건

검증:
- cargo test --lib --release 1131 passed (회귀 0)
- svg_snapshot 6/6 / issue_546 1 / issue_554 12 / clippy 0 / build --release
- WASM 4,571,643 bytes (PR #575 baseline +39 bytes — table_layout.rs +22/-3 정합)
- 광범위 페이지네이션 회귀 sweep: 164 fixture (158 hwp + 6 hwpx) /
  1,614 페이지 / 페이지 수 회귀 0
- exam_science byte 차이: page 1/4 의도된 정정 (page 2/3 byte-identical)
- mel-001 byte 차이 0 (LAYOUT_OVERFLOW 정정이 SVG byte 단위는 무영향,
  clip 영역 안으로만 이동)

시각 판정 ★ 통과.

closes #577.
@edwardkim

Copy link
Copy Markdown
Owner

@planet6897 @jangster77 님,

본 PR 의 본질 commit (0acd13a6) 핀셋 cherry-pick 후 devel merge 완료되었습니다 (ee85631).

처리 결과

본질 cherry-pick

  • 0acd13a6 Stage 2 본질 정정 (src/renderer/layout/table_layout.rs +22/-3)
  • 충돌 0건 (PR mergeable=CONFLICTING 표시는 PR base 시점 차이, 본질은 깨끗 적용)
  • author Jaeook Ryu (@jangster77) 보존

결정적 검증

광범위 페이지네이션 회귀 sweep (본 환경 자동)

통계 결과
총 fixture 164 (158 hwp + 6 hwpx — samples/ 폴더 전체)
총 페이지 (devel baseline) 1,614
총 페이지 (cherry-pick 후) 1,614
fixture 별 페이지 수 차이 0

→ 케이스별 명시 가드 (text_wrap=TopAndBottom AND vert_rel_to=Para) 의 정합성이 광범위 sweep 으로 정량 입증.

SVG byte 차이 (PR 본문 영역 + 회귀 검증)

Fixture 페이지 수 byte 차이 정정 영역
exam_science 4 2 (page 1, page 4) page 1 보기 ①~⑤ 정정 (PR 본문 권위 영역) + page 4 부수 효과
mel-001 21 0 LAYOUT_OVERFLOW 8건→0건 정정이 SVG byte 단위는 무영향 (clip 영역 안으로만 이동)

시각 판정 (★ 게이트)

작업지시자 시각 검증 결과:

시각 검증 통과입니다.

PR 본문 측정 (image_y - cell_y = 19.10 → 3.78 px = pad_top, HWP IR 정합) + LAYOUT_OVERFLOW 정정 (exam_science 9.5→3.4 / mel-001 8건→0건) 의 시각적 효과 입증.

본 PR 의 본질 — HWP IR anchor 시점 정합

text_wrap=TopAndBottom AND vert_rel_to=Para 양 조건 동시 검사로 케이스별 명시 가드 (feedback_hancom_compat_specific_over_general 정합) + HWP IR 표준 직접 사용 (anchor 시점 좌표 = paragraph 시작, 휴리스틱 아닌 규칙 — feedback_rule_not_heuristic) + 회귀 위험 영역 좁힘 (compute_object_position 자체 무변경 — 다른 호출처 회귀 차단).

처리 보고서: mydocs/pr/archives/pr_580_report.md (작성 후 push 됩니다).

본 PR 도 두 분의 협업 흐름의 우수한 사례입니다. Stage 1 분석·재현 → Stage 2 본질 → Stage 3 검증의 정밀한 LAYOUT_OVERFLOW 측정 패턴이 메인테이너 검증에서도 정량 입증으로 이어졌습니다. 감사합니다.

@edwardkim edwardkim closed this May 5, 2026
edwardkim added a commit that referenced this pull request May 5, 2026
- 처리 보고서 추가: mydocs/pr/archives/pr_580_report.md
  PR #580 (Task #577, @planet6897 / @jangster77) 핀셋 cherry-pick
  1 commit + 결정적 검증 + WASM 4,571,643 bytes + 광범위 페이지네이션
  sweep (164 fixture / 1,614 페이지 / 회귀 0) + 시각 판정 ★ 통과
- 검토 보고서 archives 이동:
  mydocs/pr/pr_580_review.md → mydocs/pr/archives/pr_580_review.md
- 5/5 orders 갱신: PR #580 항목 추가
edwardkim added a commit that referenced this pull request May 5, 2026
… 오분류 정정 — @planet6897 / Jaeook Ryu 3 commits + 시각 판정 ★ 통과)

PR #584 (Task #574, @planet6897 PR / Jaeook Ryu commit author):
- 본질 결함: is_heavy_display_face hardcoded list 에 'HY견명조' 잘못 포함 →
  CharShape.bold=false 무시되고 SVG 에 font-weight='bold' 강제 적용
- Stage 0 정밀 진단으로 이슈 본문 가설 정정: 쪽번호 '1' 출처는 본문 표 셀
  Shape TextBox 내부 literal text + IR 색상 #000000 ('회색' 가설 잘못,
  본질은 굵기만)
- 본질 정정 (단일 줄): hardcoded list 에서 'HY견명조' 제거
  ('HY견명조B' 명시 Bold variant 보존)
- TDD 흐름: Stage 2 RED + Stage 3 GREEN 분리

cherry-pick 3 commits:
- 6d193ec Stage 0: 정밀 진단 + 진단 스크립트 (examples/inspect_574.rs)
- ef6583c Stage 2: TDD 통합 테스트 + 단위 테스트 갱신 (RED)
- 0002b49 Stage 3: fix 적용 (RED → GREEN)

옵션 C 충돌 통합: integration_tests.rs 의 test_521/test_552 (HEAD) 보존 +
test_574 (ef6583c) 추가.

검증:
- cargo test --lib --release 1132 passed (test_574 RED → GREEN, baseline +1)
- svg_snapshot 6/6 / issue_546 1 / issue_554 12 / clippy 0 / build --release
- WASM 4,581,498 bytes (PR #580 baseline +9,855 bytes)
- 광범위 페이지네이션 회귀 sweep: 164 fixture (158 hwp + 6 hwpx) /
  1,614 페이지 / 페이지 수 회귀 0
- SVG 정량 측정: font-weight='bold' 출현 횟수 -1,241건 제거
  (exam_science -82 / exam_kor -759 / exam_eng -156 / exam_math -244)
- 페이지 1 쪽번호 '1' 권위 케이스 검증 (HY견명조 font-size=44 우상단)

시각 판정 ★ 통과 — Canvas + SVG 양쪽 통과 (HY견고딕 의 굵음 영역은
본 PR 의 의도된 보존 영역으로 별도 task).

closes #574.
edwardkim added a commit that referenced this pull request May 5, 2026
v0.7.9 후속 patch 사이클 (5/4 ~ 5/6).

## 신규 기능

- **CLI 바이너리 릴리즈** (Issue #608/#612, @almet 의 요청)
  - 4 플랫폼 GitHub Release 자산 첨부 (Linux x86_64 / macOS x86_64+aarch64 /
    Windows x86_64) + SHA-256 체크섬
- **PNG raster backend** (PR #599, @seo-rii) — render P4 단계
  - native Skia 기반 PageLayerTree → PNG export, native-skia feature gate
  - **AI 파이프라인 + VLM 연동 도입** (메인테이너 후속 정정):
    - --vlm-target claude (1568 longest edge / 1.15 MP, Claude Vision 정합)
    - --scale / --max-dimension (자동 scale 계산)
    - export-png CLI 명령 + 매뉴얼 (한글 + 영문 dual)
    - 한글 폰트 fallback chain + char 단위 fallback (공백 두부 정정) +
      --font-path 동적 로딩

## 외부 PR cherry-pick (13 PR / 7 컨트리뷰터)

- @planet6897 / Jaeook Ryu (협업): PR #587/#589/#561/#564/#570/#575/
  #580/#584/#592/#593/#567
- @oksure (Hyunwoo Park): PR #600 (closes #513)
- @seo-rii: PR #599 (refs #536)
- @cskwork / @johndoekim / @nameofSEOKWONHONG / @jangster77 — 사이클 누적

## 메인테이너 정정

Skia 폰트 영역 5개 정정 (한글 fallback / font-path / char-fallback /
VLM 옵션 / export-png CLI).

## 인프라

- CI 빌드 안정성 (Cargo.toml [[example]] required-features)
- 광범위 페이지네이션 회귀 sweep 도구 (164 fixture / 1,614 페이지 자동)

## 후속 이슈

- #613 (VLM 프리셋 확장)
- #614 (DPI 메타데이터)
- #615 (pua_oldhangul.rs U+F53A 한컴 정합)
- #598 (rhwp-studio 각주 삭제, 외부 컨트리뷰터 공개)

## 잔여 PR (v0.7.11 후속 patch)

PR #601, #602 (@oksure) / PR #607 (@dicebattle) / PR #609 (@jangster77,
Task #604) / PR #611 (@kihyunnn).

상세: CHANGELOG.md (한글) / CHANGELOG_EN.md (영문).
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.

2 participants