[cairo] Implementing cairo_read_func_t/cairo_write_func_t properly

Bill Spitzak spitzak at gmail.com
Sat Jan 2 13:01:39 PST 2016


On 01/01/2016 01:42 AM, Lawrence D'Oliveiro wrote:
> On Fri, 01 Jan 2016 10:32:59 +0100, Bernhard Fischer wrote:
>
>> cairo_..._stream() are stream reading functions. This is that it does
>> not know in advance how many bytes are available in the file.
>
> That’s not how they work. Cairo uses them to read known file formats.
> If it doesn’t get the number of bytes it expects, then there is
> something wrong with the file.

No, he is right, this is a problem.

A lot of libraries that accept such read/write functions are assuming 
they have to do buffering themselves, as the intention is for the 
functions to be the system read/write which are only efficient for large 
blocks.

At the point the library is calling the function to read, it is just 
trying to refill it's input buffer. It will pass the size of that 
buffer, but it wants to detect where the EOF is if it lands inside the 
buffer.

I think the api has to be changed to return number of bytes read, and a 
negative number for eof.




More information about the cairo mailing list