본문 바로가기

프로그래밍/Tizen

[EFL] Evas 오브젝트

Evas

Evas는 Efl의 핵심요소 이기에 쉽게 다룰수 있는 분량은 아니다. 그저 자주 사용될 만한 메소드들을 열거해 두고 실제 내용은 해당 레퍼런스를 참조하는것이 맞을 듯 싶다. 


기본적인 처리 순서


// Evas는 그래픽 영역이므로 몇가지 설정이 필요하다.

Evas* canvas;

Evas_Engine_Info_Buffer *info;

int method;


method = evas_render_method_lookup("buffer");

canvas = evas_new();

evas_output_method_set( canvas, method);

evas_output_size_set( canvas, w, h );

evas_output_viewport_set( canvas, 0, 0, w, h);

info = (Evas_Engine_Info_Buffer*) evas_engine_info_get(canvas);


// info에 캔버스 정보를 입력한다.

info->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;

info->info.dest_buffer =  malloc(w * h * 4); // 전체 바이트 할당

info->info.dest_buffer_row_bytes = w * 4; // 줄당 바이트

info->info.use_color_key = 0;

info->info.alpha_threshold = 0;

info->info.func.new_update_region = NULL;

info->info.func.free_update_region = NULL;

evas_engine_info_set( canvas, (Evas_Engine_Info*)info);



// 이미 윈도우가 생성되어 있으면, 해당 윈도우 내부적으로 canvas가 할당되어 있으므로 보다 수월하게 evas 객체를 얻을 수 있다.

Evas_Object *win = elm_win_add(....);

.

Evas *canvas = evas_object_evas_get(win);



// 배경설정 : rectangle 오브젝트를 처음에 추가하고, 해당 오브젝트 색상을 지정해 주는 형태로 구현

Evas_Object *bg;

bg=evas_object_rectangle_add(canvas);

evas_object_color_set(bg, 255,255,255,255);

evas_object_move(bg, 0, 0);

evas_object_resize(bg, w, h );

evas_object_show(bg);



// 필요한 요소들을 그린다.

Eina_List* update;

update = evas_render_update( canvas );

evas_render_update_free( update );




// 해제 : 할당된 버퍼를 해제한다.

Evas_Engine_Info_Buffer *info;

info = (Evas_Engine_Info_Buffer*) evas_engine_info_get( canvas );

free( info->info.dest_buffer);


evas_free( canvas);




오브젝트 종류

rectangle

line

polygon

text

textblock

textgrid

image


box

table

grid


smart object : 위에 지원되지 않은 오브젝트. elemantary 위젯이 여기에 속하며, 별도로 정의할 수도 있다.



캔버스 메쏘드

evas_focus_in : 포커스 획득

evas_focus_out : 포커스 해제

evas_render : 렌더링

evas_render_async : 비동기적으로 렌더링

evas_norender : 렌더링 없이 오브젝트 업데이트

evas_render_updates : 즉시 렌더링




객체 사이즈 힌트

EVAS_HINT_FILL=-1.0

EVAS_HINT_EXPAND=1.0


weight, align 등은 0.0~1.0 사이의 값(비율)이 들어가며, EVAS_HINT_FILL, EVAS_HINT_EXPAND 값으로 특정 사이즈를 지정할 수 있다. 


evas_object_size_hint_weight_set( obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);

evas_object_size_hint_align_set( obj, EVAS_HINT_FILL, EVAS_HINT_FILL);

evas_object_size_hint_padding_set( obj, left, right, top, bottom );

evas_object_size_hint_max_set( obj, w, h);

evas_object_size_hint_min_set( obj, w, h);







객체 위치/상태

Evas_Object *obj;


evas_object_size_set(w, h)

evas_object_position_set(x,y);

evas_object_color_set( obj, r , g, b, a );

evas_object_move( obj, x, y);

evas_object_resize( obj, w, h);


evas_object_visible_get( obje );

evas_object_show(obj);

evas_object_hide(obj);


evas_object_show( obj );





이미지

객체생성

Evas_Object *img = evas_object_image_add( canvas );


해당 영역에 맞게 객체 생성

Evas_Object *img = evas_object_image_filled_add( canvas );


이미지 파일 지정

evas_object_image_file_set( img, "path", NULL );


채우기 설정

evas_object_image_fill_set( img, 0, 0, 100, 100);


알파설정

evas_object_image_alpha_set( img, EINA_TRUE);


스케일 품질 설정

evas_object_image_smooth_scale_set( img, EINA_TRUE );


로드 시 스케일링

evas_object_image_load_size_set( img, 100, 100 );


이미지 버퍼 관련

evas_object_image_data_set

evas_object_image_data_update_add


보더

evas_object_image_border_set




캔버스 이벤트

이벤트 타입

EVAS_CALLBACK_CANVAS_FOCUS_IN

EVAS_CALLBACK_CANVAS_FOCUS_OUT

EVAS_CALLBACK_RENDER_FLUSH_PRE

.

.

.

콜백 정의

typedef void(* Evas_Event_Cb)(void *data, Evas *e, void *event_info );


이벤트 핸들러 등록

void evas_event_callback_add( Evas * e,

Evas_Callback_Type type,

Evas_Event_Cb func,

const void * data );


오브젝트 이벤트

typedef void(* Evas_Object_Event_Cb) (void *data, Evas *e, Evas_Object *obj, void *event_info);


void evas_object_event_callback_add( Evas_Object *obj,

Evas_Callback_Type type,

Evas_Object_Event_Cb func,

const void *data );



// 

void evas_object_pass_events_set( Evas_Object *obj, Eina_Bool pass);

void evas_object_repeat_event_set( Evas_Object *obj, Eina_Bool repeat);




오브젝트 찾기

현재 포커스된 오브젝트를 얻어온다.

Evas_Object* evas_focus_get( const Evas * e);


이름으로 찾기

Evas_Object* evas_object_name_find( const Evas *e, const char *name);


스택내의 오브젝트

evas_object_top_get

evas_object_bottom_get



터치입력

터치 입력 수

unsigned int evas_touch_point_list_count( Evas *e );


터치 목록 얻기

Evas_Coord x, y;

evas_touch_point_nth_xy_get( evas, 0, &x, &y );


터치 아이디 얻기

int id;

id = evas_touch_point_list_nth_id_get( evas, 0 );



스마트 오브젝트 관련

evas 오브젝트를 스마트 오브젝트의 멤버의 스택에 추가

evas_object_smart_member_add( Evas_Object *obj, Evas_Object* smart_obj);


스마트 오브젝트에서 Evas_Smart 객체를 얻는다.

Evas_Smart* smart = evas_object_smart_smart_get( Evas_Object* obj);


스마트 오브젝트의 data 얻기

void* data = evas_object_smart_data_get( Evas_Object *obj);



스마트 오브젝트의 이벤트에 대한 콜백을 등록한다. 일반적인 오브젝트 콜백과는 다르게 evnet name으로 이벤트를 식별한다. 

void(* Evas_Smart_Cb)(void *data, Evas_Object *obj, void *event_info);


evas_object_smart_callback_add( 

Evas_Object *obj, 

const char *event_name, 

Evas_Smart_Cb func, 

const void *data);




Ecore_Evas

evas 객체는 캔버스 관련 처리 루틴만 있으므로, ecore의 메인루프 안에 들어가기 위해 여러 처리가 필요하다. efl에는 메인 루프와 관련된 각종 이벤트 콜백등을 지원하기 위해 ecore_evas를 제공한다.


초기화

ecore_evas_init();


엔진확인

Eina_list *engines, *item;

char *data;

engines = ecore_evas_engines_get();

EINA_LIST_FOREACH( engines, item, data );

printf("%s\n", data );

ecore_evas_free(engines);


ex)

static void _on_destory( Ecore_Evas *ee )

{

ecore_main_loop_quit();

}


static foid _on_resize( Ecore_Evas *ee )

{

int w, h;

ecore_evas_geometry_get( ee, NULL, NULL, &w, &h );

}



int main()

{

Ecore_Evas *ee;

Evas *canvas;

Evas_Object *bg;


Ecore_Evas 생성

ee = ecore_evas_new( NULL, 0, 0, 100, 100, NULL );


ecore_evas_callback_destroy_set( ee, _on_destroy );

ecore_evas_callback_resize_set( ee, _on_resize);


Ecore_Evas 객체에서 Evas 객체얻기

canvas = ecore_evas_get( ee );


Evas객체에서 Ecore_Evas 객체 얻기

ee = ecore_evas_ecore_evas_get( canvas);


ecore_main_loop_begin();

ecore_evas_shutdown();

}


이미지 생성

Ecore_Evas 객체에서 이미지 Evas_Object 를 생성한다.

Evas_Object * ecore_evas_object_image_new( Ecore_Evas *ee_target);



해제

ecore_evas_free( ee );


'프로그래밍 > Tizen' 카테고리의 다른 글

[Tizen] 패키징 및 signing  (0) 2014.07.31
[EFL] Ecore_Exe 프로세스간 통신  (0) 2014.07.19
[EFL] Elementary  (3) 2014.07.17
[EFL] Elementary 위젯  (0) 2014.07.17
[EFL] EDC 스크립트  (0) 2014.07.17
[EFL] HTTP 연결  (0) 2014.07.13
[EFL] Ecore 이벤트 핸들러  (0) 2014.07.13
[EFL] 기본 윈도우  (0) 2014.07.13