← 목록
AI 2026-06-18 13KB 읽기 15분

크라우니폰트 — 블록체인 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)
  • sfnt 10테이블: OS/2 cmap glyf head hhea hmtx loca maxp name post
  • cmap format4 (ASCII 0x20-7E + 한글 0xAC00-D7A3 2세그먼트), head checkSumAdjustment(16비트 반쪽 누산)
  • 단위 729 = 3⁶ (크라우니 균형3진 정체성)
  • 64KB 문자열캡 우회: 버퍼읽기(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(이전해시 + 세대 + 파라미터) — 위변조 불가 계보
  • 정제 단조증가: 제네시스(거침) → 타깃(고급) 선형 march
  • 굵기 92→74, 자간 78→54, 조인 12→42, 링 8각→24각, 품질 40→100
  • 해시 기반 미세변이(자간 ±1 텍스처) — 진짜 해시체인 산물
  • 산출: /tmp/crowny_param.txt(엔진 입력) + 체인.psv(원장) append
  • 4. 도구 & 검증

    • 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 checksumAdjustment
    • build/카탈로그생성.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 패밀리:
    Crowny Gothic(7굵기+이탤릭) · Myeongjo(7굵기) · Modern(6굵기) · News/Book(실제Bold) · Round/Serif Soft/Script/Hand/Pencil/Black/Display/Cute/Calli/Classic/Brush/Mini/Pen(변형)
    • 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(근사) — 완벽 매칭은 향후.