remove the explicit use of the DirectDraw interface by using the c++ API

SVN revision: 34153
This commit is contained in:
doursse 2008-03-30 16:06:21 +00:00 committed by doursse
parent ebd938e4b1
commit 3ba03eab45
4 changed files with 45 additions and 47 deletions

View File

@ -18,8 +18,8 @@ pkg_LTLIBRARIES = module.la
module_la_SOURCES = \
evas_engine.h \
evas_engine.c \
evas_ddraw_buffer.c \
evas_ddraw_main.c
evas_ddraw_buffer.cpp \
evas_ddraw_main.cpp
module_la_LIBADD = @ddraw_16_libs@ $(top_builddir)/src/lib/libevas.la
module_la_LDFLAGS = @create_shared_lib@ -module -avoid-version
@ -33,6 +33,6 @@ endif
EXTRA_DIST = \
evas_engine.h \
evas_engine.c \
evas_ddraw_buffer.c \
evas_ddraw_main.c \
evas_ddraw_buffer.cpp \
evas_ddraw_main.cpp \
Evas_Engine_Software_16_DDraw.h

View File

@ -11,10 +11,10 @@ evas_software_ddraw_output_buffer_new(HWND window,
int width,
int height)
{
DDSURFACEDESC2 surface_desc;
DDSURFACEDESC surface_desc;
DDraw_Output_Buffer *ddob;
ddob = calloc(1, sizeof(DDraw_Output_Buffer));
ddob = (DDraw_Output_Buffer *)calloc(1, sizeof(DDraw_Output_Buffer));
if (!ddob) return NULL;
ddob->dd.window = window;
@ -29,22 +29,22 @@ evas_software_ddraw_output_buffer_new(HWND window,
ZeroMemory(&surface_desc, sizeof(surface_desc));
surface_desc.dwSize = sizeof(surface_desc);
if (FAILED(IDirectDrawSurface7_Lock(ddob->dd.surface_source, NULL,
&surface_desc,
DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR,
NULL)))
if (FAILED(ddob->dd.surface_source->Lock(NULL,
&surface_desc,
DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR,
NULL)))
{
free(ddob);
return NULL;
}
ddob->im.pixels = surface_desc.lpSurface;
ddob->im.pixels = (DATA16 *)surface_desc.lpSurface;
ddob->im.w = width;
ddob->im.h = height;
ddob->im.stride = width;
ddob->im.references = 1;
if (FAILED(IDirectDrawSurface7_Unlock(ddob->dd.surface_source, NULL)))
if (FAILED(ddob->dd.surface_source->Unlock(NULL)))
{
free(ddob);
return NULL;
@ -62,17 +62,16 @@ evas_software_ddraw_output_buffer_free(DDraw_Output_Buffer *ddob, int sync)
void
evas_software_ddraw_output_buffer_paste(DDraw_Output_Buffer *ddob)
{
RECT dst_rect;
RECT src_rect;
POINT p;
RECT dst_rect;
RECT src_rect;
POINT p;
SetRect(&src_rect, 0, 0, ddob->width, ddob->height);
if (FAILED(IDirectDrawSurface7_BltFast(ddob->dd.surface_back,
0, 0,
ddob->dd.surface_source,
&src_rect,
DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT)))
if (FAILED(ddob->dd.surface_back->BltFast(0, 0,
ddob->dd.surface_source,
&src_rect,
DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT)))
return;
p.x = 0;
@ -80,7 +79,7 @@ evas_software_ddraw_output_buffer_paste(DDraw_Output_Buffer *ddob)
ClientToScreen(ddob->dd.window, &p);
GetClientRect(ddob->dd.window, &dst_rect);
OffsetRect(&dst_rect, p.x, p.y);
IDirectDrawSurface7_Blt(ddob->dd.surface_primary, &dst_rect,
ddob->dd.surface_back, &src_rect,
DDBLT_WAIT, NULL);
ddob->dd.surface_primary->Blt(&dst_rect,
ddob->dd.surface_back, &src_rect,
DDBLT_WAIT, NULL);
}

View File

@ -4,17 +4,15 @@
void *
evas_software_ddraw_lock(DDraw_Output_Buffer *ddob, int *ddraw_width, int *ddraw_height, int *ddraw_pitch, int *ddraw_depth)
{
DDSURFACEDESC2 surface_desc;
DDSURFACEDESC *sd;
DDSURFACEDESC surface_desc;
ZeroMemory(&surface_desc, sizeof(surface_desc));
surface_desc.dwSize = sizeof(surface_desc);
sd = (DDSURFACEDESC *)&surface_desc;
if (FAILED(IDirectDrawSurface7_Lock(ddob->dd.surface_back, NULL,
sd,
DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR,
NULL)))
if (FAILED(ddob->dd.surface_back->Lock(NULL,
&surface_desc,
DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR | DDLOCK_WRITEONLY,
NULL)))
return NULL;
*ddraw_width = surface_desc.dwWidth;
@ -32,7 +30,7 @@ evas_software_ddraw_unlock_and_flip(DDraw_Output_Buffer *ddob)
RECT src_rect;
POINT p;
if (FAILED(IDirectDrawSurface7_Unlock(ddob->dd.surface_back, NULL)))
if (FAILED(ddob->dd.surface_back->Unlock(NULL)))
return;
/* we figure out where on the primary surface our window lives */
@ -44,22 +42,17 @@ evas_software_ddraw_unlock_and_flip(DDraw_Output_Buffer *ddob)
SetRect(&src_rect, 0, 0, ddob->width, ddob->height);
/* nothing to do if the function fails, so we don't check the result */
IDirectDrawSurface7_BltFast(ddob->dd.surface_primary, 0, 0,
ddob->dd.surface_back, &dst_rect,
DDBLTFAST_WAIT || DDBLTFAST_NOCOLORKEY);
ddob->dd.surface_primary->BltFast(0, 0,
ddob->dd.surface_back, &dst_rect,
DDBLTFAST_WAIT || DDBLTFAST_NOCOLORKEY);
}
void
evas_software_ddraw_surface_resize(DDraw_Output_Buffer *ddob)
{
DDSURFACEDESC2 surface_desc;
DDSURFACEDESC2 *sd;
DDSURFACEDESC surface_desc;
if (!ddob)
printf (" AIE AIE pas de ddob\n");
if (!ddob->dd.surface_back)
printf (" AIE AIE pas de surface_back\n");
IDirectDrawSurface7_Release(ddob->dd.surface_back);
ddob->dd.surface_back->Release();
memset (&surface_desc, 0, sizeof (surface_desc));
surface_desc.dwSize = sizeof (surface_desc);
/* FIXME: that code does not compile. Must know why */
@ -73,11 +66,6 @@ evas_software_ddraw_surface_resize(DDraw_Output_Buffer *ddob)
surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
surface_desc.dwWidth = ddob->width;
surface_desc.dwHeight = ddob->height;
/* Hack to cleanly remove a warning */
sd = &surface_desc;
IDirectDraw7_CreateSurface(ddob->dd.object,
(DDSURFACEDESC *)sd,
&ddob->dd.surface_back,
NULL);
ddob->dd.object->CreateSurface(&surface_desc, &ddob->dd.surface_back, NULL);
#endif
}

View File

@ -28,6 +28,12 @@ struct _DDraw_Output_Buffer
};
/****/
#ifdef __cplusplus
extern "C" {
#endif
DDraw_Output_Buffer *evas_software_ddraw_output_buffer_new (HWND window,
LPDIRECTDRAW object,
LPDIRECTDRAWSURFACE surface_primary,
@ -45,4 +51,9 @@ void evas_software_ddraw_unlock_and_flip(DDraw_Output_Buffer *ddob);
void evas_software_ddraw_surface_resize(DDraw_Output_Buffer *ddob);
#ifdef __cplusplus
}
#endif
#endif /* __EVAS_ENGINE_H__ */