- 175 Pixel Font Megapack yang dirilis pada Desember 2023 adalah proyek font piksel yang menangani pembuatan font, pengujian kualitas, hingga distribusi dengan toolchain Rust buatan sendiri
- Paket sebelumnya berisi 12 font pada 2016 dan 40 font pada 2018; paket baru ini dimulai dengan tujuan menaikkan kualitas, gaya, dukungan bahasa, dan otomatisasi distribusi sekaligus
- Font baru melampaui batasan yang sebelumnya hanya mendukung ASCII dengan mendukung 176 karakter Latin diperluas untuk EFIGS, tetapi karakter Asia dan non-Latin dikecualikan karena masalah kualitas dan waktu pembuatan
- Tool Rust pifo membuat kontur glyph, kerning otomatis, TTF, tilesheet, dan atlas tekstur terpaket dari tilesheet PNG serta konfigurasi TOML, dan memproses 175 font dalam hitungan detik
- Gambar sampel besar, kerning otomatis, dan skrip distribusi
butleruntuk itch.io mengurangi beban pemeriksaan, perbaikan, dan unggah manual sehingga kualitas hampir 200 font dapat ditingkatkan dengan cepat
Dari paket font piksel sebelumnya ke Megapack
- Paket font pertama pada 2016 adalah kumpulan 12 font yang dibuat saat mulai mengerjakan Ikenfell
- Font yang dibuat untuk game dipoles, beberapa font ditambahkan, lalu dijual di itch.io
- Digunakan di berbagai game indie dan mendapat respons baik
- Paket kedua pada 2018 bertambah menjadi 40 font dan kualitasnya juga meningkat besar
- Tabel kerning dibuat agar rendering kalimat lebih baik
- Format prebuilt yang mudah digunakan di berbagai game engine juga disediakan
- Promosi dilakukan dengan menerapkan font buatannya pada screenshot game para developer indie
- Paket sebelumnya digunakan di ratusan game indie, termasuk Cadence of Hyrule dari Nintendo
- Beberapa font juga digunakan di Get in the Car, Loser dari Love Conquers All Games
- Setelah perilisan Ikenfell, meski mengalami burnout panjang, kemampuan Rust terus diasah, dan pekerjaan font dilanjutkan demi suatu saat membuat paket font piksel baru
Tujuan Megapack
- Target awal paket baru adalah 100 font, tetapi hasil akhirnya menjadi 175 font piksel
- Paket sebelumnya masing-masing berisi 12 dan 40 font
- Paket baru menargetkan font yang bisa digunakan di berbagai genre seperti fiksi ilmiah, fantasi, horor, farming, dan game cozy
- Permintaan dan keluhan terbesar terhadap paket sebelumnya adalah hanya mendukung karakter ASCII
- Paket baru mengadopsi set karakter Latin diperluas untuk mendukung EFIGS, yaitu English, French, Italian, German, Spanish
- Set karakter final berjumlah 176 karakter
- Bahasa Asia atau bahasa berbasis non-Latin dikecualikan karena set karakternya tidak familier sehingga sulit mencapai kualitas yang diinginkan dan waktu pembuatannya akan jauh lebih panjang
- UI game membutuhkan hierarki visual, sehingga setiap font ingin dibuat bukan sebagai satu gaya tunggal, melainkan sebagai keluarga font
- Sebagai contoh, keluarga font Virtue mencakup 20 gaya
- Developer dapat memberi variasi ukuran dan ketebalan tanpa harus mencampur font dengan nuansa berbeda
- Kerning adalah faktor yang banyak memakan waktu pada pembuatan paket sebelumnya
- Jika karakter yang didukung berjumlah 176, pasangan kerning yang mungkin bisa bertambah hingga
176² - Agar tidak perlu memasukkan semua pasangan secara manual, sebagian besar dihitung otomatis, sementara bagian yang kurang memadai oleh algoritme dimasukkan secara manual
- Jika karakter yang didukung berjumlah 176, pasangan kerning yang mungkin bisa bertambah hingga
- Kontrol kualitas dan distribusi juga menjadi target otomatisasi
- Sebelumnya, setelah memperbaiki kesalahan piksel atau bug kerning, font harus diekspor ulang, diuji, dan diunggah langsung ke itch.io
- Toolchain baru bertujuan membuat teks sampel dan visualisasi kerning agar masalah cepat ditemukan dan hasil perbaikan bisa langsung diperiksa
Persiapan untuk meningkatkan kualitas desain font
- Meski punya banyak pengalaman dalam pixel art dan font piksel, desain typeface tradisional belum pernah dipelajari secara serius
- Selama pengerjaan, buku Design School: Type karya Richard Poulin dijadikan referensi
- Buku ini digunakan sebagai pengantar yang membantu mempelajari istilah dan konvensi desain typeface
- Foto teks yang terlihat di sekitar juga dikumpulkan sebagai referensi
- Papan toko kecil, museum, galeri, festival, poster acara lokal, dan sampul buku menjadi bahan rujukan
- Tujuannya bukan menyalin font, melainkan mempelajari bentuk huruf, huruf yang turun di bawah baseline, serta perbedaan antara huruf tipis dan lebar
- Dari mengamati font dekoratif di luar ruangan, dipelajari bahwa banyak font yang “mewah” tidak menghias semua huruf secara berlebihan, melainkan memusatkan ornamen pada huruf kapital dan menangani huruf kecil dengan lebih halus
Peran tool Rust pifo
- Untuk mencapai tujuan tersebut, program Rust buatan sendiri bernama
pifoditulis - Desain font itu sendiri dikerjakan dengan tool pixel art biasa
- Inputnya adalah tilesheet PNG dan file TOML untuk konfigurasi
- Contoh perintahnya berbentuk
pifo --all --output "Faraway" --input "Faraway*"
pifomemotong gambar input menjadi tile glyph individual, membuat kontur glyph, menghitung pasangan kerning secara otomatis, lalu mengekspornya sebagai file TTF- Format lain agar bisa langsung dipakai di berbagai engine juga dibuat bersamaan
- Pekerjaan glyph individual diparalelkan sehingga satu font diproses hampir seketika
- Bahkan memproses 175 font satu per satu hanya membutuhkan beberapa detik
- Crate Rust utama yang digunakan adalah sebagai berikut
Proses pembuatan kontur glyph
- Setiap sheet font terdiri dari tilesheet dan file konfigurasi TOML
- Konfigurasi mencakup
version,baseline,line_gap,spacing,metrics,auto_kerning,auto_kerning_min,manual_kerning,skip_kerning_left,skip_kerning_right, dan lainnya - Ukuran grid bisa berbeda-beda, tetapi harus selalu berupa grid seragam, dan karakter harus berada pada posisi yang ditentukan
- Tool hanya memproses piksel putih 100%; latar kotak-kotak dan baseline hanya digunakan sebagai panduan
- Konfigurasi mencakup
- Glyph TrueType terdiri dari satu atau beberapa kontur (contour)
- Pada font piksel, kontur harus dibuat untuk setiap kelompok piksel yang saling terhubung, yaitu tiap cluster
- Misalnya, jika huruf kecil
tmemiliki dua gumpalan piksel yang terpisah, diperlukan dua kontur
- Pembuatan kontur dilakukan dalam beberapa tahap
- Dari
RgbaImage, hanya piksel putih yang dipilih dan dikumpulkan sebagaiHashSetberisi strukturPoint - Dimulai dari piksel sembarang, flood fill dilakukan ke piksel tetangga, dan proses diulangi hingga tidak ada piksel yang belum dikunjungi untuk menemukan cluster
- Dari setiap cluster, sisi yang tidak memiliki piksel tetangga dikumpulkan sebagai edge terekspos
- Head dan tail edge disambungkan untuk membuat jalur tertutup, lalu diubah menjadi kontur
- Dari
- Cluster yang memiliki lubang dapat menghasilkan beberapa kontur
- Kontur luar berputar searah jarum jam, sementara lubang dalam berputar berlawanan arah jarum jam
- Perbedaan arah ini cocok dengan cara TTF merepresentasikan lubang
- Titik tengah pada garis lurus berurutan dihapus
- Ini adalah optimasi untuk mengurangi ukuran file dan meningkatkan kecepatan rasterisasi
Otomatisasi tabel kerning
- Setelah kontur, hal yang diperlukan untuk membuat TTF adalah tabel kerning
- Tabel kerning menarik pasangan karakter tertentu ke kiri agar kata terlihat lebih alami
- Misalnya, menarik pasangan
Vadanlt1 piksel ke kiri membuatnya terlihat lebih baik
- Kerning manual ditentukan di
manual_kerningpada TOML- Formatnya seperti
{ left = "V", right = "a", kern = -1 } - Opsi
alts = truedidukung agar karakter beraksen tidak perlu ditentukan satu per satu - Karakter alternatif seperti
àáâãäåuntukadipetakan agar menerapkan kerning yang sama
- Formatnya seperti
- Kerning otomatis dihitung dengan menggeser glyph kanan ke kiri 1 piksel setiap kali
- Posisi terdekat yang tidak menyentuh glyph kiri dicari
- Kontak sudut juga diperlakukan sebagai bersentuhan
- Pada contoh
LV,Vbisa ditarik 1 piksel, tetapi jika 2 piksel maka pikselnya bersentuhan, sehingga nilai kerning menjadi-1
- Perhitungan kerning otomatis menghormati nilai manual dan pengaturan pengecualian
- Glyph pada arah tertentu dapat dikecualikan dengan
skip_kerning_leftdanskip_kerning_right rayondigunakan untuk menghitung semua pasangan kerning secara paralel
- Glyph pada arah tertentu dapat dikecualikan dengan
Format ekspor
- PIFO tidak hanya membuat TTF, tetapi juga tilesheet dan atlas tekstur terpaket
- File TTF adalah file biner yang terdiri dari berbagai tabel
- Tool ekspor mengisi tabel
head,hhea,maxp,OS/2,hmtx,cmap,loca,glyf,kern,name,post - Setiap tabel harus mencatat lokasi, panjang, dan checksum, serta ditangani dengan
begin_table()danend_table()
- Tool ekspor mengisi tabel
- Ukuran dasar font piksel ditetapkan sebagai 16
- Jika dirender pada ukuran 16, pikselnya tepat menjadi
1 px - Agar diperbesar tanpa jitter, gambar sebaiknya dibuat pada kelipatan 16 seperti
32,48,64
- Jika dirender pada ukuran 16, pikselnya tepat menjadi
- Ekspor tilesheet diurutkan berdasarkan urutan codepoint Unicode, berbeda dari sheet input
- File data yang dibuat bersamanya berisi baris dan kolom, ukuran tile, baseline, line spacing, lebar spasi, metrik glyph, dan tabel kerning
- Data diserialisasi dengan
serdeke berbagai format seperti JSON, XML, dan TOML
- Atlas terpaket juga dibuat
- Crate rectangle packer buatan sendiri crunch digunakan
- Karena packing yang rapat menghilangkan informasi posisi, data tambahan seperti
x,y,w,h,off_x,off_y,advdisertakan untuk rendering
Pengujian kualitas dan gambar sampel
- Untuk mendapatkan kualitas yang diinginkan, fitur pembuatan gambar sampel raksasa ditambahkan ke PIFO
- Gambar sampel terdiri dari beberapa blok pengujian
- Semua huruf dan beberapa kalimat uji
- Sebagian cerpen Terry Bisson They're Made out of Meat
- Kata uji yang memanfaatkan strategi dari Text for Proofing Fonts: A farewell to The Quick Brown Fox
- Semua kombinasi angka dan simbol mata uang
- Pasangan kerning huruf kapital, huruf kecil, dan campuran kapital-kecil
- Berbagai tanda baca
- Selama pengerjaan, gambar sampel dapat dibuat seketika sehingga masalah bisa cepat ditemukan dan diperbaiki
- Proses ini meningkatkan kualitas keseluruhan dan tingkat penyelesaian hampir 200 font
Otomatisasi distribusi itch.io
- Hasil akhirnya adalah 175 font piksel, dan itch.io yang sudah digunakan sebelumnya dipilih sebagai toko online untuk unduhan
- Pekerjaan paling merepotkan adalah membuat proyek itch terpisah untuk setiap font
- Pekerjaan ini hanya perlu dilakukan sekali untuk tiap font
- Setelah itu, unggahan dan pemeliharaan dapat ditangani dengan skrip command-line
- Skrip distribusi terdiri dari tiga tahap
- Mengompilasi PIFO dalam mode rilis
- Membangun aset font yang diinginkan
- Memperbarui proyek itch setiap font dengan aset baru
- Pola input seperti
--input "Faraway*"mencari gaya dengan prefiks yang sama sepertiFaraway - RegulardanFaraway - Bold, lalu menggabungkannya sebagai satu paket keluarga font - Untuk unggahan final, digunakan tool distribusi command-line
butleryang disediakan itch- Distribusi dilakukan dengan bentuk
butler push ../distro/faraway chevyray/pixel-font-faraway:assets - Karena Butler melacak file yang berubah dan hanya memperbarui bagian yang diperlukan, hashing file terpisah atau manajemen versi khusus tidak dibutuhkan
- Distribusi dilakukan dengan bentuk
1 komentar
Opini Hacker News
Font-fontnya keren dan tulisannya juga menarik
Saya jadi berpikir alangkah bagusnya kalau game palsu di kanan atas https://chevyray.dev/blog/creating-175-fonts/old_previews.pn... itu benar-benar game sungguhan
Saya suka karena nuansanya seperti “Wonder Boy in Monster World untuk GBA”
Namun, jika melihat lisensinya, tampaknya penggunaan TTF dalam proyek perangkat lunak open source tidak diizinkan, jadi perlu diperhatikan
Saya bukan pengacara, tetapi klausul terakhir terbaca jelas melarangnya: https://github.com/ChevyRay/pixel_font_megapack_license/blob...
Adegan pada mockup itu merujuk pada adegan pembuka Celeste
Niatnya jelas terlihat lebih mengarah pada penggunaan di game tahap produk akhir, tempat open source relatif jarang, ketimbang di game engine atau template
Saat membaca tulisan ini, saya juga teringat kasus batas lain dalam hak cipta: di AS, typeface bukan objek yang dilindungi hak cipta
Font dilindungi sebagai program komputer, tetapi typeface dan font bitmap sederhana tidak
Jadi alur kerja ini pada dasarnya membuat TTF yang memiliki hak cipta dari tilesheet asli yang tidak memiliki hak cipta, lalu kembali lagi menjadi tilesheet/atlas keluaran yang tidak memiliki hak cipta
Benar-benar mengesankan
Membuat satu set font lengkap bisa dengan mudah memakan waktu 1 tahun
Harus membuat semua glyph dari 'A' sampai 'Z', huruf besar dan kecil, tanda kurung, ampersand, tanda seru, dan sebagainya, lalu kalau bisa juga membuat variasi seperti bold dan italic
Tanpa variasi seperti ini, kegunaan font menjadi terbatas
Yang terutama membedakan tingkat keahlian adalah kerning, yaitu jarak antarhuruf, dan ini bisa menjadi objek obsesi tanpa akhir
Di isi tulisan juga disebutkan bahwa jika mendukung 176 karakter, jumlah pasangan kerning maksimum adalah 176² = 37.976, sehingga ia membuat alat sendiri untuk mengotomatiskan sebagian besar secara semi-otomatis dan hanya memasukkan manual bagian yang kurang ditangani algoritme
Untuk mendukung bahasa lain, bahkan bahasa yang memakai alfabet Latin seperti Prancis, Spanyol, Italia, dan Portugis pun membutuhkan karakter tambahan
Setelah itu, mungkin muncul keinginan untuk mendukung alfabet Yunani, Sirilik, Jepang, hingga Mandarin
Misalnya, menurut Wikipedia, “Noto fonts mendukung lebih dari 77.000 karakter, sekitar setengah dari 149.186 karakter yang didefinisikan dalam Unicode 15.0”
Apa pun bisa dijadikan obsesi tanpa akhir
Bidang seperti bahasa, penulisan, musik, dan kaligrafi tampaknya memang sangat menarik bagi orang yang cenderung obsesif
Intinya, ucapan seperti ini terdengar seperti membangun penghalang masuk
Pembicaraan yang membuat orang yang baru ingin masuk ke suatu bidang merasa discouraged selalu terasa agak sensitif
Sangat bagus
Satu hal yang membuat saya penasaran adalah mengapa memilih subset karakter khusus Skandinavia ini
Bahasa Swedia memiliki äöå, sedangkan bahasa Norwegia/Denmark memiliki æøå, tetapi font ini punya æ dan tidak punya ø
Jadi jika æ dihapus, dukungan untuk bahasa Swedia tetap ada, dan jika ø ditambahkan, bahasa Norwegia dan Denmark juga bisa didukung
Saya penasaran apakah ini sekadar terlewat, atau ada locale yang memakai æ tetapi tidak memakai ø
Sebagai catatan, saya tidak sedang mencampuradukkan æ dengan ligatur œ, glyph terpisah yang dipakai dalam bahasa Prancis
Namun Æ memang juga dipakai dalam teks bahasa Inggris lama seperti “encyclopædia” atau bentuk jamak kata dari bahasa Latin: https://en.wiktionary.org/wiki/Category:English_plurals_in_-...
Sebenarnya baru setelah proyek cukup jauh berjalan saya menyadari bahwa ø hilang dari set karakter saya
Menambahkannya kembali ke semua font dan merilis patch tentu memungkinkan, tetapi saya menunggu untuk melihat apakah ada permintaan yang cukup besar untuk pekerjaan sebesar itu
Meski begitu, kalau bisa mendukung dua bahasa lagi, itu sepertinya cukup keren
Saya juga menyukai beberapa font yang dipakai di situsnya dan styling-nya yang sederhana
Untungnya, itu dipublikasikan dalam tulisan terpisah: https://chevyray.dev/blog/how-this-site-is-made/#catppuccin-...
Menarik
Sebelumnya saya tidak tahu bahwa ketika font piksel dienkode sebagai TTF, ia dikonversi menjadi vektor
Bagi orang yang memuatnya di text renderer yang layak, sepertinya pembesaran/pengecilan yang halus sampai batas tertentu juga menjadi mungkin
Tentu saja, game engine yang memakai font piksel hampir 1:1 mungkin menjadi pengecualian
Alat-alat seperti ini tidak memiliki konsep font piksel, jadi jika memakai TTF dengan hinting dan antialiasing dimatikan, font tersebut bisa dimanfaatkan di aplikasi-aplikasi itu
Keren
Bagus juga bahwa pekerjaan ini membantu secara finansial bagi orang yang membuatnya
Nama Chevy Ray terasa familier dari dunia game indie, tapi aku tidak ingat persis apa yang ia buat
Sepertinya sesuatu dari arus sekitar 2010–2012, seperti VVVVVV, Nidhogg, atau Canabalt
Beacon juga luar biasa — bikin nostalgia, dan aku rindu game indie
Luar biasa
Melihat sosok ala Da Vinci seperti penulis artikel ini mengingatkanku pada masa ketika seniman dan insinyur tidak dipisahkan secara jelas, melainkan satu kesatuan
Bukan artikel seperti “10 penemuan terbaik Da Vinci”
Kenyataannya, ada pemisahan yang cukup besar di antara keduanya
Aku juga bisa memodelkan kapal luar angkasa untuk pergi sampai Alpha Centauri di Maya dengan dinamika mencurigakan yang belum tervalidasi
Tapi itu masih jauh dari benar-benar membuatnya dan mengirimkannya ke ruang antarbintang
Gambarnya memang indah dan penuh imajinasi
Di Rust, pekerjaan seperti ini ternyata sangat mudah dibuat agar berjalan di banyak core
Menyisipkan satu pemanggilan saja ke dalam rantai fungsi bisa jadi sudah cukup
Selama mengikuti aturan yang ditetapkan bahasa, multithreading hampir terasa “gratis”
Hukum Amdahl tetap berpengaruh, tetapi setidaknya aplikasinya tidak meledak di depan mata
Scala dan Java juga mendukung kemampuan seperti ini secara bawaan
Pekerjaan yang benar-benar luar biasa dan tulisannya juga bagus
Dengan beberapa trik, sepertinya banyak algoritmanya bisa dibuat lebih cepat
Dari yang kubaca, petunjuknya mungkin mengganti hashmap pada penggambaran karakter dan pemetaan variasi ASCII dengan bitmap dan array indeks byte
Tentu saja, ini sudah cukup cepat, jadi tidak terlalu penting untuk kode ini
Di situsnya tidak ada kode lengkap, tetapi sebenarnya ada cukup banyak alokasi dan penyalinan string serta struktur data
Di bagian yang jelas, aku menulis kode optimal; bagian seperti penyalinan bitmap atau pekerjaan yang mudah diparalelkan begitu cepat selesai, sampai-sampai aku bahkan tidak mencoba mengoptimalkan bagian lain
Meski begitu, kalau mau dilakukan, bisa saja
Mudah lupa betapa cepatnya bahasa yang dekat ke level rendah seperti Rust, C++, dan Go, apalagi jika memakai perangkat dasar multithreading, antrean kerja, dan semacamnya
Bagi yang tertarik pada font, ada baiknya juga melihat https://tomorrow.type.today/
Itu adalah studio tipografi yang membuat font orisinal dan eksperimental yang bagus
Salah satu anggota tim kami sangat mendalami tipografi, jadi ia sedang membuat koleksi karya mereka di https://play.soot.com/tomorrowtypetoday