Автор: Алексей Федорчук
30 мая 2005 г
Консольная графика, то есть вывод произвольных попиксельных изображений (в том числе и шрифтов) средствами системы, без привлечения оконной системы X или специализированных библиотек (типа SVGAlib), до сего дня был слабым местом BSD-систем. Особенно — в сравнении с Linux, где графическая консоль (через Frame Buffer) поддерживается ядром уже очень давно. В OpenBSD же и NetBSD, насколько мне известно, вообще нет аналогов этому. А во FreeBSD графическая консоль (т.н. pixel mode) была реализована не лучшим образом: с максимальным разрешением до 800×600, да и не на всех видеокартах картина получалась мало-мальски приличной.
А вопрос консольной графики нынче приобретает актуальность в связи с распространением LCD-мониторов. Ведь на них оптимальным образом будет выглядеть картинка (идет ли речь о воспроизводстве собственно графики или текстов со шрифтовым оформлением) лишь при разрешении, равном физическому разрешению матрицы. Которое даже для 14-15-дюймовых моделей составляет минимум 1024×768. Я уж не говорю о совершенно непроизводительном расходе мест на больших (от 17 дюймов) экранах, на которых чисто текстовая консоль со стандартной плотностью символов (80×25) выглядит весьма убого. Попытка же использовать нестандартные текстовые плотности символов (типа 80×43 и так далее) приводит к тому, что зрелище становится просто душераздирающим.
И вот — свершилось: в DragonFlyBSD заявлена поддержка графической консоли, причем с разрешениями вплоть до максимально разумных (и допустимых для видеокарты). Остается только прикрутить эту самую графическую консоль — по умолчанию она не задействована, — и наслаждаться.
Впрочем, прикрутить к DragonFlyBSD графическую консоль легко: для этого достаточно переконфигурировать ядро системы, внеся в файл конфигурации строки
options VESA options SC_PIXEL_MODE
скомпилировать и инсталлировать его. После чего дело остается за малым — опробовать все доступные разрешения и настроить виртуальные консоли на наиболее комфортное из них.
Все описанное ниже основано на моих экспериментах, базой которых послужила Toshiba Satellite Pro A40 с 15-дюймовым LCD-дисплеем (физическое разрешение 1024×768). Роль видеоадаптера в ней исполняет интегрированная в чипсет AGP-карта от Intel — i852GM, без собственной видеопамяти (в качестве таковой может отъедаться до 64 Мбайт памяти системной — у меня под это дело отдано 16 Мбайт).
Как известно, за поведение консоли в DragonFlyBSD (как и во FreeBSD) отвечает консольный драйвер syscons
, а управление ее параметрами осуществляется двумя программами — kbdcontrol
, делающая все, что связано с клавиатурой, и vidcontrol
, обеспечивающая характеристики экранного вывода. К последней мы и обратимся, поскольку именно вывод в данный момент нас и интересует.
Перво-наперво с помощью vidcontrol
можно получить информацию о видеоподсистеме машины. Для этого она дается в следующей форме
$ vidcontrol -i adapter
В ответ выводит массу сведений об адресах памяти, размере видеобуфера и так далее. Что, впрочем, делу настройки видеорежима ни в малейшей степени не способствует.
Однако та же опция -i
с другим значением позволяет ознакомиться и с поддерживаемыми видеорежимами:
$ vidcontrol -i mode
В ответ на это выводится (при умолчальном ядре GENERIC
) достаточно длинный список доступных режимов с различной плотностью символов — от стандартной 80×25 и пониженной 40×25 до максимально возможной 80×60:
mode# flags type size font window linear buffer ------------------------------------------------------------------------------ 0 (0x000) 0x00000001 T 40x25 8x8 0xb8000 32k 32k 0x00000000 32k 1 (0x001) 0x00000001 T 40x25 8x8 0xb8000 32k 32k 0x00000000 32k 2 (0x002) 0x00000001 T 80x25 8x8 0xb8000 32k 32k 0x00000000 32k ... 24 (0x018) 0x00000001 T 80x25 8x16 0xb8000 32k 32k 0x00000000 32k ... 30 (0x01e) 0x00000001 T 80x50 8x8 0xb8000 32k 32k 0x00000000 32k 32 (0x020) 0x00000001 T 80x30 8x16 0xb8000 32k 32k 0x00000000 32k 34 (0x022) 0x00000001 T 80x60 8x8 0xb8000 32k 32k 0x00000000 32k
В этом списке под номером 24 мы видим тот самый стандартный режим, обеспечивающий плотность символов 80×25 и предназначенный для использования со шрифтами с матрицей 8×16.
После перекомпиляции ядра с описанными выше опциями список видеорежимов расширился почти вдвое. В нем появились графические разрешения от 640×480 до (!) 1920×1440 при глубине цвета от 8 до 32 бит — прямо как в Иксах:-). Осталось определить, как же можно подключить эту красоту.
Выручила, как всегда, тетя Маня — man (1) vidcontrol. Правда, с описанным в качестве основного способом — через опцию -g
(-geomerty
) ничего не получилось — она категорически отказывалась переключать экран в какие-либо графические режимы, только в нестандартные текстовые (да и то не во все из списка).
Однако внимательное чтение показало другой способ — через опцию MODE_#режима
. И какова же была моя радость, когда после команды
$ vidcontrol MODE_277
я получил режим с разрешением 800×600 при 32-битном цвете.
Дальнейшие эксперименты показали, что рабочими являются все режимы в диапазоне разрешений от 640×480 до 1024×768 при любой глубине цвета. Более высокие режимы имели для меня чисто теоретическое значение. Попытка выставить разрешение больше физически возможного для матрицы, естественно, потерпела фиаско: терминал просто разваливался. Однако и полученного было достаточно. Тем более, что при моей близорукости комфортно выглядел только режим 800×600. Хотя для людей с хорошим зрением 1024×768 будет, вероятно, самое то.
Правда, для достижения идеального эффекта потребовалась подборка шрифтов. Использовавшийся мной до этого шрифт ter-k16b.fnt
из пакета terminus-fonts
выглядел в графическом режиме… не то что бы плохо, но, скажем так, не идеально. Однако решение было рядом: в том же пакете имелся шрифт ter-k16f.fnt
, специально предназначенный для консоли в режиме Frame Buffer. С его установкой была достигнута совершенно невероятная четкость символов — не превзойденная даже в графической консоли Linux. Приведенные скриншоты, полученные специально предназначенной для того утилитой scr2png
(рис. 1-2) дают лишь бледное впечатление о реальности (в которой, как известно, все не так, как на самом деле).
Рис. 1. Воспроизведение латинского текста в графической консоли
Рис. 2. Воспроизведение русского текста в графической консоли
К слову сказать: я использую шрифты в кодировке KOI8-R. И из рис. 3 можно видеть, что даже программы, использующие псевдографику, выглядят при этом вполне пристойно.
Рис. 3. Воспроизведение в графической консоли программы (Midnight Commander), использующей псевдографику
Оставалось увековечить полученный результат ныне и присно. Для этого в файл /etc/rc.conf
вписывается строка
allscreens_flags="MODE_277"
И теперь после перезагрузки графический режим активизируется на всех виртуальных консолях.
В заключение замечу, что возможность работать в консоли с разрешениями выше 800×600 нынче обратно портирована и во FreeBSD. Правда, не в официальных ветках, а с помощью дополнительных патчей (и включена уже в бета-версию 6-й ветки).