HCAIRO -- cairo graphics library drawing context
头文件:<cairo.h>
库文件:-lcairo
函数:
cairo_set_source_rgb()
cairo_set_source_rgba()
cairo_set_line_width()
cairo_move_to()
cairo_line_to()
cairo_stroke()
...
...
int os_create_anonymous_file(int size); // 创建临时文件,用于mmap。用完即删。
typedef cairo_t* HCAIRO;
typedef struct _PAINTBUFFER
{
HBUFFER hBuffer;
void *data;
int bBusy;
HCAIRO hdc;
} PAINTBUFFER, *LPPAINTBUFFER;
void buffer_release(void *data, struct wl_buffer *buffer)
{
LPPAINTBUFFER lpBuffer = (LPPAINTBUFFER)data;
lpBuffer->bBusy = 0;
}
static const struct wl_buffer_listener buffer_listener = {
.release = buffer_release
};
HCAIRO wlCreateDC(HSURFACE hSurface, LPPAINTBUFFER lpBuffer)
{
SIZE sz = wlGetSurfaceSize(hSurface);
cairo_format_t cairo_format;
cairo_format = CAIRO_FORMAT_ARGB32;
int stride = cairo_format_stride_for_width (cairo_format, sz.width);
int length = stride*sz.height;
int fd = os_create_anonymous_file(length);
void* data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
HSHMPOOL hPool = wl_shm_create_pool(wlGetRegistry()->s_shm, fd, length);
HBUFFER hBuffer = wl_shm_pool_create_buffer(pool, 0, width, height, stride,
WL_SHM_FORMAT_XRGB8888);
wl_shm_pool_destroy(pool); // hBuffer内部有它的引用,可以删除。
close(fd); // 关闭临时文件。
cairo_surface_t *surface;
surface = cairo_image_surface_create_for_data(data, cairo_format,
sz.width, sz.height, stride);
HCAIRO hdc = cairo_create(cairo_surface_t *target);
// 返回值
lpBuffer->hdc = hdc;
lpBuffer->hBuffer = hBuffer;
lpBuffer->data = data;
lpBuffer->bBusy = 0;
wl_buffer_add_listener(hBuffer, &buffer_listener, lpBuffer);
return hdc;
}