lambda-gtk отрицательный указатель

Я пытался написать свой собственный пиксель на (Gdk) pixbuf в Lisp. Когда я наконец понял, как я могу работать с указателями C в CL, появилось новое препятствие — (gdk:pixbuf-get-pixels 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)))

person x13n    schedule 17.11.2009    source источник


Ответы (2)


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

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

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

CL-USER> (mod -1 (expt 2 #+cffi-features:x86 32 #+cffi-features:x86-64 64))
4294967295
person dmitry_vk    schedule 18.11.2009
comment
Ну, кажется, что-то действительно не так с этой функцией. Пришлось попробовать другой подход. - person x13n; 18.11.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.

person Luís Oliveira    schedule 17.11.2009