3 #include "pixman-tbm-helper.h"
5 static uint32_t convert_tbm_format_to_pixman(uint32_t fmt);
6 static void destroy_tbm_pixman_image(pixman_image_t *image, void *data);
9 pixman_image_from_tbm_surface(tbm_surface_h surface,
10 enum ds_buffer_data_ptr_access_flag access_flag)
12 pixman_image_t *image;
13 tbm_surface_info_s info;
15 int tbm_access_flag = 0;
19 width = tbm_surface_get_width(surface);
20 height = tbm_surface_get_height(surface);
22 if (access_flag & DS_BUFFER_DATA_PTR_ACCESS_READ)
23 tbm_access_flag |= TBM_OPTION_READ;
24 if (access_flag & DS_BUFFER_DATA_PTR_ACCESS_WRITE)
25 tbm_access_flag |= TBM_OPTION_WRITE;
27 ret = tbm_surface_map(surface, tbm_access_flag, &info);
28 assert(ret == TBM_SURFACE_ERROR_NONE);
30 format = convert_tbm_format_to_pixman(info.format);
31 image = pixman_image_create_bits(format, width, height,
32 (uint32_t *)info.planes[0].ptr,
33 info.planes[0].stride);
36 tbm_surface_internal_ref(surface);
38 pixman_image_set_destroy_function(image,
39 destroy_tbm_pixman_image, surface);
45 destroy_tbm_pixman_image(pixman_image_t *image, void *data)
47 tbm_surface_h surface = data;
49 tbm_surface_unmap(surface);
50 tbm_surface_internal_unref(surface);
54 convert_tbm_format_to_pixman(uint32_t fmt)
57 case TBM_FORMAT_XRGB8888:
58 return PIXMAN_x8r8g8b8;
59 case TBM_FORMAT_ARGB8888:
60 return PIXMAN_a8r8g8b8;
62 assert(0 && "not reached");