;Эта функция воспринимает как аргумент - виджет, который будет перерисован. В нашем случае это холст.
(defun Художник (widget)
;в дальнейшем нам может потребоваться информация о размерах виджета. Размеры мы биндим к переменным w и h.
(multiple-value-bind (w h) (drawable-get-size (widget-window widget))
;привяжем контекст cairo к виджету холст.
(with-gdk-context (ctx (widget-window widget))
(with-context (ctx)
;чтобы не нагромождать код, вынесу все рисование в функцию подмастерье. Этой функции я передаю и параметры w и h.
(Подмастерье)
nil))))
;Ну и наконец то ради чего все это писалось - функция Художник
(defun Подмастерье()
;(set-source-rgb 1 1 1) ;выберем цвет заливки фона
;(paint) ;заливаем
(set-source-surface (image-surface-create-from-png "C:/999.png") 0 0)
(paint)
(loop for *и* from 1 upto *примитив* ;(- *примитив* 1)
do(when (Gethash *и* х)
(when (> (Gethash *и* х) 0)
(when (> (Gethash *и* переменная-х) 0)
;(unless (= (Gethash *и* х) (Gethash *и* Переменная-х))
(when (Gethash *и* у)
(when (> (Gethash *и* у) 0)
(when (> (Gethash *и* переменная-у) 0)
(progn(save)
(set-line-width (Gethash *и* Толщина-линии )) ;выбираем толщину линии
(set-source-rgba (Gethash *и* Красный) (Gethash *и* Зеленый) (Gethash *и* Синий) (Gethash *и* Прозрачность)) ;задаем цвет линии
(move-to (Gethash *и* х) (Gethash *и* у)) ;перемещаемся в точку 0 0
(line-to (Gethash *и* Переменная-х) (Gethash *и* Переменная-у))
(stroke)
(restore))))))))))
Всё работает но вот только памяти жрёт немеренно, получается каждый раз вызывая функцию художник я увеличиваю расход оперативки на 20мб(примерно), естественно через время у меня вылетает ..._Access_violation... Я так понимаю что каждый раз создаётся новый контекст рисуя его поверх первого, в итоге конечно всё плачевно. в примерах везде только так и написано делать, а как сделать что бы он в одном контексте рисовал или хотя-бы как то манипулировать ими? Я вообще плохо себе представляю что такое контекст, думаю что это просто маска на любой объект, я прав?