[cairo] cairo_image_surface_create(), limited width
stan at jesmanowicz.com
Mon Aug 3 14:32:54 UTC 2020
On 03-08-2020 15:36, Uli Schlachter wrote:
> Am 02.08.20 um 13:25 schrieb Stanisław Jeśmanowicz:
>> - What is 16.16 pixman format?
> Pixman uses a fixed point format for specifying coordinates. 16 bits
> specify the integer part and 16 bits specify the fractional part. For
> example, the number 1.0 is represented as 65536 in this format (a "1" in
> the integer part and a zero for the fractional part). See
> src/cairo-fixed-private.h in cairo's source code.
>> - Where from came the MAX_IMAGE_SIZE 32767?
>> It is maximum of 16-bit integer - 1, hex 0x7FFF
> I guess the 16 bits for the integer parts are actually signed, so that
> you can specify negative coordinates for e.g. the start of a line. That
> would result in the above limit.
>> - Do we really need this conservative check
>> (_cairo_image_surface_is_size_valid()) ?
> Uhm, yes. What use is a large surface if you cannot draw to parts of it?
I can imagine that large surface can be a problem, although only host
computer memory is the limit.
32767 x 32767 is roughly 1GB.
The check in function _cairo_image_surface_is_size_valid() is applied
on width and height separately.
It would be much more flexible if check would go like:
return (0 <= width) && (0 <= height) && ((width * height) <=
(MAX_IMAGE_SIZE * MAX_IMAGE_SIZE));
>> Because pixman checks this also and much more precisely in function
>> (pixman/pixman-bits-image.c, line 1335):
>> return_val_if_fail (
>> bits == NULL || (rowstride_bytes % sizeof (uint32_t)) == 0, NULL);
> How does this check anything about the size of the surface? This only
> checks if the rowstride is a multiple of four, since otherwise pixman
> could cause unaligned memory accesses.
Stanislaw Jesmanowicz stan <at> jesmanowicz <dot> com
Amsterdam voice : + 31 20 6126193
The Netherlands mobile: + 31 653380520
More information about the cairo