ecore: move Ecore_Evas software SDL from specific SDL Evas backend to generic buffer backend.

One more step to removing Evas Software SDL backend.


SVN revision: 68346
This commit is contained in:
Cedric BAIL 2012-02-23 15:39:18 +00:00
parent 895355ef99
commit 41d64ec96e
2 changed files with 167 additions and 17 deletions

View File

@ -344,6 +344,7 @@ struct _Ecore_Evas
char sticky : 1;
char request_pos : 1;
char draw_frame : 1;
char hwsurface : 1;
} prop;
struct {

View File

@ -18,10 +18,15 @@
#include <stdlib.h>
#include <string.h>
#include <SDL/SDL.h>
#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