Wayland的HDC:cairo绘图库

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;
}




转载于:https://my.oschina.net/txl/blog/266935

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值