크라우니워드프로세서 기초도구 — 도형글상자.한선
개요
크라우니워드프로세서(
/Users/ef/crowny-word/) 기초도구 시리즈에 "도형·글상자(캔버스 개체)" 도메인을 완전 한선씨로 추가. 텍스트박스(내부 워드랩 포함)와 사각형/타원/선 도형을 하나의 캔버스(z순서 배열)에서 생성·이동·크기변경·z순서 조정·겹침검사·히트테스트·렌더명령 생성·직렬화/역직렬화하는 12개 공개 함수 + 내부 헬퍼로 구성.
무엇을 했는지
파일: /Users/ef/crowny-word/도구/도형글상자.한선 (완전 자기완결, 가져오기 없음)
데이터 표현: 개체(레코드) = "id|타입|a|b|c|d|워드랩|텍스트" 파이프 8필드 단일라인 문자열. 캔버스 = 레코드 배열, 배열 순서 자체가 z순서(인덱스0=맨뒤, 마지막=맨앞/최상단).
글상자/사각형/타원: (a,b,c,d) = (x,y,w,h)
선: (a,b,c,d) = (x,y,dx,dy), 즉 (x,y)→(x+dx,y+dy)
제약: 텍스트/워드랩 필드에 | 또는 \n 금지(렌더명령생성.한선과 동일 관례, 이스케이프 미구현)
공개 함수 12개(스펙 전부): 글상자생성·이동·크기·텍스트설정·도형생성·도형렌더명령·z순서·겹침검사·히트테스트·목록·직렬화·역직렬화
내부 헬퍼: 워드랩 6종(글리프비율/글리프폭/문자열폭/어절분리/강제분할픽셀/줄단어랩픽셀 — 렌더레이아웃.한선 계보 그대로 이식), 나누기/합치기(렌더명령생성.한선 이식), 레코드생성/필드ID·타입·A·B·C·D·워드랩·텍스트 getter, 다음ID사용가능, 개체인덱스, 개체찾기, 개체Bbox(AABB, 선은 두 끝점 정규화)
글상자 워드랩: 글자크기 고정 10(픽셀 근사, ASCII 60%/비ASCII 100% 글리프비율), 줄높이 고정 14(렌더 시)
도형렌더명령: 사각형/타원/선은 단일 명령 라인, 글상자는 배경 사각형 1줄 + 워드랩 줄마다 글자 명령 라인을 "\n"으로 조인
z순서(앞/뒤): 대상 레코드를 배열에서 제거 후 끝(앞)/맨앞(뒤)으로 재삽입 — 재대입 패턴 준수(설정()/추가() 후 항상 반환값 캔버스로 재대입)
겹침검사/히트테스트: AABB 바운딩박스 기반. 히트테스트는 배열 뒤에서부터(최상단부터) 탐색, 선은 두께 근사로 3px 여유 확장컴파일/실행 검증
cd /Users/ef/CrownyOS/crownyc
./hanseonc_high /Users/ef/crowny-word/도구/도형글상자.한선 > /tmp/도형글상자.toau 2>/tmp/도형글상자.err
./crownyc run /tmp/도형글상자.toau
결과:
검사: PASS 31/31 (최초 시도 30/31 — 히트테스트 테스트 케이스가 z순서 변경 후 겹치는 다른 개체를 잘못 기대해 FAIL, 구현이 아니라 테스트 기대값 오류로 확인 후 독립 캔버스로 재작성해 수정)
크라우니코드 사용
- 작성 전 조회:
crownycode-learn.sh search "도형 글상자" / "히트테스트 z순서" / "워드랩" / "직렬화 역직렬화" — "워드랩" 관련만 HIT(fn_문단배치_워드랩 계열, 렌더레이아웃.한선/문단배치.한선 계보) → 워드랩 6헬퍼 그대로 이식 재사용. 나머지(캔버스/z순서/히트테스트/직렬화 등)는 MISS → 신규 생성.
- 작성 후 learn add 4건: 캔버스개체z순서, AABB겹침검사바운딩박스, 히트테스트최상단개체탐색, 개체레코드파이프8필드파싱
- 크라우니코드: lookup HIT 1건(워드랩, 재사용) / MISS 3건+(생성) / learn 추가 4건
관련 파일
/Users/ef/crowny-word/도구/도형글상자.한선 (신규, 본 작업 산출물)
/Users/ef/crowny-word/도구/렌더레이아웃.한선 (워드랩 헬퍼 이식 원본)
/Users/ef/crowny-word/도구/렌더명령생성.한선 (나누기/합치기 헬퍼 이식 원본, 명령 포맷 관례 참조)
/Users/ef/crowny-word/도구/ 기존 10파일(텍스트버퍼·커서선택·편집연산·실행취소·검색치환·서식런·문단배치·문서파일·한글통계·클립보드뷰) — 수정하지 않음(가드레일 준수)
잔여 이슈
- 텍스트/워드랩 필드의
| \n 이스케이프 미구현(렌더명령생성.한선과 동일 범위 밖 한계) — 캔버스 상위 레이어에서 사용자 입력 텍스트에 파이프/개행이 들어올 경우 사전 검증 또는 이스케이프 계층 필요.
- 워드랩 글자크기(10)/줄높이(14)가 상수 고정 — 실제 워드프로세서 폰트/크기 시스템(서식런.한선 등)과 연동하려면 크기 파라미터화 필요.
- 겹침검사/히트테스트는 AABB 근사(선은 3px 여유) — 회전 도형이나 정밀 픽셀 단위 히트가 필요하면 별도 정밀 판정 로직 추가 필요.