Hello,
I'm currently writing an API for a simple 2D graphics library for Gambit, based on TinyPTC and SDL.
However, it seems that I have some issues with conversion of Scheme data to C.
Here is the API idea: (PTC-OPEN name width height) creates a window (PTC-CLOSE) closes the window (PTC-UPDATE buffer) blits the buffer to the window
I chose to represent the buffer with a vector. I'd even prefer an U32VECTOR for colors are represented by an unsigned integer, however.
The update function works like this:
int scm_ptc_update (___SCMOBJ) { int idx; ___SCMOBJ ___temp; // for the type test if ( ___VECTORP(obj) ) { for(idx=0 ; idx < width * height ; idx++ ) { buffer[idx] = ___INT ( ___VECTORREF (obj, idx)); } // Call the underlying update function return (( ptc_update (buffer)) == PTC_SUCCESS ? ___TRU : ___FAL ); } else { return ( ___FAL ); } };
If the test program fills the vector with
(vector-set! buffer (random-integer 255))
I see large vertical and periodical stripes, and , roughly, grey noise, instead of blue noise. Printf-ing the values shows a lot of them greater than 255. Therefor, I reckon that my conversion is not correct.
How should I then read a Scheme int32 value to store it in C ?
Subsidiary question: how can I call pp or pretty-print from withing C? To do something like ___PRETTYPRINT(obj);
Cordially,
Adrien.
Afficher les réponses par date
Adrien Pierard wrote:
Hello,
I'm currently writing an API for a simple 2D graphics library for Gambit, based on TinyPTC and SDL.
However, it seems that I have some issues with conversion of Scheme data to C.
Here is the API idea: (PTC-OPEN name width height) creates a window (PTC-CLOSE) closes the window (PTC-UPDATE buffer) blits the buffer to the window
I chose to represent the buffer with a vector. I'd even prefer an U32VECTOR for colors are represented by an unsigned integer, however.
The update function works like this:
int scm_ptc_update (___SCMOBJ) { int idx; ___SCMOBJ ___temp; // for the type test if ( ___VECTORP(obj) ) { for(idx=0 ; idx < width * height ; idx++ ) { buffer[idx] = ___INT ( ___VECTORREF (obj, idx));
IIRC the ___VECTORREF etc. macros expect the index as scheme object, thus: ___VECTORREF(obj,___FIX(idx)).
} // Call the underlying update function return (( ptc_update (buffer)) == PTC_SUCCESS ? ___TRU : ___FAL );
} else { return ( ___FAL ); } };
If the test program fills the vector with
(vector-set! buffer (random-integer 255))
(not relevant, but (random-integer 256) should be the correct expression)
I see large vertical and periodical stripes, and , roughly, grey noise, instead of blue noise. Printf-ing the values shows a lot of them greater than 255. Therefor, I reckon that my conversion is not correct.
How should I then read a Scheme int32 value to store it in C ?
I think it's only the index problem that's wrong.
But you could make your life simpler like this:
use a u32vector as your buffer, then in the C code instead of copying everything just call (or so, from memory, not tested as typed):
ptc_update (___CAST(unsigned int*,___BODY(vec)))
Subsidiary question: how can I call pp or pretty-print from withing C? To do something like ___PRETTYPRINT(obj);
The official way would be to use c-define to create a wrapper around pp and then call the generated C procedure from your C code. (I still haven't figured out the inofficial way ;).)
Christian.