#include "e_mod_rdp.h"
#define RDP_DEBUG 0
-#define RDP_CURSOR_DEBUG 0
#define RDP_PATH_LEN 1024
static E_Rdp_Config_Data *g_rdp_config;
static E_Rdp_Backend *g_rdp_backend;
static unsigned int refresh_raw_frame_id;
-#if RDP_CURSOR_DEBUG
-static E_Pointer_Hook *pointer_hook = NULL;
-#endif
struct _E_Rdp_Output
{
dx, dy, dw, dh);
}
-#if RDP_CURSOR_DEBUG
-static void
-_e_rdp_pixman_output_image_cusror_damage_area_get(E_Rdp_Output *output, Eina_Rectangle *rect)
-{
- if (output->cursor_crop_dst.x == 0 && output->cursor_crop_dst.y == 0 &&
- output->cursor_crop_dst.w == 0 && output->cursor_crop_dst.h == 0)
- {
- output->cursor_damage_rect.x = 0;
- output->cursor_damage_rect.y = 0;
- output->cursor_damage_rect.w = output->w;
- output->cursor_damage_rect.h = output->h;
- }
- else
- {
- /* x axis */
- if (output->cursor_crop_dst.x < rect->x)
- {
- output->cursor_damage_rect.x = output->cursor_crop_dst.x;
- output->cursor_damage_rect.w = rect->x - output->cursor_crop_dst.x + rect->w;
- }
- else
- {
- output->cursor_damage_rect.x = rect->x;
- output->cursor_damage_rect.w = output->cursor_crop_dst.x - rect->x + output->cursor_crop_dst.w;
- }
- if (output->cursor_damage_rect.x + output->cursor_damage_rect.w > output->w)
- output->cursor_damage_rect.w = output->w - output->cursor_damage_rect.x;
-
- /* y axis */
- if (output->cursor_crop_dst.y < rect->y)
- {
- output->cursor_damage_rect.y = output->cursor_crop_dst.y;
- output->cursor_damage_rect.h = rect->y - output->cursor_crop_dst.y + rect->h;
- }
- else
- {
- output->cursor_damage_rect.y = rect->y;
- output->cursor_damage_rect.h = output->cursor_crop_dst.y - rect->y + output->cursor_crop_dst.h;
- }
- if (output->cursor_damage_rect.y + output->cursor_damage_rect.h > output->h)
- output->cursor_damage_rect.h = output->h - output->cursor_damage_rect.y;
- }
-}
-
-static Eina_Bool
-_e_rdp_pixman_output_image_composite_cursor(E_Rdp_Output *output, E_Hwc_Window *hwc_window, pixman_image_t *pix_surface, int pix_w, int pix_h, int primary_w, int primary_h)
-{
- Eina_Rectangle showing_pos = {0, };
- Eina_Rectangle dst_pos = {0, };
- Eina_Rectangle src_crop = {0, };
- Eina_Rectangle dst_crop = {0, };
- void *src_ptr = NULL;
- int src_stride, img_w, img_h;
- pixman_image_t *pix_shm_src = NULL;
-
- if (!hwc_window->cursor.buffer)
- return EINA_FALSE;
-
- src_ptr = hwc_window->cursor.img_ptr;
- src_stride = hwc_window->cursor.img_stride;
- img_w = hwc_window->cursor.img_w;
- img_h = hwc_window->cursor.img_h;
-
- pix_shm_src = pixman_image_create_bits(PIXMAN_a8r8g8b8, img_w, img_h, (uint32_t*)src_ptr, src_stride);
- if (!pix_shm_src)
- {
- ERR("create pixman image failed");
- return EINA_FALSE;
- }
-
- _e_rdp_output_image_src_crop_get(hwc_window, &src_crop, &showing_pos, primary_w, primary_h);
- if (_e_rdp_output_center_rect_get(primary_w, primary_h, pix_w, pix_h, &dst_pos) == EINA_FALSE)
- {
- pixman_image_unref(pix_shm_src);
- return EINA_FALSE;
- }
- _e_rdp_output_image_dst_crop_get(hwc_window, img_w, img_h, primary_w, primary_h, &dst_pos, &showing_pos, &dst_crop, 0);
-
- _e_rdp_output_image_composite(pix_shm_src, pix_surface,
- src_crop.x, src_crop.y, src_crop.w, src_crop.h,
- dst_crop.x, dst_crop.y, dst_crop.w, dst_crop.h,
- EINA_TRUE, 0, 0, 0);
-
- pixman_image_unref(pix_shm_src);
-
- output->mouse_x = hwc_window->current.info.dst_pos.x;
- output->mouse_y = hwc_window->current.info.dst_pos.y;
-
- _e_rdp_pixman_output_image_cusror_damage_area_get(output, &dst_crop);
- output->cursor_crop_dst.x = dst_crop.x;
- output->cursor_crop_dst.y = dst_crop.y;
- output->cursor_crop_dst.w = dst_crop.w;
- output->cursor_crop_dst.h = dst_crop.h;
-
- return EINA_TRUE;
-}
-#endif
-
static Eina_Bool
_e_rdp_pixman_output_image_composite(E_Rdp_Output *output, E_Hwc_Window *hwc_window, pixman_image_t *pix_surface, int pix_w, int pix_h, int primary_w, int primary_h)
{
if ((output->refresh_count == 0) || (output->buffer_changed_count == 0))
_e_rdp_backup_buffer_create(output, tbm_surface, &info);
-#if RDP_CURSOR_DEBUG
- if (hwc_window_cursor != NULL)
- _e_rdp_pixman_output_image_composite_cursor(output, hwc_window_cursor, pix_surface, info.width, info.height, e_output_w, e_output_h);
-#endif
+
tbm_surface_unmap(tbm_surface);
output->prepare_tbm_surface = tbm_surface;
return NULL;
}
-#if RDP_CURSOR_DEBUG
-static Eina_Bool
-_e_rdp_pixman_output_image_erase_cursor(E_Rdp_Output *output)
-{
- pixman_image_t *pix_backup = NULL;
- tbm_surface_info_s info, dst_info;
- pixman_format_code_t pix_format = 0;
- pixman_region32_t clip_region;
- pixman_transform_t t;
- struct pixman_f_transform ft;
- int err;
-
- EINA_SAFETY_ON_NULL_RETURN_VAL(output->backup_tbm_surface, EINA_FALSE);
- EINA_SAFETY_ON_NULL_RETURN_VAL(output->showing_tbm_surface, EINA_FALSE);
- if (output->cursor_crop_dst.w == 0 && output->cursor_crop_dst.h == 0)
- return EINA_FALSE;
-
- err = tbm_surface_map(output->showing_tbm_surface, TBM_SURF_OPTION_WRITE, &dst_info);
- if (err)
- {
- ERR("tbm_surface_map failed");
- return EINA_FALSE;
- }
-
- err = tbm_surface_map(output->backup_tbm_surface, TBM_SURF_OPTION_READ, &info);
- if (err)
- {
- ERR("tbm_surface_map failed");
- tbm_surface_unmap(output->showing_tbm_surface);
- return EINA_FALSE;
- }
-
- pix_format = _e_rdp_pixman_format_get(info.format);
- if (pix_format == 0)
- {
- ERR("not supported format");
- tbm_surface_unmap(output->showing_tbm_surface);
- tbm_surface_unmap(output->backup_tbm_surface);
- return EINA_FALSE;
- }
-
- pix_backup = pixman_image_create_bits(pix_format, info.width, info.height, (uint32_t *)info.planes[0].ptr, info.planes[0].stride);
- if (pix_backup == NULL)
- {
- ERR("create pixman image failed");
- tbm_surface_unmap(output->showing_tbm_surface);
- tbm_surface_unmap(output->backup_tbm_surface);
- return EINA_FALSE;
- }
-
- pixman_image_ref(output->showing_surface);
-
- pixman_region32_init_rect(&clip_region, output->cursor_crop_dst.x, output->cursor_crop_dst.y, output->cursor_crop_dst.w, output->cursor_crop_dst.h);
- pixman_image_set_clip_region32(pix_backup, &clip_region);
- pixman_image_set_source_clipping(pix_backup, TRUE);
- pixman_image_set_has_client_clip (pix_backup, TRUE);
- pixman_f_transform_init_identity(&ft);
- pixman_f_transform_scale(&ft, NULL, 1, 1);
- pixman_f_transform_translate(&ft, NULL, 0, 0);
- pixman_transform_from_pixman_f_transform(&t, &ft);
- pixman_image_set_transform(pix_backup, &t);
- pixman_image_composite(PIXMAN_OP_OVER, pix_backup, NULL, output->showing_surface, 0, 0, 0, 0, 0, 0, output->w, output->h);
-
- pixman_image_unref(pix_backup);
- pixman_image_unref(output->showing_surface);
- tbm_surface_unmap(output->showing_tbm_surface);
- tbm_surface_unmap(output->backup_tbm_surface);
-
- return EINA_TRUE;
-}
-
-static pixman_image_t *
-_e_rdp_pixman_output_image_get_cursor(E_Rdp_Output *output, E_Hwc_Window *hwc_window_cursor, int e_output_w, int e_output_h)
-{
- tbm_surface_h tbm_surface = NULL;
- tbm_surface_info_s src_info, info;
- pixman_image_t *pix_surface = NULL;
- pixman_format_code_t pix_format = 0;
- int err;
- Eina_Bool ret = EINA_FALSE;
-
- if ((output->mouse_x == hwc_window_cursor->current.info.dst_pos.x) &&
- (output->mouse_y == hwc_window_cursor->current.info.dst_pos.y))
- {
-// INF("same position. do not update. (%dx%d)", output->mouse_x, output->mouse_y);
- return NULL;
- }
-
- if (_e_rdp_pixman_output_image_erase_cursor(output))
- {
- err = tbm_surface_map(output->showing_tbm_surface, TBM_SURF_OPTION_WRITE, &info);
- if (err)
- ERR("tbm_surface_map failed");
- else
- {
- ret = _e_rdp_pixman_output_image_composite_cursor(output, hwc_window_cursor, output->showing_surface, info.width, info.height, e_output_w, e_output_h);
- tbm_surface_unmap(output->showing_tbm_surface);
- }
-
- if (ret == EINA_TRUE)
- {
- output->buffer_reuse = EINA_TRUE;
- pix_surface = output->showing_surface;
- output->prepare_tbm_surface = output->showing_tbm_surface;
- }
- }
-
- if (!output->buffer_reuse)
- {
- err = tbm_surface_map(output->backup_tbm_surface, TBM_SURF_OPTION_READ, &src_info);
- if (err)
- {
- ERR("tbm_surface_map failed");
- return NULL;
- }
-
- tbm_surface = _e_rdp_tbm_image_create(output, output->w, output->h, 0x00000000);
- if (tbm_surface == NULL)
- {
- ERR("create tbm surface failed");
- output->prepare_tbm_surface = NULL;
- tbm_surface_unmap(output->backup_tbm_surface);
- return NULL;
- }
-
- err = tbm_surface_map(tbm_surface, TBM_SURF_OPTION_WRITE, &info);
- if (err)
- {
- ERR("tbm_surface_map failed");
- tbm_surface_destroy(tbm_surface);
- output->prepare_tbm_surface = NULL;
- tbm_surface_unmap(output->backup_tbm_surface);
- return NULL;
- }
-
- _e_rdp_tbm_surface_copy(output->backup_tbm_surface, &src_info, tbm_surface, &info);
-
- pix_format = _e_rdp_pixman_format_get(info.format);
- if (pix_format == 0)
- {
- ERR("not supported format");
- tbm_surface_unmap(tbm_surface);
- tbm_surface_destroy(tbm_surface);
- output->prepare_tbm_surface = NULL;
- return NULL;
- }
-
- pix_surface = pixman_image_create_bits(pix_format, info.width, info.height, (uint32_t *)info.planes[0].ptr, info.planes[0].stride);
- if (pix_surface == NULL)
- {
- ERR("create pixman image failed");
- tbm_surface_unmap(tbm_surface);
- tbm_surface_destroy(tbm_surface);
- output->prepare_tbm_surface = NULL;
- return NULL;
- }
-
- _e_rdp_pixman_output_image_composite_cursor(output, hwc_window_cursor, pix_surface, info.width, info.height, e_output_w, e_output_h);
-
- tbm_surface_unmap(tbm_surface);
- tbm_surface_unmap(output->backup_tbm_surface);
-
- output->prepare_tbm_surface = tbm_surface;
- }
-
- return pix_surface;
-}
-#endif
-
static pixman_image_t *
_e_rdp_pixman_output_image_get(E_Rdp_Output *output)
{
if (hwc_window->is_target) continue;
if (hwc_window->is_video) continue;
if (hwc_window->state == E_HWC_WINDOW_STATE_NONE || hwc_window->zpos == -999) continue;
-#if !(RDP_CURSOR_DEBUG)
if (hwc_window->is_cursor) continue;
-#endif
if (hwc_window->accepted_state == E_HWC_WINDOW_STATE_CLIENT)
{
visible_list = eina_list_append(visible_list, hwc_window);
if (hwc_window->accepted_state == E_HWC_WINDOW_STATE_DEVICE)
visible_list = eina_list_append(visible_list, hwc_window);
-#if RDP_CURSOR_DEBUG
- if (hwc_window->accepted_state == E_HWC_WINDOW_STATE_CURSOR)
- {
- if (hwc_window->cursor.buffer)
- {
- hwc_window_cursor = hwc_window;
- }
- }
-#endif
}
if (eina_list_count(visible_list) == 0)
return pix_surface;
}
visible_list = eina_list_sort(visible_list, eina_list_count(visible_list), _e_rdp_cb_hwc_window_sort);
-#if RDP_CURSOR_DEBUG
- if (output->buffer_changed)
- {
- pix_surface = _e_rdp_pixman_output_image_get_all(output, visible_list, hwc_window_cursor, e_output_w, e_output_h);
- }
- else if ((output->mouse_moved) && (hwc_window_cursor != NULL))
- {
- pix_surface = _e_rdp_pixman_output_image_get_cursor(output, hwc_window_cursor, e_output_w, e_output_h);
- }
-#else
+
pix_surface = _e_rdp_pixman_output_image_get_all(output, visible_list, hwc_window_cursor, e_output_w, e_output_h);
-#endif
+
return pix_surface;
}
return ECORE_CALLBACK_PASS_ON;
}
-#if RDP_CURSOR_DEBUG
-static void
-_e_rdp_cb_pointer_mouse_move(void *data, E_Pointer *ptr)
-{
- E_Rdp_Backend *b = NULL;
- E_Rdp_Output *output = NULL;
-
- EINA_SAFETY_ON_TRUE_RETURN(e_object_is_del(E_OBJECT(ptr)));
- EINA_SAFETY_ON_FALSE_RETURN(e_comp->pointer);
-
- b = g_rdp_backend;
- EINA_SAFETY_ON_NULL_RETURN(b);
- EINA_SAFETY_ON_NULL_RETURN(b->output);
- output = b->output;
-
- if (b->client_count == 0)
- return;
-
- if (output->buffer_changed)
- _e_rdp_set_refresh_timer(output, output->refresh_time);
- else
- _e_rdp_set_refresh_timer(output, VGA_TIME);
- output->mouse_moved = EINA_TRUE;
-}
-#endif
-
static void
_e_rdp_canvas_render_post(void *data EINA_UNUSED, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
{
EINA_SAFETY_ON_NULL_RETURN(b);
evas_event_callback_del(e_comp->evas, EVAS_CALLBACK_RENDER_POST, _e_rdp_canvas_render_post);
-#if RDP_CURSOR_DEBUG
- if (pointer_hook)
- {
- e_pointer_hook_del(pointer_hook);
- pointer_hook = NULL;
- }
-#endif
+
if (b->handlers)
{
EINA_LIST_FREE(b->handlers, h)
E_LIST_HANDLER_APPEND(b->handlers, E_EVENT_CLIENT_BUFFER_CHANGE, _e_rdp_cb_client_buffer_change, g_rdp_backend);
E_LIST_HANDLER_APPEND(b->handlers, E_EVENT_CLIENT_UNICONIFY, _e_rdp_cb_client_uniconify, g_rdp_backend);
-#if RDP_CURSOR_DEBUG
- pointer_hook = e_pointer_hook_add(E_POINTER_HOOK_MOUSE_MOVE, _e_rdp_cb_pointer_mouse_move, g_rdp_backend);
-#endif
+
evas_event_callback_add(e_comp->evas, EVAS_CALLBACK_RENDER_POST, _e_rdp_canvas_render_post, NULL);
g_rdp_backend = b;