LINUX.ORG.RU

Cairo и его контекст в CL-GTK2+


0

1
;Эта функция воспринимает как аргумент - виджет, который будет перерисован. В нашем случае это холст.
(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... Я так понимаю что каждый раз создаётся новый контекст рисуя его поверх первого, в итоге конечно всё плачевно. в примерах везде только так и написано делать, а как сделать что бы он в одном контексте рисовал или хотя-бы как то манипулировать ими? Я вообще плохо себе представляю что такое контекст, думаю что это просто маска на любой объект, я прав?



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

> (set-source-surface (image-surface-create-from-png «C:/999.png») 0 0)

Ты на каждую перерисовку создаешь новый surface из файла. Закешируй, чтоли, в состоянии объекта его.

«C:/999.png»

А вот это уже интересно. Как под виндой cl-gtk2 поднял? Какая система, какой компилятор?

yoghurt ★★★★★
()

> Я вообще плохо себе представляю что такое контекст,

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

думаю что это просто маска на любой объект, я прав?

ХЗ что ты имел ввиду.

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

Связка проста SBCL(с прикрученными нитями от Love5han (надеюсь не ошибся в имени)+emacs+slime всё ставится элементарно, потом CL-GTK2+ от dmitry_vk и всё ок, осталось только научится пользоваться. Насчёт контекста я имел ввиду что в GTK создаётся Drawing-area и к нему прикручивается контекст.Вот и фиг его знает что это за контекст, ну вот я и подумал что это что то врде маски или трафарета для Drawing-area.

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

>Как под виндой cl-gtk2 поднял? Какая система, какой компилятор?

А что в этом удивительного? cl-gtk2 давно под виндой работает (sbcl и clozure)

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

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

RusNekromant
() автор топика

У вас на каждую отрисовку читается картинка из файла, да к тому же не удаляется. Удалить созданную surface можно с помощью функции cl-cairo2:destroy. Вообще, конечно, картинку прочесть один раз.

Контекст cairo - это объект, который содержит состояние рисования cairo. Он состоит из поверхности рисования (target surface), области клипирования, матрицы преобразования, текущего path и прочего.

Терминология cairo объясняется, например, здесь: http://www.tortall.net/mu/wiki/CairoTutorial

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

Но если не читать картинку то она исчезает при перерисовке м отображаются только линии... поэтому гружу. Я выносил в отдельную функцию прогрузки картинки и прорисовки, но если прерисовать линию с помощью stroke то картинка исчезает, и не помогает (Save) (Restore), хотя теоретически должно помогать.

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

>Но если не читать картинку то она исчезает при перерисовке м отображаются только линии

Хранить её пермаментно между перерисовками в состоянии, скажем, окна - в голову не пришло?

yoghurt ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.