Seni ASCII penuh warna dulu cukup populer di DOS, yang dapat memanfaatkan rangkaian karakter ASCII yang diperluas dan koleksi elemen gambarnya. Anda dapat menambahkan sedikit ketertarikan visual ke program FreeDOS berikutnya dengan menambahkan seni ASCII sebagai layar "selamat datang" yang keren atau sebagai layar "keluar" yang berwarna-warni dengan informasi lebih lanjut tentang program tersebut.
Tetapi gaya seni ASCII ini tidak terbatas hanya pada aplikasi FreeDOS. Anda dapat menggunakan metode yang sama dalam program mode terminal Linux. Sementara Linux menggunakan ncurses untuk mengontrol layar alih-alih conio DOS, konsep terkait berlaku baik untuk program Linux. Artikel ini membahas cara menghasilkan seni ASCII berwarna-warni dari program C.
Lebih banyak sumber daya Linux
- Lembar contekan perintah Linux
- Lembar contekan perintah Linux tingkat lanjut
- Kursus online gratis:Ikhtisar Teknis RHEL
- Lembar contekan jaringan Linux
- Lembar contekan SELinux
- Lembar contekan perintah umum Linux
- Apa itu container Linux?
- Artikel Linux terbaru kami
File seni ASCII
Anda dapat menggunakan berbagai alat untuk menggambar seni ASCII Anda. Untuk contoh ini, saya menggunakan aplikasi DOS lama bernama TheDraw, tetapi Anda dapat menemukan program seni ASCII open source modern di Linux, seperti Moebius (lisensi Apache) atau PabloDraw (lisensi MIT). Tidak masalah alat apa yang Anda gunakan selama Anda tahu seperti apa tampilan data yang disimpan.
Berikut adalah bagian dari contoh file seni ASCII, disimpan sebagai kode sumber C. Perhatikan bahwa cuplikan kode menentukan beberapa nilai:IMAGEDATA_WIDTH
dan IMAGEDATA_DEPTH
menentukan jumlah kolom dan baris di layar. Dalam hal ini, ini adalah "gambar" seni ASCII 80x25. IMAGEDATA_LENGTH
mendefinisikan jumlah entri dalam IMAGEDATA
Himpunan. Setiap karakter dalam layar seni ASCII dapat diwakili oleh dua byte data:Karakter yang akan ditampilkan dan atribut warna yang berisi warna latar depan dan latar belakang untuk karakter tersebut. Untuk layar 80x25, di mana setiap karakter dipasangkan dengan atribut, lariknya berisi 4000 entri (yaitu 80 * 25 * 2 =4000).
#define IMAGEDATA_WIDTH 80
#define IMAGEDATA_DEPTH 25
#define IMAGEDATA_LENGTH 4000
unsigned char IMAGEDATA [] ={
'.', 0x08, ' ', 0x08 ', 0x08, ' ', 0x08, ' ', 0x08, ' ', 0x08,
' ', 0x08, ' ', 0x08, '.', 0x0F, ' ', 0x08, ' ', 0x08, ' ', 0x08,
' ', 0x08, ' ', 0x08, ' ', 0x08, ' ', 0x08, ' ', 0x08, '.', 0x0F,
' ', 0x08, ' ' , 0x08, ' ', 0x08, ' ', 0x08, ' ', 0x08, ' ', 0x08,
' ', 0x08, ' ', 0x08, ' ', 0x08, ' ', 0x08, ' ' 0x08, ' ', 0x08,
dan seterusnya untuk sisa array.
Untuk menampilkan seni ASCII ini ke layar, Anda perlu menulis program kecil untuk membaca array dan mencetak setiap karakter dengan warna yang tepat.
Menyetel atribut warna
Atribut warna dalam file seni ASCII ini mendefinisikan warna latar belakang dan latar depan dalam satu byte, yang diwakili oleh nilai heksadesimal seperti 0x08
atau 0x6E
. Heksadesimal ternyata menjadi cara ringkas untuk mengekspresikan "pasangan" warna seperti ini.
Sistem mode karakter seperti ncurses di Linux atau conio di DOS hanya dapat menampilkan enam belas warna. Itu enam belas kemungkinan warna teks dan delapan warna latar belakang. Menghitung enam belas nilai (dari 0 hingga 15) dalam biner hanya membutuhkan empat bit:
1111
adalah 16 dalam biner
Dan mudahnya, heksadesimal dapat mewakili 0 hingga 15 dengan satu karakter:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, dan F. Jadi nilainya F
dalam heksadesimal adalah angka 15, atau 1111
dalam biner.
Dengan pasangan warna, Anda dapat mengkodekan warna latar belakang dan latar depan dalam satu byte delapan bit. Itu empat bit untuk warna teks (0 hingga 15 atau 0 hingga F dalam heksadesimal) dan tiga bit untuk warna latar belakang (0 hingga 7 atau 0 hingga E dalam heksadesimal). Bit sisa dalam byte tidak digunakan di sini, jadi kita bisa mengabaikannya.
Untuk mengonversi pasangan warna atau atribut menjadi nilai warna yang dapat digunakan program Anda, Anda harus menggunakan bit mask untuk menentukan hanya bit yang digunakan untuk warna teks atau warna latar belakang. Menggunakan OpenWatcom C Compiler di FreeDOS, Anda dapat menulis fungsi ini untuk mengatur warna dengan tepat dari atribut warna:
void
textattr(int newattr)
{
_settextcolor(newattr &15); /* 0000xxxx */
_setbkcolor((newattr>> 4) &7); /* 0xxx0000 */
}
_settextcolor
fungsi hanya mengatur warna teks, dan _setbkcolor
fungsi mengatur warna latar belakang. Keduanya didefinisikan dalam graph.h
. Perhatikan bahwa karena atribut warna menyertakan warna latar belakang dan warna latar depan dalam satu nilai byte, textattr
fungsi menggunakan &
(biner DAN) untuk menyetel topeng bit yang mengisolasi hanya empat bit terakhir dalam atribut. Di situlah pasangan warna menyimpan nilai 0 hingga 15 untuk warna latar depan.
Untuk mendapatkan warna latar belakang, fungsi tersebut terlebih dahulu melakukan sedikit shift untuk “mendorong” bit ke kanan. Ini menempatkan bit "atas" ke dalam kisaran bit "bawah", jadi bit apa pun seperti 0xxx0000
menjadi 00000xxx
sebagai gantinya. Kita dapat menggunakan topeng bit lain dengan 7 (biner 0111
) untuk memilih nilai warna latar belakang.
Menampilkan seni ASCII
IMAGEDATA
array berisi seluruh layar seni ASCII dan nilai warna untuk setiap karakter. Untuk menampilkan seni ASCII ke layar, program Anda perlu memindai larik, menyetel atribut warna, lalu menampilkan layar satu karakter dalam satu waktu.
Mari tinggalkan ruang di bagian bawah layar untuk pesan atau permintaan terpisah kepada pengguna. Artinya, daripada menampilkan 25 baris dari layar ASCII 80 kolom, saya hanya ingin menampilkan 24 baris pertama.
/* mencetak satu baris kurang dari 80x25 yang ada di sana:
80 x 24 x 2 =3840 */
for (pos =0; pos <3840; pos +=2) {
...
}
Di dalam for
loop, kita perlu mengatur warna, lalu mencetak karakter. OpenWatcom C Compiler menyediakan fungsi _outtext
untuk menampilkan teks dengan nilai warna saat ini. Namun, ini membutuhkan melewatkan string dan akan menjadi tidak efisien jika kita perlu memproses setiap karakter satu per satu, jika setiap karakter pada baris membutuhkan warna yang berbeda.
Sebaliknya, OpenWatcom memiliki fungsi serupa yang disebut _outmem
yang memungkinkan Anda untuk menunjukkan berapa banyak karakter yang akan ditampilkan. Untuk satu karakter pada satu waktu, kami dapat memberikan pointer ke nilai karakter di IMAGEDATA
array dan beri tahu _outtext
untuk menunjukkan hanya satu karakter. Itu akan menampilkan karakter menggunakan atribut warna saat ini, yang kita butuhkan.
for (pos =0; pos <3840; pos +=2) {
ch =&IMAGEDATA[pos]; /* penunjukan penunjuk */
attr =IMAGEDATA[pos + 1];
textattr(attr);
_outmem(ch, 1);
}
for
. yang diperbarui ini loop menyetel karakterch
dengan menetapkan pointer keIMAGEDATA
Himpunan. Selanjutnya, loop menyetel atribut teks, dan kemudian menampilkan karakter dengan_outmem
.Menggabungkan semuanya
Dengan
textattr
fungsi danfor
loop untuk memproses array, kita dapat menulis program lengkap untuk menampilkan konten file seni ASCII. Untuk contoh ini, simpan seni ASCII sebagaiimgdata.inc
dan sertakan dalam file sumber dengan#include
pernyataan.#include
#include
#include
#include "imgdata.inc"
void
textattr(int newattr)
{
_settextcolor(newattr &15); /* 0000xxxx */
_setbkcolor((newattr>> 4) &7); /* 0xxx0000 */
}
int
main()
{
char *ch;
int attr;
int pos;
if (_setvideomode(_TEXTC80) ==0) {
fputs("Error setting video mode", stderr);
return 1;
}
/* menggambar array */
_settextposition(1, 1); /* kiri atas */
/* mencetak satu baris kurang dari 80x25 yang ada di sana:
80 x 24 x 2 =3840 */
for ( pos =0; pos <3840; pos +=2) {
ch =&IMAGEDATA[pos]; /* penunjukan penunjuk */
attr =IMAGEDATA[pos + 1];
textattr(attr);
_outmem(ch, 1);
}
/* selesai */
_settextposition(25, 1); /* kiri bawah */
textattr(0x0f);
_outtext("Tekan sembarang tombol untuk keluar");
getch();
textattr(0x00);
return 0;
}Kompilasi program menggunakan OpenWatcom C Compiler di FreeDOS, dan Anda akan mendapatkan program baru yang menampilkan pesan liburan ini:
![]()
Selamat Halloween, semuanya!
Unduh file kode INC di sini.
imgdata.inc_.txt hallown.c.txt
Unduh file kode C di sini.
Linux