Task #430: 그림 자동 크롭(FitToSize+crop) 공식 교정 — exam_kor 헤더 "국어 영역" 정상 표시#434
Closed
planet6897 wants to merge 5 commits into
Closed
Task #430: 그림 자동 크롭(FitToSize+crop) 공식 교정 — exam_kor 헤더 "국어 영역" 정상 표시#434planet6897 wants to merge 5 commits into
planet6897 wants to merge 5 commits into
Conversation
bin_id=27 (exam_kor 헤더) 의 실제 pic.crop 실측:
- orig=174000×26580 HU (=2320×354 px @ 75 HU/px)
- crop=(0, 0, 102366, 26580) → 좌측 58.8% 영역 ("국어 영역"만)
- 시나리오 (A) 확정: HWP에 명시 crop 있으나 렌더러 스케일 공식 오류
src/main.rs:1643 표 셀 그림 dump 형식에 orig/cur/crop 추가 (디버깅).
수행계획서 + 구현계획서 + Stage 1 보고서.
…공식 교정
ImageNode 에 original_size_hu: Option<(u32, u32)> 추가하고
pic.shape_attr.original_{width,height} 값을 채워 보낸다.
- picture_footnote.rs::layout_picture (표 셀 그림 — 본 케이스)
- picture_footnote.rs::layout_body_picture (body picture)
- layout.rs::layout_paragraph 의 TAC+빈 문단 경로
svg.rs 의 crop 스케일 공식 교정:
- 기존: scale_x = cr/img_w → src_w 항상 img_w (crop 무력화)
- 신규: scale_x = original_width_hu/img_w_px (정확한 HU/px)
- 헬퍼 compute_image_crop_src 추출 (pub(crate))
- 폴백: original_size_hu 가 None 이면 기존 공식 유지 (호환성)
단위 테스트 4건 추가:
- exam_kor 헤더 케이스 (174000×26580 HU, crop 좌측 58.8% → src=1364.88×354)
- crop=원본전체 케이스
- 좌상단 오프셋 케이스
- 폴백 검증
draw_image_with_fill_mode 시그니처에 original_size_hu 추가하고 crop 분기에서 svg::compute_image_crop_src 헬퍼 호출로 교체. SVG/Canvas 두 렌더러가 단일 진실 원천 공유. 검증: - cargo build --release (native) + cargo check --target wasm32 --lib 통과 - cargo test --release --lib: 1027 passed - cargo test --release --tests: 7 passed - exam_kor 페이지 1 헤더 viewBox="0 0 1364.88 354" → "국어 영역" 표시 확인 - clippy 기존 선존재 에러 2건은 본 변경과 무관
exam_kor 헤더 "국어 영역(A 형)" → "국어 영역" 으로 정정 완료. PDF 정답과 일치.
visible stroke 테두리 + border_spacing 좌/우 0 인 경우 paragraph margin 값을 inner padding 으로 추가 적용. 박스 위치는 box_margin 으로 분리해 그대로 유지. 배경(fill)만 있는 문단은 영향 없음.
edwardkim
added a commit
that referenced
this pull request
Apr 29, 2026
PR #434 / 이슈 #430 검토 중 발견된 정황 — 같은 hwp 를 한컴 2010 / 2020 / 한컴독스가 다르게 조판한다는 사실이 이미지 자동 크롭 영역까지 확장됨. 이 정황과 비교 자료를 모든 컨트리뷰터와 fork 한 사람들이 접근할 수 있도록 README 에 위키 링크 추가: - Contributing 섹션에 "한컴 PDF 는 정답지가 아닙니다" 항목 추가 - 신규 "위키 자료 (Wiki)" / "Wiki Resources" 서브섹션 추가 (한컴 PDF 환경 의존성 / HWP 스펙 정오표 / LINE_SEG vpos / Tab Leader / Export API / Cloudflared / Hyper-Waterfall / Investigation PR / Legal FAQ) 위키 페이지 자체는 별도 commit (rhwp.wiki repository) 으로 발견 정황 II (PR #434) 섹션 보강.
edwardkim
added a commit
that referenced
this pull request
Apr 29, 2026
- mydocs/pr/pr_434_review.md (옵션 3: 5 commits 모두 cherry-pick + 한컴 PDF 환경 의존성 II 발견 정황) - mydocs/pr/pr_434_report.md (cherry-pick 머지 결정 + 위키/README 후속 조치 정리) - mydocs/orders/20260429.md (PR 처리 + 위키 보강 + samples 추가 + README 보강 행 추가) 검증: 1066 passed + svg_snapshot 6/6 + issue_418 1/1 + clippy 0 + WASM 4,182,395 bytes 광범위 byte 비교: 309 중 40 페이지 변화 (의도된 정정) 한컴 PDF 환경 의존성 II: 한컴 2010 ↔ 2020 ↔ 한컴독스 차이 발견 → 위키 보강 + README 안내 시각 판정: 작업지시자 한컴 3종 PDF + SVG/Canvas 직접 통과
edwardkim
added a commit
that referenced
this pull request
Apr 29, 2026
…ng (cherry-pick @planet6897 5 commits)
edwardkim
added a commit
that referenced
this pull request
Apr 29, 2026
Owner
|
@planet6897 님 PR 감사드립니다. 메인테이너가 cherry-pick 으로 devel 에 적용 완료했습니다. 처리작성자 attribution 보존 5 commits 모두 cherry-pick (Task #430 4 commits + 별도 fix 1 commit):
devel 머지 commit: 검증
광범위 byte 단위 비교10 샘플 / 309 페이지 SVG 비교: 269/309 byte 동일, 40/309 차이 (의도된 정정). 차이 분포: exam_kor 22, exam_eng 8, 2025년 기부 6, synam-001 3, k-water-rfp 1. 시각 판정 (작업지시자 직접) + 한컴 PDF 환경 의존성 II 발견본 PR 검토 중 작업지시자가 한컴 3종 PDF 자료 제공:
한컴 2010 ↔ 한컴 2020 ↔ 한컴독스 모두 다르게 조판 정황 발견. 작업지시자 코멘트:
후속 조치 (메인테이너 처리)
이슈 #430 도 함께 close 됩니다. 본 PR 의 정밀 진단 (잘못된 crop 공식 → 올바른 HU/px 스케일 공식) 과 헬퍼 추출 (SVG/Canvas 단일 진실 원천 공유) 모두 좋은 설계였습니다. 감사합니다. |
This was referenced Apr 29, 2026
This was referenced Apr 30, 2026
edwardkim
added a commit
that referenced
this pull request
Apr 30, 2026
작업 시작점: k-water-rfp 16쪽 두 번째 표 셀 안 그림 셀 경계 초과. 시각 검증 중 1쪽 K-water 로고 결함도 발견 → 회귀 origin: PR #434 / Task #430 (commit a5541f9, @planet6897). 작업 범위 확장 통합. 본질: HWP 의 image bin 두 가지 케이스: - A: PNG = crop 적용 후 image (k-water-rfp pi=31 등) - B: PNG = 원본 image (exam_kor 헤더 등) Task #430 의 scale_x = orig_w / img_w_px 계산식이 케이스 B 만 정합, 케이스 A 회귀 (image 좌측 89.66% 만 보이고 1.069배 stretch = 확대). 정정: - compute_image_crop_src: HWP 표준 75 HU/px 룰 단일 계산식 (1 inch = 7200 HU = 96 px → 75 HU/px = DPI 96) - 호출부 셀 폭 클램프 3개소 (table_layout.rs / table_partial.rs / shape_layout.rs) — TAC 표 셀 / 도형 안 그림이 셀 폭 초과 시 비율 유지 클램프 검증: - cargo test --lib: 1078 passed (1075 + 단위 테스트 3 추가) - svg_snapshot: 6/6, issue_418: 1/1, clippy: 0건 - 작업지시자 시각 판정: 1쪽 + 16쪽 모두 정상 문서: - 트러블슈팅: mydocs/troubleshootings/image_crop_scale_rule.md - 위키: HWP 그림 Crop Scale 룰 작업지시자 통찰: "이건 휴리스틱이 아닙니다. 룰입니다." closes #477 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim
added a commit
that referenced
this pull request
Apr 30, 2026
edwardkim
added a commit
that referenced
this pull request
Apr 30, 2026
본 사이클 누적 정정 (5): - Task #474: RowBreak 표 보호 블록 정책 비적용 (k-water-rfp 5쪽) - Task #477: 표 셀 안 그림 클램프 + 이미지 Crop Scale 룰 정합화 (PR #434/Task #430 회귀) - Task #470 + #471: cross-column vpos-reset / 박스 stroke_sig (PR #472 cherry-pick) - Task #431: 분할 표 셀 내 문단 미출력 (단위 mismatch) + dump-pages 진단 도구 - Task #429: 표 셀 배경 image fill 미구현 (BorderFill image_fill 렌더링) 본 사이클 close 이슈 (10): - 정정 완료: #474 / #477 / #431 / #429 - 자동 해결 / 정합 점검: #426 / #407 / #231 / #345 - 구현 중지: #497 / #242 (클라우드 HWP 인라인 — 본 사이클 외) 마일스톤 v2.0.0 이관 (2): #272 (HwpCtrl Action) / #307 (이미지 드래그 앤 드롭) 샘플 추가: - samples/exam_eng-2010.pdf, exam_eng-2020.pdf (이슈 #345 정답지) - samples/hwpx/issue_241.hwpx + pdf (이슈 #241 본질 분석용) 검증: - cargo test --lib: 1080 passed - svg_snapshot: 6/6, issue_418: 1/1, clippy: 0건 - WASM 4,204,760 bytes - 작업지시자 시각 판정 통과 (Task #474 / #477 / #431 / #429)
jangster77
pushed a commit
to jangster77/rhwp
that referenced
this pull request
Apr 30, 2026
작업 시작점: k-water-rfp 16쪽 두 번째 표 셀 안 그림 셀 경계 초과. 시각 검증 중 1쪽 K-water 로고 결함도 발견 → 회귀 origin: PR edwardkim#434 / Task edwardkim#430 (commit a5541f9, @planet6897). 작업 범위 확장 통합. 본질: HWP 의 image bin 두 가지 케이스: - A: PNG = crop 적용 후 image (k-water-rfp pi=31 등) - B: PNG = 원본 image (exam_kor 헤더 등) Task edwardkim#430 의 scale_x = orig_w / img_w_px 계산식이 케이스 B 만 정합, 케이스 A 회귀 (image 좌측 89.66% 만 보이고 1.069배 stretch = 확대). 정정: - compute_image_crop_src: HWP 표준 75 HU/px 룰 단일 계산식 (1 inch = 7200 HU = 96 px → 75 HU/px = DPI 96) - 호출부 셀 폭 클램프 3개소 (table_layout.rs / table_partial.rs / shape_layout.rs) — TAC 표 셀 / 도형 안 그림이 셀 폭 초과 시 비율 유지 클램프 검증: - cargo test --lib: 1078 passed (1075 + 단위 테스트 3 추가) - svg_snapshot: 6/6, issue_418: 1/1, clippy: 0건 - 작업지시자 시각 판정: 1쪽 + 16쪽 모두 정상 문서: - 트러블슈팅: mydocs/troubleshootings/image_crop_scale_rule.md - 위키: HWP 그림 Crop Scale 룰 작업지시자 통찰: "이건 휴리스틱이 아닙니다. 룰입니다." closes edwardkim#477 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
배경
samples/exam_kor.hwp1쪽 상단 가운데 헤더 이미지가 SVG 출력에서국어 영역(A 형)으로 표시(원본 전체가 강제 스트레치되어 가로 폭 압축). 한컴 PDF는국어 영역만 표시 — PDF가 정답.근본 원인
HWP 그림 컨트롤(
Picture)의crop필드는 정상 파싱돼ImageNode.crop까지 전달되고 있었으나, SVG/Canvas 렌더러의 스케일 변환 공식이 잘못돼 crop이 사실상 무력화되고 있었다.잘못된 공식 (수정 전)
cr(crop 우경계 HWPUNIT) 을 마치 원본 이미지 우경계인 양 다뤘다. 결과적으로 어떤 crop 값이 와도 src 영역이 항상 이미지 전체와 일치해 crop 이 무효.올바른 공식 (수정 후)
본 이슈 케이스 입력값:
original_size_hu = (174000, 26580),img_px = (2320, 354)crop = (0, 0, 102366, 26580)scale = (75, 75.08) HU/pxsrc = (0, 0, 1364.88, 354)이 src 영역만 SVG
<svg viewBox=...>로 노출 → "국어 영역" 만 보임.변경
1. 모델 —
ImageNode.original_size_hu필드 추가src/renderer/render_tree.rsImageNode에original_size_hu: Option<(u32, u32)>필드 추가.pic.shape_attr.{original_width, original_height}와 동일 단위(HWPUNIT)기존에는 crop 만으로 src 좌표를 추정하려 했기 때문에 공식이 깨졌다. 원본 크기(HU)가 명시적으로 노드에 실리면
HU → px스케일을 직접 계산할 수 있다.2. 레이아웃 — ImageNode 채우기
src/renderer/layout/picture_footnote.rslayout_pictureoriginal_size_hu채움src/renderer/layout/picture_footnote.rslayout_body_picturesrc/renderer/layout.rs(~2614)src/renderer/layout/table_cell_content.rs:635None명시 (컴파일 호환)3. 렌더러 — 헬퍼 추출 + 공식 교정
src/renderer/svg.rscompute_image_crop_src(crop_hu, original_size_hu, img_w_px, img_h_px) -> (sx, sy, sw, sh)추가(pub(crate)).render_image_node의FitToSize+crop분기가 헬퍼 호출.original_size_hu가None인 폴백 동작 보존src/renderer/web_canvas.rsdraw_image_with_fill_mode시그니처에original_size_hu추가 + 동일 헬퍼 호출. SVG/Canvas 두 렌더러가 단일 진실 원천 공유4. 디버깅 보강
src/main.rsdump(라인 1643)orig,cur,crop출력 추가. Stage 1 조사 단계에서 적용한 후 디버깅 가치로 유지5. 테두리 문단 inner padding 수정 (커밋 07b6737)
본 브랜치에 함께 포함된 별도 fix 커밋이다.
border_spacing좌/우 0 인 경우 paragraph margin 값을 inner padding 으로 추가 적용. 박스 위치는box_margin으로 분리해 그대로 유지. 배경(fill)만 있는 문단은 영향 없음.src/renderer/layout/paragraph_layout.rs(+29 / -3)본 #430 (이미지 crop) 과는 코드 경로가 분리되어 상호 영향 없음.
검증
단위 테스트 (신규 4건,
src/renderer/svg/tests.rs)test_compute_image_crop_src_exam_kor_header— 본 이슈 케이스test_compute_image_crop_src_no_crop_full_image— crop 이 원본 전체와 일치test_compute_image_crop_src_offset_top_left— 좌상단 오프셋 + 우하단 잘림test_compute_image_crop_src_fallback_when_original_size_missing— 폴백 검증빌드/테스트
cargo build --release(native)cargo check --target wasm32-unknown-unknown --release --lib(WASM)cargo test --release --libcargo test --release --testscargo clippy --release --libtable_ops.rs:1007,object_ops.rs:298) 외 본 변경 추가 경고 0건시각 검증
수정 후 SVG 의 헤더 영역:
viewBox 가 정확히 좌측 1364.88×354 px(= "국어 영역" 영역)만 노출. 원본 JPEG 자체는 그대로 임베드되어 있어 향후 동일 자원 다른 crop 적용에도 재사용 가능.
변경 파일
영향 범위
FillMode::FitToSize + crop경로로 한정. crop 이 없는 경우 또는 다른 fill 모드는 영향 없음.original_size_hu = None폴백 분기를 유지해 채우지 않은 ImageNode 생성 사이트(인라인 TAC picture 등)도 종전 동작 보존.비범위 (Out of Scope)
본 이슈 수정 범위 외로 별도 이슈 분리 권장:
paragraph_layout.rs:1700, 1950, 2033의 ImageNode 생성 사이트는crop자체를 전달하지 않음. 본 케이스에서는 미사용 경로지만 동일 패턴 재발 가능.shape_layout.rs:959, 1133동일.(화법과 작문)등) + 그림(bin_id=27) 동시 보유 시 그림이 SVG 에 출력되지 않음. 본 이슈와 별개로, "텍스트와 그림이 함께 있는 셀 paragraph" 처리 결함.closes #430