From b9ac050dd220ef881f1eab37c220429b61b7545b Mon Sep 17 00:00:00 2001 From: doursse Date: Sun, 25 May 2008 17:39:48 +0000 Subject: [PATCH] add DirectDraw backend. Seems faster on pda's that have it SVN revision: 34668 --- .../engines/software_16_wince/Makefile.am | 3 +- .../engines/software_16_wince/evas_engine.c | 28 ++++ .../engines/software_16_wince/evas_engine.h | 23 +++ .../evas_wince_ddraw_buffer.cpp | 157 ++++++++++++++++++ .../software_16_wince/evas_wince_fb_buffer.c | 2 +- .../evas_wince_gapi_buffer.c | 2 +- 6 files changed, 212 insertions(+), 3 deletions(-) create mode 100644 legacy/evas/src/modules/engines/software_16_wince/evas_wince_ddraw_buffer.cpp diff --git a/legacy/evas/src/modules/engines/software_16_wince/Makefile.am b/legacy/evas/src/modules/engines/software_16_wince/Makefile.am index 57dd6aa120..358f6ec200 100644 --- a/legacy/evas/src/modules/engines/software_16_wince/Makefile.am +++ b/legacy/evas/src/modules/engines/software_16_wince/Makefile.am @@ -19,7 +19,8 @@ module_la_SOURCES = \ evas_engine.h \ evas_engine.c \ evas_wince_fb_buffer.c \ -evas_wince_gapi_buffer.c +evas_wince_gapi_buffer.c \ +evas_wince_ddraw_buffer.cpp module_la_CFLAGS = @WIN32_CFLAGS@ module_la_LIBADD = $(top_builddir)/src/lib/libevas.la diff --git a/legacy/evas/src/modules/engines/software_16_wince/evas_engine.c b/legacy/evas/src/modules/engines/software_16_wince/evas_engine.c index 53dd95fb0e..0ed0cdecde 100644 --- a/legacy/evas/src/modules/engines/software_16_wince/evas_engine.c +++ b/legacy/evas/src/modules/engines/software_16_wince/evas_engine.c @@ -204,6 +204,20 @@ eng_setup(Evas *e, void *in) re->backend_output_buffer_paste = evas_software_wince_gapi_output_buffer_paste; re->backend_surface_resize = evas_software_wince_gapi_surface_resize; break; + case 3: /* DirectDraw */ + re->backend = EVAS_ENGINE_WINCE_DDRAW; + re->backend_priv = evas_software_wince_ddraw_init(info->info.window); + if (!re->backend_priv) + { + free(re); + return; + } + re->backend_shutdown = evas_software_wince_ddraw_shutdown; + re->backend_output_buffer_new = evas_software_wince_ddraw_output_buffer_new; + re->backend_output_buffer_free = evas_software_wince_ddraw_output_buffer_free; + re->backend_output_buffer_paste = evas_software_wince_ddraw_output_buffer_paste; + re->backend_surface_resize = evas_software_wince_ddraw_surface_resize; + break; default: free(re); return; @@ -251,6 +265,20 @@ eng_setup(Evas *e, void *in) re->backend_output_buffer_paste = evas_software_wince_gapi_output_buffer_paste; re->backend_surface_resize = evas_software_wince_gapi_surface_resize; break; + case 3: /* DirectDraw */ + re->backend = EVAS_ENGINE_WINCE_DDRAW; + re->backend_priv = evas_software_wince_ddraw_init(info->info.window); + if (!re->backend_priv) + { + free(re); + return; + } + re->backend_shutdown = evas_software_wince_ddraw_shutdown; + re->backend_output_buffer_new = evas_software_wince_ddraw_output_buffer_new; + re->backend_output_buffer_free = evas_software_wince_ddraw_output_buffer_free; + re->backend_output_buffer_paste = evas_software_wince_ddraw_output_buffer_paste; + re->backend_surface_resize = evas_software_wince_ddraw_surface_resize; + break; default: free(re); return; diff --git a/legacy/evas/src/modules/engines/software_16_wince/evas_engine.h b/legacy/evas/src/modules/engines/software_16_wince/evas_engine.h index dbbc35c2c0..8507fe3bee 100644 --- a/legacy/evas/src/modules/engines/software_16_wince/evas_engine.h +++ b/legacy/evas/src/modules/engines/software_16_wince/evas_engine.h @@ -46,4 +46,27 @@ int evas_software_wince_gapi_suspend(void); int evas_software_wince_gapi_resume(void); +/* DirectDraw */ + +#ifdef __cplusplus +extern "C" { +#endif + + +void *evas_software_wince_ddraw_init (HWND window); +FB_Output_Buffer *evas_software_wince_ddraw_output_buffer_new (void *priv, + int width, + int height); +void evas_software_wince_ddraw_shutdown(void *priv); +void evas_software_wince_ddraw_output_buffer_free (FB_Output_Buffer *fbob); +void evas_software_wince_ddraw_output_buffer_paste (FB_Output_Buffer *fbob); + +void evas_software_wince_ddraw_surface_resize(FB_Output_Buffer *fbob); + + +#ifdef __cplusplus +} +#endif + + #endif /* __EVAS_ENGINE_H__ */ diff --git a/legacy/evas/src/modules/engines/software_16_wince/evas_wince_ddraw_buffer.cpp b/legacy/evas/src/modules/engines/software_16_wince/evas_wince_ddraw_buffer.cpp new file mode 100644 index 0000000000..b053e34692 --- /dev/null +++ b/legacy/evas/src/modules/engines/software_16_wince/evas_wince_ddraw_buffer.cpp @@ -0,0 +1,157 @@ +#include + +#include "evas_common.h" +#include "evas_engine.h" + + +typedef LONG (*fct_DirectDrawCreate)(LPGUID, LPUNKNOWN *, LPUNKNOWN *); + +fct_DirectDrawCreate lib_DirectDrawCreate; + +typedef struct Evas_Engine_WinCE_DDraw_Priv Evas_Engine_WinCE_DDraw_Priv; + +struct Evas_Engine_WinCE_DDraw_Priv +{ + HMODULE module; + LPDIRECTDRAW object; + LPDIRECTDRAWSURFACE surface; + int width; + int height; + int stride; +}; + +void * +evas_software_wince_ddraw_init (HWND window) +{ + DDSURFACEDESC surface_desc; + Evas_Engine_WinCE_DDraw_Priv *priv; + HRESULT res; + + priv = (Evas_Engine_WinCE_DDraw_Priv *)malloc(sizeof(Evas_Engine_WinCE_DDraw_Priv)); + if (!priv) + return NULL; + + priv->module = LoadLibrary(L"ddraw.dll"); + if (!priv->module) + goto free_priv; + + lib_DirectDrawCreate = (fct_DirectDrawCreate)GetProcAddress(priv->module, L"DirectDrawCreate"); + if (!lib_DirectDrawCreate) + goto free_lib; + + res = lib_DirectDrawCreate(NULL, (IUnknown**)&priv->object, NULL); + if (FAILED(res)) + goto free_lib; + + res = priv->object->SetCooperativeLevel(window, DDSCL_FULLSCREEN); + if (FAILED(res)) + goto release_object; + + memset(&surface_desc, 0, sizeof(surface_desc)); + surface_desc.dwSize = sizeof(surface_desc); + surface_desc.dwFlags = DDSD_CAPS; + surface_desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; + + res = priv->object->CreateSurface(&surface_desc, &priv->surface, NULL); + if (FAILED(res)) + goto release_object; + + memset(&surface_desc, 0, sizeof(surface_desc)); + surface_desc.dwSize = sizeof(surface_desc); + res = priv->surface->Lock(0, &surface_desc, DDLOCK_WAITNOTBUSY, 0); + if (FAILED(res)) + goto release_surface; + + priv->width = surface_desc.dwWidth; + priv->height = surface_desc.dwHeight; + priv->stride = surface_desc.lPitch / 2; + + res = priv->surface->Unlock(NULL); + if (FAILED(res)) + goto release_surface; + + return priv; + + release_surface: + priv->surface->Release(); + release_object: + priv->object->Release(); + free_lib: + FreeLibrary(priv->module); + free_priv: + free(priv); + + return 0; +} + +void +evas_software_wince_ddraw_shutdown(void *priv) +{ + ((Evas_Engine_WinCE_DDraw_Priv *)priv)->surface->Release(); + ((Evas_Engine_WinCE_DDraw_Priv *)priv)->object->Release(); + FreeLibrary(((Evas_Engine_WinCE_DDraw_Priv *)priv)->module); + free(priv); +} + + +FB_Output_Buffer * +evas_software_wince_ddraw_output_buffer_new(void *priv, + int width, + int height) +{ + FB_Output_Buffer *fbob; + void *buffer; + + fbob = (FB_Output_Buffer *)calloc(1, sizeof(FB_Output_Buffer)); + if (!fbob) return NULL; + + buffer = malloc (width * height * 2); /* we are sure to have 16bpp */ + if (!buffer) + { + free(fbob); + return NULL; + } + + fbob->priv = priv; + + fbob->im = (Soft16_Image *) evas_cache_image_data(evas_common_soft16_image_cache_get(), width, height, (DATA32 *)buffer, 0, EVAS_COLORSPACE_RGB565_A5P); + if (fbob->im) + fbob->im->stride = ((Evas_Engine_WinCE_DDraw_Priv *)priv)->stride; + + return fbob; +} + +void +evas_software_wince_ddraw_output_buffer_free(FB_Output_Buffer *fbob) +{ + free(fbob->im->pixels); + free(fbob); +} + +void +evas_software_wince_ddraw_output_buffer_paste(FB_Output_Buffer *fbob) +{ + DDSURFACEDESC surface_desc; + Evas_Engine_WinCE_DDraw_Priv *priv; + HRESULT res; + + priv = (Evas_Engine_WinCE_DDraw_Priv *)fbob->priv; + + memset(&surface_desc, 0, sizeof(surface_desc)); + surface_desc.dwSize = sizeof(surface_desc); + res = priv->surface->Lock(0, &surface_desc, DDLOCK_WAITNOTBUSY, 0); + if (FAILED(res)) + return; + + if ((fbob->im->cache_entry.w == surface_desc.dwWidth) && + (fbob->im->cache_entry.h == surface_desc.dwHeight)) + memcpy(surface_desc.lpSurface, fbob->im->pixels, + surface_desc.dwWidth * surface_desc.dwHeight * 2); + + priv->surface->Unlock(NULL); +} + +void +evas_software_wince_ddraw_surface_resize(FB_Output_Buffer *fbob) +{ +} diff --git a/legacy/evas/src/modules/engines/software_16_wince/evas_wince_fb_buffer.c b/legacy/evas/src/modules/engines/software_16_wince/evas_wince_fb_buffer.c index eab4c50c58..f4b1d0706d 100644 --- a/legacy/evas/src/modules/engines/software_16_wince/evas_wince_fb_buffer.c +++ b/legacy/evas/src/modules/engines/software_16_wince/evas_wince_fb_buffer.c @@ -162,6 +162,6 @@ evas_software_wince_fb_output_buffer_paste(FB_Output_Buffer *fbob) } void -evas_software_wince_fb_surface_resize(FB_Output_Buffer *ddob) +evas_software_wince_fb_surface_resize(FB_Output_Buffer *fbob) { } diff --git a/legacy/evas/src/modules/engines/software_16_wince/evas_wince_gapi_buffer.c b/legacy/evas/src/modules/engines/software_16_wince/evas_wince_gapi_buffer.c index d6f66818fb..cff5df9900 100644 --- a/legacy/evas/src/modules/engines/software_16_wince/evas_wince_gapi_buffer.c +++ b/legacy/evas/src/modules/engines/software_16_wince/evas_wince_gapi_buffer.c @@ -321,6 +321,6 @@ evas_software_wince_gapi_output_buffer_paste(FB_Output_Buffer *fbob) } void -evas_software_wince_gapi_surface_resize(FB_Output_Buffer *ddob) +evas_software_wince_gapi_surface_resize(FB_Output_Buffer *fbob) { }