RGB — работа с цветами консоли

Разработка Far.
Post Reply
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

RGB — работа с цветами консоли

Post by DrKnS »

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

Желающим поиграться с самостоятельным рисованием:

Если изобразите dll с примерно таким интерфейсом (обсуждаемо):

Code: Select all

BOOL GetTextAttributes(FarColor* Attributes)
BOOL SetTextAttributes(const FarColor* Attributes)
BOOL ReadOutput(FAR_CHAR_INFO* Buffer, COORD BufferSize, COORD BufferCoord, SMALL_RECT* ReadRegion);
BOOL WriteOutput(const FAR_CHAR_INFO* Buffer, COORD BufferSize, COORD BufferCoord, SMALL_RECT* WriteRegion);
и, наверное,

Code: Select all

 int GetColorDialog(FarColor* Color, BOOL Centered, BOOL AddTransparent);
(который сведётся к ChooseColor или как там вам удобнее) - то Far вполне сможет её загружать и вызывать, когда надо.

Что делать дальше со свалившимся на вас богатством красок - зависит только от вашей фантазии. :popcorn:
Last edited by DrKnS on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: Изменён заголовок Темы
Maximus5
Posts: 3295
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 10 times
Contact:

Re: RGB

Post by Maximus5 »

Еще наверное, хорошо бы функцию типа
void CommitOutput();
чтобы не напрягать попусту GUI
Maximus5
Posts: 3295
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 10 times
Contact:

Re: RGB

Post by Maximus5 »

И еще вопрос. Эта длл-ка будет загружаться как обычныйи плагин, или плодить отдельную, которая, например, будет рядом с Far.exe?
Yegor
Posts: 1328
Joined: Mon 04 Apr, 2005 13:41
Location: San Ramon, CA / Kharkov, UA
Has thanked: 32 times
Been thanked: 61 times

Re: RGB

Post by Yegor »

Я малость далек от темы, но мне не понятно чьи цвета запрашиваются и возвращаются через:

Code: Select all

BOOL GetTextAttributes(FarColor* Attributes)
BOOL SetTextAttributes(const FarColor* Attributes)
Или Attributes это массив, соответствующий PaletteColors.COL_* ?
Мы не можем ждать милостей от Фара, взять их у него — наша задача! (C) Мичурин
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Re: RGB

Post by DrKnS »

Maximus5 wrote:Еще наверное, хорошо бы функцию типа
void CommitOutput();
чтобы не напрягать попусту GUI
Зачем? WriteOutput - это прямая замена одноимённой функции из console.cpp.
Т. е. дело до неё и так дойдет только тогда, когда Far будет коммитить, а до этого всё кешируется.
Эта длл-ка будет загружаться как обычныйи плагин, или плодить отдельную, которая, например, будет рядом с Far.exe?
Это концепт, поэтому пока планируется отдельно. А тебе ещё и доступ к api нужен?
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Re: RGB

Post by DrKnS »

Yegor wrote:мне не понятно чьи цвета запрашиваются и возвращаются
Текущие цвета консоли.
То, что возвращает GetConsoleScreenBufferInfo и то, что меняет SetConsoleTextAttribute.
Maximus5
Posts: 3295
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 10 times
Contact:

Re: RGB — работа с цветами консоли

Post by Maximus5 »

WriteOutput - это прямая замена одноимённой функции из console.cpp.
Т. е. дело до неё и так дойдет только тогда, когда Far будет коммитить, а до этого всё кешируется.
Что-то я сомневаюсь, что фар коммитит весь буфер целиком за один вызов... не?

Доступ к api фара не нужен, можно и отдельную длл сплодить.
То, что возвращает GetConsoleScreenBufferInfo и то, что меняет SetConsoleTextAttribute.
Т.е. эти функции оперируют с буфером целиком?
Странно как-то, параметров не хватает... Есть ведь еще и прокрутка? то бишь видимая область или весь буфер?

И еще. Как фар будет менять размер буфера (видимой области)? или это остается на совести gui?
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Re: RGB — работа с цветами консоли

Post by DrKnS »

Maximus5 wrote:Что-то я сомневаюсь, что фар коммитит весь буфер целиком за один вызов... не?
Не, только изменившиеся с прошлого коммита участки.
Странно как-то, параметров не хватает... Есть ведь еще и прокрутка? то бишь видимая область или весь буфер?
Размеры видимой области ты можешь узнать сам через winapi, консоль же никуда не делась.
И еще. Как фар будет менять размер буфера (видимой области)? или это остается на совести gui?
А что, он сейчас как-то меняет? Это всё через winapi доступно же.
Maximus5
Posts: 3295
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 10 times
Contact:

Re: RGB — работа с цветами консоли

Post by Maximus5 »

DrKnS wrote:
Maximus5 wrote:Что-то я сомневаюсь, что фар коммитит весь буфер целиком за один вызов... не?
Не, только изменившиеся с прошлого коммита участки.
Так и я о том же.
10 изменившихся участков -> 10 вызовов Write -> 10 раз обновлен экран в gui
нехорошо
User avatar
HaRT
Moderator
Posts: 10858
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Re: RGB — работа с цветами консоли

Post by HaRT »

Maximus5 wrote:10 вызовов Write -> 10 раз обновлен экран в gui
При грамотном использовании InvalidateRect — ничего страшного.
Фар есть инструмент, а не нянька. © 2009 DrKnS
Maximus5
Posts: 3295
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 10 times
Contact:

Re: RGB — работа с цветами консоли

Post by Maximus5 »

При чем тут InvalidateRect? хуже то, что 10 раз придется гонять данные из одного процесса (консоль) - в другой (gui).
Более того, может случиться так, что фактический Redraw в GUI произойдет в середине обновления консоли, будет весело.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Re: RGB — работа с цветами консоли

Post by DrKnS »

Maximus5 wrote:При чем тут InvalidateRect? хуже то, что 10 раз придется гонять данные из одного процесса (консоль) - в другой (gui).
Винда для своей консоли и так гоняет из одного процесса в другой, вроде никто не жалуется.
Ну и 10 раз там не наберется, 2-3 в среднем.
Maximus5
Posts: 3295
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 10 times
Contact:

Re: RGB — работа с цветами консоли

Post by Maximus5 »

Почему такое нежелание сделать "красиво"? Жалко один вызов в конце цикла обновления вставить?

Аргументы
У плагинов фара почему-то commit (в виде Text(NULL)) есть. Для чего-то же его делали ;) А ведь плагины тоже только измененные участки в консоль пишут.
В какой момент обновлять (передавать данные) при постоянном обновлении экрана (скроллинг, пробег курсора по панели,...)?
Да и равняться на кривую консоль винды некошерно.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Re: RGB — работа с цветами консоли

Post by DrKnS »

Ok, убедил.
Maximus5
Posts: 3295
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 10 times
Contact:

Re: RGB — работа с цветами консоли

Post by Maximus5 »

На счет аргументов GetColorDialog.
В чем смысл "Centered"?
Post Reply

Return to “Development”