From 6c2924e3464743dfae37710a2fcac202a612b2f2 Mon Sep 17 00:00:00 2001 From: doursse Date: Mon, 8 Oct 2007 19:24:22 +0000 Subject: [PATCH] add 16bits software directdraw engine SVN revision: 32021 --- configure.in | 29 ++- src/bin/Makefile.am | 3 +- src/bin/engine_software_16_ddraw.c | 391 +++++++++++++++++++++++++++++ src/bin/engine_software_16_ddraw.h | 9 + src/bin/main.c | 4 +- src/bin/main.h | 3 +- 6 files changed, 427 insertions(+), 12 deletions(-) create mode 100644 src/bin/engine_software_16_ddraw.c create mode 100644 src/bin/engine_software_16_ddraw.h diff --git a/configure.in b/configure.in index 353b911..bef57d1 100644 --- a/configure.in +++ b/configure.in @@ -99,6 +99,15 @@ AC_CHECK_HEADER(Evas_Engine_Software_DDraw.h, [ #include ] ) +have_ddraw_16="no" +AC_CHECK_HEADER(Evas_Engine_Software_16_DDraw.h, + [ AC_DEFINE(HAVE_SOFTWARE_DDRAW, 1, [Evas 16bit Software DirectDraw Engine Support]) + have_ddraw_16="yes" + ddraw_16_libs="-lddraw -ldxguid" ], + [ dummy=no ], + [ #include ] +) + have_d3d="no" AC_CHECK_HEADER(Evas_Engine_Direct3D.h, [ AC_DEFINE(HAVE_DIRECT3D, 1, [Evas Direct3D Engine Support]) @@ -118,6 +127,7 @@ fi AC_SUBST(x_cflags) AC_SUBST(x_libs) AC_SUBST(ddraw_libs) +AC_SUBST(ddraw_16_libs) AC_SUBST(d3d_libs) AC_SUBST(glew_libs) @@ -161,15 +171,16 @@ echo echo " $PACKAGE $VERSION" echo echo " Engines:" -echo " Software Xlib...........: ${have_xlib}" -echo " Software Xlib 16 bits...: ${have_xlib_16}" -echo " X Render Xlib...........: ${have_xlib_render}" -echo " Open GL Glew............: ${have_glew_opengl}" -echo " Open GL Xlib............: ${have_xlib_opengl}" -echo " Software DirectDraw.....: ${have_ddraw}" -echo " Direct3D................: ${have_d3d}" -echo " Software SDL............: ${have_sdl}" +echo " Software Xlib................: ${have_xlib}" +echo " Software Xlib 16 bits........: ${have_xlib_16}" +echo " X Render Xlib................: ${have_xlib_render}" +echo " Open GL Glew.................: ${have_glew_opengl}" +echo " Open GL Xlib.................: ${have_xlib_opengl}" +echo " Software DirectDraw..........: ${have_ddraw}" +echo " Software DirectDraw 16 bits..: ${have_ddraw}" +echo " Direct3D.....................: ${have_d3d}" +echo " Software SDL.................: ${have_sdl}" echo echo " Installation:" -echo " prefix..................: ${prefix}" +echo " prefix.......................: ${prefix}" echo diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am index cc8a4c3..026da07 100644 --- a/src/bin/Makefile.am +++ b/src/bin/Makefile.am @@ -17,6 +17,7 @@ engine_gl_x11.c engine_gl_x11.h \ engine_xrender_x11.c engine_xrender_x11.h \ engine_software_16_x11.c engine_software_16_x11.h \ engine_software_ddraw.c engine_software_ddraw.h \ +engine_software_16_ddraw.c engine_software_16_ddraw.h \ engine_direct3d.cpp engine_direct3d.h \ engine_software_sdl.c engine_software_sdl.h \ ui.c ui.h \ @@ -61,4 +62,4 @@ image_blend_occlude2_very_many.c \ image_blend_occlude3_very_many.c \ poly_blend.c -expedite_LDFLAGS = @EVAS_LIBS@ @sdl_libs@ @x_libs@ @ddraw_libs@ @d3d_libs@ @glew_libs@ -lm +expedite_LDFLAGS = @EVAS_LIBS@ @sdl_libs@ @x_libs@ @ddraw_libs@ @ddraw_16_libs@ @d3d_libs@ @glew_libs@ -lm diff --git a/src/bin/engine_software_16_ddraw.c b/src/bin/engine_software_16_ddraw.c new file mode 100644 index 0000000..220e565 --- /dev/null +++ b/src/bin/engine_software_16_ddraw.c @@ -0,0 +1,391 @@ +#include "main.h" + + +#ifndef HAVE_SOFTWARE_DDRAW +int +engine_software_ddraw_args(int argc, char **argv) +{ + fprintf(stderr, "ERROR: No 16bits Software DirectDraw Engine built\n"); + return 0; +} + +void +engine_software_ddraw_loop(void) +{ +} +#else +#include +#include +#include +#include + + +static HWND window; + +static int +_directdraw_init (HWND window, + int width, + int height, + LPDIRECTDRAW *object, + LPDIRECTDRAWSURFACE *surface_primary, + LPDIRECTDRAWSURFACE *surface_back, + LPDIRECTDRAWSURFACE *surface_source, + int *depth) +{ + DDSURFACEDESC2 surface_desc; + DDPIXELFORMAT pixel_format; + LPDIRECTDRAW o; + DDSURFACEDESC2 *sd; + void *source; + HRESULT res; + + res = DirectDrawCreateEx (NULL, (void **)&o, &IID_IDirectDraw7, NULL); + if (FAILED(res)) + return 0; + + res = IDirectDraw7_SetCooperativeLevel (o, window, DDSCL_NORMAL); + if (FAILED(res)) + { + IDirectDraw7_Release (o); + return 0; + } + + memset(&surface_desc, 0, sizeof(surface_desc)); + surface_desc.dwSize = sizeof(surface_desc); + surface_desc.dwFlags = DDSD_CAPS; + surface_desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; + + sd=&surface_desc; + res = IDirectDraw7_CreateSurface (o, (DDSURFACEDESC *)sd, + surface_primary, NULL); + if (FAILED(res)) + { + IDirectDraw7_Release (o); + return 0; + } + + memset (&surface_desc, 0, sizeof(surface_desc)); + surface_desc.dwSize = sizeof(surface_desc); + surface_desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; + surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; + surface_desc.dwWidth = width; + surface_desc.dwHeight = height; + + sd=&surface_desc; + res = IDirectDraw7_CreateSurface (o, (DDSURFACEDESC *)sd, + surface_back, NULL); + if (FAILED(res)) + { + IDirectDrawSurface7_Release (*surface_primary); + IDirectDraw7_Release (o); + return 0; + } + + ZeroMemory(&pixel_format, sizeof(pixel_format)); + pixel_format.dwSize = sizeof(pixel_format); + IDirectDrawSurface7_GetPixelFormat(*surface_primary, &pixel_format); + + *object = o; + *depth = pixel_format.dwRGBBitCount; + + source = malloc(width * height * 2); + if (!source) + { + IDirectDrawSurface7_Release (*surface_primary); + IDirectDraw7_Release (o); + return 0; + } + + memset (&surface_desc, 0, sizeof (surface_desc)); + surface_desc.dwSize = sizeof (surface_desc); + surface_desc.dwFlags = + DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | + DDSD_LPSURFACE | DDSD_PITCH | DDSD_PIXELFORMAT; + surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY; + surface_desc.dwWidth = width; + surface_desc.dwHeight = height; + surface_desc.lPitch = 2 * surface_desc.dwWidth; + surface_desc.lpSurface = source; + + surface_desc.ddpfPixelFormat = pixel_format; + + /* Hack to cleanly remove a warning */ + sd = &surface_desc; + if (FAILED(IDirectDraw7_CreateSurface(*object, + (DDSURFACEDESC *)sd, + surface_source, + NULL))) + { + free(source); + IDirectDrawSurface7_Release (*surface_primary); + IDirectDraw7_Release (o); + return 0; + } + + return 1; +} + +static LRESULT CALLBACK +MainWndProc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + switch (uMsg) + { + case WM_CREATE: + return 0; + case WM_DESTROY: + PostQuitMessage(0); + return 0; + case WM_CLOSE: + PostQuitMessage(0); + return 0; + case WM_WINDOWPOSCHANGED: { + PAINTSTRUCT ps; + HDC hdc; + + hdc = BeginPaint (window, &ps); + evas_damage_rectangle_add(evas, + ps.rcPaint.left, ps.rcPaint.top, + ps.rcPaint.right - ps.rcPaint.left, + ps.rcPaint.bottom - ps.rcPaint.top); + EndPaint(window, &ps); + return 0; + } + case WM_SIZING: + { + PRECT rect = (PRECT)lParam; + + evas_output_size_set(evas, + rect->right - rect->left, + rect->bottom - rect->top); + return 0; + } + case WM_RBUTTONDOWN: + evas_event_feed_mouse_move(evas, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), 0, NULL); + evas_event_feed_mouse_down(evas, 3, EVAS_BUTTON_NONE, 0, NULL); + return 0; + case WM_LBUTTONDOWN: + evas_event_feed_mouse_move(evas, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), 0, NULL); + evas_event_feed_mouse_down(evas, 1, EVAS_BUTTON_NONE, 0, NULL); + return 0; + case WM_LBUTTONUP: + evas_event_feed_mouse_move(evas, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), 0, NULL); + evas_event_feed_mouse_up(evas, 1, EVAS_BUTTON_NONE, 0, NULL); + return 0; + case WM_RBUTTONUP: + evas_event_feed_mouse_move(evas, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), 0, NULL); + evas_event_feed_mouse_up(evas, 3, EVAS_BUTTON_NONE, 0, NULL); + return 0; + case WM_MOUSEMOVE: + if (!evas_pointer_inside_get(evas)) evas_event_feed_mouse_in(evas, 0, NULL); + evas_event_feed_mouse_move(evas, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), 0, NULL); + return 0; + case WM_MOUSELEAVE: + evas_event_feed_mouse_out(evas, 0, NULL); + return 0; + /* FIXME : can't find an event when the mouse is entering */ + case WM_KEYDOWN: + case WM_SYSKEYDOWN: { + int key; + + key = LOWORD(wParam); + + if ((key == VK_SHIFT) || + (key == VK_LSHIFT) || + (key == VK_RSHIFT)) + evas_key_modifier_on(evas, "Shift"); + if ((key == VK_CONTROL) || + (key == VK_LCONTROL) || + (key == VK_RCONTROL)) + evas_key_modifier_on(evas, "Control"); + if ((key == VK_MENU) || + (key == VK_LMENU) || + (key == VK_RMENU)) + evas_key_modifier_on(evas, "Alt"); + if ((key == VK_LWIN) || + (key == VK_RWIN)) + evas_key_modifier_on(evas, "Super"); + + if (key == VK_CAPITAL) + { + if (evas_key_lock_is_set(evas_key_lock_get(evas), "Caps_Lock")) + evas_key_lock_off(evas, "Caps_Lock"); + else + evas_key_lock_on(evas, "Caps_Lock"); + } + if (key == VK_NUMLOCK) + { + if (evas_key_lock_is_set(evas_key_lock_get(evas), "Num_Lock")) + evas_key_lock_off(evas, "Num_Lock"); + else + evas_key_lock_on(evas, "Num_Lock"); + } + if (key == VK_SCROLL) + { + if (evas_key_lock_is_set(evas_key_lock_get(evas), "Scroll_Lock")) + evas_key_lock_off(evas, "Scroll_Lock"); + else + evas_key_lock_on(evas, "Scroll_Lock"); + } + if (key == VK_ESCAPE) + evas_event_feed_key_down(evas, "Escape", "Escape", NULL, NULL, 0, NULL); + if (key == VK_RETURN) + evas_event_feed_key_down(evas, "Return", "Return", NULL, NULL, 0, NULL); + if (key == VK_LEFT) + evas_event_feed_key_down(evas, "Left", "Left", NULL, NULL, 0, NULL); + if (key == VK_RIGHT) + evas_event_feed_key_down(evas, "Right", "Right", NULL, NULL, 0, NULL); + if (key == 81) + evas_event_feed_key_down(evas, "Q", "Q", NULL, NULL, 0, NULL); + if (key == 113) + evas_event_feed_key_down(evas, "q", "q", NULL, NULL, 0, NULL); + return 0; + } + case WM_KEYUP: + case WM_SYSKEYUP: { + int key; + + key = LOWORD(wParam); + + if ((key == VK_SHIFT) || + (key == VK_LSHIFT) || + (key == VK_RSHIFT)) + evas_key_modifier_off(evas, "Shift"); + if ((key == VK_CONTROL) || + (key == VK_LCONTROL) || + (key == VK_RCONTROL)) + evas_key_modifier_off(evas, "Control"); + if ((key == VK_MENU) || + (key == VK_LMENU) || + (key == VK_RMENU)) + evas_key_modifier_off(evas, "Alt"); + if ((key == VK_LWIN) || + (key == VK_RWIN)) + evas_key_modifier_off(evas, "Super"); + if (key == VK_ESCAPE) + evas_event_feed_key_up(evas, "Escape", "Escape", NULL, NULL, 0, NULL); + if (key == VK_RETURN) + evas_event_feed_key_up(evas, "Return", "Return", NULL, NULL, 0, NULL); + if (key == VK_LEFT) + evas_event_feed_key_up(evas, "Left", "Left", NULL, NULL, 0, NULL); + if (key == VK_RIGHT) + evas_event_feed_key_up(evas, "Right", "Right", NULL, NULL, 0, NULL); + if (key == 81) + evas_event_feed_key_up(evas, "Q", "Q", NULL, NULL, 0, NULL); + if (key == 113) + evas_event_feed_key_up(evas, "q", "q", NULL, NULL, 0, NULL); + return 0; + } + default: + return DefWindowProc(hwnd, uMsg, wParam, lParam); + } +} + +int +engine_software_16_ddraw_args(int argc, char **argv) +{ + WNDCLASS wc; + RECT rect; + HINSTANCE hinstance; + MSG msg; + LPDIRECTDRAW object; + LPDIRECTDRAWSURFACE surface_primary; + LPDIRECTDRAWSURFACE surface_back; + LPDIRECTDRAWSURFACE surface_source; + Evas_Engine_Info_Software_16_DDraw *einfo; + int depth; + int i; + int ok = 0; + + for (i = 1; i < argc; i++) + { + if ((!strcmp(argv[i], "-e")) && (i < (argc - 1))) + { + i++; + if (!strcmp(argv[i], "ddraw-16")) ok = 1; + } + } + if (!ok) return 0; + + hinstance = GetModuleHandle(0); + + wc.style = 0; + wc.lpfnWndProc = MainWndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = hinstance; + wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); + wc.hCursor = LoadCursor (NULL, IDC_ARROW); + wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE); + wc.lpszMenuName = NULL; + wc.lpszClassName = "Evas_Software_16_DDraw_Test"; + + if(!RegisterClass(&wc)) return EXIT_FAILURE; + + rect.left = 0; + rect.top = 0; + rect.right = win_w; + rect.bottom = win_h; + AdjustWindowRect (&rect, WS_OVERLAPPEDWINDOW | WS_SIZEBOX, FALSE); + + window = CreateWindowEx(0, + "Evas_Software_16_DDraw_Test", + "Evas_Software_16_DDraw_Test", + WS_OVERLAPPEDWINDOW | WS_SIZEBOX, + CW_USEDEFAULT, CW_USEDEFAULT, + rect.right - rect.left, rect.bottom - rect.top, + NULL, NULL, hinstance, NULL); + if (!window) return EXIT_FAILURE; + + if (!_directdraw_init(window, win_w, win_h, + &object, + &surface_primary, + &surface_back, + &surface_source, + &depth)) + return 0; + + evas_output_method_set(evas, evas_render_method_lookup("software_16_ddraw")); + einfo = (Evas_Engine_Info_Software_16_DDraw *)evas_engine_info_get(evas); + if (!einfo) + { + printf("Evas does not support the 16bit Software DirectDraw Engine\n"); + return 0; + } + + einfo->info.window = window; + einfo->info.object = object; + einfo->info.surface_primary = surface_primary; + einfo->info.surface_back = surface_back; + einfo->info.surface_source = surface_source; + einfo->info.depth = depth; + einfo->info.rotation = 0; + evas_engine_info_set(evas, (Evas_Engine_Info *) einfo); + + /* the second parameter is ignored, as it's the first call of ShowWindow */ + ShowWindow(window, SW_SHOWDEFAULT); + UpdateWindow(window); + + return 1; +} + +void +engine_software_16_ddraw_loop(void) +{ + MSG msg; + int res; + + again: + if (!PeekMessage (&msg, window, 0, 0, PM_NOREMOVE)) + return; + + res = GetMessage (&msg, NULL, 0, 0); + TranslateMessage (&msg); + DispatchMessage (&msg); + + goto again; +} + +#endif /* HAVE_SOFTWARE_DDRAW */ diff --git a/src/bin/engine_software_16_ddraw.h b/src/bin/engine_software_16_ddraw.h new file mode 100644 index 0000000..9e3db78 --- /dev/null +++ b/src/bin/engine_software_16_ddraw.h @@ -0,0 +1,9 @@ +#ifndef __ENGINE_SOFTWARE_16_DDRAW_H__ +#define __ENGINE_SOFTWARE_16_DDRAW_H__ + + +int engine_software_16_ddraw_args(int argc, char **argv); +void engine_software_16_ddraw_loop(void); + + +#endif /* __ENGINE_SOFTWARE_16_DDRAW_H__ */ diff --git a/src/bin/main.c b/src/bin/main.c index 8dba455..c06e47b 100644 --- a/src/bin/main.c +++ b/src/bin/main.c @@ -1147,6 +1147,8 @@ _engine_args(int argc, char **argv) loop_func = engine_software_16_x11_loop; if (engine_software_ddraw_args(argc, argv)) loop_func = engine_software_ddraw_loop; + if (engine_software_16_ddraw_args(argc, argv)) + loop_func = engine_software_16_ddraw_loop; if (engine_software_sdl_args(argc, argv)) loop_func = engine_software_sdl_loop; if (engine_direct3d_args(argc, argv)) @@ -1161,7 +1163,7 @@ _engine_args(int argc, char **argv) " -p PROFILE\n" "\n" "Where ENGINE can be one of:\n" - " x11 xr gl-glew gl x11-16 ddraw direct3d sdl\n" + " x11 xr gl-glew gl x11-16 ddraw ddraw-16 direct3d sdl\n" "Where PROFILE can be one of:\n" " qvga qvga-p vga vga-p wvga wvga-p svga svga-p xga xga-p wxga wxga-p\n" " n800\n" diff --git a/src/bin/main.h b/src/bin/main.h index 55de5f5..024710a 100644 --- a/src/bin/main.h +++ b/src/bin/main.h @@ -20,8 +20,9 @@ #include "engine_xrender_x11.h" #include "engine_software_16_x11.h" #include "engine_software_ddraw.h" -#include "engine_software_sdl.h" +#include "engine_software_16_ddraw.h" #include "engine_direct3d.h" +#include "engine_software_sdl.h" #include "ui.h" #include "about.h"