Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FARCOLORFLAGS docs are outdated #906

Open
johnd0e opened this issue Feb 10, 2025 · 11 comments · May be fixed by #917
Open

FARCOLORFLAGS docs are outdated #906

johnd0e opened this issue Feb 10, 2025 · 11 comments · May be fixed by #917

Comments

@johnd0e
Copy link
Contributor

johnd0e commented Feb 10, 2025

E.g. FCF_FG_UNDERLINE does not exist anymore, but there are FCF_FG_UNDERLINE_INDEX, FCF_FG_U_DATA0, FCF_FG_U_DATA1, FCF_FG_U_DATA2 and FCF_FG_UNDERLINE_MASK instead.
Other not yet documented flags include FCF_FG_OVERLINE, FCF_FG_STRIKEOUT, FCF_FG_FAINT, FCF_FG_BLINK, FCF_FG_INVERSE, FCF_FG_INVISIBLE, FCF_STYLEMASK, FCF_RAWATTR_MASK.

Compare https://api.farmanager.com/ru/structures/farcolor.html with the sources:

Details

FarManager/far/plugin.hpp

Lines 104 to 142 in 283c2a1

typedef unsigned long long FARCOLORFLAGS;
FAR_INLINE_CONSTANT FARCOLORFLAGS
FCF_FG_INDEX = 0x0000000000000001ULL,
FCF_BG_INDEX = 0x0000000000000002ULL,
FCF_FG_UNDERLINE_INDEX = 0x0000000000000008ULL,
FCF_INDEXMASK = 0x000000000000000BULL, // FCF_FG_INDEX | FCF_BG_INDEX | FCF_FG_UNDERLINE_INDEX
#ifdef FAR_USE_INTERNALS
#else // ELSE FAR_USE_INTERNALS
// Legacy names, don't use
FCF_FG_4BIT = 0x0000000000000001ULL, // FCF_FG_INDEX
FCF_BG_4BIT = 0x0000000000000002ULL, // FCF_BG_INDEX
FCF_4BITMASK = 0x000000000000000BULL, // FCF_INDEXMASK
#endif // END FAR_USE_INTERNALS
FCF_INHERIT_STYLE = 0x0000000000000004ULL,
FCF_RAWATTR_MASK = 0x000000000000FF00ULL, // stored console attributes
#ifdef FAR_USE_INTERNALS
FCF_FOREIGN = 0x0000000000010000ULL,
#endif // END FAR_USE_INTERNALS
FCF_FG_BOLD = 0x1000000000000000ULL,
FCF_FG_ITALIC = 0x2000000000000000ULL,
FCF_FG_U_DATA0 = 0x4000000000000000ULL, // This is not a style flag, but a storage for one of 5 underline styles
FCF_FG_U_DATA1 = 0x8000000000000000ULL, // This is not a style flag, but a storage for one of 5 underline styles
FCF_FG_OVERLINE = 0x0100000000000000ULL,
FCF_FG_STRIKEOUT = 0x0200000000000000ULL,
FCF_FG_FAINT = 0x0400000000000000ULL,
FCF_FG_BLINK = 0x0800000000000000ULL,
FCF_FG_INVERSE = 0x0010000000000000ULL,
FCF_FG_INVISIBLE = 0x0020000000000000ULL,
FCF_FG_U_DATA2 = 0x0040000000000000ULL, // This is not a style flag, but a storage for one of 5 underline styles
FCF_FG_UNDERLINE_MASK = 0xC040000000000000ULL, // FCF_FG_U_DATA0 | FCF_FG_U_DATA1 | FCF_FG_U_DATA2,
FCF_STYLEMASK = 0xFFF0000000000000ULL,
FCF_NONE = 0;

@johnd0e
Copy link
Contributor Author

johnd0e commented Feb 10, 2025

Also from color picker we can know possible underline types:

  • Single
  • Double
  • Curly
  • Dotted
  • Dashed

So currently 5 types are mapped to 4 flags in some (unobvious) way. As for me, it would be more convenient to have 5 separate flags, and just document that they are mutually exclusive.

Otherwise, we could introduce five more constants for the allowed combinations of the four existing flags.

@alabuzhev
Copy link
Contributor

The whole page is outdated.
PRs are welcome. You can use this cheat sheet as a reference:

Image

@johnd0e
Copy link
Contributor Author

johnd0e commented Feb 11, 2025

FarColor

https://api.farmanager.com/ru/structures/farcolor.html

Структура FarColor описывает код цвета, используется, например, в функции Text.

struct rgba
{
	unsigned char
		r,
		g,
		b,
		a;
};

struct color_index
{
	unsigned char
		i,
		reserved0,
		reserved1,
		a;
};

struct FarColor
{
	FARCOLORFLAGS Flags;
	union
	{
		COLORREF ForegroundColor;
		struct color_index ForegroundIndex;
		struct rgba ForegroundRGBA;
	};
	union
	{
		COLORREF BackgroundColor;
		struct color_index BackgroundIndex;
		struct rgba BackgroundRGBA;
	};
	union
	{
		COLORREF UnderlineColor;
		struct color_index UnderlineIndex;
		struct rgba UnderlineRGBA;
	};
	DWORD Reserved;
	// ...
	UNDERLINE_STYLE GetUnderline() const  {/* ... */}
	FarColor& SetUnderline(UNDERLINE_STYLE UnderlineStyle) {/* ... */}
	// ... кроме того определён ряд других хелперов, полное определение см. в plugin.hpp
};

Элементы

Flags

Может быть комбинацией следующих значений (тип FARCOLORFLAGS):

Флаг Описание
FCF_FG_INDEX цвет символа задан индексом
FCF_BG_INDEX цвет фона символа задан индексом
FCF_FG_UNDERLINE_INDEX цвет подчёркивания задан индексом
FCF_INHERIT_STYLE "Наследовать" расширенные атрибуты; используется в группах раскраски файлов, в цвете выделения, и в раскраске редактора, потенциально - и в других местах
FCF_NONE нулевой флаг

Расширенные атрибуты, задающие стиль (см. также Замечания):

Флаг Описание
FCF_FG_BLINK "мигающий"
FCF_FG_BOLD "жирный" (или "яркий")
FCF_FG_FAINT "блёклый"
FCF_INVERSE "инверсный" ("негатив")
FCF_FG_INVISIBLE "невидимый" ("скрытый")
FCF_FG_ITALIC "наклонный" ("курсив")
FCF_FG_OVERLINE "надчёркнутый"
FCF_FG_STRIKEOUT "зачёркнутый"
FCF_FG_U_DATA0, FCF_FG_U_DATA1, FCF_FG_U_DATA2 "подчёркнутый"; стиль подчёркивания определяется комбинацией значений этих трёх битов.*

* Для работы со стилями подчёркивания предусмотрены хелперы GetUnderline() и SetUnderline().
Возможные стили подчёркивания (enum UNDERLINE_STYLE): UNDERLINE_NONE, UNDERLINE_SINGLE, UNDERLINE_DOUBLE, UNDERLINE_CURLY, UNDERLINE_DOT, UNDERLINE_DASH.

Маски

Флаг Описание
FCF_INDEXMASK FCF_FG_INDEX | FCF_BG_INDEX | FCF_FG_UNDERLINE_INDEX
FCF_FG_UNDERLINE_MASK FCF_FG_U_DATA0 | FCF_FG_U_DATA1 | FCF_FG_U_DATA2
FCF_RAWATTR_MASK LVB console attributes
FCF_STYLE_MASK объединение всех расширенных атрибутов

ForegroundIndex | ForegroundRGBA | ForegroundColor

Цвет символа может быть представлен в виде struct color_index, struct rgba или COLORREF, в зависимости от флага FCF_FG_INDEX:

  • Если флаг установлен, то значение соответствует типу struct color_index, где i это индекс в палитре (см. Замечания), a - Alpha-канал, определяющий степень прозрачности, от полностью прозрачного 00 до совсем непрозрачного FF.
  • Если флаг снят, то значение соответствует типу struct rgba, где a - Alpha-канал, а r, g, b - красный, зелёный, и синий каналы в цветовом пространстве RGB, со значениями от 00 до FF.
  • Значение типа COLORREF можно использовать в обоих случаях:
    • при установленном флаге: значение в формате 0xAA000000 - 0xAA0000FF, где младший байт представляет собой индекс в палитре, а старший (AA) - Alpha-канал.
    • при снятом флаге: значение в формате 0xAABBGGRR, где AA - Alpha-канал, а RR, GG, BB - красный, зелёный, и синий каналы.

Warning

В данный момент прозрачность поддерживается не везде. Чтобы в будущем избежать неприятных сюрпризов, всегда устанавливайте Alpha-канал (старший байт значения COLORREF) в 0xFF.

Note

Для комфортной работы со структурами также предусмотрен ряд хелперов, см. plugin.hpp

BackgroundIndex | BackgroundRGBA | BackgroundColor

Цвет фона символа, в зависимости от флага FCF_BG_INDEX, формат тот же что у Foreground*

UnderlineIndex | UnderlineRGBA | UnderlineColor

Цвет подчёркивания, в зависимости от флага FCF_FG_UNDERLINE_INDEX, формат тот же что у Foreground*.

Reserved

Не используется и должен быть установлен в 0.

Замечания

При использовании цветов из палитры обязательно указывайте флаги FCF_FG_INDEX, FCF_BG_INDEX (и FCF_FG_UNDERLINE_INDEX, если используется подчёркивание).

Стандартные цвета консоли Windows представляют собой палитру из 16 цветов, с индексами 0 - 15.

Также можно использовать цвета из палитры VT100 (16 - 255). В этом случае значения (16 - 231) кодируются как 36R+6G+B, где уровень каждого из основных цветов 0-5, а последние 24 значения (232 - 255) используются для оттенков серого [желательна ссылка на определение VT color cube].

Warning

  • Гарантированно везде работает только стандартная 16-цветная палитра.
    Поддержка всего остального условна и определяется вашим терминалом.
  • Расширенные (RGB) цвета и стили требуют рендеринга на основе Virtual Terminal,
    который можно включить в настройках интерфейса. Если он не включен или если ваш
    терминал не поддерживает цвета RGB, то цвета будут аппроксимированы до ближайших
    индексов консольной палитры.

Смотрите также:

[вероятно стоит приложить и cheat sheet?]

@johnd0e
Copy link
Contributor Author

johnd0e commented Feb 11, 2025

@alabuzhev

  • В нескольких местах текста, где требуются дополнительные пояснения, сейчас стоят знаки вопроса.
  • Непонятно, как должна работать прозрачность: например я устанавливаю для Help / Normal Text (FG/BG) прозрачность 77, жму F1 и ничего вообще не меняется. Это об этом предупреждение что "в данный момент прозрачность поддерживается не везде"? На чём тогда сейчас можно проверить?
  • (тема для отдельного тикета) Заметил что работа атрибутов Bold/Faint/Blink неодинакова для всех цветов, и ещё зависит от того, используется ли цвет из палитры или RGB.
    Например, с умолчательным Dialog / Normal text работает только Bold (хотя цвет парадоксально меняется на более бледный). А если установить дефолтные цвета RGB, то ни один из трёх перечисленных атрибутов не оказывает влияния.
  • (оффтопик) Не вполне очевидно что именно делает настройка Colors / Palette / [x] Classic palette. Похоже сбрасывает консольную палитру к стандартным значениям.

@alabuzhev
Copy link
Contributor

alabuzhev commented Feb 11, 2025

struct FarColor

Outdated.

| FCF_INHERIT_STYLE | ? |

https://forum.farmanager.com/viewtopic.php?p=168086

FCF_FG_INVERSE

It is FCF_INVERSE now.

| FCF_FG_UNDERLINE_INDEX | "подчёркнутый", стиль подчёркивания должен быть задан в FCF_FG_U_DATA* |

This is not a style flag, but a switch between index and RGB.
It belongs to the other table, next to FCF_FG_INDEX & FCF_BG_INDEX.

  • Single: FCF_FG_U_DATA0
  • Double: FCF_FG_U_DATA1
  • Curly: FCF_FG_U_DATA1 | FCF_FG_U_DATA0
  • Dotted: FCF_FG_U_DATA2
  • Dashed: FCF_FG_U_DATA2 | FCF_FG_U_DATA0

Users are not supposed to do that manually, so no need to document.
There's UNDERLINE_STYLE enum and GetUnderline() & SetUnderline() helpers in FarColor.

Reserved
Не используется и должен быть установлен в 0.

It's UnderlineColor now.

Это об этом предупреждение что "в данный момент прозрачность поддерживается не везде"?

Yep.

На чём тогда сейчас можно проверить?

Files highlighting.
Colors -> Editor -> Selected text.
ECTL_ADDCOLOR

Bold/Faint/Blink

Faint is "reduce text intenseness".
Blink is "Faint in a loop".
Bold is either actually "bold font" or "increase text intenseness", depending on your terminal and/or its settings.

We do not do anything funny with these flags, just pass them to the terminal.
If something doesn't match your expectations it's better to report it there.

сбрасывает консольную палитру к стандартным значениям

Yes, to pre-Windows 10 values. Same as "Vintage" in WT.

@johnd0e
Copy link
Contributor Author

johnd0e commented Feb 11, 2025

Исправил.
Надо ли все хелперы перечислить, и описать?

Yes, to pre-Windows 10 values. Same as "Vintage" in WT.

Из того, что это чекбокс, а не просто кнопка, предполагается что фар активно препятствует изменению палитры?

@alabuzhev
Copy link
Contributor

Up to you.

If checked, we set the palette at startup and then every time something is executed from the command line.

@johnd0e
Copy link
Contributor Author

johnd0e commented Feb 11, 2025

FCF_INHERIT_STYLE действует также и для Editor -> Selected text, и ECTL_ADDCOLOR?

Про LVB console attributes ничего конкретного больше не надо сказать?
Сейчас упоминается только маска.

@HamRusTal
Copy link
Contributor

I propose my help in Russian proofreading (spelling, punctuation, grammar, style, etc). If nobody minds, please let me know when the text is ready for a clean-up.

@alabuzhev
Copy link
Contributor

Probably.

LVB should be treated as opaque.
We might encounter them in the output after executing something, such attributes need to be preserved and put back when we show the user screen.

@johnd0e
Copy link
Contributor Author

johnd0e commented Feb 12, 2025

please let me know when the text is ready for a clean-up.

It is ready, more or less. Probably there can be some changes later, when it will be converted to html.

@johnd0e johnd0e linked a pull request Feb 16, 2025 that will close this issue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants