From: cedric Date: Thu, 23 Feb 2012 15:39:18 +0000 (+0000) Subject: ecore: move Ecore_Evas software SDL from specific SDL Evas backend to generic buffer... X-Git-Tag: accepted/2.0/20130306.224007~69^2~43 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2db68f27efd2d3314629a96a7fcd99c4bcb14a1a;p=profile%2Fivi%2Fecore.git ecore: move Ecore_Evas software SDL from specific SDL Evas backend to generic buffer backend. One more step to removing Evas Software SDL backend. git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/ecore@68346 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- diff --git a/src/lib/ecore_evas/ecore_evas_private.h b/src/lib/ecore_evas/ecore_evas_private.h index 48f3316..acb70f5 100644 --- a/src/lib/ecore_evas/ecore_evas_private.h +++ b/src/lib/ecore_evas/ecore_evas_private.h @@ -344,6 +344,7 @@ struct _Ecore_Evas char sticky : 1; char request_pos : 1; char draw_frame : 1; + char hwsurface : 1; } prop; struct { diff --git a/src/lib/ecore_evas/ecore_evas_sdl.c b/src/lib/ecore_evas/ecore_evas_sdl.c index a3be2c7..28c69cd 100644 --- a/src/lib/ecore_evas/ecore_evas_sdl.c +++ b/src/lib/ecore_evas/ecore_evas_sdl.c @@ -18,10 +18,15 @@ #include #include +#include + #include "ecore_evas_private.h" #include "Ecore_Evas.h" -// fixme: 1 sdl window only at a time? seems wrong +/** + ** SDL only handle one window at a time. That's by definition, there is nothing wrong here. + ** + **/ #if defined(BUILD_ECORE_EVAS_SOFTWARE_SDL) || defined(BUILD_ECORE_EVAS_OPENGL_SDL) @@ -45,6 +50,13 @@ _ecore_evas_sdl_match(void) return sdl_ee; } +static void * +_ecore_evas_sdl_switch_buffer(void *data, void *dest __UNUSED__) +{ + SDL_Flip(data); + return ((SDL_Surface*)data)->pixels; +} + static Eina_Bool _ecore_evas_sdl_event_got_focus(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__) { @@ -80,12 +92,54 @@ _ecore_evas_sdl_event_video_resize(void *data __UNUSED__, int type __UNUSED__, v { Ecore_Sdl_Event_Video_Resize *e; Ecore_Evas *ee; + int rmethod; e = event; ee = _ecore_evas_sdl_match(); if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */ + + rmethod = evas_output_method_get(ee->evas); + if (rmethod == evas_render_method_lookup("buffer")) + { + Evas_Engine_Info_Buffer *einfo; + + einfo = (Evas_Engine_Info_Buffer *) evas_engine_info_get(ee->evas); + if (einfo) + { + einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32; + einfo->info.switch_data = SDL_SetVideoMode(e->w, e->h, 32, + (ee->prop.hwsurface ? SDL_HWSURFACE : SDL_SWSURFACE) + | (ee->prop.fullscreen ? SDL_FULLSCREEN : 0) + | (ee->alpha ? SDL_SRCALPHA : 0) + | SDL_DOUBLEBUF); + if (!einfo->info.switch_data) + { + return EINA_FALSE; + } + + SDL_SetAlpha(einfo->info.switch_data, SDL_SRCALPHA, 0); + SDL_FillRect(einfo->info.switch_data, NULL, 0); + + einfo->info.dest_buffer = ((SDL_Surface*)einfo->info.switch_data)->pixels; + einfo->info.dest_buffer_row_bytes = e->w * sizeof (int); + einfo->info.use_color_key = 0; + einfo->info.alpha_threshold = 0; + einfo->info.func.new_update_region = NULL; + einfo->info.func.free_update_region = NULL; + einfo->info.func.switch_buffer = _ecore_evas_sdl_switch_buffer; + if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *) einfo)) + { + return EINA_FALSE; + } + } + } + + ee->w = e->w; + ee->h = e->h; + evas_output_size_set(ee->evas, e->w, e->h); + evas_output_viewport_set(ee->evas, 0, 0, e->w, e->h); return ECORE_CALLBACK_PASS_ON; } @@ -191,7 +245,7 @@ _ecore_evas_sdl_shutdown(void) _ecore_evas_init_count--; if (_ecore_evas_init_count == 0) { - int i; + unsigned int i; for (i = 0; i < sizeof (ecore_evas_event_handlers) / sizeof (Ecore_Event_Handler*); i++) ecore_event_handler_del(ecore_evas_event_handlers[i]); @@ -219,10 +273,48 @@ _ecore_evas_sdl_free(Ecore_Evas *ee) static void _ecore_evas_resize(Ecore_Evas *ee, int w, int h) { + int rmethod; + if ((w == ee->w) && (h == ee->h)) return; ee->w = w; ee->h = h; + rmethod = evas_output_method_get(ee->evas); + if (rmethod == evas_render_method_lookup("buffer")) + { + Evas_Engine_Info_Buffer *einfo; + + einfo = (Evas_Engine_Info_Buffer *) evas_engine_info_get(ee->evas); + if (einfo) + { + einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32; + einfo->info.switch_data = SDL_SetVideoMode(w, h, 32, + (ee->prop.hwsurface ? SDL_HWSURFACE : SDL_SWSURFACE) + | (ee->prop.fullscreen ? SDL_FULLSCREEN : 0) + | (ee->alpha ? SDL_SRCALPHA : 0) + | SDL_DOUBLEBUF); + if (!einfo->info.switch_data) + { + return ; + } + + SDL_SetAlpha(einfo->info.switch_data, SDL_SRCALPHA, 0); + SDL_FillRect(einfo->info.switch_data, NULL, 0); + + einfo->info.dest_buffer = ((SDL_Surface*)einfo->info.switch_data)->pixels; + einfo->info.dest_buffer_row_bytes = w * sizeof (int); + einfo->info.use_color_key = 0; + einfo->info.alpha_threshold = 0; + einfo->info.func.new_update_region = NULL; + einfo->info.func.free_update_region = NULL; + einfo->info.func.switch_buffer = _ecore_evas_sdl_switch_buffer; + if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *) einfo)) + { + return ; + } + } + } + evas_output_size_set(ee->evas, ee->w, ee->h); evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h); evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); @@ -349,7 +441,6 @@ static Ecore_Evas_Engine_Func _ecore_sdl_engine_func = static Ecore_Evas* _ecore_evas_internal_sdl_new(int rmethod, const char* name, int w, int h, int fullscreen, int hwsurface, int noframe, int alpha) { - void *einfo; Ecore_Evas *ee; if (!name) @@ -382,6 +473,8 @@ _ecore_evas_internal_sdl_new(int rmethod, const char* name, int w, int h, int fu ee->prop.withdrawn = 0; ee->prop.sticky = 0; ee->prop.window = 0; + ee->alpha = alpha; + ee->prop.hwsurface = hwsurface; /* init evas here */ ee->evas = evas_new(); @@ -391,18 +484,19 @@ _ecore_evas_internal_sdl_new(int rmethod, const char* name, int w, int h, int fu evas_output_size_set(ee->evas, w, h); evas_output_viewport_set(ee->evas, 0, 0, w, h); - if (rmethod == evas_render_method_lookup("software_sdl") || - rmethod == evas_render_method_lookup("software_16_sdl") ) + if (rmethod == evas_render_method_lookup("software_16_sdl")) { #ifdef BUILD_ECORE_EVAS_SOFTWARE_SDL - einfo = evas_engine_info_get(ee->evas); + Evas_Engine_Info_SDL *einfo; + + einfo = (Evas_Engine_Info_SDL *) evas_engine_info_get(ee->evas); if (einfo) { - ((Evas_Engine_Info_SDL *)einfo)->info.rotation = 0; - ((Evas_Engine_Info_SDL *)einfo)->info.fullscreen = fullscreen; - ((Evas_Engine_Info_SDL *)einfo)->info.hwsurface = hwsurface; - ((Evas_Engine_Info_SDL *)einfo)->info.noframe = noframe; - ((Evas_Engine_Info_SDL *)einfo)->info.alpha = alpha; + einfo->info.rotation = 0; + einfo->info.fullscreen = fullscreen; + einfo->info.hwsurface = hwsurface; + einfo->info.noframe = noframe; + einfo->info.alpha = alpha; if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo)) { ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver); @@ -418,14 +512,70 @@ _ecore_evas_internal_sdl_new(int rmethod, const char* name, int w, int h, int fu } #endif } + else if (rmethod == evas_render_method_lookup("buffer")) + { + Evas_Engine_Info_Buffer *einfo; + + einfo = (Evas_Engine_Info_Buffer *) evas_engine_info_get(ee->evas); + if (einfo) + { + SDL_Init(SDL_INIT_NOPARACHUTE); + + if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) + { + ERR("SDL_Init failed with %s", SDL_GetError()); + SDL_Quit(); + return NULL; + } + + einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32; + einfo->info.switch_data = SDL_SetVideoMode(w, h, 32, + (hwsurface ? SDL_HWSURFACE : SDL_SWSURFACE) + | (fullscreen ? SDL_FULLSCREEN : 0) + | (noframe ? SDL_NOFRAME : 0) + | (alpha ? SDL_SRCALPHA : 0) + | SDL_DOUBLEBUF); + if (!einfo->info.switch_data) + { + ERR("SDL_SetVideoMode failed !"); + ecore_evas_free(ee); + return NULL; + } + + SDL_SetAlpha(einfo->info.switch_data, SDL_SRCALPHA, 0); + SDL_FillRect(einfo->info.switch_data, NULL, 0); + + einfo->info.dest_buffer = ((SDL_Surface*)einfo->info.switch_data)->pixels; + einfo->info.dest_buffer_row_bytes = w * sizeof (int); + einfo->info.use_color_key = 0; + einfo->info.alpha_threshold = 0; + einfo->info.func.new_update_region = NULL; + einfo->info.func.free_update_region = NULL; + einfo->info.func.switch_buffer = _ecore_evas_sdl_switch_buffer; + if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *) einfo)) + { + ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver); + ecore_evas_free(ee); + return NULL; + } + } + else + { + ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver); + ecore_evas_free(ee); + return NULL; + } + } else if (rmethod == evas_render_method_lookup("gl_sdl")) { #ifdef BUILD_ECORE_EVAS_OPENGL_SDL - einfo = evas_engine_info_get(ee->evas); + Evas_Engine_Info_GL_SDL *einfo; + + einfo = (Evas_Engine_Info_GL_SDL *) evas_engine_info_get(ee->evas); if (einfo) { - ((Evas_Engine_Info_GL_SDL *)einfo)->flags.fullscreen = fullscreen; - ((Evas_Engine_Info_GL_SDL *)einfo)->flags.noframe = noframe; + einfo->flags.fullscreen = fullscreen; + einfo->flags.noframe = noframe; if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo)) { ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver); @@ -464,7 +614,7 @@ _ecore_evas_internal_sdl_new(int rmethod, const char* name, int w, int h, int fu (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process, (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process); - SDL_ShowCursor(SDL_DISABLE); + SDL_ShowCursor(SDL_ENABLE); ee->engine.func->fn_render = _ecore_evas_sdl_render; _ecore_evas_register(ee); @@ -481,11 +631,10 @@ ecore_evas_sdl_new(const char* name, int w, int h, int fullscreen, int hwsurface Ecore_Evas *ee; int rmethod; - rmethod = evas_render_method_lookup("software_sdl"); + rmethod = evas_render_method_lookup("buffer"); if (!rmethod) return NULL; ee = _ecore_evas_internal_sdl_new(rmethod, name, w, h, fullscreen, hwsurface, noframe, alpha); - ee->driver = "sdl"; return ee; } #else