From 208d20a30f1e12424a3ba2306c1e5b4ad720c165 Mon Sep 17 00:00:00 2001 From: doursse Date: Wed, 23 Apr 2008 19:17:59 +0000 Subject: [PATCH] * Add Windows CE engine (1st step) The engine is not entirely working right now. Recent devices which supports the raw frame buffer should work though. But having it in cvs will help me as I'm coding it most of the time "blindly" (no device to test it) * minor formatting in the top evel Makefile.am too SVN revision: 34354 --- legacy/evas/Makefile.am | 130 ++-- legacy/evas/configure.in | 45 +- legacy/evas/evas-software-16-wince.pc.in | 3 + legacy/evas/src/lib/canvas/evas_main.c | 3 + legacy/evas/src/modules/engines/Makefile.am | 1 + .../Evas_Engine_Software_16_WinCE.h | 30 + .../engines/software_16_wince/Makefile.am | 35 + .../engines/software_16_wince/evas_engine.c | 697 ++++++++++++++++++ .../engines/software_16_wince/evas_engine.h | 49 ++ .../software_16_wince/evas_wince_fb_buffer.c | 122 +++ .../evas_wince_gapi_buffer.c | 278 +++++++ 11 files changed, 1337 insertions(+), 56 deletions(-) create mode 100644 legacy/evas/evas-software-16-wince.pc.in create mode 100644 legacy/evas/src/modules/engines/software_16_wince/Evas_Engine_Software_16_WinCE.h create mode 100644 legacy/evas/src/modules/engines/software_16_wince/Makefile.am create mode 100644 legacy/evas/src/modules/engines/software_16_wince/evas_engine.c create mode 100644 legacy/evas/src/modules/engines/software_16_wince/evas_engine.h create mode 100644 legacy/evas/src/modules/engines/software_16_wince/evas_wince_fb_buffer.c create mode 100644 legacy/evas/src/modules/engines/software_16_wince/evas_wince_gapi_buffer.c diff --git a/legacy/evas/Makefile.am b/legacy/evas/Makefile.am index 0348494f21..0f75b87282 100644 --- a/legacy/evas/Makefile.am +++ b/legacy/evas/Makefile.am @@ -2,58 +2,80 @@ ACLOCAL_AMFLAGS = -I m4 SUBDIRS = src -MAINTAINERCLEANFILES = Makefile.in aclocal.m4 config.guess \ - config.h.in config.sub configure install-sh \ - ltconfig ltmain.sh missing mkinstalldirs \ - stamp-h.in build-stamp configure-stamp depcomp \ - evas_docs.tar.gz evas.c \ - README \ - evas-cairo-x11.pc \ - evas-directfb.pc \ - evas-fb.pc \ - evas-glitz-x11.pc \ - evas-opengl-x11.pc \ - evas-opengl-glew.pc \ - evas-software-buffer.pc \ - evas-software-qtopia.pc \ - evas-software-x11.pc \ - evas-software-16-x11.pc \ - evas-software-xcb.pc \ - evas-xrender-x11.pc \ - evas-xrender-xcb.pc \ - evas-software-ddraw.pc \ - evas-software-16-ddraw.pc \ - evas-direct3d.pc \ - evas-software-sdl.pc \ - evas.pc \ - evas.spec +MAINTAINERCLEANFILES = \ +Makefile.in \ +aclocal.m4 \ +config.guess \ +config.h.in \ +config.sub \ +configure \ +install-sh \ +ltconfig \ +ltmain.sh \ +missing \ +mkinstalldirs \ +stamp-h.in \ +build-stamp \ +configure-stamp \ +depcomp \ +evas_docs.tar.gz \ +evas.c \ +README \ +evas-cairo-x11.pc \ +evas-directfb.pc \ +evas-fb.pc \ +evas-glitz-x11.pc \ +evas-opengl-x11.pc \ +evas-opengl-glew.pc \ +evas-software-buffer.pc \ +evas-software-qtopia.pc \ +evas-software-x11.pc \ +evas-software-16-x11.pc \ +evas-software-xcb.pc \ +evas-xrender-x11.pc \ +evas-xrender-xcb.pc \ +evas-software-ddraw.pc \ +evas-software-16-ddraw.pc \ +evas-direct3d.pc \ +evas-software-16-wince.pc \ +evas-software-sdl.pc \ +evas.pc \ +evas.spec -bin_SCRIPTS = +bin_SCRIPTS = -EXTRA_DIST = AUTHORS COPYING COPYING-PLAIN autogen.sh evas.c.in gendoc \ - Doxyfile \ - README.in README \ - evas.pc.in \ - evas-cairo-x11.pc \ - evas-directfb.pc \ - evas-fb.pc \ - evas-glitz-x11.pc \ - evas-opengl-x11.pc \ - evas-opengl-glew.pc \ - evas-software-buffer.pc \ - evas-software-qtopia.pc \ - evas-software-x11.pc \ - evas-software-16-x11.pc \ - evas-software-xcb.pc \ - evas-xrender-x11.pc \ - evas-xrender-xcb.pc \ - evas-software-ddraw.pc \ - evas-software-16-ddraw.pc \ - evas-direct3d.pc \ - evas-software-sdl.pc \ - evas.pc \ - evas.spec.in evas.spec \ - doc gendoc +EXTRA_DIST = \ +AUTHORS \ +COPYING \ +COPYING-PLAIN \ +autogen.sh \ +evas.c.in \ +gendoc \ +Doxyfile \ +README.in \ +README \ +evas.pc.in \ +evas-cairo-x11.pc \ +evas-directfb.pc \ +evas-fb.pc \ +evas-glitz-x11.pc \ +evas-opengl-x11.pc \ +evas-opengl-glew.pc \ +evas-software-buffer.pc \ +evas-software-qtopia.pc \ +evas-software-x11.pc \ +evas-software-16-x11.pc \ +evas-software-xcb.pc \ +evas-xrender-x11.pc \ +evas-xrender-xcb.pc \ +evas-software-ddraw.pc \ +evas-software-16-ddraw.pc \ +evas-direct3d.pc \ +evas-software-16-wince.pc \ +evas-software-sdl.pc \ +evas.pc \ +evas.spec.in evas.spec \ +doc gendoc if BUILD_ENGINE_SOFTWARE_X11 psoftwarex11 = evas-software-x11.pc @@ -112,13 +134,17 @@ psoftwareddraw = evas-software-ddraw.pc endif if BUILD_ENGINE_SOFTWARE_16_DDRAW -psoftwared16draw = evas-software-16-ddraw.pc +psoftware16ddraw = evas-software-16-ddraw.pc endif if BUILD_ENGINE_DIRECT3D pdirect3d = evas-direct3d.pc endif +if BUILD_ENGINE_SOFTWARE_16_WINCE +psoftware16wince = evas-software-16-wince.pc +endif + if BUILD_ENGINE_SDL psoftwaresdl = evas-software-sdl.pc endif @@ -128,4 +154,4 @@ pkgconfig_DATA = \ evas.pc $(psoftwarex11) $(psoftwarexcb) $(pdirectfb) $(pfb) \ $(psoftwarebuffer) $(psoftwareqtopia) $(popenglx11) $(pcairox11) \ $(pxrenderx11) $(pxrenderxcb) $(pglitzx11) $(psoftwareddraw) $(psoftwaresdl) \ - $(psoftware16x11) $(pdirect3d) $(psoftwared16draw) $(popenglglew) + $(psoftware16x11) $(pdirect3d) $(psoftware16ddraw) $(psoftware16wince) $(popenglglew) diff --git a/legacy/evas/configure.in b/legacy/evas/configure.in index 6c0d27cda0..a08df81110 100644 --- a/legacy/evas/configure.in +++ b/legacy/evas/configure.in @@ -41,7 +41,7 @@ WIN32_CFLAGS="" lt_no_undefined="" lt_enable_auto_import="" case "$host_os" in - mingw|mingw32*|cegcc) + mingw*|cegcc*) PKG_CHECK_MODULES(EVIL, evil) AC_DEFINE(HAVE_EVIL, 1, [Set to 1 if evil package is installed]) dnl needed for correct definition of EAPI @@ -134,8 +134,8 @@ fi dlopen_libs="" case "$host_os" in - mingw|mingw32) - AC_CHECK_HEADER(windows.h, [], [AC_MSG_ERROR(Cannot find windows.h)]) + mingw*|cegcc*) +dnl managed by evil ;; *) AC_CHECK_FUNCS(dlopen, res=yes, res=no) @@ -266,6 +266,37 @@ AC_MSG_RESULT($have_evas_direct3d) AM_CONDITIONAL(BUILD_ENGINE_DIRECT3D, test "x$have_evas_direct3d" = "xyes") +####################################### +## Check if we should build the 16bit software_wince engine +want_evas_software_16_wince="auto"; +have_evas_software_16_wince="no"; + +AC_MSG_CHECKING(whether 16 bit software WinCE backend is to be built) +AC_ARG_ENABLE(software-16-wince, + AC_HELP_STRING([--enable-software-16-wince], [enable the 16bit Software WinCE rendering backend]), + [ want_evas_software_16_wince=$enableval ] +) +AC_MSG_RESULT($want_evas_software_16_wince) + +if test "x$want_evas_software_16_wince" = "xyes" -o "x$want_evas_software_16_wince" = "xauto"; then + AC_CHECK_HEADER(windows.h, + [ + AC_DEFINE(BUILD_ENGINE_SOFTWARE_16_WINCE, 1, [16bit Software WinCE Rendering Backend]) + wince_16_libs="" + have_evas_software_16_wince="yes" + ], + [ + if test "x$want_evas_software_16_wince" = "xyes" -a "x$use_strict" = "xyes" ; then + AC_MSG_ERROR([WinCE not found (strict dependencies checking)]) + fi + ] + ) +fi +AC_MSG_CHECKING(whether 16 bits software WinCE backend will be built) +AC_MSG_RESULT($have_evas_software_16_wince) +AM_CONDITIONAL(BUILD_ENGINE_SOFTWARE_16_WINCE, test "x$have_evas_software_16_wince" = "xyes") + + ####################################### ## Check if we should build the software_x11 engine want_evas_software_x11="auto"; @@ -861,7 +892,7 @@ fi dnl Windows has no sigsetjmp function, nor equivalent. dnl So we disable the jpeg saver. case "$host_os" in - mingw|mingw32) + mingw*|cegcc*) have_jpeg_saver="no" ;; esac @@ -1538,6 +1569,9 @@ fi if test "x$have_evas_software_16_ddraw" = "xyes"; then have_evas_software_16="yes" fi +if test "x$have_evas_software_16_wince" = "xyes"; then + have_evas_software_16="yes" +fi AM_CONDITIONAL(BUILD_ENGINE_SOFTWARE_16, test "x$have_evas_software_16" = "xyes") ##################################################################### @@ -1596,6 +1630,7 @@ evas-xrender-xcb.pc evas-software-ddraw.pc evas-software-16-ddraw.pc evas-direct3d.pc +evas-software-16-wince.pc evas-software-sdl.pc evas.pc src/Makefile @@ -1619,6 +1654,7 @@ src/modules/engines/Makefile src/modules/engines/software_generic/Makefile src/modules/engines/software_ddraw/Makefile src/modules/engines/direct3d/Makefile +src/modules/engines/software_16_wince/Makefile src/modules/engines/software_x11/Makefile src/modules/engines/software_xcb/Makefile src/modules/engines/fb/Makefile @@ -1691,6 +1727,7 @@ echo " Glitz X11..................: $have_evas_glitz_x11" echo " Software 16bit ............: $have_evas_software_16" echo " Software 16bit X11.........: $have_evas_software_16_x11" echo " Software 16bit Directdraw..: $have_evas_software_16_ddraw" +echo " Software 16bit WinCE.......: $have_evas_software_16_wince" echo " Software 16bit SDL.........: $have_evas_sdl (primitive: $sdl_primitive)" # FIXME: opengl engine needs to be fixed and tested lots for all drivers # FIXME: xrender engine to be written diff --git a/legacy/evas/evas-software-16-wince.pc.in b/legacy/evas/evas-software-16-wince.pc.in new file mode 100644 index 0000000000..01fad4830a --- /dev/null +++ b/legacy/evas/evas-software-16-wince.pc.in @@ -0,0 +1,3 @@ +Name: evas-software-16-wince +Description: Evas 16bit software WinCE engine +Version: @VERSION@ diff --git a/legacy/evas/src/lib/canvas/evas_main.c b/legacy/evas/src/lib/canvas/evas_main.c index 7313a33aaf..1677b36561 100644 --- a/legacy/evas/src/lib/canvas/evas_main.c +++ b/legacy/evas/src/lib/canvas/evas_main.c @@ -712,6 +712,9 @@ evas_render_method_list(void) #ifdef BUILD_ENGINE_DIRECT3D methods = evas_list_append(methods, strdup("direct3d")); #endif +#ifdef BUILD_ENGINE_SOFTWARE_16_WINCE + methods = evas_list_append(methods, strdup("software_16_wince")); +#endif #ifdef BUILD_ENGINE_SOFTWARE_X11 methods = evas_list_append(methods, strdup("software_x11")); #endif diff --git a/legacy/evas/src/modules/engines/Makefile.am b/legacy/evas/src/modules/engines/Makefile.am index 5d0c7339cd..59df875794 100644 --- a/legacy/evas/src/modules/engines/Makefile.am +++ b/legacy/evas/src/modules/engines/Makefile.am @@ -23,5 +23,6 @@ software_16 \ software_16_x11 \ direct3d \ software_16_ddraw \ +software_16_wince \ software_16_sdl diff --git a/legacy/evas/src/modules/engines/software_16_wince/Evas_Engine_Software_16_WinCE.h b/legacy/evas/src/modules/engines/software_16_wince/Evas_Engine_Software_16_WinCE.h new file mode 100644 index 0000000000..238d68b6f2 --- /dev/null +++ b/legacy/evas/src/modules/engines/software_16_wince/Evas_Engine_Software_16_WinCE.h @@ -0,0 +1,30 @@ +#ifndef __EVAS_ENGINE_SOFTWARE_16_WINCE_H__ +#define __EVAS_ENGINE_SOFTWARE_16_WINCE_H__ + + +#include + + +typedef struct _Evas_Engine_Info_Software_16_WinCE Evas_Engine_Info_Software_16_WinCE; + +struct _Evas_Engine_Info_Software_16_WinCE +{ + /* PRIVATE - don't mess with this baby or evas will poke its tongue out */ + /* at you and make nasty noises */ + Evas_Engine_Info magic; + + struct { + HWND window; + int backend; /* 0: auto, 1: raw, 2: gapi, 3: ddraw */ + int rotation; + } info; + /* engine specific function calls to query stuff about messages */ + struct { + int (*suspend) (int backend); + int (*resume) (int backend); + void *(*default_keys) (int backend); + } func; +}; + + +#endif /* __EVAS_ENGINE_SOFTWARE_16_WINCE_H__ */ diff --git a/legacy/evas/src/modules/engines/software_16_wince/Makefile.am b/legacy/evas/src/modules/engines/software_16_wince/Makefile.am new file mode 100644 index 0000000000..d6f2ed5b42 --- /dev/null +++ b/legacy/evas/src/modules/engines/software_16_wince/Makefile.am @@ -0,0 +1,35 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +-I$(top_srcdir)/src/modules/engines \ +-I$(top_srcdir)/src/modules/engines/software_16 \ +@FREETYPE_CFLAGS@ + +if BUILD_ENGINE_SOFTWARE_16_WINCE + +pkgdir = $(libdir)/evas/modules/engines/software_16_wince/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = \ +evas_engine.h \ +evas_engine.c \ +evas_wince_fb_buffer.c \ +evas_wince_gapi_buffer.c + +module_la_CFLAGS = @WIN32_CFLAGS@ +module_la_LIBADD = $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = @lt_no_undefined@ -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h + +include_HEADERS = Evas_Engine_Software_16_WinCE.h + +install-exec-hook: + mv $(libdir)/evas/modules/engines/software_16_wince/$(MODULE_ARCH)/module.dll $(bindir)/engine_buffer.dll + +endif 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 new file mode 100644 index 0000000000..9e5fa85ac5 --- /dev/null +++ b/legacy/evas/src/modules/engines/software_16_wince/evas_engine.c @@ -0,0 +1,697 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_Software_16_WinCE.h" +#include "evas_common_soft16.h" + + +typedef enum +{ + EVAS_ENGINE_WINCE_FB, + EVAS_ENGINE_WINCE_GAPI, + EVAS_ENGINE_WINCE_DDRAW +} Evas_Engine_WinCE_Backend; + + +/* function tables - filled in later (func and parent func) */ +static Evas_Func func, pfunc; + +/* engine struct data */ +typedef struct _Render_Engine Render_Engine; + +struct _Render_Engine +{ + Evas_Engine_WinCE_Backend backend; /* 1: raw, 2: gapi, 3: ddraw */ + void *backend_priv; + void (*backend_shutdown)(void *priv); + FB_Output_Buffer *(*backend_output_buffer_new)(void *priv, + int width, + int height); + void (*backend_output_buffer_free)(FB_Output_Buffer *fbob); + void (*backend_output_buffer_paste)(FB_Output_Buffer *fbob); + + int width; + int height; + int rotation; + Tilebuf *tb; + Tilebuf_Rect *rects; + Tilebuf_Rect *cur_rect; + FB_Output_Buffer *fbob; + Soft16_Image *tmp_out; /* used by indirect render, like rotation */ + HRGN clip_rects; + unsigned char end : 1; +}; + +/* prototypes we will use here */ + +static void *eng_info(Evas *e); +static void eng_info_free(Evas *e, void *info); +static void eng_setup(Evas *e, void *info); +static void eng_output_free(void *data); +static void eng_output_resize(void *data, int w, int h); +static void eng_output_tile_size_set(void *data, int w, int h); +static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h); +static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h); +static void eng_output_redraws_clear(void *data); +static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch); +static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h); +static void eng_output_flush(void *data); +static void eng_output_idle_flush(void *data); + +static int +_suspend(int backend) +{ + switch (backend) + { + case 2: /* gapi */ + return evas_software_wince_gapi_suspend(); + default: /* other engines do not need it */ + return 0; + } +} + +static int +_resume(int backend) +{ + switch (backend) + { + case 2: /* gapi */ + return evas_software_wince_gapi_resume(); + default: /* other engines do not need it */ + return 0; + } +} + +static void * +_default_keys(int backend) +{ + switch (backend) + { + case 2: /* gapi */ + return evas_software_wince_gapi_default_keys(); + default: /* other engines do not need it */ + return NULL; + } +} + +/* engine api this module provides */ +static void * +eng_info(Evas *e) +{ + Evas_Engine_Info_Software_16_WinCE *info; + + info = calloc(1, sizeof(Evas_Engine_Info_Software_16_WinCE)); + if (!info) return NULL; + info->magic.magic = rand(); + info->func.suspend = _suspend; + info->func.resume = _resume; + info->func.default_keys = _default_keys; + return info; + e = NULL; +} + +static void +eng_info_free(Evas *e, void *info) +{ + Evas_Engine_Info_Software_16_WinCE *in; + + in = (Evas_Engine_Info_Software_16_WinCE *)info; + free(in); +} + +static void +_tmp_out_alloc(Render_Engine *re) +{ + Tilebuf_Rect *r; + int w = 0, h = 0; + + for (r = re->rects; r; r = (Tilebuf_Rect *)(r->_list_data.next)) + { + if (r->w > w) w = r->w; + if (r->h > h) h = r->h; + } + + if (re->tmp_out) + { + if ((re->tmp_out->cache_entry.w < w) || (re->tmp_out->cache_entry.h < h)) + { + evas_cache_image_drop(&re->tmp_out->cache_entry); + re->tmp_out = NULL; + } + } + + if (!re->tmp_out) + { + Soft16_Image *im; + + im = (Soft16_Image *) evas_cache_image_empty(evas_common_soft16_image_cache_get()); + im->flags.have_alpha = 0; + evas_cache_image_surface_alloc(&im->cache_entry, w, h); + + + re->tmp_out = im; + } +} + + +static void +eng_setup(Evas *e, void *in) +{ + Render_Engine *re; + Evas_Engine_Info_Software_16_WinCE *info; + + info = (Evas_Engine_Info_Software_16_WinCE *)in; + if (!e->engine.data.output) + { + /* do common routine init - we wil at least use it for core + * image loading and font loading/glyph rendering & placement */ + evas_common_cpu_init(); + + evas_common_blend_init(); + evas_common_image_init(); + evas_common_convert_init(); + evas_common_scale_init(); + evas_common_rectangle_init(); + evas_common_gradient_init(); + evas_common_polygon_init(); + evas_common_line_init(); + evas_common_font_init(); + evas_common_draw_init(); + evas_common_tilebuf_init(); + evas_common_soft16_image_init(); + + /* render engine specific data */ + re = calloc(1, sizeof(Render_Engine)); + if (!re) + return; + e->engine.data.output = re; + + switch(info->info.backend) + { + case 1: /* FB */ + re->backend = EVAS_ENGINE_WINCE_FB; + re->backend_priv = evas_software_wince_fb_init(info->info.window); + if (!re->backend_priv) + { + free(re); + return; + } + re->backend_shutdown = evas_software_wince_fb_shutdown; + re->backend_output_buffer_new = evas_software_wince_fb_output_buffer_new; + re->backend_output_buffer_free = evas_software_wince_fb_output_buffer_free; + re->backend_output_buffer_paste = evas_software_wince_fb_output_buffer_paste; + break; + case 2: /* GAPI */ + re->backend = EVAS_ENGINE_WINCE_GAPI; + re->backend_priv = evas_software_wince_gapi_init(info->info.window); + if (!re->backend_priv) + { + free(re); + return; + } + re->backend_shutdown = evas_software_wince_gapi_shutdown; + re->backend_output_buffer_new = evas_software_wince_gapi_output_buffer_new; + re->backend_output_buffer_free = evas_software_wince_gapi_output_buffer_free; + re->backend_output_buffer_paste = evas_software_wince_gapi_output_buffer_paste; + break; + default: + free(re); + return; + } + + re->width = e->output.w; + re->height = e->output.h; + re->rotation = info->info.rotation; + re->tb = evas_common_tilebuf_new(e->output.w, e->output.h); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + } + else + { + re = e->engine.data.output; + if (re->tb) evas_common_tilebuf_free(re->tb); + + switch(info->info.backend) + { + case 1: /* FB */ + re->backend = EVAS_ENGINE_WINCE_FB; + re->backend_priv = evas_software_wince_fb_init(info->info.window); + if (!re->backend_priv) + { + free(re); + return; + } + re->backend_shutdown = evas_software_wince_fb_shutdown; + re->backend_output_buffer_new = evas_software_wince_fb_output_buffer_new; + re->backend_output_buffer_free = evas_software_wince_fb_output_buffer_free; + re->backend_output_buffer_paste = evas_software_wince_fb_output_buffer_paste; + break; + case 2: /* GAPI */ + re->backend = EVAS_ENGINE_WINCE_GAPI; + re->backend_priv = evas_software_wince_gapi_init(info->info.window); + if (!re->backend_priv) + { + free(re); + return; + } + re->backend_shutdown = evas_software_wince_gapi_shutdown; + re->backend_output_buffer_new = evas_software_wince_gapi_output_buffer_new; + re->backend_output_buffer_free = evas_software_wince_gapi_output_buffer_free; + re->backend_output_buffer_paste = evas_software_wince_gapi_output_buffer_paste; + break; + default: + free(re); + return; + } + + re->width = e->output.w; + re->height = e->output.h; + re->rotation = info->info.rotation; + re->tb = evas_common_tilebuf_new(e->output.w, e->output.h); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + if (re->tmp_out) + { + evas_cache_image_drop(&re->tmp_out->cache_entry); + re->tmp_out = NULL; + } + } + if (!e->engine.data.output) return; + /* add a draw context if we dont have one */ + if (!e->engine.data.context) + e->engine.data.context = + e->engine.func->context_new(e->engine.data.output); +} + +static void +eng_output_free(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (re->fbob) re->backend_output_buffer_free(re->backend_priv); + re->backend_shutdown(re->backend_priv); + if (re->clip_rects) DeleteObject(re->clip_rects); + if (re->tb) evas_common_tilebuf_free(re->tb); + if (re->rects) evas_common_tilebuf_free_render_rects(re->rects); + if (re->tmp_out) evas_cache_image_drop(&re->tmp_out->cache_entry); + free(re); + + evas_common_font_shutdown(); + evas_common_image_shutdown(); + evas_common_soft16_image_shutdown(); +} + +static void +eng_output_resize(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + + if ((re->width == w) && (re->height == h)) return; + + /* FIXME: is it needed ?? */ + if (re->fbob) + evas_software_wince_fb_surface_resize(re->fbob); + + evas_common_tilebuf_free(re->tb); + re->width = w; + re->height = h; + re->tb = evas_common_tilebuf_new(w, h); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + if (re->fbob) + { + evas_software_wince_fb_output_buffer_free(re->fbob); + re->fbob = NULL; + } + if (re->clip_rects) + { + DeleteObject(re->clip_rects); + re->clip_rects = NULL; + } + if (re->tmp_out) + { + evas_cache_image_drop(&re->tmp_out->cache_entry); + re->tmp_out = NULL; + } +} + +static void +eng_output_tile_size_set(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_set_tile_size(re->tb, w, h); +} + +static void +eng_output_redraws_rect_add(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_add_redraw(re->tb, x, y, w, h); +} + +static void +eng_output_redraws_rect_del(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_del_redraw(re->tb, x, y, w, h); +} + +static void +eng_output_redraws_clear(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_clear(re->tb); +} + +static inline void +_output_buffer_alloc(Render_Engine *re) +{ + int width; + int height; + + if (re->fbob) return; + + if ((re->rotation == 0) || (re->rotation == 180)) + { + width = re->width; + height = re->height; + } + else + { + width = re->height; + height = re->width; + } + + re->fbob = re->backend_output_buffer_new(re->backend_priv, + width, + height); +} + +static void * +eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch) +{ + Render_Engine *re; + Tilebuf_Rect *rect; + int ux, uy, uw, uh; + + re = (Render_Engine *)data; + if (re->end) + { + re->end = 0; + return NULL; + } + if (!re->rects) + { + re->rects = evas_common_tilebuf_get_render_rects(re->tb); + if (!re->rects) return NULL; + + re->cur_rect = re->rects; + _output_buffer_alloc(re); + if (re->rotation != 0) _tmp_out_alloc(re); /* grows if required */ + } + if (!re->cur_rect) + { + if (re->rects) evas_common_tilebuf_free_render_rects(re->rects); + re->rects = NULL; + return NULL; + } + rect = re->cur_rect; + ux = rect->x; uy = rect->y; uw = rect->w; uh = rect->h; + re->cur_rect = (Tilebuf_Rect *)(re->cur_rect->_list_data.next); + if (!re->cur_rect) + { + evas_common_tilebuf_free_render_rects(re->rects); + re->rects = NULL; + re->end = 1; + } + + *x = ux; *y = uy; *w = uw; *h = uh; + if (re->rotation == 0) + { + *cx = ux; *cy = uy; *cw = uw; *ch = uh; + return re->fbob->im; + } + else + { + *cx = 0; *cy = 0; *cw = uw; *ch = uh; + return re->tmp_out; + } +} + +static void +_blit_rot_90(Soft16_Image *dst, const Soft16_Image *src, + int out_x, int out_y, int w, int h) +{ + DATA16 *dp, *sp; + int x, y; + + sp = src->pixels; + dp = dst->pixels + (out_x + + (w + out_y - 1) * dst->stride); + + for (y = 0; y < h; y++) + { + DATA16 *dp_itr, *sp_itr; + + sp_itr = sp; + dp_itr = dp; + + for (x = 0; x < w; x++) + { + *dp_itr = *sp_itr; + + sp_itr++; + dp_itr -= dst->stride; + } + sp += src->stride; + dp++; + } +} + +static void +_blit_rot_180(Soft16_Image *dst, const Soft16_Image *src, + int out_x, int out_y, int w, int h) +{ + DATA16 *dp, *sp; + int x, y; + + sp = src->pixels; + dp = dst->pixels + ((w + out_x - 1) + + (h + out_y - 1) * dst->stride); + + for (y = 0; y < h; y++) + { + DATA16 *dp_itr, *sp_itr; + + sp_itr = sp; + dp_itr = dp; + + for (x = 0; x < w; x++) + { + *dp_itr = *sp_itr; + + sp_itr++; + dp_itr--; + } + sp += src->stride; + dp -= dst->stride; + } +} + +static void +_blit_rot_270(Soft16_Image *dst, const Soft16_Image *src, + int out_x, int out_y, int w, int h) +{ + DATA16 *dp, *sp; + int x, y; + + sp = src->pixels; + dp = dst->pixels + ((h + out_x - 1) + + out_y * dst->stride); + + for (y = 0; y < h; y++) + { + DATA16 *dp_itr, *sp_itr; + + sp_itr = sp; + dp_itr = dp; + + for (x = 0; x < w; x++) + { + *dp_itr = *sp_itr; + + sp_itr++; + dp_itr += dst->stride; + } + sp += src->stride; + dp--; + } +} + +static void +_tmp_out_process(Render_Engine *re, int out_x, int out_y, int w, int h) +{ + Soft16_Image *d, *s; + + d = re->fbob->im; + s = re->tmp_out; + + if ((w < 1) || (h < 1) || (out_x >= d->cache_entry.w) || (out_y >= d->cache_entry.h)) + return; + + if (re->rotation == 90) + _blit_rot_90(d, s, out_x, out_y, w, h); + else if (re->rotation == 180) + _blit_rot_180(d, s, out_x, out_y, w, h); + else if (re->rotation == 270) + _blit_rot_270(d, s, out_x, out_y, w, h); +} + +static void +eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h) +{ + Render_Engine *re; + HRGN region; + int xx; + int yy; + int width; + int height; + + re = (Render_Engine *)data; + + if (!re->clip_rects) + re->clip_rects = CreateRectRgn(0, 0, 0, 0); + + if (re->rotation == 0) + { + xx = x; + yy = y; + width = w; + height = h; + } + else if (re->rotation == 90) + { + xx = y; + yy = re->width - w - x; + width = h; + height = w; + } + else if (re->rotation == 180) + { + xx = re->width - w - x; + yy = re->height - h - y; + width = w; + height = h; + } + else if (re->rotation == 270) + { + xx = re->height - h - y; + yy = x; + width = h; + height = w; + } + + region = CreateRectRgn(xx, yy, xx + width, yy + height); + + if (re->rotation != 0) + _tmp_out_process(re, xx, yy, w, h); + CombineRgn(re->clip_rects, re->clip_rects, region, RGN_OR); +} + +static void +eng_output_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (re->clip_rects) + { + /* FIXME : i have to manage that */ +/* XSetRegion(re->disp, re->gc, re->clip_rects); */ + DeleteObject(re->clip_rects); + re->clip_rects = NULL; + } + else return; + + evas_software_wince_fb_output_buffer_paste(re->fbob); + + /* FIXME : i have to manage that */ +/* XSetClipMask(re->disp, re->gc, None); */ +} + +static void +eng_output_idle_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (re->fbob) + { + evas_software_wince_fb_output_buffer_free(re->fbob); + re->fbob = NULL; + } + if (re->clip_rects) + { + DeleteObject(re->clip_rects); + re->clip_rects = NULL; + } + if (re->tmp_out) + { + evas_cache_image_drop(&re->tmp_out->cache_entry); + re->tmp_out = NULL; + } +} + + +/* module advertising code */ +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + /* get whatever engine module we inherit from */ + if (!_evas_module_engine_inherit(&pfunc, "software_16")) return 0; + /* store it for later use */ + func = pfunc; + /* now to override methods */ +#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_) + ORD(info); + ORD(info_free); + ORD(setup); + ORD(output_free); + ORD(output_resize); + ORD(output_tile_size_set); + ORD(output_redraws_rect_add); + ORD(output_redraws_rect_del); + ORD(output_redraws_clear); + ORD(output_redraws_next_update_get); + ORD(output_redraws_next_update_push); + ORD(output_flush); + ORD(output_idle_flush); + /* now advertise out own api */ + em->functions = (void *)(&func); + return 1; +} + +EAPI void +module_close(void) +{ +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_ENGINE, + "software_16_wince_fb", + "none" +}; 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 new file mode 100644 index 0000000000..dbbc35c2c0 --- /dev/null +++ b/legacy/evas/src/modules/engines/software_16_wince/evas_engine.h @@ -0,0 +1,49 @@ +#ifndef __EVAS_ENGINE_H__ +#define __EVAS_ENGINE_H__ + + +#include + +#include "evas_common_soft16.h" + + +typedef struct _FB_Output_Buffer FB_Output_Buffer; + +struct _FB_Output_Buffer +{ + Soft16_Image *im; + void *priv; +}; + + +/* Raw FrameBuffer */ + +void *evas_software_wince_fb_init (HWND window); +FB_Output_Buffer *evas_software_wince_fb_output_buffer_new (void *priv, + int width, + int height); +void evas_software_wince_fb_shutdown(void *priv); +void evas_software_wince_fb_output_buffer_free (FB_Output_Buffer *fbob); +void evas_software_wince_fb_output_buffer_paste (FB_Output_Buffer *fbob); + +void evas_software_wince_fb_surface_resize(FB_Output_Buffer *fbob); + + +/* GAPI */ + +void *evas_software_wince_gapi_init (HWND window); +FB_Output_Buffer *evas_software_wince_gapi_output_buffer_new (void *priv, + int width, + int height); +void evas_software_wince_gapi_shutdown(void *priv); +void evas_software_wince_gapi_output_buffer_free (FB_Output_Buffer *fbob); +void evas_software_wince_gapi_output_buffer_paste (FB_Output_Buffer *fbob); + +void evas_software_wince_gapi_surface_resize(FB_Output_Buffer *fbob); + +void *evas_software_wince_gapi_default_keys(void); +int evas_software_wince_gapi_suspend(void); +int evas_software_wince_gapi_resume(void); + + +#endif /* __EVAS_ENGINE_H__ */ 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 new file mode 100644 index 0000000000..b569180c83 --- /dev/null +++ b/legacy/evas/src/modules/engines/software_16_wince/evas_wince_fb_buffer.c @@ -0,0 +1,122 @@ +#include "evas_common.h" +#include "evas_engine.h" + + +#define GETRAWFRAMEBUFFER 0x00020001 + +typedef struct _RawFrameBufferInfo +{ + WORD wFormat; + WORD wBPP; + VOID *pFramePointer; + int cxStride; + int cyStride; + int cxPixels; + int cyPixels; +} RawFrameBufferInfo; + + +typedef struct Evas_Engine_WinCE_FB_Priv Evas_Engine_WinCE_FB_Priv; + +struct Evas_Engine_WinCE_FB_Priv +{ + int width; + int height; + void *buffer; +}; + + +void * +evas_software_wince_fb_init (HWND window) +{ + RawFrameBufferInfo rfbi; + HDC dc; + Evas_Engine_WinCE_FB_Priv *priv; + + priv = (Evas_Engine_WinCE_FB_Priv *)malloc(sizeof(Evas_Engine_WinCE_FB_Priv)); + if (!priv) + return NULL; + + dc = GetDC (window); + if (!dc) + { + free(priv); + return NULL; + } + + if (!ExtEscape(dc, GETRAWFRAMEBUFFER, 0, 0, sizeof(rfbi), (char *) &rfbi)|| + (rfbi.wBPP != 16) || + (rfbi.wFormat != 1)) + { + ReleaseDC(window, dc); + free(priv); + return NULL; + } + + priv->width = rfbi.cxPixels; + priv->height = rfbi.cyPixels; + priv->buffer = rfbi.pFramePointer; + + ReleaseDC(window, dc); + + return priv; +} + +void +evas_software_wince_fb_shutdown(void *priv) +{ + free(priv); +} + + +FB_Output_Buffer * +evas_software_wince_fb_output_buffer_new(void *priv, + int width, + int height) +{ + FB_Output_Buffer *fbob; + void *buffer; + + fbob = 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 = width; + + return fbob; +} + +void +evas_software_wince_fb_output_buffer_free(FB_Output_Buffer *fbob) +{ + free(fbob->im->pixels); + free(fbob); +} + +void +evas_software_wince_fb_output_buffer_paste(FB_Output_Buffer *fbob) +{ + Evas_Engine_WinCE_FB_Priv *priv; + + priv = (Evas_Engine_WinCE_FB_Priv *)fbob->priv; + + if ((fbob->im->cache_entry.w == priv->width) && + (fbob->im->cache_entry.h == priv->height)) + memcpy(priv->buffer, fbob->im->pixels, + priv->width * priv->height * 2); +} + +void +evas_software_wince_fb_surface_resize(FB_Output_Buffer *ddob) +{ +} 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 new file mode 100644 index 0000000000..4d07e236e6 --- /dev/null +++ b/legacy/evas/src/modules/engines/software_16_wince/evas_wince_gapi_buffer.c @@ -0,0 +1,278 @@ +#include "evas_common.h" +#include "evas_engine.h" + + +typedef int (*evas_engine_wince_close_display)(); +typedef int (*evas_engine_wince_close_input)(); + +typedef struct Evas_Engine_WinCE_GAPI_Priv Evas_Engine_WinCE_GAPI_Priv; + + +#define LINK(type,name,import) \ + name = (gapi_##type)GetProcAddress (gapi_lib, import) + +#define GX_FULLSCREEN 0x01 +#define GX_NORMALKEYS 0x02 + +#define kfDirect555 0x40 +#define kfDirect565 0x80 + + +typedef struct +{ + DWORD cxWidth; + DWORD cyHeight; + LONG cbxPitch; + LONG cbyPitch; + LONG cBPP; + DWORD ffFormat; +} _GAPI_Display_Properties; + +typedef struct +{ + short vkUp; // key for up + POINT ptUp; // x,y position of key/button. Not on screen but in screen coordinates. + short vkDown; + POINT ptDown; + short vkLeft; + POINT ptLeft; + short vkRight; + POINT ptRight; + short vkA; + POINT ptA; + short vkB; + POINT ptB; + short vkC; + POINT ptC; + short vkStart; + POINT ptStart; +} _GAPI_Key_List; + +typedef int (*gapi_display_open)(HWND hWnd, DWORD dwFlags); +typedef int (*gapi_display_close)(); +typedef _GAPI_Display_Properties (*gapi_display_properties_get)(void); +typedef void* (*gapi_draw_begin)(void); +typedef int (*gapi_draw_end)(void); +typedef int (*gapi_input_open)(void); +typedef int (*gapi_input_close)(void); +typedef _GAPI_Key_List (*gapi_default_keys_get)(int iOptions); +typedef int (*gapi_suspend)(void); +typedef int (*gapi_resume)(void); + +gapi_default_keys_get default_keys_get = NULL; +gapi_suspend suspend = NULL; +gapi_resume resume = NULL; + +int +evas_software_wince_gapi_suspend(void) +{ + return suspend(); +} + +int +evas_software_wince_gapi_resume(void) +{ + return resume(); +} + +void * +evas_software_wince_gapi_default_keys(void) +{ + _GAPI_Key_List key_list; + _GAPI_Key_List *keys; + + keys = (_GAPI_Key_List *)malloc(sizeof(_GAPI_Key_List)); + if (!keys) + return NULL; + + key_list = default_keys_get(GX_NORMALKEYS); + memcpy(keys, &key_list, sizeof(_GAPI_Key_List)); + + return keys; +} + + +struct Evas_Engine_WinCE_GAPI_Priv +{ + HMODULE lib; + gapi_display_close close_display; + gapi_input_close close_input; + gapi_draw_begin draw_begin; + gapi_draw_end draw_end; + int width; + int height; +}; + +void * +evas_software_wince_gapi_init (HWND window) +{ + _GAPI_Display_Properties prop; + _GAPI_Key_List key_list; + HMODULE gapi_lib; + Evas_Engine_WinCE_GAPI_Priv *priv; + + gapi_display_open display_open = NULL; + gapi_display_close display_close = NULL; + gapi_display_properties_get display_properties_get = NULL; + gapi_draw_begin draw_begin = NULL; + gapi_draw_end draw_end = NULL; + gapi_input_open input_open = NULL; + gapi_input_close input_close = NULL; + + priv = (Evas_Engine_WinCE_GAPI_Priv *)malloc(sizeof(Evas_Engine_WinCE_GAPI_Priv)); + if (!priv) + return NULL; + + gapi_lib = LoadLibrary(L"\\Windows\\gx.dll"); + if (!gapi_lib) + { + gapi_lib = LoadLibrary(L"gx.dll"); + if (!gapi_lib) { + printf ("error : LoadLibrary\n"); + goto free_priv; + } + } + + LINK(display_open, display_open, L"?GXOpenDisplay@@YAHPAUHWND__@@K@Z"); + LINK(display_close, display_close, L"?GXCloseDisplay@@YAHXZ"); + LINK(display_properties_get, display_properties_get, L"?GXGetDisplayProperties@@YA?AUGXDisplayProperties@@XZ"); + LINK(draw_begin, draw_begin, L"?GXBeginDraw@@YAPAXXZ"); + LINK(draw_end, draw_end, L"?GXEndDraw@@YAHXZ"); + LINK(input_open, input_open, L"?GXOpenInput@@YAHXZ" ); + LINK(input_close, input_close, L"?GXCloseInput@@YAHXZ" ); + LINK(default_keys_get, default_keys_get, L"?GXGetDefaultKeys@@YA?AUGXKeyList@@H@Z"); + LINK(suspend, suspend, L"?GXSuspend@@YAHXZ" ); + LINK(resume, resume, L"?GXResume@@YAHXZ" ); + + if (!display_open || + !display_close || + !display_properties_get || + !draw_begin || + !draw_end || + !input_open || + !input_close || + !default_keys_get || + !suspend || + !resume) + { + printf ("error : no valid symbols\n"); + goto free_lib; + } + + if (!display_open(window, GX_FULLSCREEN)) + { + printf ("error : GXOpenDisplay\n"); + goto free_lib; + } + + prop = display_properties_get(); + + // verify pixel format + if(!(prop.ffFormat & kfDirect565) || (prop.cBPP != 16)) + { + printf ("error : GAPI format mismatch\n"); + goto close_display; + } + + // verify we have a vga device + if ((GetSystemMetrics(SM_CXSCREEN) != (int)prop.cxWidth) || + (GetSystemMetrics(SM_CYSCREEN) != (int)prop.cyHeight)) + { + printf ("error : GAPI format mismatch\n"); + goto close_display; + } + + if (!input_open()) + { + printf ("error : GXOpenInput\n"); + goto close_display; + } + + priv->lib = gapi_lib; + priv->close_display = display_close; + priv->close_input = input_close; + priv->draw_begin = draw_begin; + priv->draw_end = draw_end; + priv->width = prop.cxWidth; + priv->height = prop.cyHeight; + + return priv; + + close_display: + display_close(); + free_lib: + FreeLibrary(gapi_lib); + free_priv: + free(priv); + return NULL; +} + +void +evas_software_wince_gapi_shutdown(void *priv) +{ + Evas_Engine_WinCE_GAPI_Priv *p; + + p = (Evas_Engine_WinCE_GAPI_Priv *)priv; + p->close_input(); + p->close_display(); + FreeLibrary(p->lib); + free(p); +} + + +FB_Output_Buffer * +evas_software_wince_gapi_output_buffer_new(void *priv, + int width, + int height) +{ + FB_Output_Buffer *fbob; + void *buffer; + + fbob = 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 = width; + + return fbob; +} + +void +evas_software_wince_gapi_output_buffer_free(FB_Output_Buffer *fbob) +{ + free(fbob->im->pixels); + free(fbob); +} + +void +evas_software_wince_gapi_output_buffer_paste(FB_Output_Buffer *fbob) +{ + Evas_Engine_WinCE_GAPI_Priv *priv; + void *buffer; + + priv = (Evas_Engine_WinCE_GAPI_Priv *)fbob->priv; + + buffer = priv->draw_begin(); + + if ((fbob->im->cache_entry.w == priv->width) && + (fbob->im->cache_entry.h == priv->height)) + memcpy(buffer, fbob->im->pixels, + priv->width * priv->height * 2); + + priv->draw_end(); +} + +void +evas_software_wince_gapi_surface_resize(FB_Output_Buffer *ddob) +{ +}