В C или C ++ есть ли способ непосредственно прочитать значения RGB цветовой палитры? Особенно интересным является расширенное цветовое пространство, используемое xterm (и другими) для определения до 256 терминальных цветов.
Например, я хочу определить свои собственные цвета (используя escape-последовательности ANSI, например, \e]4;3;rgb:cc/78/33\e\\
или непосредственно в c), но мне нужно сохранить цвета пользователей перед тем, как переопределить их (в маловероятном случае, когда они уже переопределили свои цвета), чтобы я мог восстановить их после завершения моей программы. Нечеткая настройка пользователя не хороша.
Прямо сейчас я собираюсь использовать escape-последовательности ANSI, чтобы сделать это клиентским способом. Но так как я не могу найти, как вы получаете цвета, я начинаю заниматься этим вместо этого в c или c ++.
Решение будет написано как рубиновый гем с собственным расширением (в основном это встроенный код c или c ++), и я буду стремиться получить кроссплатформенное решение, хотя основной целью является OS X и, во-вторых, среды Linux …
Из моих первоначальных экспериментов я дошел до того, что я могу определить любые цвета, которые я хочу для кодовой точки в цветовой палитре. Я также могу легко восстановить системные цвета по умолчанию (так как они являются стандартом ANSI). Я искал способ сделать это с помощью управляющих кодов ANSI, но не нашел ни одного. Я полагаю, что это где-то хранится в памяти, и, если есть какой-то способ найти, читать цвета должно быть легко …
Подведем итоги информации в комментариях:
Похоже, что единственный способ сделать это последовательно — это распечатать экран из █ символов разных цветов и извлечь из него цвета. Поскольку предполагается, что этот проект будет кроссплатформенным по всем трем основным ОС, а Linux в настоящее время имеет 3 диспетчера пользователей, которые находятся на входе в эксплуатацию, а Windows имеет два (7 и 8), я могу только представить, сколько часов удовольствия от этого было бы 🙂
Таким образом, мое «решение» ™ заключается в том, чтобы просто заглушить цвета пользователей (если у них было что-то кроме системных значений по умолчанию … что, давайте посмотрим правде в глаза, это довольно редко). Я предоставлю файл настроек, в котором пользователь может сообщить плагину, какие цвета должны быть восстановлены, если они не удовлетворены настройками системы по умолчанию. Прагматичный и скучный, но это заставляет меня снова идти на это 🙂
[Редактировать 1] извините, это не приводит к решению, но для других я добавил доступ IO палитры ЦАП
посмотрите старые устаревшие ссылки на EGA / VGA …
для прямого доступа попробуйте это:
BYTE r,g,b,c=5; // R,G,B values are 6 bit only !!!
out 0x3C8,c; // set color index to work with <0,255>
in r,0x3C9; // read color pallete for color c
in g,0x3C9; // not sure if it should be r,g,b
in b,0x3C9; // or b,g,r ... i did not use it for too many years
out 0x3C8,c; // set color index to work with <0,255>
out 0x3C9,r; // write color pallete for color c
out 0x3C9,g;
out 0x3C9,b;
C / C ++ не имеет операций in, out, поэтому используйте это:
BYTE i,o; // this must be local !!!
WORD port; // this must be local !!!
asm {
mov dx,port // in i,port
in al,dx
mov o,al
mov dx,port // out port,o
mov al,o
out dx,al
}
Других решений пока нет …