Немного о цвете в lua+cairo

Разработка скриптов на lua. Создание виджетов, диалогов и т.д.
Ответить
Аватара пользователя
olgmen
Сообщения: 155
Зарегистрирован: 30 ноя 2012, 11:00
Темы: 32
Откуда: Санкт-Петербург
Статус: Не в сети

Немного о цвете в lua+cairo

Сообщение olgmen » 19 янв 2014, 14:27

Имеется две команды для установке цвета. Первая команда устанавливает цвет с полной насыщенностью

cr:set_source_rgb(r, g, b)

Здесь r - красный, g - зеленый, b - синий значения цвета задаются цифрами от 0 до 1

Вторая команда задает кроме цвета ещё и насыщенность цвета, прозрачность

cr:set_source_rgba(r, g, b, a)

Здесь a - насыщенность цвета со значениями от 0 до 1

Эти команды можно использовать как для окраски текста, так и для окраски графики созданной с помощью lua+cairo.

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

С графикой немного посложней, если выводится только контур рисунка, то всё происходит как и при выводе текста, но для окраски всего рисунка, необходимо дать команду

cr:fill()

которая дает задание закончить вывод графики и окрасить всё в заданный цвет.

Например

cr:set_source_rgba (1, 1, 0, 1)

x0 = 20
y0 = 20
width = 200
height = 200
radius = 100

x1 = x0 + width
y1 = y0 + height

cr:set_line_width(15)
cr:move_to(x0, y0+radius)
cr:curve_to(x0, y0, x0, y0, (x0+x1)/2, y0)
cr:curve_to(x1, y0, x1, y0, x1, y0+radius)
cr:line_to(x1, y1-radius)
cr:curve_to(x1, y1, x1, y1, (x1+x0)/2, y1)
cr:curve_to(x0, y1, x0, y1, x0, y1-radius)
cr:fill()

Изображение

Если необходимо нарисовать рамку вокруг, в данном случае прямоугольника, то нет необходимости снова набирать все команды и накладывать рисунок на рисунок. Достаточно изменить последнюю строку

cr:fill_preserve()

Эта команда дает указание всё окрасить и выполнять следующие команды. Затем добавляем цвет рамки, и даем команду завершения

cr:set_source_rgba(0,0,1,1)
cr:stroke()

Всё это выглядит так

cr:set_source_rgba (1, 1, 0, 1)

x0 = 20
y0 = 20
width = 200
height = 200
radius = 100

x1 = x0 + width
y1 = y0 + height

cr:set_line_width(15)
cr:move_to(x0, y0+radius)
cr:curve_to(x0, y0, x0, y0, (x0+x1)/2, y0)
cr:curve_to(x1, y0, x1, y0, x1, y0+radius)
cr:line_to(x1, y1-radius)
cr:curve_to(x1, y1, x1, y1, (x1+x0)/2, y1)
cr:curve_to(x0, y1, x0, y1, x0, y1-radius)
cr:fill_preserve()
cr:set_source_rgba(0,0,1,1)
cr:stroke()

Изображение

В завершении хочу показать как с помощью окраски можно сделать псевдо 3D рисунок

Изображение

Оба изображения, и фон и шар нарисованы с помощью градиентной окраски. Не буду залезать в подробности, объясню как это делается.

Создаем переменную pat, название может быть любым, которая содержит данные о выводимом объекте

local pat = cairo.Pattern.create_linear(0, 0, 0, height)

теперь задаем границы с которых начинается нужный нам цвет, у меня на рисунке использовано два цвета, черный и синий, первая цифра означает уровень с которого начинается цвет, этих уровней может быть сколько угодно, нумерация уровней идёт сверху вниз, от 0 до 1. Следующие три цифры, это цвет в кодировке rgb, последняя цифра, насыщенность цвета

pat:add_color_stop_rgba(1, 0, 0, 0, 1)
pat:add_color_stop_rgba(0, 0, 0, 1, 0.75)


далее рисуем фигуру, в моём случае это квадрат, ширина и высота которого равна ширине и высоте виджета

cr:rectangle(0, 0, width,height)

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

cr:set_source(pat)

или, что тоже самое

cr.source = pat

ну и в завершении даем команду закрасить

cr:fill()

Градиентная окраска шара отличается только переменной pat,

pat = cairo.Pattern.create_radial(115.2, 102.4, 5, 102.4, 102.4, 128)

Здесь три первые цифры, координаты первой окружности и её радиус, на рисунке это светлое пятно (блик на поверхности), остальные три цифры, координаты и радиус второй окружности. Размеры второй окружности могут быть больше или меньше окружности которую мы будем рисовать, от её размеров зависит интенсивность окраски шара

pat:add_color_stop_rgba(0, 1, 1, 1, 1);
pat:add_color_stop_rgba(1, 0, 0, 0, 0);
cr.source = pat


Рисуем окружность

cr:arc(128, 128, 76.8, 0, math.rad(360))

закрашиваем

cr:fill()
Кто ищет, тот всегда найдет

Arch Linux
Conky - 1.9

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей