среда, 2 марта 2011 г.

Рисуем в CONKY

В классических конки, в отличии от конок + LUA + Cairo,  имеется всего одна команда для вывода линии в окно конки.

${hr 10}



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

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

Как и с выводом текстов, всё начинается с точки. Назначаем точку из которой будет проведена линия

cairo_move_to (cr, x, y)

Проводим линию, это можно сделать двумя способами.

Первый способ. Задаем координаты следующей точки, линия будет проведена из начальной точки.

cairo_line_to (cr, x + 100, y)

Второй способ. Задаем координаты точки из которой необходимо провести линию в начальную точку.

cairo_rel_line_to (cr, dx, dy)

 Как говорится в рекламе, это ещё не всё. Необходимо задать толщину линии

cairo_set_line_width (cr, width)

и цвет линии

cairo_set_source_rgba (cr, r, g, b, a)

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

cairo_stroke (cr)

Пример

cairo_set_line_width (cr, 5)
cairo_move_to (cr, 20, 50)
cairo_set_source_rgba (cr, 1, 0, 0, 1)  -- задаем красный цвет для линии
cairo_line_to (cr, 150, 50)  -- проводим горизонтальную линию
cairo_stroke (cr)
-- проводим вторую линию в начальную точку
cairo_set_source_rgba (cr, 1, 1, 0, 1)  --задаем желтый цвет для линии
cairo_move_to (cr, 20, 50)
cairo_rel_line_to (cr, 150, 150)
cairo_stroke (cr)


Концы линии можно оформить следующим образом.

По умолчанию концы линий выводятся обрезанными под прямым углом к линии. Задается это командой

cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT)

Пример. Проводим горизонтальную белую линию и сверху выводим тонкую красную линию с теми же координатами.

cairo_set_line_width (cr, 30)
cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT)
cairo_move_to (cr, 30, 50)
cairo_set_source_rgba (cr, 1, 1, 1, 1) 
-- задаем белый цвет для линии
cairo_line_to (cr, 250, 50)
cairo_stroke (cr)

cairo_set_line_width (cr, 2)
cairo_set_source_rgba (cr, 1, 0.2, 0.2, 1) 
-- задаем красный цвет для линии
cairo_move_to (cr, 30, 50)
cairo_line_to (cr, 250, 50)

cairo_stroke (cr)


 Закругленные концы линии выводятся командой

cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND)

Пример

cairo_set_line_width (cr, 30)
cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND)
cairo_move_to (cr, 30, 50)
cairo_set_source_rgba (cr, 1, 1, 1, 1)

cairo_line_to (cr, 250, 50)
cairo_stroke (cr)

cairo_set_line_width (cr, 2)
cairo_set_source_rgba (cr, 1, 0.2, 0.2, 1)
cairo_move_to (cr, 30, 50)
cairo_line_to (cr, 250, 50)

cairo_stroke (cr)

 Как видно из рисунка, длина линии увеличилась за счет закругления концов линии. Такое же удлинение получается при применении команды

cairo_set_line_cap (cr,  CAIRO_LINE_CAP_SQUARE)

cairo_set_line_width (cr, 30)
cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE)
cairo_move_to (cr, 30, 50)
cairo_set_source_rgba (cr, 1, 1, 1, 1)
cairo_line_to (cr, 250, 50)
cairo_stroke (cr)

cairo_set_line_width (cr, 2)
cairo_set_source_rgba (cr, 1, 0.2, 0.2, 1)

cairo_move_to (cr, 30, 50)
cairo_line_to (cr, 250, 50)
cairo_stroke (cr)

С линиями почти всё, остался вывод пунктирной линии.

cairo_set_dash(cr, длина_штриха, количество_штрихов, отступ)
Пример. В первом случае выводятся штрихи длиной 10 пикселей без смещения, во втором со смещением на длины штриха.

cairo_set_line_width (cr, 2)
cairo_set_source_rgba (cr, 1, 0.2, 0.2, 1)
cairo_move_to (cr, 30, 150)
cairo_line_to (cr, 250, 150)
cairo_set_dash(cr, 10, 1, 0) 
-- задаем параметры верхней пунктирной линии
cairo_stroke (cr)

cairo_move_to (cr, 30, 250)
cairo_line_to (cr, 250, 250)
cairo_set_dash(cr, 10, 1, -10)
-- задаем параметры нижней пунктирной линии
cairo_stroke (cr)



К сожалению вывод штрихпунктирной линии я не одолел.

Далее рассмотрим вывод простых фигур, окружности и прямоугольника.



4 комментария:

  1. А как сделать переносы и обрезку слишком длинной текстовой строки?

    ОтветитьУдалить
  2. О какой текстовой строке идет речь?

    ОтветитьУдалить
    Ответы
    1. Извините, я вкладкой ошибся и не туда написал вопрос. Я хотел его в статью про вывод текста написать, где вывод с помощью lua осуществляется. Вот например ширина блока 100px и текст которые не влазит в этот блок нужно как нибудь обрезать. Или перенести на следующую строчку. Можно ли как то это сделать? Или может есть возможность рассчитать количество букв?

      Удалить
    2. Ни разу не сталкивался, мне проще увеличить ширину окна conky. Ответа на данное время не имею.

      Удалить