[cl-cairo2-devel] null pdf surface

Tamas K Papp tpapp at Princeton.EDU
Mon Jan 5 04:00:42 UTC 2009


On Sun, Jan 04, 2009 at 07:40:40PM -0800, Scott Graham wrote:
> Hi
> 
> I want to create a null pdf surface to be used for calculating metrics
> without writing a file. See:
> 
> http://cairographics.org/manual/cairo-pdf-surface.html#cairo-pdf-surface-create
> 
> But, with something like:
> 
> (defmacro with-pdf-file ((filename width height) &body body)
>   "Execute the body with context bound to a newly created pdf
>   file, and close it after executing body."
>   `(let* ((*context* (create-pdf-context ,filename ,width ,height)))
>          (unwind-protect (progn , at body)
>                          (destroy *context*))))
> 
> (with-pdf-file ((cffi:null-pointer) 500 500)
>   (move-to 100 100)
>   (line-to 200 200)
>   (stroke))
> 
> I get (a bunch of) errors spit out:
> 
> WARNING: function returned with status WRITE-ERROR.
> 
> So I guess it's not working properly. Is there a different way I could
> try specifying that "NULL" gets passed into the cairo function
> perhaps? Or is this perhaps just a bug in cairo itself?

Hi Scott,

I am at a conference and I don't have time to investigate this in
detail at the moment, but I suspect that the error arises from how
CFFI handles :string types.  When you use a string type, CFFI
allocates a memory area, and copies the string to that before calling
the function with the resulting pointer.  My guess is that this chokes
on NULL.

What I would do is ask on the CFFI list whether there is a clean way
to pass a NULL pointer to a CFFI function which expects a string
argument.  If not (which is my guess), then we have to do the
allocation and conversion manually, and call a function with type
char*.  See Section 4.8 of the CFFI manual on this issue.

If you have time on your hands and know how to program C, you can
experiment with the following: write a C function

void test(char* string) {
  /* open a file with a fixed name, eg /tmp/test, write string into
  it, close */
  ...
}

define this in CFFI with the argument of type :string, and see what is
written to the file when you call this with cffi:null-pointer.

Anyhow, please ask the smart people who designed CFFI.  If possible,
please CC me.

Thanks,

Tamas




More information about the Cl-cairo2-devel mailing list