лямбда-гтк отрицательный указатель - PullRequest
3 голосов
/ 18 ноября 2009

Я пытался написать свой собственный put-pixel на (Gdk) pixbuf в Лиспе. Когда я наконец понял, как я могу работать с указателями C в CL, возникло новое препятствие - (gdk: pixbuf-get-пиксели pb) возвращает мне отрицательное число. У меня вопрос: можно ли как-то преобразовать его в действительный указатель? Мои попытки использовать cffi: convert-from-foreign и cffi: translate-from-foreign (в чем разница между ними в любом случае?) Потерпели неудачу.

Ниже мой фактический (не работающий) код:

(defun put-pixel (pixbuf x y r g b)
  (let ((p (+ (gdk:pixbuf-get-pixels pixbuf) (* x (gdk:pixbuf-get-n-channels pixbuf)) (* y (gdk:pixbuf-get-rowstride pixbuf)))))
    (setf (cffi:mem-aref p :unsigned-char 0) r)
    (setf (cffi:mem-aref p :unsigned-char 1) g)
    (setf (cffi:mem-aref p :unsigned-char 2) b)))

Ответы [ 2 ]

5 голосов
/ 18 ноября 2009

CFFI: TRANSLATE-FROM-FOREIGN - универсальная функция. Вы можете определить свои собственные внешние типы, используя CFFI: DEFINE-FOREIGN-TYPE , а затем добавить метод к CFFI: TRANSLATE-FROM-FOREIGN, чтобы указать, как должны работать преобразования из внешних значений в Lisp.

CFFI: CONVERT-FROM-FOREIGN - это то, что вы должны называть, если вам нужно явно преобразовать какое-то значение. Он будет вызывать CFFI: TRANSLATE-FROM-FOREIGN за кулисами и может по возможности выполнить некоторые оптимизации во время компиляции.

То же самое относится к CFFI: CONVERT-TO-FOREIGN и CFFI: TRANSLATE-TO-FOREIGN .

2 голосов
/ 18 ноября 2009

Я думаю, что lambda-gtk неправильно определил привязку для pixbuf-get-пикселей.

Отрицательное значение для значения указателя может появиться из-за неправильной интерпретации целого числа без знака как целого числа со знаком.

Самый простой способ исправить это значение - использовать mod :

CL-USER> (mod -1 (expt 2 #+cffi-features:x86 32 #+cffi-features:x86-64 64))
4294967295
...