2009-11-17 21 views
3

我試圖在Lisp中編寫自己的放置像素(Gdk)pixbuf。當我終於意識到如何在CL中操作C指針時,出現了新的障礙 - (gdk:pixbuf-get-pixels pb)會返回負數。我的問題是:我可以將它轉換成一個有效的指針嗎?我嘗試使用cffi:convert-from-foreign和cffi:translate-from-foreign(它們之間有什麼區別?)失敗了。lambda-gtk負指針

下面是我的實際(不工作)代碼:

(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

我認爲lambda-gtk錯誤地爲pixbuf-get-pixels定義了綁定。

由於將無符號整數解釋爲帶符號整數的錯誤,可能會出現指針值的負值。

糾正這個值的最簡單方法是使用mod

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

嗯,看來事情真的是錯功能。我不得不嘗試不同的方法。 – x13n 2009-11-18 10:52:44

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