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-pixel のバインディングを誤って定義したと思います。

符号なし整数が符号付き整数として正しく解釈されないため、ポインター値に負の値が表示される場合があります。

この値を修正する最も簡単な方法は、modを使用することです:

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