+int capture(int width, int height, char *filename) {
+ efl_util_screenshot_h screenshot = NULL;
+ tbm_surface_h tbm_surface = NULL;
+ int ret = EXIT_SUCCESS;
+
+ screenshot = efl_util_screenshot_initialize(width, height);
+ if (screenshot == NULL) {
+ fprintf(stderr, "Screenshot initialization failed!\n");
+ return EXIT_FAILURE;
+ }
+
+ tbm_surface = efl_util_screenshot_take_tbm_surface(screenshot);
+ if (!tbm_surface) {
+ fprintf(stderr, "Taking surface failed!\n");
+ ret = EXIT_FAILURE;
+ goto deinitialize_screenshot;
+ }
+
+ tbm_surface_info_s surface_info;
+ ret = tbm_surface_get_info(tbm_surface, &surface_info);
+ if (ret != TBM_SURFACE_ERROR_NONE) {
+ fprintf(stderr, "Get surface info failed!\n");
+ ret = EXIT_FAILURE;
+ goto destroy_surface;
+ }
+
+ int stride = cairo_format_stride_for_width (CAIRO_FORMAT_ARGB32, width);
+ cairo_surface_t *surface = cairo_image_surface_create_for_data(surface_info.planes[0].ptr,
+ CAIRO_FORMAT_ARGB32,
+ width, height, stride);
+ if (!surface) {
+ fprintf(stderr, "Create cairo surface failed!\n");
+ ret = EXIT_FAILURE;
+ goto destroy_surface;
+ }
+
+ cairo_surface_write_to_png(surface, filename);
+ cairo_surface_destroy(surface);
+ fprintf(stdout, "Captured image: width = %d, height = %d, filename = %s\n", width, height, filename);
+
+destroy_surface:
+ tbm_surface_destroy(tbm_surface);
+
+deinitialize_screenshot:
+ efl_util_screenshot_deinitialize(screenshot);
+
+ return ret;
+}
+