FontBase 클래스
sfnt 형식 폰트 파일 생성의 공통 로직을 제공하는 추상 베이스 클래스입니다.
TTF(glyf/loca)와 OTF(CFF)는 sfnt 디렉터리 조립, checksum 계산,
head/hhea/OS/2 메트릭 자동 계산 등이 동일하므로 이 클래스에서 공유합니다.
윤곽 테이블(glyf/loca 또는 CFF), maxp 버전, sfnt version은
파생 클래스가 구현하는 추상 멤버로 구분됩니다.
문자 코드에서 글리프로의 매핑을 dictionary처럼 접근할 수 있습니다:
인덱서(font[charCode]), ContainsGlyph(int), TryGetGlyph(int, out Glyph),
RemoveGlyph(int), 그리고 foreach로 전체 매핑을 열거할 수 있습니다.
네임스페이스: VagabondK.OpenType
어셈블리: VagabondK.OpenType.dll
구문
public abstract class FontBase : IEnumerable<KeyValuePair<int, Glyph>>, IEnumerable
생성자
| 이름 | 설명 |
|---|---|
| FontBase() | FontBase의 새 인스턴스를 생성합니다. 글리프 0은 .notdef(테두리만 있는 사각형) 글리프로 자동 생성됩니다. |
속성
| 이름 | 설명 |
|---|---|
| CharToGlyph | 문자 코드에서 glyph ID로의 매핑입니다. |
| Glyphs | 전체 글리프 목록입니다. (glyph ID 순서, 0=.notdef) .notdef와 추가된 글리프를 결합하여 반환합니다. 반환된 Glyph는 실제 인스턴스이므로, AdvanceWidth/ LeftSideBearing 또는 Outline을 수정하면 다음 ToBytes()에 반영됩니다. |
| Head | head 테이블입니다. 글리프에서 자동 계산되는 바운딩 박스 값을 제외하고 속성을 조작할 수 있습니다. |
| Hhea | hhea 테이블입니다. 글리프에서 자동 계산되는 메트릭 값을 제외하고 속성을 조작할 수 있습니다. |
| this[int] | 문자 코드에 해당하는 글리프를 가져오거나 설정합니다. get: 해당 글리프를 반환하며, 매핑되지 않은 문자는 null입니다. set: 글리프를 추가하거나 교체합니다(upsert). 이미 매핑된 문자 코드는 그 자리에서 글리프만 교체되어 glyph ID가 유지되고, 새로운 문자 코드는 마지막 glyph ID로 추가됩니다. 반환된 Glyph는 실제 인스턴스이므로, AdvanceWidth/ LeftSideBearing 또는 Outline을 수정하면 다음 ToBytes()에 반영됩니다. |
| Name | name 테이블입니다. 폰트 이름 및 메타데이터 속성을 조작할 수 있습니다. |
| Notdef | .notdef 글리프(glyph 0)입니다. .notdef은 "not defined"의 약어로, cmap에 매핑되지 않은 문자가 렌더링될 때 사용되는 글리프입니다. 매핑되지 않은 문자는 전부 이 글리프로 표시되므로, advance width가 0이면 문자들이 같은 위치에 겹쳐 표시됩니다. 기본값은 missing glyph로 통용되는 테두리만 있는 사각형입니다. |
| Os2 | OS/2 테이블입니다. 글리프에서 자동 계산되는 문자 범위 값을 제외하고 속성을 조작할 수 있습니다. |
| Post | post 테이블입니다. 밑줄 및 이탤릭 각도 속성을 조작할 수 있습니다. |
| SfntVersion | sfnt version 필드에 기록할 값입니다. TTF는 0x00010000, OTF는 0x4F54544F('OTTO')입니다. |
메서드
| 이름 | 설명 |
|---|---|
| AddGlyph(int, Glyph) | 문자 코드에 해당하는 글리프를 추가합니다. 글리프 0은 .notdef(누락 문자 글리프)로 자동 생성되며, cmap에 매핑되지 않은 문자는 이 .notdef 글리프로 렌더링됩니다. |
| ContainsGlyph(int) | 문자 코드가 글리프에 매핑되어 있는지 확인합니다. |
| CreateOutlineTables(int, int, int, int) | 윤곽 테이블을 생성합니다. TTF는 glyf/loca, OTF는 CFF 테이블을 반환합니다. |
| GetEnumerator() | 문자 코드에서 글리프로의 전체 매핑을 charCode 오름차순으로 열거합니다. |
| Load(Stream) | sfnt 형식 폰트 파일을 스트림에서 읽어 FontBase로 재구성합니다. sfnt version 필드로 폰트 타입을 자동 감지합니다: 0x00010000 → TtfFont, 0x4F54544F('OTTO') → OtfFont. 이 구현은 이 라이브러리가 생성한 폰트(셀프 리더)만 지원합니다. |
| Load(string) | sfnt 형식 폰트 파일을 파일에서 읽어 FontBase로 재구성합니다. Load(Stream)과 동일하며, 파일 확장자가 아닌 sfnt version 필드로 타입을 감지합니다. |
| RemoveGlyph(int) | 문자 코드에 해당하는 글리프를 제거합니다. glyph ID는 0..n-1로 연속해야 하므로, 제거된 글리프 이후의 glyph ID는 1씩 감소합니다. |
| Save(Stream) | sfnt 형식 폰트 파일을 스트림에 저장합니다. ToBytes()와 동일한 바이트를 기록합니다. 스트림의 소유권은 호출자에게 있으며, 이 메서드는 스트림을 닫지 않습니다. |
| Save(string) | sfnt 형식 폰트 파일을 파일로 저장합니다. |
| ToBytes() | sfnt 형식 폰트 파일 바이트 배열을 생성합니다. 윤곽/hmtx/cmap/maxp 테이블을 생성하고, 글리프에서 자동 계산된 값을 head/hhea/OS/2 테이블에 반영한 후, sfnt 테이블 디렉터리와 함께 조립합니다. head의 checkSumAdjustment는 0xB1B0AFBA - 전체 폰트 checksum으로 계산됩니다. |
| TryGetGlyph(int, out Glyph) | 문자 코드에 해당하는 글리프를 시도하여 가져옵니다. |
| Validate() | 폰트 상태를 검사하여 오류와 경고 목록을 반환합니다. 글리프/테이블 설정이 모두 완료된 후(상태 단위 불변식)에 호출해야 합니다. 값 단위(설정 시점) 검사는 이미 생성자/속성에서 fail-fast로 처리됩니다. 이 메서드는 파일을 수정하지 않으며, 검사만 수행합니다. |
| ValidateOutline(List<ValidationResult>) | 윤곽 테이블(glyf/loca 또는 CFF)에 대한 추가 검사를 수행합니다. 기본 구현은 아무것도 하지 않으며, OTF(CFF)는 CFF 전용 검사를 오버라이드합니다. |