воскресенье, 6 марта 2011 г.

Цвет в conky

Цвет на мониторе создаётся смешиванием трех основных цветов, красного - R, зеленого - G, голубого - B. Насыщенность полученного цвета, его прозрачность, устанавливается параметром alpha. Изменяя параметры каждого цвета можно получить десятки тысяч всевозможных цветов и оттенков.
Для подбора цвета я использую программу Agave, есть в репозитарии, с помощью этой программы можно подобрать, задав определенный цвет, похожие, взаимодополняющие, монохромные цвета от двух до четырех.

В классических конках цвет можно задать как названием цвета

${color red}

так и шестнадцатеричным кодом

${color RRGGBB}

значения для каждого цвета можно изменять в пределах от 00 до FF.

Насыщенность цвета, только для текстов, устанавливается параметром

xftalpha = 1

который записывается выше слова TEXT и может иметь значение от 0 до 1.


В CAIRO цвет можно задать несколькими способами. Но программа понимает только значения от 0 до 1

Самый простой способ, это указать цвет в формате R - красный, G - зеленый, B - синий с помощью команды

cairo_set_source_rgb (cr, R, G, B)

Насыщенность цвета, его прозрачность, в этом случае, будет наибольшая и её нельзя изменить. Для изменения насыщенности необходимо использовать команду

cairo_set_source_rgba (cr, R, G, B, alpha)

alpha также может иметь значения от 0 - абсолютная прозрачность, до 1 - наибольшая насыщенность.

Всё это хорошо для программы, но обычно код цвета пишут в шестнадцатеричном коде, а пересчитывать код не очень то легко. Для этого в скрипт вводят функцию пересчета цвета.

function rgb_to_r_g_b(colour, alpha)
    return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha
end


Эта функция забирает значения цвета в шестнадцатеричном коде и производит перерасчет в десятичное значение.

Для использования этой функции необходимо в скрипте задать цвет по такой форме

colour = 0xRRGGBB

и тогда команда для назначения цвета будет

cairo_set_source_rgba(cr, rgb_to_r_g_b(colour, alpha))

Напишем простой скрипт для вывода квадрата окрашенного в коричневый цвет с кодом #7F5906. Код можно писать как заглавными так и строчными буквами.

require 'cairo'

function brown_square ()

    if conky_window == nil then return end
    local cs = cairo_xlib_surface_create(conky_window.display, conky_window.drawable, conky_window.visual, conky_window.width, conky_window.height)

cr = cairo_create (cs)


-- вставляем в текст локальную функцию для перерасчета цвета

    local function rgb_to_r_g_b(colour, alpha)
        return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha
    end


-- задаем координаты

    x = 20
    y = 50


-- задаем размеры, так как это квадрат, то задаем только ширину или высоту

    width = 200

-- задаем цвет и насыщенность

    colour = 0x7f5906
    alpha = 1


    cairo_set_source_rgba(cr, rgb_to_r_g_b(colour, alpha))

-- рисуем квадрат

    cairo_rectangle (cr, x, y, width, width)

    cairo_fill (cr)

    cairo_destroy(cr)
   
end



Теперь разберём градиентную окраску, то есть окраску с плавным переходом цвета из одного в другой. В классических конках такая окраска задействована в выводе баров командой

${cpugraph (номер cpu) (высота),(ширина) (первый цвет) (второй цвет) (шкала)}

Пример использования этой команды

${cpugraph cpu0 50,200 ff0000 0000ff -l}


При рисовании в cairo градиентная окраска предоставляет много возможностей для вывода псевдообъёмных рисунков. Пример градиентной окраски с использованием линейной и радиальной градации.



Для линейной градиентной окраски задаем параметры для окраски

pat = cairo_pattern_create_linear (x0, y0, x1, y1)

в этой команде координаты
x0, y0 = x, y
x1, y1 = могут иметь различные параметры в зависимости от того, что мы желаем получить.

Назначаем цвет

cairo_pattern_add_color_stop_rgba (pat, отступ, R, G, B, alpha)

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

Далее следует команда, для вывода рисунка, возьмем к примеру квадрат

cairo_rectangle (cr, x, y, width, height)

Включаем градиентную окраску

cairo_set_source (cr, pat)

Окрашиваем

cairo_fill (cr)

Выключаем градиентную окраску

cairo_pattern_destroy (pat)


Напишем простой скрипт для вывода квадрата окрашенного в коричневый цвет с кодом #7F5906 переходящим в синий цвет с кодом #062D7F.

require 'cairo'

function brown_blue_square ()

    if conky_window == nil then return end
    local cs = cairo_xlib_surface_create(conky_window.display, conky_window.drawable, conky_window.visual, conky_window.width, conky_window.height)

cr = cairo_create (cs)


-- вставляем в текст локальную функцию для перерасчета цвета

    local function rgb_to_r_g_b(colour, alpha)
        return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha
    end


-- задаем координаты

    x = 20
    y = 50


-- задаем размеры, так как это квадрат, то задаем только ширину или высоту

    width = 200

-- задаем параметры

pat = cairo_pattern_create_linear (x, y, x, y + width)

-- задаем цвет и насыщенность

    colour0 = 0x7f5906
    colour1 = 0x062D7f
    alpha = 1


    cairo_pattern_add_color_stop_rgba (pat, 1, rgb_to_r_g_b(colour0, alpha))

    cairo_pattern_add_color_stop_rgba (pat, 0, rgb_to_r_g_b(colour1, alpha))


-- рисуем квадрат

cairo_rectangle (cr, x, y, width, width)

-- включаем градиентную окраску

cairo_set_source (cr, pat)

-- окрашиваем

cairo_fill (cr)

-- отключаем градиентную окраску

cairo_pattern_destroy (pat)

cairo_destroy (cr)
end


Изменяя параметры градации можно например поменять цвета местами

pat = cairo_pattern_create_linear (x, y + width, x, y)

 повернуть

pat = cairo_pattern_create_linear (x, y, x + width, y)


Всё зависит от вашей фантазии.

В следующий раз расскажу о радиальной градиентной окраске.

Комментариев нет:

Отправить комментарий