[Pkg-e-commits] [SCM] Enlightenment DR17 advanced canvas library branch, upstream-vcs, updated. 069f3cc6c93f253bffbc90289fe21d868f745bb6
doursse
doursse at alioth.debian.org
Sat Jun 7 18:24:19 UTC 2008
The following commit has been merged in the upstream-vcs branch:
commit 29c2054a664d66abd79f34b47582014b9f7efb7b
Author: doursse <doursse>
Date: Sun May 25 17:37:24 2008 +0000
add DirectDraw backend. Seems faster on pda's that have it
diff --git a/src/modules/engines/software_16_wince/Makefile.am b/src/modules/engines/software_16_wince/Makefile.am
index 57dd6aa..358f6ec 100644
--- a/src/modules/engines/software_16_wince/Makefile.am
+++ b/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/src/modules/engines/software_16_wince/evas_engine.c b/src/modules/engines/software_16_wince/evas_engine.c
index 53dd95f..0ed0cde 100644
--- a/src/modules/engines/software_16_wince/evas_engine.c
+++ b/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/src/modules/engines/software_16_wince/evas_engine.h b/src/modules/engines/software_16_wince/evas_engine.h
index dbbc35c..8507fe3 100644
--- a/src/modules/engines/software_16_wince/evas_engine.h
+++ b/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/src/modules/engines/software_16_wince/evas_wince_ddraw_buffer.cpp b/src/modules/engines/software_16_wince/evas_wince_ddraw_buffer.cpp
new file mode 100644
index 0000000..b053e34
--- /dev/null
+++ b/src/modules/engines/software_16_wince/evas_wince_ddraw_buffer.cpp
@@ -0,0 +1,157 @@
+#include <ddraw.h>
+
+#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/src/modules/engines/software_16_wince/evas_wince_fb_buffer.c b/src/modules/engines/software_16_wince/evas_wince_fb_buffer.c
index eab4c50..f4b1d07 100644
--- a/src/modules/engines/software_16_wince/evas_wince_fb_buffer.c
+++ b/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/src/modules/engines/software_16_wince/evas_wince_gapi_buffer.c b/src/modules/engines/software_16_wince/evas_wince_gapi_buffer.c
index d6f6681..cff5df9 100644
--- a/src/modules/engines/software_16_wince/evas_wince_gapi_buffer.c
+++ b/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)
{
}
--
Enlightenment DR17 advanced canvas library
More information about the Pkg-e-commits
mailing list