delphi-bitfont-viewer
yaff 비트맵 폰트(IBM VGA 8x16) 파서와 델파이 VCL 뷰어 샘플 - A yaff bitmap font parser and VCL viewer for Delphi
- Active · last change 8-5-2026
- ★ 3 on GitHub
README
yaff 비트맵 폰트 뷰어 (Delphi)
한국어 | English ·
델파이 개발자 동호회에 소개된 비트맵 폰트를 보고, 도스(DOS) 시절의 추억이 떠올라 만들었습니다.
흑백 CRT 모니터에 16색으로 찍히던 그 8x16 픽셀 글자들, ╔═══╗ 로 창을 그리고 ░▒▓█ 로 그라데이션을
흉내 내던 시절이 있었죠. hoard-of-bitfonts 저장소에서
IBM VGA ROM 폰트가 yaff 라는 사람이 읽을 수 있는 텍스트 포맷으로 보존되어 있는 걸 보고,
델파이로 파서와 렌더러를 만들어 그 시절 화면을 다시 띄워 봤습니다.
그리고 한글도 지원합니다. 8x16 영문 폰트에 16x16 완성형 한글을 얹어, 도스 시절 한글 화면 그대로 영문과 한글이 한 줄에 섞여 나옵니다.

무엇이 들어 있나
| 경로 | 설명 |
|---|---|
src\BitFonts.Yaff.pas |
.yaff 파일 파서 + 폰트 모델 (VCL 비의존, 순수 RTL). 읽기·병합·저장 지원 |
src\BitFonts.Yaff.Render.pas |
TCanvas 렌더러 (정수배 확대 · 픽셀 격자 · 반각/전각 혼용) |
demo\ |
VCL 뷰어 샘플 (YaffDemo.dpr) |
tools\YaffMerge.dpr |
여러 yaff 폰트를 하나로 합치는 콘솔 도구 |
tools\make-hangul-font.ps1 |
완성형 한글 폰트(dos_ko_16.yaff) 재생성 스크립트 |
fonts\vga_8x16.yaff |
IBM BIOS VGA 8x16 (CP437, 256 글리프) |
fonts\dos_ko_16.yaff |
영문 8x16 + 완성형 한글·한자 16x16 (7,033 글리프) |
build.ps1 |
dcc64 / brcc32 직접 호출 빌드 스크립트 |
한글 지원
폰트
fonts\dos_ko_16.yaff 는 두 폰트를 합쳐 만든 것입니다.
| 영역 | 크기 | 글리프 수 | 출처 |
|---|---|---|---|
| 영문·기호 (CP437) | 8x16 | 256 | IBM BIOS VGA |
| 완성형 한글 | 16x16 | 2,591 | 대우 CPC-400 (아이큐) |
| 한자 | 16x16 | 3,606 | 대우 CPC-400 |
| 전각 기호·자모 등 | 16x16 | 580 | 대우 CPC-400 |
한글은 8비트 대우 MSX(아이큐) ROM 폰트라서, 요즘 폰트에는 없는 그 시절 특유의 흘림체 느낌이 살아 있습니다.
완성형 2,591자는 KS C 5601 완성형 2,350자를 포함합니다. 유니코드 11,172자 전부는 아니라서
뷁 같은 음절은 없고, 없는 글자는 빈 사각형으로 표시됩니다.
(자모를 조합해 11,172자를 모두 찍는 조합형 지원은 TODO 에 적어 두었습니다.)
반각/전각 혼용
영문은 8픽셀, 한글은 16픽셀을 차지합니다. 렌더러는 글리프마다 자기 폭만큼만 자리를 차지하도록 advance 기반으로 배치하므로, 한 줄에 영문과 한글이 섞여도 도스 화면처럼 칸이 정확히 맞습니다.
+--------------------------------+
| IBM VGA 8x16 + 한글 CPC-400 | <- 한글 1ìž� = ì˜�문 2ìž� í�
+--------------------------------+폰트 다시 만들기
원본 한글 폰트(약 3MB)는 저장소에 두지 않고, 필요할 때 내려받아 합칩니다.
.\build.ps1 # YaffMerge.exe 빌드
.\tools\make-hangul-font.ps1 # 원본 내려받기 + 병합 -> fonts\dos_ko_16.yaff직접 다른 폰트를 합치고 싶다면:
bin\YaffMerge.exe fonts\out.yaff fonts\vga_8x16.yaff 다른한글폰트.yaff -name:"내 폰트"같은 유니코드 코드포인트가 이미 있으면 앞쪽 폰트가 이깁니다. 셀 크기와 서수(0x) 레이블은
기준 폰트의 것을 유지하므로, 합친 뒤에도 CP437 코드 페이지 표가 그대로 동작합니다.
데모 앱
- 텍스트 렌더링 탭 — 위쪽 메모에 입력한 내용이 그대로 비트맵 폰트로 그려집니다. 한글 입력도 됩니다.
- 코드 페이지 표 탭 — 폰트 인코딩(CP437)의 0x00~0xFF 글리프를 16x16 표로 보여 줍니다.
- 테마 4종 — IBM VGA(회색/검정), 흰 배경, 녹색 인광, 앰버 터미널.
- 배율 1x~12x — 보간 없는 정수배 확대라 픽셀 모양이 뭉개지지 않습니다.
- 픽셀 격자 — 4배 이상에서 글리프의 픽셀 경계를 표시합니다.
- 다른
.yaff파일도 [폰트 열기]로 불러올 수 있습니다.


빌드
Delphi 13 (Studio 37.0) / Win64 기준입니다.
.\build.ps1 # Debug 빌드 -> bin\YaffDemo.exe, bin\YaffMerge.exe
.\build.ps1 -Config Release
.\build.ps1 -Run # 빌드 후 실행IDE 를 쓴다면 demo\YaffDemo.dproj 를 열어 그냥 실행해도 됩니다.
빌드 스크립트는 brcc32 로 매니페스트 리소스(PerMonitorV2 DPI 인식 + 공용 컨트롤 v6)를 만든 뒤
dcc64 로 실행 파일을 만듭니다.
라이브러리로 쓰기
폰트 파싱과 렌더링은 데모와 분리되어 있어 그대로 가져다 쓸 수 있습니다.
uses
BitFonts.Yaff,
BitFonts.Yaff.Render;
var LFont := TYaffFont.Create;
try
LFont.LoadFromFile('fonts\dos_ko_16.yaff');
var LRenderer := TYaffRenderer.Create(LFont);
try
LRenderer.Scale := 3;
LRenderer.ForeColor := clSilver;
LRenderer.BackColor := clBlack;
LRenderer.DrawText(Canvas, '안녕하세요, DOS!'#13#10'╔══════╗', 10, 10);
finally
LRenderer.Free;
end;
finally
LFont.Free;
end;글리프 단위로 직접 다루고 싶다면:
// 유니코드로 조회 (u+ 레이블)
var LGlyph := LFont.FindGlyph('한');
// 폰트 자체 인코딩의 서수로 조회 (0x 레이블 — CP437 의 ♥)
var LHeart := LFont.FindGlyphByOrdinal($03);
for var Y := 0 to LGlyph.Height - 1 do
begin
WriteLn(LGlyph.RowAsString(Y)); // '.' 과 '@' 로 된 한 행
end;폰트를 합치거나 저장하는 것도 라이브러리에서 바로 됩니다.
LLatin.MergeFrom(LHangul); // 없는 코드포인트만 채워 넣는다
LLatin.SaveToFile('fonts\dos_ko_16.yaff');렌더러는 1:1 크기의 오프스크린 비트맵에 글리프를 찍은 뒤 StretchBlt(COLORONCOLOR) 로 확대합니다.
픽셀마다 FillRect 를 부르지 않으므로 한글이 가득한 화면도 빠르고, 보간이 없어 픽셀 폰트 특유의
각진 형태가 그대로 유지됩니다.
yaff 포맷 요약
name: IBM BIOS VGA 8x16 # �성 (key: value)
cell-size: 8 16
encoding: cp437
u+0041: # ë ˆì�´ë¸” - ìœ ë‹ˆì½”ë“œ 코드í�¬ì�¸íЏ
0x41: # ë ˆì�´ë¸” - í�°íЏ ìž�ì²´ ì�¸ì½”딩ì�˜ 서수
..@@.... # 들여쓴 줄� 비트맵 ('.' 여백, '@' 잉�)
.@..@...
@....@..한 글리프에 레이블이 여러 개 붙을 수 있고, 레이블은 항상 비트맵 앞에 옵니다.
파서는 u+ 레이블을 유니코드 사전에, 0x 레이블을 0~255 서수 배열에 등록해
양쪽 모두로 조회할 수 있게 합니다. 셀보다 넓은 글리프가 섞이면 spacing: multi-cell 로 표시합니다.
출처와 라이선스
- 코드·빌드 스크립트·문서: MIT 라이선스.
- 폰트 데이터 (
fonts\*.yaff) 는 MIT 적용 대상이 아닙니다 — 자세한 내용은 fonts/NOTICE.md.vga_8x16.yaff— robhagemans/hoard-of-bitfonts 의ibm/vga_8x16.yaffdos_ko_16.yaff— 위 폰트 + 같은 저장소의msx/msx-hangul-daewoo-cpc400.yaff를 합친 것- hoard-of-bitfonts 는 "비트맵 서체는 미국에서 저작권 대상이 아니며 영국에서는 25년 보호기간이 만료됐다"는 견해 아래 수집되었고, 수집자가 추가한 작업물은 CC0 로 공개되어 있습니다. 원본 ROM 폰트의 권리는 원저작자(IBM, 대우전자)에게 있으며, 사용 전 각자의 관할 법률을 확인하세요.
- yaff 포맷과 폰트 도구에 대한 자세한 내용은 monobit 을 참고하세요.

