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




你可能感兴趣的:(linux,cairo,Wayland,图形库,hdc)