lambda-gtk 负指针
我试图用 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)))
I was trying to write my own put-pixel on (Gdk) pixbuf in Lisp. When I finally realized how I can operate on C pointers in CL, new obstacle came along - (gdk:pixbuf-get-pixels pb) returns me negative number. My question is: can I convert it somehow to a valid pointer? My attempts to use cffi:convert-from-foreign and cffi:translate-from-foreign (what's the difference between them anyway?) failed.
Below is my actual (not working) code:
(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)))
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
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:翻译至国外。
CFFI:TRANSLATE-FROM-FOREIGN is a generic function. You can define your own foreign types using CFFI:DEFINE-FOREIGN-TYPE and then add a method to CFFI:TRANSLATE-FROM-FOREIGN to specify how the conversions from foreign to Lisp values should work.
CFFI:CONVERT-FROM-FOREIGN is what you should call if you need to explicitly convert some value. It will call CFFI:TRANSLATE-FROM-FOREIGN behind the scenes and it might perform some compile-time optimizations if possible.
Same thing applies to CFFI:CONVERT-TO-FOREIGN and CFFI:TRANSLATE-TO-FOREIGN.
我认为 lambda-gtk 错误地定义了 pixbuf-get-pixels 的绑定。
由于将无符号整数错误地解释为有符号整数,可能会出现指针值的负值。
更正此值的最简单方法是使用 mod:
I think that lambda-gtk incorrectly defined binding for pixbuf-get-pixels.
The negative value for pointer value might appear because of incorrect interpretation of unsigned integer as a signed integer.
The simplest way to correct this value is to use mod: