Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Catalog · How the catalog works
Anything · Lazarus or Delphi
Random projectRandom project

delphi-bitfont-viewer

yaff 비트맵 폰트(IBM VGA 8x16) 파서와 델파이 VCL 뷰어 샘플 - A yaff bitmap font parser and VCL viewer for Delphi

View on GitHub

Member rating

No ratings yet.

Sign in to rate this project.

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 기반으로 배치하므로, 한 줄에 영문과 한글이 섞여도 도스 화면처럼 칸이 정확히 맞습니다.

pascal
+--------------------------------+
| IBM VGA 8x16 + 한글 CPC-400    |     <- 한글 1� = �문 2� �
+--------------------------------+

폰트 다시 만들기

원본 한글 폰트(약 3MB)는 저장소에 두지 않고, 필요할 때 내려받아 합칩니다.

powershell
.\build.ps1                      # YaffMerge.exe 빌드
.\tools\make-hangul-font.ps1     # 원본 내려받기 + 병합 -> fonts\dos_ko_16.yaff

직접 다른 폰트를 합치고 싶다면:

powershell
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 기준입니다.

powershell
.\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 로 실행 파일을 만듭니다.

라이브러리로 쓰기

폰트 파싱과 렌더링은 데모와 분리되어 있어 그대로 가져다 쓸 수 있습니다.

pascal
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;

글리프 단위로 직접 다루고 싶다면:

pascal
// 유니코드로 조회 (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;

폰트를 합치거나 저장하는 것도 라이브러리에서 바로 됩니다.

pascal
LLatin.MergeFrom(LHangul);                       // 없는 코드포인트만 채워 넣는다
LLatin.SaveToFile('fonts\dos_ko_16.yaff');

렌더러는 1:1 크기의 오프스크린 비트맵에 글리프를 찍은 뒤 StretchBlt(COLORONCOLOR) 로 확대합니다. 픽셀마다 FillRect 를 부르지 않으므로 한글이 가득한 화면도 빠르고, 보간이 없어 픽셀 폰트 특유의 각진 형태가 그대로 유지됩니다.

yaff 포맷 요약

pascal
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.yaff
    • dos_ko_16.yaff — 위 폰트 + 같은 저장소의 msx/msx-hangul-daewoo-cpc400.yaff 를 합친 것
    • hoard-of-bitfonts 는 "비트맵 서체는 미국에서 저작권 대상이 아니며 영국에서는 25년 보호기간이 만료됐다"는 견해 아래 수집되었고, 수집자가 추가한 작업물은 CC0 로 공개되어 있습니다. 원본 ROM 폰트의 권리는 원저작자(IBM, 대우전자)에게 있으며, 사용 전 각자의 관할 법률을 확인하세요.
  • yaff 포맷과 폰트 도구에 대한 자세한 내용은 monobit 을 참고하세요.