Чтение значений RGB консольной цветовой палитры

В 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), я могу только представить, сколько часов удовольствия от этого было бы 🙂

Таким образом, мое «решение» ™ заключается в том, чтобы просто заглушить цвета пользователей (если у них было что-то кроме системных значений по умолчанию … что, давайте посмотрим правде в глаза, это довольно редко). Я предоставлю файл настроек, в котором пользователь может сообщить плагину, какие цвета должны быть восстановлены, если они не удовлетворены настройками системы по умолчанию. Прагматичный и скучный, но это заставляет меня снова идти на это 🙂

4

Решение

[Редактировать 1] извините, это не приводит к решению, но для других я добавил доступ IO палитры ЦАП

посмотрите старые устаревшие ссылки на EGA / VGA …

  • Вы можете получить доступ к палитре через I / O
  • я думаю, что это были порты 0x03C8, 0x03C9 hex.
  • конечно в современной ОС у вас нет к ней доступа
  • так что попробуйте в DOS-BOX или что-нибудь еще и сохраните исходные значения палитры, они должны быть одинаковыми.

для прямого доступа попробуйте это:

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
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]