Skip to content

Task #628: nested cell inline_shape_positions 키 충돌 정정 — 글상자 안 이미지 미렌더링#629

Closed
planet6897 wants to merge 1 commit into
edwardkim:develfrom
planet6897:pr-task628
Closed

Task #628: nested cell inline_shape_positions 키 충돌 정정 — 글상자 안 이미지 미렌더링#629
planet6897 wants to merge 1 commit into
edwardkim:develfrom
planet6897:pr-task628

Conversation

@planet6897

Copy link
Copy Markdown
Contributor

Summary

  • samples/exam_science.hwp 페이지 4 (20번 문항) 글상자 안 실린더 이미지(bin_id=2, 99.7×26.9mm) 미렌더링 결함 정정. 19번 (단일 nesting) 정상 / 20번 (이중 nesting: 외부 1x1 글상자 → 내부 2x3 표 → 셀 → 그림) 만 발현하던 비대칭의 근본 원인을 fix.
  • PageRenderTree.inline_shape_positions 의 키 (section, para, control)cell_path 차원을 추가하여 섹션 단위 vs 셀 단위 paragraph 인덱스 namespace 충돌 차단.

근본 원인

키의 para 가 두 가지 의미로 혼용됨:

  1. paragraph_layout 호출 시 → 섹션 단위 paragraph 인덱스 (예: 119, 127)
  2. layout_table → 셀 paragraph 호출 시 → 셀 내부 paragraph 인덱스 (cp_idx, 보통 0)

서로 다른 셀 컨텍스트가 동일 키 (0, 0, 1) 등을 공유 → 다른 paragraph 의 double-nested 셀 처리가 키를 미리 점유 → 20번 외부 1x1 표 처리 시 already_rendered_inline=true 오판 → table_layout.rs:1900 분기에서 내부 2x3 표의 layout_table 재귀 호출 스킵 → 그 안의 그림 미렌더.

수정

// 기존
inline_shape_positions: HashMap<(usize, usize, usize), (f64, f64)>

// 신규
pub type InlineShapeKey = (usize, usize, usize, Vec<(usize, usize, usize)>);
//                          section, para, control, cell_path
inline_shape_positions: HashMap<InlineShapeKey, (f64, f64)>

cell_path = 외→내 nesting 순서의 (control_index, cell_index, cell_para_index) 튜플 목록. 섹션 단위는 빈 Vec, 셀 단위는 CellContext.path 전체.

set/get_inline_shape_position 시그니처에 cell_ctx: Option<&CellContext> 추가, 호출처 13곳 일괄 패치 (셀 단위 9 + 섹션 단위 4). cursor_rect.rs:532 의 hit-test 루프에 cell_path.is_empty() 가드 추가.

변경 통계

 src/document_core/queries/cursor_rect.rs |  6 ++--
 src/renderer/layout.rs                   |  8 ++---
 src/renderer/layout/paragraph_layout.rs  | 12 +++----
 src/renderer/layout/shape_layout.rs      |  4 +--
 src/renderer/layout/table_layout.rs      |  4 +--
 src/renderer/layout/table_partial.rs     |  2 +-
 src/renderer/render_tree.rs              | 54 ++++++++++++++++++++++++-------
 7 files changed, 62 insertions(+), 28 deletions(-)

회귀 위험 평가

  • 낮음 — 키 namespace 분리만 수행, 값/계산 로직 무변경
  • 섹션 단위 호출(None 전달)은 기존 (sec, para, ctrl, []) 와 동등 → 기존 동작 유지
  • 셀 단위 호출(Some(ctx) 전달)은 stale-key 충돌 차단 → 의도된 변화만 (20번 이미지 +1)

Test plan

  • 타겟 결함 해결 — exam_science page 4: 3 → 4 images (20번 이미지 정상 위치 x=568 y=783.92 width=376.65 height=101.81 = 99.7×26.9mm IR 정확 매칭)
  • 회귀 sweep 5 샘플 56 페이지 — exam_eng/math/kor/social + exam_science page 1-3: SVG byte-identical (회귀 0)
  • cargo test --release --lib: 1134 passed, 0 failed
  • cargo test --release (전체 workspace): 모두 GREEN
  • cargo clippy --release --lib: 신규 경고 0 (사전 존재 경고 2건 — table_ops.rs:1007, object_ops.rs:298 의 panic-on-unwrap — 은 base branch 동일 발생, 본 변경 무관)

closes #628

🤖 Generated with Claude Code

…안 이미지 미렌더링

exam_science.hwp 페이지 4 (20번 문항) 글상자 안 실린더 이미지가 SVG 출력에서
누락되던 결함 정정. 동일 페이지 19번(단일 nesting)은 정상이나 20번(외부 1x1
글상자 → 내부 2x3 표 → 셀 → 그림, 이중 nesting)만 발현.

근본 원인: PageRenderTree.inline_shape_positions 의 키 (section, para, control)
에서 para 가 (1) 섹션 단위 paragraph 인덱스 (2) 셀 내부 paragraph 인덱스
(cp_idx) 두 컨텍스트에서 동일 namespace 공유. 다른 paragraph 의 double-nested
셀 처리가 (0, 0, 1) 키를 점유 → 20번 외부 1x1 표 처리 시 stale 값을 보고
already_rendered_inline=true 오판 → table_layout.rs:1900 분기에서 내부 2x3 표의
layout_table 재귀 호출 스킵 → 그 안의 그림 미렌더.

수정: 키에 cell_path: Vec<(ctrl_idx, cell_idx, cell_para_idx)> 추가, 섹션
단위는 빈 Vec, 셀 단위는 nesting 경로 전체. set/get_inline_shape_position
시그니처에 cell_ctx: Option<&CellContext> 추가, 호출처 13곳 (셀 9 + 섹션 4)
일괄 패치. cursor_rect.rs hit-test 루프에 cell_path.is_empty() 가드 추가.

검증:
- exam_science page 4: 3 → 4 images (20번 이미지 +1, x=568 y=783.92
  width=376.65 height=101.81 = 99.7×26.9mm IR 정확 매칭)
- exam_eng/math/kor/social + exam_science page 1-3 (5 샘플 55 페이지) SVG
  byte-identical (회귀 0)
- cargo test --release --lib: 1134 passed
- clippy 신규 경고 0

closes edwardkim#628

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request May 6, 2026
- Task #628 nested cell inline_shape_positions 키 충돌 정정 검토
- 본질 commit 04ce0d2 src 7 파일 (+62/-28) 단독 cherry-pick 가능
- 본 환경 검증: cargo test 1140 passed / clippy 0 / svg_snapshot 6/6
- 정량 측정: BEFORE 3 → AFTER 4 images (page 4), 위치 PR 본문 명세 100% 일치
- 광범위 sweep: 164 fixture / 1,684 페이지 / 차이 0
- WASM: 4,590,307 bytes (PR #578 baseline +7,151)
- 옵션 A (핀셋 cherry-pick) 권장, 작업지시자 시각 판정 + 결정 대기

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request May 6, 2026
- 9.5.1 핀셋 cherry-pick (c353cfc, author Jaeook Ryu 보존)
- 9.5.2 결정적 재검증 (1140 passed / clippy 0 / WASM 4,590,307 bytes)
- 9.5.3 광범위 sweep 164 fixture / 1,684 페이지 / 차이 0
- 9.5.4 SVG byte 차이 + 정량 측정 (page 4 BEFORE 3 → AFTER 4 images)
- 9.5.5 시각 판정 자료 안내 (output/svg/pr629_before vs pr629_after)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request May 6, 2026
…shape_positions 키 충돌 — @planet6897 / Jaeook Ryu 1 commit + 시각 판정 ★ 통과)
@edwardkim

Copy link
Copy Markdown
Owner

검토 + 핀셋 cherry-pick 머지 완료. 감사합니다.

처리 결과

결정적 재검증 (본 환경)

검증 결과
cargo test --lib --release 1140 passed (회귀 0)
svg_snapshot / issue_546 / issue_554 모두 통과
cargo clippy --release --lib 0건
Docker WASM 빌드 4,590,307 bytes (PR #578 baseline +7,151, render_tree.rs +43 LOC + InlineShapeKey Vec allocation 정합)

정량 측정 (PR 본문 100% 재현)

exam_science.hwp page 4 (20번 문항):

  • BEFORE: 3 images
  • AFTER: 4 images (+1, 실린더 이미지 정상 emit)
  • 추가 image 위치: x=568.00 y=783.92 width=376.65 height=101.81 — PR 본문 명세 99.7×26.9mm IR 정확 일치
  • page 1/2/3: byte-identical (회귀 0)

광범위 페이지네이션 회귀 sweep

  • 총 164 fixture (158 hwp + 6 hwpx) / 1,684 페이지 / 차이 0
  • 키 namespace 분리가 페이지네이션에 영향 없음

메인테이너 시각 판정 결과

통과 — exam_science page 4 의 20번 글상자 안 실린더 이미지 정상 위치 출력 확인.

본 PR 의 본질

PageRenderTree.inline_shape_positions 키 namespace 충돌 (섹션 단위 para vs 셀 내부 cp_idx 동일 namespace) 의 근본 원인 식별 + cell_path 차원 추가로 해결. 호출처 13곳 일괄 패치 + cursor_rect.rs hit-test 가드까지 정합. 19번 (단일 nesting) 정상 + 20번 (이중 nesting) 만 발현하던 비대칭의 origin 정확히 진단 + 정정.

feedback_rule_not_heuristic (휴리스틱 미도입, HWP IR CellContext.path 직접 사용) + feedback_hancom_compat_specific_over_general (키 namespace 분리만 수행, 값/계산 로직 무변경, 회귀 위험 영역 좁힘) 정합 패턴 우수.

수고하셨습니다.

@edwardkim edwardkim closed this May 6, 2026
edwardkim added a commit that referenced this pull request May 6, 2026
- mydocs/pr/archives/pr_629_report.md 신규 (처리 보고서)
- mydocs/pr/pr_629_review.md → mydocs/pr/archives/pr_629_review.md 이동
- mydocs/orders/20260506.md 갱신 (PR #629 항목 추가, 잔존 PR 12 → 11)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request May 6, 2026
- 9.5.1 핀셋 cherry-pick (5cdf8e5, author kihyunnn 보존)
- 9.5.2 결정적 재검증 (1140 passed / clippy 0 / npm build 정합 / WASM 4,590,307 bytes)
- 9.5.3 광범위 sweep 164 fixture / 1,684 페이지 / 차이 0
- 9.5.4 WASM 정량 정합 (PR #629 baseline 과 정확 일치 — Rust 영역 변경 0 정량 입증)
- 9.5.5 web 환경 시각 판정 자료 안내 (vite dev server, 7가지 권위 영역 명시)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim pushed a commit that referenced this pull request May 7, 2026
PR #668 (@metahan88-droid) 본질 cherry-pick.
컨트리뷰터의 4 커밋 (045ac58 + 7112183 + d7a8dc4 + 29ae304)을 src + .claude/skills + tools/rhwp-ingest 영역만 single squash로 통합.
mydocs 거버넌스 산출물 7파일은 PR #629 패턴에 따라 cherry-pick에서 제외.

신규 영역:
- tools/rhwp-ingest/schema/ingest_schema_v1.json — JSON Schema v7, auto_number 명시 필드
- src/parser/ingest/{mod,schema}.rs — IngestDocument/Question/Choice/Media/Placement serde 모델
- src/document_core/builders/{mod,exam_paper}.rs — IngestDocument → Document IR 변환
- src/main.rs — `rhwp build-from-ingest <json> [--media-dir <dir>] -o <out.hwpx>` 신규 명령
- .claude/skills/rhwp-exam-ingest/SKILL.md + helpers 4종 — Claude Code Skill 인프라
- Cargo.toml — serde_json = "1" 추가

부수 변경:
- search_query.rs Vec type 명시 (serde_json Vec inference 충돌 회피, 3 라인)
- .gitignore — `.claude/skills/` negate 패턴

검증 (본 환경):
- cargo test --release --lib: 1155 passed (parser::ingest 4 + builders 10 신규 포함, 회귀 0)
- cargo test --release (전체): 모두 GREEN
- cargo clippy --release --lib: 신규 경고 0
- cargo build --release: 무에러
- e2e 라운드트립: sample_minimal.json → HWPX 5,356 bytes (문제 3개, 문단 21개, ① ~ ⑤ 평문 보존)
- 회귀 sweep: aift/exam_kor/exam_math/exam_science/aift.hwpx 195 페이지 export-svg 모두 정상

본 단계 한계 (후속 이슈 영역):
- 이미지 → `[이미지: <ref>]` placeholder
- 모든 ParaShape default(id=0)
- 공유 지문 그룹 표현 부재
- (#665/#666/#667 영역은 메인테이너 권한 검토 후 마일스톤 분류)

closes #660 (Task #660 Neumann 본 작업 1)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim pushed a commit that referenced this pull request May 7, 2026
…tahan88-droid 4 commits squash, closes #660)

PR #668 (rhwp 첫 PR — @metahan88-droid) 본질 cherry-pick.
PR #629 권위 자료 패턴 정합:
- src + .claude/skills + tools/rhwp-ingest 영역 cherry-pick
- mydocs 거버넌스 산출물 7파일 cherry-pick에서 제외
- author email 보존 (한 <han@han-ui-Macmini.local>)
- single squash commit (4 본 작업 커밋 통합: 045ac58 + 7112183 + d7a8dc4 + 29ae304)

검증:
- cargo test --release --lib: 1155 passed (parser::ingest 4 + builders 10 신규 포함)
- cargo build --release: 무에러
- cargo clippy --release --lib: 신규 경고 0
- 회귀 sweep: aift/exam_kor/exam_math/exam_science/aift.hwpx 195 페이지 정상
- e2e 라운드트립: sample_minimal.json → HWPX 5,356 bytes (문제 3개, 문단 21개, ① ~ ⑤ 평문 보존)
- Docker WASM 빌드: 4,598,886 bytes (v0.7.10 + serde_json + ingest 영역)

시각 게이트웨이 (rhwp-studio 웹 에디터):
- sample_minimal.hwpx 변환 파이프라인 동작성 확인
- 발견: 1번 문제 두 번째 줄이 SVG에서는 1줄, WASM 웹 에디터에서는 2줄로 줄바꿈 (LineSeg simplistic 영역)
- 본 한계는 PR 본문 명시 한계(ParaShape default + 이미지 placeholder)와 동일 영역에 속함
- 후속 이슈 #665 (placement 4모드 + ParaShape + Picture/BinData IR 빌드)에서 본격 해결

본 단계 한계 (후속 이슈):
- 이미지 → [이미지: <ref>] placeholder
- 모든 ParaShape default(id=0)
- 공유 지문 그룹 표현 부재
- LineSeg simplistic (SVG/WASM 줄나눔 불일치)

closes #660
edwardkim pushed a commit that referenced this pull request May 7, 2026
- mydocs/pr/archives/pr_668_review.md (신규) — PR #629 권위 자료 정합 검토 + 옵션 A/B/C 분류 + 검토 영역 1~6
- mydocs/pr/archives/pr_668_report.md (신규) — 본질 cherry-pick + 결정적 재검증 + 시각 게이트웨이 발견 사항(LineSeg simplistic 영역)
- mydocs/orders/20260507.md — PR #668 (#660) 행 추가 (rhwp 첫 PR, 거버넌스 정합 모범 사례)

PR #668 처리 정합:
- PR #629 권위 자료 패턴 정합 (mydocs 영역 cherry-pick 제외, src + .claude/skills + tools/rhwp-ingest만 포함)
- single squash commit 80535a3 (author 한 <han@han-ui-Macmini.local> 보존, Co-Authored-By Claude Opus 4.7)
- devel merge 9fc8f32 + push 정합
- PR #668 close + Issue #660 close + 컨트리뷰터 한글 안내 코멘트
- 시각 게이트웨이 발견(LineSeg simplistic SVG/WASM 줄나눔 불일치)은 후속 #665에서 본격 해결

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request May 7, 2026
PR #621 의 외부 컨트리뷰터 거버넌스 산출물 영역 (수행 계획서 + 구현 계획서 + Stage 1 보고서 + 최종 보고서) 의 본 환경 명명 규약 영역 정합:

- task_m07_617 → task_m100_617 일괄 정정 (m07 영역은 v0.7.x 약어 영역, 본 환경 m100 영역의 v1.0.0 마일스톤 정합 영역)
- mydocs/plans/task_m100_617.md (수행 계획서)
- mydocs/plans/task_m100_617_impl.md (구현 계획서)
- mydocs/working/task_m100_617_stage1.md (단계별 보고서)
- mydocs/report/task_m100_617_report.md (최종 보고서, PR 두 번째 commit 79ed72b 영역에서 추출)

PR #629 / PR #668 의 본 환경 패턴 정합 — mydocs/ 거버넌스 산출물 영역의 외부 컨트리뷰터 영역 + 본 환경 명명 규약 영역의 정합 영역.
edwardkim pushed a commit that referenced this pull request May 13, 2026
#826)

PR #832 (@jangster77) GitHub diff 기반 cherry-pick.
mydocs 거버넌스 산출물 + pdf 권위 자료는 제외 (PR #629 패턴 정합).

#824 — HWP3 임베디드 그림 external_path 오표시:
  parser/hwp3/mod.rs pic_type == 0 가드 1줄

#825 — 머리말/꼬리말 picture 선택 + dialog:
  ImageNode.header_footer_ref 필드 + HeaderFooterImageRef/HeaderFooterKind 신규 타입
  layout_picture_full() + propagate_header_footer_ref() 후처리
  get/set_header_footer_picture_properties WASM API
  rhwp-studio: findPictureAtClick headerFooter 전파 + picture-props-dialog 분기

#826 — HWP3 PUA U+F080F/U+F0827 글리프 fallback:
  paragraph_layout.rs map_pua_bullet_char 2 케이스 추가
  U+F080F → U+2501 (━), U+F0827 → U+25A0 (■)

검증:
- cargo test --release --lib: 1235 passed
- cargo test issue_824/825/826: 9 passed (2+3+4)
- CI: Build & Test / Canvas visual diff / CodeQL 전부 통과

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
edwardkim pushed a commit that referenced this pull request May 13, 2026
PR #834 (@jangster77) GitHub diff 기반 cherry-pick.
mydocs 거버넌스 산출물 제외 (PR #629 패턴 정합).

(A) Save As — file:save-as command 신규 + Ctrl+Shift+S 단축키 + 메뉴 항목
    forceSaveAs 옵션으로 currentHandle 우회 → 항상 showSaveFilePicker
(B) Cancel fallback — isUserCancelError() 헬퍼로 AbortError + NotAllowedError 통합 검출
    권한 프롬프트 취소 시 fallback download 오발현 방지

검증:
- tsc --noEmit: 관련 파일 에러 0
- CI: Build & Test / Canvas visual diff / CodeQL 전부 통과

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
edwardkim pushed a commit that referenced this pull request May 13, 2026
…#842)

PR #843 (@planet6897) GitHub diff 기반 cherry-pick.
mydocs 거버넌스 산출물 제외 (PR #629 패턴 정합).

결함 #4 — cross-run 우측탭 블록 폭 합산 + in-run RIGHT 인라인 탭 body_right 정렬
결함 #3 — 단 구분선 line type 6→Dash, 7→Dot 매핑 추가
결함 #2 — 헤더 바 TAC 표 좌측 위치 정정 (alphanumeric 글자 시 leading=0)

검증:
- cargo test --release --lib: 1246 passed (회귀 0)
- SVG before/after 비교: 헤더 바 x좌표 122→94 + 우측탭 항목 좌측 이동 확인
- 시각 판정 ★ 통과 (PDF 권위 자료 대비)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
edwardkim pushed a commit that referenced this pull request May 13, 2026
PR #851 (@planet6897) GitHub diff 기반 cherry-pick.
mydocs 거버넌스 산출물 제외 (PR #629 패턴 정합).

typeset.rs start_new_column_band() 추가:
- 마지막 단 명시적 단나누기 시 같은 페이지 새 단-밴드 시작
- 배분(Distribute) 단에서만 적용, 일반(Normal/신문형) 단은 기존대로 새 페이지
- 떠다니는 개체가 있으면 새 페이지로 fallback

효과: shortcut.hwp 8→7페이지 (한컴 2022 PDF 정합)
회귀: 다른 다단 샘플 전부 무변화

검증:
- cargo test --release --lib: 1246 passed (회귀 0)
- SVG before/after: 8→7페이지 확인
- 시각 판정 ★ 통과

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
edwardkim pushed a commit that referenced this pull request May 13, 2026
PR #856 (@planet6897) GitHub diff 기반 cherry-pick.
mydocs 거버넌스 산출물 제외 (PR #629 패턴 정합).

typeset.rs 어울림 표 옆 문단 흡수 분기:
- 첫 LINE_SEG만 비교 → 마지막 LINE_SEG도 wrap zone 일치 확인
- 불일치 시 일반 텍스트 배치로 폴백
- 21_언어 14페이지 pi=300 본문 누락 해소

검증:
- cargo test --release --lib: 1246 passed (회귀 0)
- SVG before/after: 14페이지 [A] 박스 아래 본문 정상 렌더
- 웹 에디터 시각 판정 ★ 통과

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
edwardkim pushed a commit that referenced this pull request May 14, 2026
…atch (closes #857)

PR #859 (@johndoekim) GitHub diff 기반 cherry-pick.
mydocs 거버넌스 산출물 제외 (PR #629 패턴 정합).

cursor_rect.rs hit_test_native L648-666:
- cell-context TextRun 후보 중 first-match → bbox 면적 최소 best-match
- 외곽 1×1 wrapper placeholder가 inner cell TextRun을 선점하던 결함 해소
- Task #717 cell_bboxes selection과 동일 best-match 패턴으로 정책 통일

검증:
- cargo test --release --lib: 1246 passed (회귀 0)
- issue_table_vpos_01_page5_cell_hit_test: 13 passed
- 웹 에디터 동작 판정 ★ 통과

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
edwardkim pushed a commit that referenced this pull request May 14, 2026
PR #865 (@postmelee) GitHub diff 기반 cherry-pick.
mydocs 거버넌스 산출물 제외 (PR #629 패턴 정합).

Task #717 hit-test 정밀도 향상 후 중첩 셀 입력 경로가 로컬 기준으로 잘려
"컨트롤 인덱스 범위 초과" 에러 발생하던 회귀 정정:
- cursor_rect.rs — 중첩 표 결과를 문서 루트 기준 전체 cellPath로 보존
- rendering.rs — getPageOverlayImages 신규 API (입력 루프 렌더 비용 절감)
- wasm_api.rs — WASM 바인딩
- rhwp-studio — page-renderer 캐시 최적화 + wasm-bridge 추가

검증:
- cargo test --release --lib: 1246 passed (회귀 0)
- issue_850_answer_sheet_name_hit_test: 3 passed
- 웹 에디터 동작 판정 ★ 통과

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
edwardkim pushed a commit that referenced this pull request May 14, 2026
closes #864)

PR #869 (@jangster77) GitHub diff 기반 cherry-pick.
mydocs 거버넌스 산출물 제외 (PR #629 패턴 정합).

Task #860 — BMP MIME 변환 (PNG 재인코딩) + viewBox 자동 확장
Task #864 — WMF image x/y point_s_to_absolute_point 변환
         + HWP3 inline picture caption y_start 정합
         + set_inline_shape_position 추가로 중복 emit 방지
         + caption bottom까지 result_y 진행 (겹침 방지)
         + dump에 picture caption 정보 표시

fixture: hwp3-sample13/14 HWP3/HWP5/HWPX + PDF 권위 자료

검증:
- cargo test --release --lib: 1246 passed (회귀 0)
- cargo clippy: 경고 0
- SVG page 2/3/4 + 웹 에디터 시각 판정 ★ 통과

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (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.

2 participants