Karakter cepat dan kotor ke Linux Buffer di C - The Hard Way - dengan "Glyph Arrays", Array Fu, Pointer Fu, tetapi tidak ada payudara, ledakan, atau pengejaran mobil proyek ini adalah tentang karakter. Ketika mencari untuk menempatkan karakter ke layar untuk buffer Linux, saya ingin membuat tampilan untuk data tetapi teks aktual dari konsol terlalu kecil di Barbones non-gui raspberry pi yang diarahkan untuk proyek ini. Proyek ini didasarkan pada pekerjaan lain, contoh yang baik dari penanganan Framebuffer di Linux. Lihat http://raspberrycompote.blogspot.com/2015/01/low-velvel-graphics-on-raspberry-pi-part.html Jadi apa yang dilakukan untuk proyek ini adalah sekelompok pewarnaan yang benar-benar dengan piksel dan piksel. Font didasarkan pada senjata alien penjaga. https://www.youtube.com/watch?v=hqdy-5iqvuu demo ini mengasumsikan bahwa tidak setiap sistem akan cepat dan memiliki layar HDMI (yang terlalu panas dalam kasus saya - jangan menjadi saya) jadi perhatikan baris ini:
vinfo.bits_per_pixel = 8;
Nilai warna berkisar 0 hingga 15. Ini bukan warna terdalam tentu saja. Jika Anda menaikkan "kedalaman" ini, Anda bisa memperlambat segalanya, tetapi Anda mendapatkan rentang warna yang lebih luas. Dan ini:
vinfo.xres = 1184;
vinfo.yres = 624;
Layar Anda, baik itu HDMI, atau beberapa LCD TFT mungkin - itu penting bukan untuk rutinitas linux framebuffer selama Anda mendapatkan /dev /fbn yang benar, di mana n adalah jumlah tampilan ke -n - cenderung berbeda. Jadi dimensi layar dan "kedalaman" bisa berbeda. Saya memiliki layar LCD TFT yang menangani output dari kamera raspberry inframerah noir lama dengan baik, tetapi cobalah bitmap x32 di atasnya tanpa konversi dan segalanya menjadi menarik. Tujuan saya secara keseluruhan adalah "hanya mendapatkan beberapa teks ke layar". Array dibuat menggunakan sesuatu yang dekat dengan "Aliens Auto-Gun Font" dan rutinitas yang ditulis untuk mengatur piksel ke nilai warna yang diberikan berdasarkan di mana kita menginginkannya, x dan y dan semua itu, dan apa 1 atau 0 dalam array glyph.
Dari sana beberapa rutinitas lain diteluskan: mencetak string. Mencetak tampilan nomor. Dan persegi panjang, diisi atau hampa dengan perbatasan, dan garis.
Demo ini menunjukkan sedikit animasi, tetapi bukan tujuannya. Menggunakan semacam pendekatan "buffer flipping", yang merupakan cara sebagian besar grafik bekerja - menulis ke ruang memori, seperti array terlebih dahulu, yang sama dengan tampilan dalam ukuran dan kedalaman warna, dengan nilai warna, dan kemudian "blitting" (kata lama dari tahun 1990 -an) memori ke memori yang sama yang dipetakan ke layar. Ini membuat transisi yang sangat halus dari satu layar ke layar lainnya.
Jadi animasi itu mungkin, tetapi bukan tujuannya. Cukup sederhana untuk semuanya untuk "buffer belakang" itu dan kemudian menulisnya ke buffer layar. Setelah Anda memiliki kode semacam ini, seperti kode dari raspberry compote, apa yang Anda lakukan untuk buffer kembali adalah bisnis Anda: dari teks sederhana hingga rendering 3D.
Demo ini mengasumsikan bahwa sistem yang lebih tua atau kurang mampu mungkin digunakan. Jadi semua karakter berada di blok. Mesin terbang yang sebenarnya - diwakili oleh array "diadakan" melalui array "pointer to array". Di blok, array ini ditugaskan pointer ke data array, jadi setelah blok dilewati, objek -objek itu hilang. Ini memungkinkan Anda memilih dan memilih karakter apa yang Anda gunakan, dan buang sisanya. Juga untuk dicatat, ada dua array yang mewakili dua ukuran font. Masing -masing adalah 128 elemen, dan elemen ke -n sesuai dengan nilai int yang tidak ditandatangani dari karakter. Jadi karena alasan itu, ruang berada di elemen 32. Nilai ASCII dari "S" adalah 83, jadi elemen ke -83 dari array adalah penunjuk ke array S.
Array angka yang lebih kecil juga digunakan sebagai elemen yang menunjuk ke array yang mewakili angka, elemen ke-n yang sesuai dengan angka, mulai dari 0-9. Ini menghemat kita panggilan Atoi yang akan digunakan untuk surat.
Secara keseluruhan, diuji pada raspberry inti tunggal gen 1, itu cukup cepat. Hasilnya dapat bervariasi. Kode C dasar juga.
Ada cara lain untuk karakter ke layar. Tetapi saya memilih ukuran yang cepat dan kotor ini untuk memastikan fleksibilitas dan kesederhanaan. "Array fu" dari kode ini juga terbukti bermanfaat untuk hal -hal lain. Array tidak perlu surat atau nomor atau mesin terbang apa pun - itu bisa menjadi sprite misalnya, atau apa pun yang Anda inginkan. Anda dibatasi oleh layar yang Anda gunakan dan prosesor.
Jika Anda ingin lebih banyak font mewah, ada demo di internet yang mengambil font "nyata" dan mengubahnya menjadi piksel. Jika Anda bisa mendapatkan ini menjadi array, seperti program yang dibaca bitmap dan mengubahnya menjadi berbagai nilai warna, Anda mungkin menggunakannya sebagai font dalam program ini. Perlu diingat bahwa semua ini, saat ditampilkan dalam kode sebagai array 2D, benar -benar array 1D. Jadi, Anda harus tahu sebelumnya seperti apa dimensi array Anda. Array dalam demo ini dibuat secara manual. Seluruh rentang ASCII - 128 karakter, tidak selesai. Jadi, jika Anda menginginkan sesuatu yang tidak ada, seperti karakter huruf kecil dan tanda baca, Anda harus membuatnya sendiri. Catatan lebih lanjut: Saya mencatat kesalahan segmentasi pada instalasi Debian di Beaglebone dengan resolusi 800x600 - tetapi saya menggunakan layar HDMI yang sama. Penasaran. Hasil akan bervariasi dengan sistem dan OS. Saya bahkan mendapatkan kedalaman piksel default yang lebih rendah di BeagleBone. Kedua sistem adalah sistem non-GUI (GUI adalah untuk ibu rumah tangga). Saya menemukan bahwa menyingkirkan buffer "diperluas" pada yres * 2 trik yang bekerja dengan baik pada rasperry menghilangkan kesalahan inisialisasi dan memungkinkan animasi ringan yang sama dengan atari 2600 flicker saya tumbuh. Saya membayangkan array terpisah untuk menulis untuk kemudian "blit" untuk menyaring dengan cara sekolah lama mungkin berfungsi, saya akan bereksperimen dengan ini. Resolusi yang lebih rendah pada grafik hanya Debian Beaglebone memberi saya nostalgia. Saya juga memperhatikan bahwa dengan "kedalaman piksel" yang sama seperti yang saya gunakan pada raspberry pi, saya masih bisa lebih dari 15 dalam nilai saya ke warna saat meletakkan piksel di buffer. Raspberry akan tersedak itu, tetapi bukan Beaglebone. Ini memungkinkan lebih banyak opsi warna. Setiap sistem berbeda sehingga Anda selalu perlu bereksperimen. Bersenang -senang dengan kode ini.