[cairo] cairo_image_surface_create(), limited width
stan at jesmanowicz.com
Sun Aug 2 11:25:14 UTC 2020
I am using x11-libs/cairo library on Unix/Linux platforms for a long time.
Back in 2005 I have found out one limitation, that caused me a problem
to generate running text (ticker) form rss feeds.
Basically the ticker generates a 'long thin image', where width can be
quite big and height relatively small.
I had to modify function _cairo_image_surface_is_size_valid() in file
I have forgot to send this observation then, but better late then never ...
The original function, as in cairo-1.17.3:
/* Limit on the width / height of an image surface in pixels. This is
* mainly determined by coordinates of things sent to pixman at the
* moment being in 16.16 format. */
#define MAX_IMAGE_SIZE 32767
_cairo_image_surface_is_size_valid (int width, int height)
return 0 <= width && width <= MAX_IMAGE_SIZE &&
0 <= height && height <= MAX_IMAGE_SIZE;
_cairo_image_surface_is_size_valid (int width, pixman_format_code_t
uint64_t stride = (uint64_t) (width * PIXMAN_FORMAT_BPP(pixman_format));
return (stride > INT32_MAX) ? 0 : 1;
And my 'long images' ware working OK then.
Some questions regarding the original implementation:
- What is 16.16 pixman format?
As I see in the pixman 0.40.0 implementation:
CAIRO_FORMAT_ARGB32 is PIXMAN_a8r8g8b8 (this is what I mostly use)
and one of the 16 pixman format is PIXMAN_r5g6b5
- Where from came the MAX_IMAGE_SIZE 32767?
It is maximum of 16-bit integer - 1, hex 0x7FFF
- Do we really need this conservative check
Because pixman checks this also and much more precisely in function
(pixman/pixman-bits-image.c, line 1335):
bits == NULL || (rowstride_bytes % sizeof (uint32_t)) == 0, NULL);
Please consider to change it like in the attached patch file,
or remove the check completely.
Stanislaw Jesmanowicz stan <at> jesmanowicz <dot> com
Amsterdam voice : + 31 20 6126193
The Netherlands mobile: + 31 653380520
-------------- next part --------------
A non-text attachment was scrubbed...
Size: 2402 bytes
Desc: not available
More information about the cairo