LINUX.ORG.RU

Дилетантский вопрос к тем, кто знает Си

 ,


0

1

Решил я найти простенький индикатор раскладки в трей, нашел kbi. Для того, чтобы он вписался в окружение слегка изменил код под себя, переменные. Но вот никак не пойму с цветом текста. В коде это так:

#define COLOR 0xDFDFDF /* 0x2E3436 */

И обработка COLOR:

cairo_set_source_rgb(cr,
                     (COLOR >> 16) / 255.0,
                     (COLOR >> 8 & ~(0xFF << 8)) / 255.0,
                     (COLOR & ~(0xFFFF << 8)) / 255.0);

Сам вопрос, как из 0x2E3436 получился 0xDFDFDF? Мне собственно нужен белый, но так не работает:

#define COLOR 0xFFFFFF

Может здесь есть сам автор? Очень понравилось, простенько и без лишних флажков.

★★★★

Сам вопрос, как из 0x2E3436 получился 0xDFDFDF?

ручками написали и получился. просто кто-то цвета подбирал. df(16ричный) это 223. короче какой-то светло серый.

alysnix ★★★
()

как из 0x2E3436 получился 0xDFDFDF?

Скорее всего просто возможый вариант в комментарии указан.

Мне собственно нужен белый, но так не работает

Захардкодить cairo_set_source_rgb(cr, 1, 1, 1); тоже не помогает?

utf8nowhere ★★★
()
Последнее исправление: utf8nowhere (всего исправлений: 1)

Цвет задаётся float значениями.

  • cairo_set_source_rgb(cr,1.0f,1.0f,1.0f) белый

Вот тут можешь например, чтобы не мудрить, цвет подобрать

И взять от туда значение RGB 0.0-1.0 float

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 3)

Сам вопрос, как из 0x2E3436 получился 0xDFDFDF?

Судя по приведённому куску, никак.

cairo_set_source_rgb(cr,
                     (COLOR >> 16) / 255.0,
                     (COLOR >> 8 & ~(0xFF << 8)) / 255.0,
                     (COLOR & ~(0xFFFF << 8)) / 255.0);

Это просто разделяет константу на байты и нормирует (видимо для cairo).

andalevor ★★★
()
Ответ на: комментарий от Bfgeshka

Типичный пример для аргумента против комментариев,

Тебе нужен комментарий «Чтобы понять значения аргументов функции прочтите НАКОНЕЦ документацию по ней?»

LamerOk ★★★★★
()
Ответ на: комментарий от dmitry237

Собрал у себя — не воспроизводится. На изменение COLOR реагирует ожидаемо: с 0xFFFFFF белый текст, с 0xFF0000 — красный.

P.S. для сборки

gcc -O2 $(pkg-config --cflags gtk+-3.0 pangocairo x11) -o kbi kbi.c $(pkg-config --libs gtk+-3.0 pangocairo x11)

или

CFLAGS=$(pkg-config --cflags gtk+-3.0 pangocairo x11) LDLIBS=$(pkg-config --libs gtk+-3.0 pangocairo x11) make kbi
utf8nowhere ★★★
()
Последнее исправление: utf8nowhere (всего исправлений: 1)
Ответ на: комментарий от dmitry237

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

А так, не должны быть разноцветные судя по


Sets the source pattern within cr to an opaque color. This opaque color will then be used for any subsequent drawing operation until a new source pattern is set.

cairo_set_source_rgb(cr, red, green, blue)


Может ты запускаешь не тот файл, вернее прошлый, пересобираешь в один, а запускаешь другой :)

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

попробуй просто удалить эту функцию, тебе белый нужен, может оно по умолчанию белым и пишет.

По твоей же ссылке написано

The default source pattern is opaque black, (that is, it is equivalent to cairo_set_source_rgb(cr, 0.0, 0.0, 0.0)).

utf8nowhere ★★★
()
Последнее исправление: utf8nowhere (всего исправлений: 1)
Ответ на: комментарий от Jurik_Phys

А собранный ли бинарник запускается для теста?

Собрал и запустил. Другого kbi нет. Сейчас перелогинюсь в xfce, может в i3 и fluxbox другой трей?

PS. Нет, такая же ерунда, ладно выставил нечто циановое, цвета если и различаются, но не особо заметно.

dmitry237 ★★★★
() автор топика
Последнее исправление: dmitry237 (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Может ты запускаешь не тот файл, вернее прошлый, пересобираешь в один, а запускаешь другой :)

Нет, я его перемещаю в домашний bin, он в $PATH, соответсвенно старый перезаписывается

dmitry237 ★★★★
() автор топика
Ответ на: комментарий от dmitry237

выводится En или Ru разноцветные, заглавная белая, а другая зеленая

Кривой субпиксельный antialiasing?

Размер шрифта если увеличить, что получается?

utf8nowhere ★★★
()
Последнее исправление: utf8nowhere (всего исправлений: 2)
Ответ на: комментарий от dmitry237

Тем не менее, попахивает кривым антиалиасингом. Возможно, тот же баг, что https://gitlab.gnome.org/GNOME/gimp/-/issues/8455

Что если отключить субпиксельный антиалиасинг?

utf8nowhere ★★★
()
Последнее исправление: utf8nowhere (всего исправлений: 1)

Сам вопрос, как из 0x2E3436 получился 0xDFDFDF?

Ты тупостью траллишь, чтоле? Это два никак не связанных друг с другом значения. Старое - закоменченное, и новое - используемое.

Мне собственно нужен белый, но так не работает:

Работает.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Ты тупостью траллишь, чтоле? Это два никак не связанных друг с другом значения.

Я не разбираюсь в этом, вообще. Просто подумал, что может в Си как-то по-хитрому принято указывать цвета. А потом мудрят с побитовыми и логическими операциями, ведь нельзя же просто указать rgb, надо обязательно BAND, BNOT и SHIFT вправо-влево.

dmitry237 ★★★★
() автор топика
Ответ на: комментарий от dmitry237

Вот так

Ты слепой? У тебя включено размазывание инклюзивной радугой вокруг букв.

Поставь терминус в систему и замени строчку #define FONT "Sans 10" на #define FONT "Terminus 10".

Ещё вариант - создай новый профиль пользователя в системе, убедись, что настройках фритайпа нет размазни и запусти программу в полуголых иксах без всяких гомосеттингов.

LamerOk ★★★★★
()
Ответ на: комментарий от dmitry237

в Си как-то по-хитрому принято указывать цвета. А потом мудрят с побитовыми и логическими операциями

Возможно, это следы переписывания на cairo с какого-нибудь неcairo, где цвет задавался одним целым числом.

anonymous
()
Ответ на: комментарий от dmitry237

Просто подумал, что может в Си как-то по-хитрому принято указывать цвета.

в си цветов вообще нет, а также запахов и вкусов. как внешние либы их определяют, так и будет.

цвета обычно представляют как тройку байтов red,green,blue компонент.

но особо гордые птички, чтобы лететь к самому солнцу, могут и представлять компоненты как плавающий (float) тип. вот тут так и есть.

просто байт 0..255 делят на 255.0 и получаются float 0..1.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от alysnix

Я с таким float-представлением цвета не сталкивался, да и при значениях по-умолчанию текст выводился слишком мелкими, мне вообще показалось, что он салатовый. Я, кстати, проверял, что получается на выходе:

$ & {
         (0xdbdbdb -shr 16) / 255.0          
         (0xdbdbdb -shr 8 -band -bnot (0xFF -shl 8)) / 255.0
         (0xdbdbdb -band -bnot (0xFFFF -shl 8)) / 255.0     
    }
0,858823529411765
0,858823529411765
0,858823529411765

Но мало ли…

dmitry237 ★★★★
() автор топика
Ответ на: комментарий от dmitry237

ну вот и экспериментируй в этой кайре с цветовыми компонентами в диапазоне 0..1, естессно float.

а то, что он делал сдвиги и маски накладывал.. это он rgb байты вытаскивал из 32битного слова, куда их ранее затолкали, аналогичным, но обратным способом. короче распаковывал компоненты упакованные в машинное слово.

alysnix ★★★
()
Ответ на: комментарий от alysnix

Я пришел к выводу, что проблема скорее с моими настройками шрифтов. Ну если у всех нормально, а у меня нет. Но и здесь я не продвинулся, отключил сглаживание, уточнение, удалил /etc/profile.d/freetype2.sh, перезагружался, но это никак не повлияло на результат. Точнее, шрифты в целом выглядят иначе, но сам индикатор все равно из двух цветов, первый символ ожидаемого цвета, а второй почему-то зеленый… И только циановые варианты (а-ля 0х00FFFF) отображаются нормально. Поэтому у меня такие детские непонятки и возникли.

dmitry237 ★★★★
() автор топика

поскольку сие есть чистое извращение

cairo_set_source_rgb(cr,
                     (COLOR >> 16) / 255.0,
                     (COLOR >> 8 & ~(0xFF << 8)) / 255.0,
                     (COLOR & ~(0xFFFF << 8)) / 255.0);

запиши его правильно

cairo_set_source_rgb(
  cr,
  ((COLOR >> 16) & 0xFF ) / 255.0, //red
  ((COLOR >> 8 ) & 0xFF ) / 255.0, //green
  ((COLOR & 0xFF) / 255.0 //blue
);

при этом компоненты в слове будут в 16ричном виде 0xRRGGBB

но поскольку там упакованный цвет вроде нигде больше не используется можно прям подставить желаемые компоненты в вызов в плавающем виде 0..1

типа так

cairo_set_source_rgb(
  cr,
  0.7, //red
  0.5, //green
  0.1 //blue
);
alysnix ★★★
()
Ответ на: комментарий от alysnix

Я пробовал явно подставлять значения, выше это предлагали, но дело действительно не в этом, а в шрифтах. Или еще в чем-то.

Отключил picom, ничего не изменилось.

dmitry237 ★★★★
() автор топика
Последнее исправление: dmitry237 (всего исправлений: 1)
Ответ на: комментарий от dmitry237

И только циановые варианты (а-ля 0х00FFFF) отображаются нормально.

Вот в этом варианте у тебя белые горизонтальные палки у буквы Е и почти белая вертикальная:

https://picloud.cc/images/9292a9e3a75ebc98164dc35b4ae3c8af.png

Просто хреновый шрифт не ложится пиксельную сетку и его размазюкивает почему-то зелёным (что странно - соседние буквы обмазаны чёрно-синим).

Ничего не помогает,

В новом чистом профиле пользователя с голыми иксами без гомодкед всё должно работать нормально. Если не работает - у тебя конкретно зафакаплен сам дистрибутив / установка.

LamerOk ★★★★★
()
Ответ на: комментарий от ann_eesti

у тебя же хфцешная панель?

Нет, i3bar и панель fluxbox

На самом деле никогда не пользовался, даже в крысе не смотрю на индикатор, это скорее «чтобы было».

dmitry237 ★★★★
() автор топика
Последнее исправление: dmitry237 (всего исправлений: 1)