256 цветов, передний план и фон

Это рассказ о двух скриптах, связанный с предыдущим вопросом. .

Два сценария находятся по адресу http://gist.github.com/50692. Сценарий ansi.rb отображает все 256 цветов на всех 256 цветах фона. Сценарий ncurses.rb отображает все 256 цветов переднего плана, но фон отображает основные 16, а затем, кажется, циклически переключает различные атрибуты, такие как мерцание и перевернутое видео.

Так что дает? Является ли это ошибкой в ​​​​ncurses, которая использует целое число со знаком для цветовых пар? (т. е. «введенные цвета» говорят 256, но «вводные пары» говорят 32767 вместо 65536). Кажется, что если бы это было так, первая половина пар цветов отображалась бы правильно, но вторая половина повторялась бы или попадала в атрибуты как int обертывания.


person pushcx    schedule 24.01.2009    source источник
comment
ссылка на суть 404 сейчас.   -  person drewish    schedule 12.08.2013


Ответы (2)


Причина в том, что ncurses до ABI 6, который включает в себя текущую версию, используемую в большинстве дистрибутивов, включая Debian и Amazon AMI, COLOR_PAIR(n) не может ссылаться на какие-либо определенные пары выше 256. Это связано с тем, что аргумент COLOR_PAIR(n) имеет тип cchar_t . Младшие 8 битов выбирают пару цветов, а остальные обрабатываются как битовые флаги, ORed для определенных атрибутов терминала. Вот почему вы видите мерцание, инверсию, подчеркивание и т. д., когда пытаетесь выйти за пределы пары 255 в своем примере кода.

Это довольно неудачно, и я планирую использовать в своей программе очередь для определения цветов на лету с помощью init_pair() и просто перезаписывать наименее использовавшиеся пары в качестве компромисса. Я написал мейнтейнеру ncurses Томасу Дики, спрашивая, есть ли способ временно выйти за пределы ncurses, чтобы написать необработанные коды терминала, а затем вернуться к ncurses. Это был его ответ:

По сути, вам придется забыть об оптимизации экрана и просто сделать свой собственный рисунок, используя функции, перечисленные в terminfo(3), например, tigetstr, mvcur, tputs.

Можно временно выйти из ncurses, но тогда придется перекрашивать экран. В противном случае ncurses будет путаться в том, что находится на экране и где находится курсор.

Это решение, кажется, содержит слишком много ловушек, но если вам абсолютно необходимо более 256 одновременных пар в программе ncurses (не считая пар, которые вы можете подделать с помощью атрибута inverse), то это то, что вам нужно сделать.

person Andy    schedule 13.12.2012
comment
Спасибо за ответ на мой почти четырехлетний вопрос. Я бы хотел, чтобы это было легко исправить, но определенно приятно знать, что, черт возьми, было не так с этим. Я всегда подозревал, что все сведется к тому, что тебе просто придется делать это самому. - person pushcx; 14.12.2012

Я совсем не знаком с Ruby, поэтому не могу привести рабочий пример, но сценарий ncurses.rb должен вам кое-что сказать, поскольку он намного короче, чем сценарий ansi.rb.

Вы не настраиваете цвета, поэтому просто зацикливаете 16-цветную палитру по умолчанию с вариациями, предоставляемыми такими атрибутами, как мерцание, подчеркивание, полужирный шрифт и т. д.

Вам нужно использовать int init_color(short color, short r, short g, short b) для инициализации индекса цвета значениями RGB (0 - 1000), а затем установить пары цветов для использования для отображения с помощью int init_pair(short pair, short f, short b) перед вызовом COLOR_PAIR(n).

Для переносимости вы должны проверить bool has_colors(void) и bool can_change_color(void)

В моей системе справочные страницы для ncurses бесценны.

person James Morris    schedule 18.10.2009