3

我试图在 Lisp 中的 (Gdk) pixbuf 上编写自己的 put-pixel。当我终于意识到如何在 CL 中操作 C 指针时,出现了新的障碍 - (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)))
4

2 回答 2

5

CFFI:TRANSLATE-FROM-FOREIGN是一个通用函数。您可以使用CFFI:DEFINE-FOREIGN-TYPE定义自己的外部类型,然后向 CFFI:TRANSLATE-FROM-FOREIGN 添加一个方法来指定从外部到 Lisp 值的转换应该如何工作。

CFFI:CONVERT-FROM-FOREIGN如果您需要显式转换某些值,则应该调用它。它将在幕后调用 CFFI:TRANSLATE-FROM-FOREIGN 并且可能会执行一些编译时优化。

同样的事情也适用于CFFI:CONVERT-TO-FOREIGNCFFI:TRANSLATE-TO-FOREIGN

于 2009-11-17T22:30:14.980 回答
2

我认为 lambda-gtk 错误地为 pixbuf-get-pixels 定义了绑定。

由于将无符号整数错误解释为有符号整数,可能会出现指针值的负值。

更正此值的最简单方法是使用mod

CL-USER> (mod -1 (expt 2 #+cffi-features:x86 32 #+cffi-features:x86-64 64))
4294967295
于 2009-11-18T05:33:35.707 回答