test: adapt the change of policy request
[platform/core/uifw/libds-tizen.git] / examples / pixman-tbm-helper.c
1 #include <assert.h>
2
3 #include "pixman-tbm-helper.h"
4
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);
7
8 pixman_image_t *
9 pixman_image_from_tbm_surface(tbm_surface_h surface,
10         enum ds_buffer_data_ptr_access_flag access_flag)
11 {
12     pixman_image_t *image;
13     tbm_surface_info_s info;
14     uint32_t format;
15     int tbm_access_flag = 0;
16     int width, height;
17     int ret;
18
19     width = tbm_surface_get_width(surface);
20     height = tbm_surface_get_height(surface);
21
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;
26
27     ret = tbm_surface_map(surface, tbm_access_flag, &info);
28     assert(ret == TBM_SURFACE_ERROR_NONE);
29
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);
34     assert(image);
35
36     tbm_surface_internal_ref(surface);
37
38     pixman_image_set_destroy_function(image,
39             destroy_tbm_pixman_image, surface);
40
41     return image;
42 }
43
44 static void
45 destroy_tbm_pixman_image(pixman_image_t *image, void *data)
46 {
47     tbm_surface_h surface = data;
48
49     tbm_surface_unmap(surface);
50     tbm_surface_internal_unref(surface);
51 }
52
53 static uint32_t
54 convert_tbm_format_to_pixman(uint32_t fmt)
55 {
56     switch (fmt) {
57         case TBM_FORMAT_XRGB8888:
58             return PIXMAN_x8r8g8b8;
59         case TBM_FORMAT_ARGB8888:
60             return PIXMAN_a8r8g8b8;
61         default:
62             assert(0 && "not reached");
63     }
64 }