diff options
author | NAMJEONGYOON <just.nam@samsung.com> | 2016-04-19 21:00:48 +0900 |
---|---|---|
committer | NAMJEONGYOON <just.nam@samsung.com> | 2016-04-20 11:18:18 +0900 |
commit | e72ce71db196f25fb015436f62e69643e23a570c (patch) | |
tree | 3733112ba5e710b0a25d3b3c8742a6d79751280a | |
parent | 562de3e500da5044ef6e90dcf69c012fd35a5129 (diff) | |
download | libmm-evas-renderer-e72ce71db196f25fb015436f62e69643e23a570c.tar.gz libmm-evas-renderer-e72ce71db196f25fb015436f62e69643e23a570c.tar.bz2 libmm-evas-renderer-e72ce71db196f25fb015436f62e69643e23a570c.zip |
add roi APIsubmit/tizen/20160421.022931
Change-Id: I40aa07f8eef97583ee2edfa7f967f428d9c2b4da
Signed-off-by: NAMJEONGYOON <just.nam@samsung.com>
-rw-r--r-- | src/include/mm_evas_renderer.h | 5 | ||||
-rw-r--r-- | src/mm_evas_renderer.c | 81 |
2 files changed, 79 insertions, 7 deletions
diff --git a/src/include/mm_evas_renderer.h b/src/include/mm_evas_renderer.h index 6f38a5f..5694d1e 100644 --- a/src/include/mm_evas_renderer.h +++ b/src/include/mm_evas_renderer.h @@ -99,6 +99,7 @@ typedef struct { /* properties */ visible_info visible; rect_info eo_size; + rect_info dst_roi; gboolean use_ratio; guint rotate_angle; guint display_geometry_method; @@ -136,6 +137,10 @@ int mm_evas_renderer_get_rotation(MMHandleType handle, int *rotate); /* set and get geometry value */ int mm_evas_renderer_set_geometry(MMHandleType handle, int mode); int mm_evas_renderer_get_geometry(MMHandleType handle, int *mode); +/* set and get coordinate and resolution value for the destination */ +/* it would be better not to call set_geometry for DISP_GEO_METHOD_CUSTOM_ROI */ +int mm_evas_renderer_set_roi_area(MMHandleType handle, int x, int y, int w, int h); +int mm_evas_renderer_get_roi_area(MMHandleType handle, int *x, int *y, int *w, int *h); /* set and get flip value */ int mm_evas_renderer_set_flip(MMHandleType handle, int flip); int mm_evas_renderer_get_flip(MMHandleType handle, int *flip); diff --git a/src/mm_evas_renderer.c b/src/mm_evas_renderer.c index 6b69187..fb7b7f4 100644 --- a/src/mm_evas_renderer.c +++ b/src/mm_evas_renderer.c @@ -87,6 +87,7 @@ enum { DISP_GEO_METHOD_FULL_SCREEN, DISP_GEO_METHOD_CROPPED_FULL_SCREEN, DISP_GEO_METHOD_ORIGIN_SIZE_OR_LETTER_BOX, + DISP_GEO_METHOD_CUSTOM_ROI, DISP_GEO_METHOD_NUM, }; @@ -286,7 +287,9 @@ void _evas_pipe_cb(void *data, void *buffer, update_info info) if (result.x || result.y) LOGD("coordinate x, y (%d, %d) for locating video to center", result.x, result.y); - evas_object_image_fill_set(evas_info->eo, result.x, result.y, result.w, result.h); + + if (evas_info->display_geometry_method != DISP_GEO_METHOD_CUSTOM_ROI) + evas_object_image_fill_set(evas_info->eo, result.x, result.y, result.w, result.h); evas_object_image_pixels_dirty_set(evas_info->eo, EINA_TRUE); LOGD("GEO_METHOD : src(%dx%d), dst(%dx%d), dst_x(%d), dst_y(%d), rotate(%d), flip(%d)", evas_info->w, evas_info->h, evas_info->eo_size.w, evas_info->eo_size.h, evas_info->eo_size.x, evas_info->eo_size.y, evas_info->rotate_angle, evas_info->flip); @@ -418,7 +421,9 @@ int _flush_packets(mm_evas_info *evas_info) if (result.x || result.y) LOGD("coordinate x, y (%d, %d) for locating video to center", result.x, result.y); - evas_object_image_fill_set(evas_info->eo, result.x, result.y, result.w, result.h); + + if (evas_info->display_geometry_method != DISP_GEO_METHOD_CUSTOM_ROI) + evas_object_image_fill_set(evas_info->eo, result.x, result.y, result.w, result.h); /* set flush buffer */ surf.type = EVAS_NATIVE_SURFACE_TBM; @@ -585,8 +590,8 @@ int _mm_evas_renderer_set_info(mm_evas_info *evas_info, Evas_Object *eo) evas_info->pkt_info[i].tbm_surf = NULL; evas_info->pkt_info[i].prev = -1; } - evas_info->cur_idx = -1; + evas_info->dst_roi.x = evas_info->dst_roi.y = evas_info->dst_roi.w = evas_info->dst_roi.h = 0; evas_info->eo = eo; evas_info->epipe = ecore_pipe_add((Ecore_Pipe_Cb) _evas_pipe_cb, evas_info); if (!evas_info->epipe) { @@ -626,6 +631,7 @@ int _mm_evas_renderer_reset(mm_evas_info *evas_info) } evas_info->eo_size.x = evas_info->eo_size.y = evas_info->eo_size.w = evas_info->eo_size.h = 0; + evas_info->dst_roi.x = evas_info->dst_roi.y = evas_info->dst_roi.w = evas_info->dst_roi.h = 0; evas_info->w = evas_info->h = 0; if (evas_info->flush_buffer) @@ -728,6 +734,18 @@ void _mm_evas_renderer_update_geometry(mm_evas_info *evas_info, rect_info *resul result->h = evas_info->eo_size.h; } break; + case DISP_GEO_METHOD_CUSTOM_ROI: + LOGD("custom roi mode"); + evas_info->use_ratio= FALSE; + result->x = evas_info->dst_roi.x; + result->y = evas_info->dst_roi.y; + result->w = evas_info->dst_roi.w; + result->h = evas_info->dst_roi.h; + + /* don't call evas_object_image_fill_set */ + evas_object_move(evas_info->eo, result->x, result->y); + evas_object_resize(evas_info->eo, result->w, result->h); + break; default: LOGW("unsupported mode."); break; @@ -761,7 +779,8 @@ int _mm_evas_renderer_apply_geometry(mm_evas_info *evas_info) if (result.x || result.y) LOGD("coordinate x, y (%d, %d) for locating video to center", result.x, result.y); - evas_object_image_fill_set(evas_info->eo, result.x, result.y, result.w, result.h); + if (evas_info->display_geometry_method != DISP_GEO_METHOD_CUSTOM_ROI) + evas_object_image_fill_set(evas_info->eo, result.x, result.y, result.w, result.h); return MM_ERROR_NONE; } else LOGW("there is no surf"); @@ -1046,7 +1065,9 @@ int mm_evas_renderer_update_param(MMHandleType handle) if (!ret) { LOGW("fail to ecore_pipe_write() for updating visibility\n"); return MM_ERROR_UNKNOWN; - } + } else + ret = MM_ERROR_NONE; + #if 0 /* FIXME: pause state only */ g_mutex_lock(&evas_info->idx_lock); ret = ecore_pipe_write(evas_info->epipe, evas_info, UPDATE_TBM_SURF); @@ -1273,6 +1294,52 @@ int mm_evas_renderer_get_geometry(MMHandleType handle, int *mode) return MM_ERROR_NONE; } +int mm_evas_renderer_set_roi_area(MMHandleType handle, int x, int y, int w, int h) +{ + int ret = MM_ERROR_NONE; + mm_evas_info *evas_info = (mm_evas_info *)handle; + + if (!evas_info) { + LOGW("skip it. it is not evas surface type or handle is not prepared"); + return MM_ERROR_RESOURCE_NOT_INITIALIZED; + } + if (!w || !h) { + LOGW("invalid resolution"); + return MM_ERROR_INVALID_ARGUMENT; + } + + /* display mode is set to DISP_GEO_METHOD_CUSTOM_ROI internally */ + evas_info->display_geometry_method = DISP_GEO_METHOD_CUSTOM_ROI; + evas_info->dst_roi.x = x; + evas_info->dst_roi.y = y; + evas_info->dst_roi.w = w; + evas_info->dst_roi.h = h; + ret = _mm_evas_renderer_apply_geometry(evas_info); + + return ret; +} + +int mm_evas_renderer_get_roi_area(MMHandleType handle, int *x, int *y, int *w, int *h) +{ + mm_evas_info *evas_info = (mm_evas_info *)handle; + + if (!evas_info) { + LOGW("skip it. it is not evas surface type or handle is not prepared"); + return MM_ERROR_RESOURCE_NOT_INITIALIZED; + } + if (evas_info->display_geometry_method != DISP_GEO_METHOD_CUSTOM_ROI) { + LOGW("invalid mode"); + return MM_ERROR_INVALID_ARGUMENT; + } + + *x = evas_info->dst_roi.x; + *y = evas_info->dst_roi.y; + *w = evas_info->dst_roi.w; + *h = evas_info->dst_roi.h; + + return MM_ERROR_NONE; +} + int mm_evas_renderer_set_flip(MMHandleType handle, int flip) { int ret = MM_ERROR_NONE; @@ -1285,7 +1352,7 @@ int mm_evas_renderer_set_flip(MMHandleType handle, int flip) switch(flip) { case FLIP_NONE : - evas_info->flip = 0; + evas_info->flip = EVAS_IMAGE_ORIENT_NONE; break; case FLIP_HORIZONTAL: evas_info->flip = EVAS_IMAGE_FLIP_HORIZONTAL; @@ -1325,7 +1392,7 @@ int mm_evas_renderer_get_flip(MMHandleType handle, int *flip) } switch(evas_info->flip) { - case 0: + case EVAS_IMAGE_ORIENT_NONE: *flip = FLIP_NONE; break; case EVAS_IMAGE_FLIP_HORIZONTAL: |