크라우니폰트 — 블록체인 100세대 (순수 한선씨 TTF 엔진)
개요
한글 우선 + 라틴. 기존 폰트를 스크리닝해 장단점을 분석하고, 같은 이름(Crowny)이지만 블록체인으로 매 세대 미세하게 더 고급스러워지는 100세대 폰트 계보를 순수 한선씨로 생성. 외부 폰트 툴(fontTools/fontforge) 일절 불사용.위치: /Users/ef/crowny-fonts/
무엇을 했는지
1. 순수 한선씨 TTF 에미터 (핵심 관문 돌파)
버퍼바이트(buf,off,0-255) + 절단나눗셈(738)로 빅엔디언 바이너리 직접 생성비트곱/오른시프트)은 균형3진 기반이라 바이너리 바이트추출 불가(300&255=219). 나눗셈은 자연반올림(200/256→1). → 절단나눗셈만이 정답(200/256→0)버퍼읽기(F,pos,len)로 청크 덧쓰기 스트리밍버퍼잘라(buf,시작,**끝**) — VM 시그니처는 끝(절대), 컴파일러 주석은 "길이"로 오기2. 글리프 엔진 (굵은-획 파라메트릭)
획추가(x0,y0,x1,y1,w)= 굵은 직선을 4점 윤곽으로 (대각선 가능, 굵기 파라미터화)조인비= 획 끝 연장으로 모서리 접합 (노치↔nub 균형, gen별 정제)링추가= 단위원 테이블(8/12/16/24각) — 사인/코사인 정수라디안 제약 회피- 한글 67자모(초19중21종28) + 6유형 조합 → 11,172 음절 알고리즘 생성
- 라틴 A-Z + 0-9 + 기본 문장부호
- 함정: 배열
추가재할당이 48M 아레나 누수 → 사전할당 배열 +설정(제자리). loca/hmtx는 배열 4095캡 초과 → 버퍼 스트리밍
3. 블록체인 진화 엔진
진화.한선: 체인.psv 마지막줄 읽어 다음 블록 생성SHA256(이전해시 + 세대 + 파라미터) — 위변조 불가 계보/tmp/crowny_param.txt(엔진 입력) + 체인.psv(원장) append4. 도구 & 검증
build/검증.c(CoreText 유효성·글리프수·cmap),build/render.c(PNG),build/비교.c(세대 스택)- 검증 통과: glyphs=11268, upm=729, name="Crowny", A·가 매핑 OK, 렌더 깨끗
5. 스크리닝 리포트
스크리닝.md: Noto/Pretendard/Spoqa/나눔/본고딕/Apple SD 등 장단점 → 설계 반영- 계승: 전수커버·라틴한글조화·숫자가독·옵티컬. 회피: 거대파일·평범함·변형불가·느슨자간
관련 파일
폰트엔진.한선— 파라메트릭 TTF 생성기 (한글+라틴)진화.한선— 블록체인 정제 엔진진화.sh— 100세대 드라이버쇼케이스생성.sh— 체인.psv → 쇼케이스.html서버.sh— font.crowny.org:9932 정적 서버스크리닝.md— 기존 폰트 분석체인.psv— 블록체인 원장 (height|hash|prevhash|params|품질|파일)fonts/crowny-gen001..100.ttf— 100세대 폰트 (각 ~2.8MB, 11,268 글리프)build/검증.c · render.c · 비교.c— 검증/렌더 도구
잔여 이슈
- 글리프 품질은 "기하학 모노라인" 수준 — gen1 거침은 의도(정제 출발점)이나 대각선 접합·곡선은 추가 정제 여지
- 소문자는 현재 대문자 축소형(간이) — 진짜 소문자 디자인 미구현
- 한글 ㅇㅎ 원이 다각형 근사 — 진짜 베지어 곡선은 미지원(VM on-curve만 사용, off-curve 제어점 추가 시 더 부드러움)
- 서빙은 정적 python 서버(부득이) — 한선씨 HTTP는 프로덕션 미성숙(메모리 함정)
- 향후: 베지어(off-curve 제어점) 도입, GPOS 커닝, 진짜 소문자/이탤릭, 가변폰트(fvar) 축으로 100세대를 단일 가변폰트화
재설계 (2026-06-18 오후) — 사용자 피드백 반영: "올바른 폰트 100가지 글씨체"
방향 전환
- 사용자 명확화: ①100세대(한 디자인 정제)가 아니라 100가지 글씨체(고딕·명조 등) ②0부터 기하학 생성은 가독성 미달 → 기존 폰트 학습/활용해 읽히는 폰트 재설계
- 0부터 자모합성(폐기, fonts/DEPRECATED) → 실제 폰트 스크리닝 → 변형/리브랜딩 으로 전환
실제 스크리닝 (사용자 재요청)
build/스크리너.py(순수 struct, fontTools 불필요) — 21종 OFL 한글폰트 실측: upm/글리프/단순복합/한글커버리지/메트릭build/비교(CoreText 렌더) — 시각 스크리닝build/screening.png- 결과
스크리닝.psv+스크리닝.md: 전수+단순글리프(NotoSansKR/NotoSerifKR/AppleGothic/GamjaFlower/HiMelody)=변형베이스, 복합대량(Nanum)/가변(Noto)=리브랜딩, 디스플레이(21%)=액센트
100종 카탈로그 (혼합안 C)
build/카탈로그.py— 순수 struct TTF round-tripper: name 리브랜딩 + glyf 점변형(기울기kx/장평sx/높이sy) + 압축인코딩(short delta+repeat) + 가변/힌팅 테이블 제거 + head checksumAdjustmentbuild/카탈로그생성.py— 14 변형베이스×스타일(R/Italic/Oblique/Condensed/Wide/Tall/CondIt/WideIt/ExtraCond/ExtraWide) + 6 리브랜딩 = 100종catalog/001..100-*.ttf(476MB) — 전수 검증 OK=100, 전부 한글 매핑, 전부 읽힘카탈로그.psv매니페스트,쇼케이스.html(100 @font-face),서버.sh(localhost:9932)
베이스 (OFL, bases/)
Noto Sans/Serif KR · Nanum Gothic/Myeongjo/Pen/Brush · Gowun Dodum/Batang · GamjaFlower · HiMelody · BlackHanSans · DoHyeon · Jua · Gugi · CuteFont · Gaegu · SongMyung · Dokdo · AppleGothic/Myungjo(시스템,로컬)잔여/주의
- AppleGothic/Myungjo 베이스 파생은 로컬 사용(Apple 독점) — 재배포는 OFL 베이스(Noto/Nanum/Gowun 등)로 교체
- 복합글리프 베이스(Nanum)는 변형 시 컴포넌트 offset 미변형 → 리브랜딩만 적용
- 한선씨 에미터(폰트엔진.한선)는 검증된 자산으로 보존 — 단 대용량 바이너리 폰트 파싱은 고수준 미지원(파일읽기바이트 없음)이라 카탈로그는 Python struct 사용
- 총 476MB — 배포 시 woff2 압축 권장
저작권 정리 (2026-06-18) — 100% OFL 배포 가능
사용자 질의("저작권 문제 없나") → 실측 후 수정:
- 문제: ①Apple 18종(AppleGothic/Myungjo 독점, 재배포 불가) ②Nanum 예약명("Nanum") 이름 잔존 ③OFL 라이선스 미동봉
- 수정: ①Apple 전량 제거 → OFL 베이스(NotoSansKR=Crowny Gothic, NotoSerifKR=Crowny Myeongjo 등) ②전 이름 순수 'Crowny ...'(원brand·예약명 배제) ③원저작권 보존(name ID 0)+OFL(13)+URL(14) 임베딩 ④catalog/OFL.txt + NOTICE.md(18패밀리 출처) + licenses/(원본별 18 OFL.txt)
- 검증: OK=100/100, 이름 위반 0건. 18 OFL 베이스(예약명: Nanum·Source만 — 이름서 배제)
- 결과: 100% OFL, 배포 가능(번들 한정, 파생본 OFL 유지). 412MB(woff2 권장)
- 패밀리: Gothic/Myeongjo/Round/Serif Soft/Hand/Script/Black/Display/Cute/Calli/Mini/Pencil/Classic/Brush/News/Book/Pen/Ink
재구성 v2 (2026-06-18 저녁) — 진짜 굵기축 (fontTools)
사용자 질의("약간만 수정한 버전?"·"두 고딕 혼합 중간수준?") → 검증 후 재구성:
- 확인: ①100종 중 18종이 이름만 바꾼 Regular(정직 고지) ②임의의 두 다른 폰트 직접 보간 불가(점구조 상이: Noto23/Nanum50/Gowun85) ③윤곽팽창 굵기합성은 한글에서 자기교차로 불안정(실증)
- 돌파: /usr/bin/python3(3.9.6)에 fontTools 설치 성공 → 가변폰트 인스턴싱
- 재구성
build/카탈로그3.py(fontTools): 가변 베이스 3종(NotoSansKR 100-900·NotoSerifKR 200-900·Hahmlet 100-900) → 진짜 설계 굵기 마스터(Thin~Black) 인스턴싱 + composite 정상 변형(기울기/장평, fontTools가 컴포넌트 처리) + OFL 리브랜딩(원저작권 보존) - 결과: 100종, 검증 OK=100/100, 이름위반 0, 굵기클래스 정확. 18 패밀리:
- 523MB. OFL.txt+NOTICE.md(18)+licenses/(20). 이전 struct 카탈로그/굵기합성은 폐기(fontTools가 우월)
studio.crowny.org/font 귀속 (2026-06-19)
- 신규 도메인은 게이트웨이 재시작 필요 → 이미 결선된 studio.crowny.org(:9933) 아래 /font 라우트로 귀속 → 재시작 없이 즉시 공개.
- crowny-studio/server.js에 /font 라우트 추가:
/font→studio-font.html,/font/<경로>→/Users/ef/crowny-fonts/ 정적서빙(경로탈출 가드, FM에 .ttf/.cif MIME). kill→launchd 재기동(워치독). - studio-font.html(build/studio-font생성.sh): TTF 100종 라이브 @font-face(/font/catalog/) + CIF 벡터 데모 이미지(/font/catalog-cif/, 글자별CIF비교) 섹션.
- 검증: https://studio.crowny.org/font 200, /font/catalog/.ttf 200(font/ttf), /font/cifont//.cif 200. 공개 시청 가능.
/font 페이지 품질화 + 폰트로딩 수정 (2026-06-19)
- 증상: 100종이 다 한가지 고딕으로 보임. 진단(Chrome 헤드리스 3종 테스트=구분 렌더 OK, 폰트·cmap 정상) → 원인=6MB×100=600MB 미로딩→시스템고딕 폴백.
- 수정: 각 폰트를 미리보기 글자만 subset→woff2(fontTools+brotli). 6076KB→평균50KB(260×), 100종 총 5.1MB → 즉시 로딩. web/.woff2. server.js FM에 woff2/woff MIME.
- 페이지 재설계: build/웹페이지생성.py — 타입 스페시먼(따뜻한 크림 톤, padella 참고). 패밀리 18 그룹 + 굵기 사다리(Thin~Black) + 이탤릭 + CIF 벡터/AA 섹션. studio-font.html.
- 검증: Chrome 헤드리스로 공개 https://studio.crowny.org/font 굵기축·서체 다양성 또렷(catalog-cif/스페시먼.png). woff2 MIME font/woff2 공개 200.
- 함정: studio 재기동은 단일 PID kill론 부족(워치독 잔존)→
pkill -f crowny-studio/server.js로 클린 재기동해야 새 코드 반영.
배포 번들 + AA 감소 (2026-06-19)
- AA 줄임: CIF 데모를 halo R=1+smooth=0(R3-soft→R1-sharp)로 재생성. 또렷·글로우 감소.
- OFL 재검증: 현재 100종 = 18 OFL 베이스(Apple 없음), 임베드 SIL OFL. 배포·OS탑재 가능(OFL.txt+NOTICE 동봉·예약명미사용·파생OFL유지·단독판매금지).
- 배포 번들 dist/crowny-fonts/: ttf(523M)+web-woff2(전체글리프 86M)+licenses(18)+OFL.txt+NOTICE.md+cif/+cifont/+README.md(라이선스·CrownyOS탑재안내).
- zip: crowny-fonts-web.zip(86M, woff2+cif+라이선스)·crowny-fonts-full.zip(259M, ttf포함). studio.crowny.org/font 하단 "다운로드·라이선스" 섹션(웹팩/전체팩/OFL/NOTICE 링크). 공개 200 검증.
글로벌 배포 개선 (2026-06-19)
- 메트릭 통일: 전 100종 세로메트릭 1조합(Typo 880/-220/120, hhea=Typo, Win 1000/300, USE_TYPO_METRICS) → OS·패밀리 줄간격 동일. (이전 11종 불일치 해소)
- 변수폰트 3종: Crowny Gothic/Myeongjo/Modern VF(wght 100/200~900). 인스턴서 re-default→Regular, fvar 인스턴스 subfamily/PS이름 재구성. catalog-vf/ + web-vf/. 페이지 굵기 슬라이더.
- FontBakery QA(opentype) 통과: 정적 100종 + VF 3종 모두 FAIL 0(WARN=post포맷3 등 niche). nameID5(버전) 누락 FAIL 수정.
- 라틴: 핵심 패밀리 이미 풀 라틴(7/7 é ñ ü ç à œ € · 23,174글자) — 별도 라틴 카탈로그 대신 페어링 유지(사용자 합의).
- 번들 재패키징: dist 웹팩 128M·전체 304M(ttf+web-woff2+variable+cif+licenses). studio.crowny.org/font 변수폰트 슬라이더+QA노트.
- 잔여: ttfautohint 미설치(변형폰트 stale 힌팅, 작은크기 윈도 미세) · 디스플레이 라틴 미흡(베이스 한계).
ttfautohint 재힌팅 (2026-06-19)
- ttfautohint 1.8.4 설치(brew). 변형 폰트 63종(Italic/Oblique/Condensed/Wide/Tall) 재힌팅 → stale 힌팅(원본윤곽용) 제거+재생성, 작은크기 윈도 렌더 개선. 미변형(원본 수동힌팅 우수)은 보존.
- 메트릭 보존 확인(Typo 880/-220/120). 렌더 검증 OK.
- 비용: 변형 ttf 크기 ~2배(힌팅 바이트코드, 6.5→13MB). woff2는 영향 미미(dist woff2 86→87M, 압축). TTF 번들 654M.
- dist/zip 재생성(웹 128M·전체 336M), 공개 200. QA 잔여 'missing-roman'(이탤릭↔로만 스타일링크)=다중스타일 카탈로그 특성, 기능무관(재힌팅과 무관).
라틴 보강 (2026-06-19)
- 약한 라틴 13패밀리(악센트 0~11/64) → 스타일/굵기 맞는 Crowny 풀-라틴 소스에서 악센트 글리프(0xC0-0x17F+€·따옴표) 합성 보강. build/라틴보강.py(DecomposingRecordingPen→TTGlyphPen, cmap/hmtx/glyphOrder 동기화).
- 매칭: Black→Gothic Black, Display→Gothic Bold, Classic/Book→Myeongjo, News→Gothic, Mini→Gothic Light, 나머지(Cute/Calli/손글씨)→Round.
- 결과: 59파일 평균 153글리프 보강. Latin-1 64/64 완비 + €. 유럽어 렌더 OK("Café Résumé Niño €99"), QA FAIL 0.
- dist/zip 재생성. 핵심패밀리(고딕/명조/모던/둥근)는 원래 완비라 제외. 손글씨 라틴 소스는 Round(근사) — 완벽 매칭은 향후.