Release 980726
Sat Jul 25 19:45:45 1998 Juergen Schmied <juergen.schmied@metronet.de>
* [include/shlobj.h][misc/shell.c][misc/shellord.c][ole/folders.c]
[shell32.spec]
Added SHFILEOPSTRUCT32[A|W] and constants, prototypes.
Implemented SHGetSpecialFolderLocation, SHGetPathFromIDList32[A].
Many IShellFolder, pidl, shell -related changes.
SHChangeNotifyRegister, SHChangeNotifyDeregister,
SHShellFolderView_Message, SHMapPIDLToSystemImageListIndex,
SHAddToRecentDocs32, SHFileOperation, SHChangeNotify,
SHCreateShellFolderViewEx stubs.
Sat Jul 25 17:16:25 1998 Huw D M Davies <daviesh@abacus.physics.ox.ac.uk>
* [files/profile.c]
Fix return value of PROFILE_GetSection().
Fri Jul 24 22:45:19 1998 Ove Kaaven <ovek@isflak.arcticnet.no>
* [controls/edit.c]
Killed the modified flag on WM_SETTEXT. Eudora should no longer
bother asking whether you want to save an unchanged message.
Fri Jul 24 21:21:35 1998 Andreas Mohr <100.30936@germany.net>
* [controls/menu.c]
Fixed bug in GetMenuState32.
Doesn't fix Free Agent 32 :((
* [documentation/debugging]
Hints added.
* [files/dos_fs.c] [include/msdos.h] [msdos/int21.c]
Enhanced DOS device support.
* [if1632/Makefile.in] [if1632/builtin.c] [if1632/rasapi16.spec]
[relay32/Makefile.in] [relay32/builtin32.c] [relay32/rasapi32.spec]
Added RASAPI16/32.DLL.
* [misc/aspi.c] [relay32/wnaspi32.spec]
Implemented GetASPI32SupportInfo.
* [multimedia/mmsystem.c]
Implemented mmTaskCreate.
Fri Jul 24 20:55:31 1998 Eric Kohl <ekohl@abo.rhein-zeitung.de>
* [controls/toolbar.c]
Fixed some bugs and added new features.
* [controls/tooltips.c][include/tooltips.h]
Added more messages and started display code.
* [misc/shell.c][misc/shellord.c][relay32/shell.spec]
Fixed StrToOleStrN (SHELL32_79) and added OleStrToStrN (SHELL32_78).
Added some new stubs.
* [objects/cursoricon.c][misc/imagelist.c][include/windows.h]
Fixed GetIconInfo and removed the GetIconInfo hack from the
image list code.
* [controls/pager.c][include/pager.h][controls/treeview.c]
[include/treeview.h]
Added some messages.
* [misc/tweak.c][winows/nonclient.c][documentation/win95look]
Removed unused tweak variables.
* [documentation/common_controls]
Updated.
Fri Jul 24 18:36:32 1998 James Moody <013263m@dragon.acadiau.ca>
* [objects/font.c]
Fixed a bug in GetTextFace.
Fri Jul 24 17:09:33 1998 Marcus Meissner <marcus@jet.franken.de>
* [misc/commdlg.c]
Fixed stacksmashing bug due to invalid specified function
pointers.
* [files/dos_fs.c]
Small change in case handling... be able to create files with
uppercase in them (like Program Files/).
* [graphics/ddraw.c]
XF86DGA support made threadsafe, added more Xlib dependent stuff
(create Window using CreateWindow(), draw into it). xlib support
is not satisfying.
* [scheduler/critsection.c]
Don't recurse on HeapLock with semaphore id 0.
* [win32/user32.c][windows/message.c][windows/event.c]
Moved win32 *Message functions where they belong.
Removed some potential races between XPending and XNextEvent by
a bit more locking.
Fri Jul 24 13:58:19 1998 Alexandre Julliard <julliard@lrc.epfl.ch>
* [loader/pe_image.c] [loader/ne/segment.c]
Use bogus pointer value instead of NULL for unresolved externals.
* [memory/selector.c]
Clear saved_fs on selector free.
* [msdos/cdrom.c] [configure.in]
Added check for linux/ucdrom.h.
* [scheduler/client.c] [server/socket.c]
Fix for missing struct cmsghdr.
Attempt to support msg_accrights fd passing (completely untested).
* [windows/event.c]
Do not grab the pointer in SetCapture (Win32 behavior).
Tue Jul 21 22:28:13 1998 James Juran <jrj120@psu.edu>
* [Make.rules.in]
Changed $(MKDIR) macro to use -p option (make parent directories
if they don't already exist. This fixes an error in 'make install'
if /usr/local/include doesn't already exist.
Tue Jul 21 13:37:04 Rein Klazes <rklazes@casema.net>
* [include/heap.h]
Replaced macro SEGPTR_GET by inline function to avoid *lots*
of wrong use of this macro.
* [relay32/comdlg32.spec]
Corrected GetSaveFileNameW entry.
* [relay32/advapi32.spec] [win32/advapi.c]
[relay32/ole32.spec] [ ole/moniker.c]
Added stubs for SetFileSecurity[AW] and CreateFileMoniker32
* [graphics/x11drv/graphics.c]
Finished implementation of bezier drawing code.
Tue Jul 21 11:00:51 1998 Claus Fischer <cfischer@td2cad.intel.com>
* [files/drive.c]
Remove label trailing blanks in GetVolumeInformation32A.
* [documentation/cdrom-labels]
Added documentation on how to find out a CD-ROM label.
Sun Jul 19 23:16:41 1998 Pascal Cuoq <pcuoq@ens-lyon.fr>
* [include/windows.h]
Added some DM_* and DISP_CHANGE_* flags.
* [relay32/user32.spec] [windows/user.c]
Added stub for ChangeDisplaySettingA.
* [ole/ole2nls.c]
is_punctuation: reuse information from another table.
Sun Jul 19 22:04:46 1998 Douglas Ridgway <ridgway@winehq.com>
* [Make.rules.in]
Updated automatic documentation rules.
* [graphics/path.c] [misc/aspi.c] [misc/ntdll.c] [misc/winsock_dns.c]
[ole/ole2dsp.c] [relay32/user32.spec]
Comment format futzing to keep c2man happy.
* [documentation/README.documentation]
Updated description of automatic documentation.
Wed Jul 15 19:10:09 1998 Andrew M. Bishop <amb@gedanken.demon.co.uk>
* [files/profile.c]
Cache the 10 most recently used .ini files.
Tue May 20 19:20:23 1997 Pablo Saratxaga <srtxg@chanae.alphanet.ch>
* [misc/commdlg.c]
Makes PrintDlg32A() return TRUE even if it is an empty
stub, so most programs are happy and run anyway instead of
aborting at startup.
* [graphics/x11drv/xfont.c]
Increased the maximum font families as (X11) font aliases
eated up a lot of families causing wine to stop reading fonts.
diff --git a/graphics/ddraw.c b/graphics/ddraw.c
index 2c5add5..4420891 100644
--- a/graphics/ddraw.c
+++ b/graphics/ddraw.c
@@ -71,9 +71,11 @@
#include "d3d.h"
#include "debug.h"
#include "compobj.h"
+#include "spy.h"
+#include "message.h"
#ifdef HAVE_LIBXXF86DGA
-#include <X11/extensions/xf86dga.h>
+#include "ts_xf86dga.h"
#endif
/* restore signal handlers overwritten by XF86DGA
@@ -105,8 +107,6 @@
};
static struct IDirectDrawSurface3_VTable dga_dds3vt, xshm_dds3vt, xlib_dds3vt;
-static struct IDirectDrawSurface2_VTable dga_dds2vt, xshm_dds2vt, xlib_dds2vt;
-static struct IDirectDrawSurface_VTable dga_ddsvt, xshm_ddsvt, xlib_ddsvt;
static struct IDirectDraw_VTable dga_ddvt, xshm_ddvt, xlib_ddvt;
static struct IDirectDraw2_VTable dga_dd2vt, xshm_dd2vt, xlib_dd2vt;
static struct IDirectDrawClipper_VTable ddclipvt;
@@ -114,12 +114,23 @@
static struct IDirect3D_VTable d3dvt;
static struct IDirect3D2_VTable d3d2vt;
+void Xlib_MessagePump(HWND32 hwnd) {
+ MSG32 msg32;
+
+ while (PeekMessage32A(&msg32,0,0,0,PM_NOYIELD)) {
+ GetMessage32A(&msg32,0,0,0);
+ TranslateMessage32(&msg32);
+ DispatchMessage32A(&msg32);
+ }
+}
+
+
BOOL32
DDRAW_DGA_Available()
{
#ifdef HAVE_LIBXXF86DGA
int evbase, evret;
- return (getuid() == 0) && XF86DGAQueryExtension(display,&evbase,&evret);
+ return (getuid() == 0)&&TSXF86DGAQueryExtension(display,&evbase,&evret);
#else /* defined(HAVE_LIBXXF86DGA) */
return 0;
#endif /* defined(HAVE_LIBXXF86DGA) */
@@ -138,12 +149,13 @@
HRESULT WINAPI
DirectDrawEnumerate32A(LPDDENUMCALLBACK32A ddenumproc,LPVOID data) {
if (DDRAW_DGA_Available()) {
- ddenumproc(&DGA_DirectDraw_GUID,"WINE with XFree86 DGA","wine-dga",data);
+ ddenumproc(&DGA_DirectDraw_GUID,"WINE with XFree86 DGA","display",data);
}
if (DDRAW_XShm_Available()) {
- ddenumproc(&XSHM_DirectDraw_GUID,"WINE with MIT XShm","wine-xshm",data);
+ ddenumproc(&XSHM_DirectDraw_GUID,"WINE with MIT XShm","display",data);
}
- ddenumproc(&XLIB_DirectDraw_GUID,"WINE with Xlib","wine-xlib",data);
+ ddenumproc(&XLIB_DirectDraw_GUID,"WINE with Xlib","display",data);
+ ddenumproc(NULL,"WINE","display",data);
return 0;
}
@@ -285,52 +297,6 @@
DUMP("\n");
}
-static void _dump_DDCAPS(DWORD flagmask) {
- int i;
- const struct {
- DWORD mask;
- char *name;
-} flags[] = {
-#define FE(x) { x, #x},
- FE(DDCAPS_3D)
- FE(DDCAPS_ALIGNBOUNDARYDEST)
- FE(DDCAPS_ALIGNSIZEDEST)
- FE(DDCAPS_ALIGNBOUNDARYSRC)
- FE(DDCAPS_ALIGNSIZESRC)
- FE(DDCAPS_ALIGNSTRIDE)
- FE(DDCAPS_BLT)
- FE(DDCAPS_BLTQUEUE)
- FE(DDCAPS_BLTFOURCC)
- FE(DDCAPS_BLTSTRETCH)
- FE(DDCAPS_GDI)
- FE(DDCAPS_OVERLAY)
- FE(DDCAPS_OVERLAYCANTCLIP)
- FE(DDCAPS_OVERLAYFOURCC)
- FE(DDCAPS_OVERLAYSTRETCH)
- FE(DDCAPS_PALETTE)
- FE(DDCAPS_PALETTEVSYNC)
- FE(DDCAPS_READSCANLINE)
- FE(DDCAPS_STEREOVIEW)
- FE(DDCAPS_VBI)
- FE(DDCAPS_ZBLTS)
- FE(DDCAPS_ZOVERLAYS)
- FE(DDCAPS_COLORKEY)
- FE(DDCAPS_ALPHA)
- FE(DDCAPS_COLORKEYHWASSIST)
- FE(DDCAPS_NOHARDWARE)
- FE(DDCAPS_BLTCOLORFILL)
- FE(DDCAPS_BANKSWITCHED)
- FE(DDCAPS_BLTDEPTHFILL)
- FE(DDCAPS_CANCLIP)
- FE(DDCAPS_CANCLIPSTRETCHED)
- FE(DDCAPS_CANBLTSYSMEM)
- };
- for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
- if (flags[i].mask & flagmask)
- DUMP("%s ",flags[i].name);
- DUMP("\n");
-}
-
static void _dump_DDSD(DWORD flagmask) {
int i;
const struct {
@@ -392,11 +358,14 @@
}
/******************************************************************************
- * IDirectDrawSurface
+ * IDirectDrawSurface,IDirectDrawSurface2,IDirectDrawSurface3
+ *
+ * Since DDS3 and DDS2 are supersets of DDS, we implement DDS3 and let
+ * DDS and DDS2 use those functions. (Function calls did not change (except
+ * using different DirectDrawSurfaceX version), just added flags and functions)
*/
-
-static HRESULT WINAPI IDirectDrawSurface_Lock(
- LPDIRECTDRAWSURFACE this,LPRECT32 lprect,LPDDSURFACEDESC lpddsd,DWORD flags, HANDLE32 hnd
+static HRESULT WINAPI IDirectDrawSurface3_Lock(
+ LPDIRECTDRAWSURFACE3 this,LPRECT32 lprect,LPDDSURFACEDESC lpddsd,DWORD flags, HANDLE32 hnd
) {
TRACE(ddraw, "(%p)->Lock(%p,%p,%08lx,%08lx)\n",
this,lprect,lpddsd,flags,(DWORD)hnd);
@@ -412,6 +381,7 @@
(lprect->top*this->s.lpitch) +
(lprect->left*(this->s.ddraw->d.depth/8));
} else {
+ assert(this->s.surface);
lpddsd->y.lpSurface = this->s.surface;
}
lpddsd->dwFlags = DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT|DDSD_PITCH|DDSD_LPSURFACE;
@@ -422,21 +392,18 @@
return 0;
}
-static HRESULT WINAPI DGA_IDirectDrawSurface_Unlock(
- LPDIRECTDRAWSURFACE this,LPVOID surface
+static HRESULT WINAPI DGA_IDirectDrawSurface3_Unlock(
+ LPDIRECTDRAWSURFACE3 this,LPVOID surface
) {
TRACE(ddraw,"(%p)->Unlock(%p)\n",this,surface);
return 0;
}
-static HRESULT WINAPI XShm_IDirectDrawSurface_Unlock(
- LPDIRECTDRAWSURFACE this,LPVOID surface
+static HRESULT WINAPI XShm_IDirectDrawSurface3_Unlock(
+ LPDIRECTDRAWSURFACE3 this,LPVOID surface
) {
#ifdef HAVE_LIBXXSHM
TRACE(ddraw,"(%p)->Unlock(%p)\n",this,surface);
- if (!this->t.xshm.surface_is_image_data) {
- FIXME(ddraw,"(%p)->Unlock(%p) needs an image copy!\n",this,surface);
- }
/* FIXME: is it really right to display the image on unlock?
* or should it wait for a Flip()? */
TSXShmPutImage(display,
@@ -447,41 +414,40 @@
this->t.xshm.image->width,
this->t.xshm.image->height,
False);
+/*
if (this->s.palette && this->s.palette->cm) {
TSXInstallColormap(display,this->s.palette->cm);
}
- TSXSync(display,False);
+*/
+ /*TSXSync(display,False);*/
+ EVENT_Synchronize();
return 0;
#else /* defined(HAVE_LIBXXSHM) */
return E_UNEXPECTED;
#endif /* defined(HAVE_LIBXXSHM) */
}
-static HRESULT WINAPI Xlib_IDirectDrawSurface_Unlock(
- LPDIRECTDRAWSURFACE this,LPVOID surface
+static HRESULT WINAPI Xlib_IDirectDrawSurface3_Unlock(
+ LPDIRECTDRAWSURFACE3 this,LPVOID surface
) {
+ Xlib_MessagePump(this->s.ddraw->e.xlib.window);
+
TRACE(ddraw,"(%p)->Unlock(%p)\n",this,surface);
- if (!this->t.xshm.surface_is_image_data) {
- FIXME(ddraw,"(%p)->Unlock(%p) needs an image copy!\n",this,surface);
- }
- /* FIXME: is it really right to display the image on unlock?
- * or should it wait for a Flip()? */
- TSXPutImage(display,
+ TSXPutImage( display,
this->s.ddraw->e.xlib.drawable,
DefaultGCOfScreen(screen),
this->t.xlib.image,
0, 0, 0, 0,
this->t.xlib.image->width,
- this->t.xlib.image->width);
- if (this->s.palette && this->s.palette->cm) {
- TSXInstallColormap(display,this->s.palette->cm);
- }
- TSXSync(display,False);
+ this->t.xlib.image->height
+ );
+ /*TSXSetWindowColormap(display,this->s.ddraw->e.xlib.drawable,this->s.palette->cm);*/
+ EVENT_Synchronize();
return 0;
}
-static HRESULT WINAPI DGA_IDirectDrawSurface_Flip(
- LPDIRECTDRAWSURFACE this,LPDIRECTDRAWSURFACE flipto,DWORD dwFlags
+static HRESULT WINAPI DGA_IDirectDrawSurface3_Flip(
+ LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWSURFACE3 flipto,DWORD dwFlags
) {
#ifdef HAVE_LIBXXF86DGA
TRACE(ddraw,"(%p)->Flip(%p,%08lx)\n",this,flipto,dwFlags);
@@ -491,11 +457,12 @@
else
flipto = this;
}
- XF86DGASetViewPort(display,DefaultScreen(display),0,flipto->t.dga.fb_height);
+ TSXF86DGASetViewPort(display,DefaultScreen(display),0,flipto->t.dga.fb_height);
+
if (flipto->s.palette && flipto->s.palette->cm) {
- XF86DGAInstallColormap(display,DefaultScreen(display),flipto->s.palette->cm);
+ TSXF86DGAInstallColormap(display,DefaultScreen(display),flipto->s.palette->cm);
}
- while (!XF86DGAViewPortChanged(display,DefaultScreen(display),2)) {
+ while (!TSXF86DGAViewPortChanged(display,DefaultScreen(display),2)) {
}
if (flipto!=this) {
int tmp;
@@ -515,8 +482,8 @@
#endif /* defined(HAVE_LIBXXF86DGA) */
}
-static HRESULT WINAPI XShm_IDirectDrawSurface_Flip(
- LPDIRECTDRAWSURFACE this,LPDIRECTDRAWSURFACE flipto,DWORD dwFlags
+static HRESULT WINAPI XShm_IDirectDrawSurface3_Flip(
+ LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWSURFACE3 flipto,DWORD dwFlags
) {
#ifdef HAVE_LIBXXSHM
TRACE(ddraw,"(%p)->Flip(%p,%08lx)\n",this,flipto,dwFlags);
@@ -534,10 +501,12 @@
flipto->t.xshm.image->width,
flipto->t.xshm.image->height,
False);
+/*
if (flipto->s.palette && flipto->s.palette->cm) {
TSXInstallColormap(display,flipto->s.palette->cm);
}
- TSXSync(display,False);
+*/
+ EVENT_Synchronize();
if (flipto!=this) {
XImage *tmp;
tmp = this->t.xshm.image;
@@ -550,8 +519,8 @@
#endif /* defined(HAVE_LIBXXSHM) */
}
-static HRESULT WINAPI Xlib_IDirectDrawSurface_Flip(
- LPDIRECTDRAWSURFACE this,LPDIRECTDRAWSURFACE flipto,DWORD dwFlags
+static HRESULT WINAPI Xlib_IDirectDrawSurface3_Flip(
+ LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWSURFACE3 flipto,DWORD dwFlags
) {
TRACE(ddraw,"(%p)->Flip(%p,%08lx)\n",this,flipto,dwFlags);
if (!flipto) {
@@ -566,30 +535,32 @@
flipto->t.xlib.image,
0, 0, 0, 0,
flipto->t.xlib.image->width,
- flipto->t.xlib.image->width);
- if (flipto->s.palette && flipto->s.palette->cm) {
- TSXInstallColormap(display,flipto->s.palette->cm);
- }
- TSXSync(display,False);
+ flipto->t.xlib.image->height);
+ TSXSetWindowColormap(display,this->s.ddraw->e.xlib.drawable,this->s.palette->cm);
+ EVENT_Synchronize();
if (flipto!=this) {
XImage *tmp;
- tmp = this->t.xshm.image;
- this->t.xshm.image = flipto->t.xshm.image;
- flipto->t.xshm.image = tmp;
+ LPVOID *surf;
+ tmp = this->t.xlib.image;
+ this->t.xlib.image = flipto->t.xlib.image;
+ flipto->t.xlib.image = tmp;
+ surf = this->s.surface;
+ this->s.surface = flipto->s.surface;
+ flipto->s.surface = surf;
}
return 0;
}
-static HRESULT WINAPI IDirectDrawSurface_SetPalette(
- LPDIRECTDRAWSURFACE this,LPDIRECTDRAWPALETTE pal
+static HRESULT WINAPI IDirectDrawSurface3_SetPalette(
+ LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWPALETTE pal
) {
TRACE(ddraw,"(%p)->SetPalette(%p)\n",this,pal);
this->s.palette = pal; /* probably addref it too */
return 0;
}
-static HRESULT WINAPI IDirectDrawSurface_Blt(
- LPDIRECTDRAWSURFACE this,LPRECT32 rdst,LPDIRECTDRAWSURFACE src,LPRECT32 rsrc,DWORD dwFlags,LPDDBLTFX lpbltfx
+static HRESULT WINAPI IDirectDrawSurface3_Blt(
+ LPDIRECTDRAWSURFACE3 this,LPRECT32 rdst,LPDIRECTDRAWSURFACE3 src,LPRECT32 rsrc,DWORD dwFlags,LPDDBLTFX lpbltfx
) {
RECT32 xdst,xsrc;
int i,j;
@@ -656,8 +627,8 @@
return 0;
}
-static HRESULT WINAPI IDirectDrawSurface_BltFast(
- LPDIRECTDRAWSURFACE this,DWORD dstx,DWORD dsty,LPDIRECTDRAWSURFACE src,LPRECT32 rsrc,DWORD trans
+static HRESULT WINAPI IDirectDrawSurface3_BltFast(
+ LPDIRECTDRAWSURFACE3 this,DWORD dstx,DWORD dsty,LPDIRECTDRAWSURFACE3 src,LPRECT32 rsrc,DWORD trans
) {
int i,bpp;
if (TRACE_ON(ddraw)) {
@@ -677,8 +648,8 @@
return 0;
}
-static HRESULT WINAPI IDirectDrawSurface_BltBatch(
- LPDIRECTDRAWSURFACE this,LPDDBLTBATCH ddbltbatch,DWORD x,DWORD y
+static HRESULT WINAPI IDirectDrawSurface3_BltBatch(
+ LPDIRECTDRAWSURFACE3 this,LPDDBLTBATCH ddbltbatch,DWORD x,DWORD y
) {
TRACE(ddraw,"(%p)->BltBatch(%p,%08lx,%08lx),stub!\n",
this,ddbltbatch,x,y
@@ -686,16 +657,16 @@
return 0;
}
-static HRESULT WINAPI IDirectDrawSurface_GetCaps(
- LPDIRECTDRAWSURFACE this,LPDDSCAPS caps
+static HRESULT WINAPI IDirectDrawSurface3_GetCaps(
+ LPDIRECTDRAWSURFACE3 this,LPDDSCAPS caps
) {
TRACE(ddraw,"(%p)->GetCaps(%p)\n",this,caps);
caps->dwCaps = DDCAPS_PALETTE; /* probably more */
return 0;
}
-static HRESULT WINAPI IDirectDrawSurface_GetSurfaceDesc(
- LPDIRECTDRAWSURFACE this,LPDDSURFACEDESC ddsd
+static HRESULT WINAPI IDirectDrawSurface3_GetSurfaceDesc(
+ LPDIRECTDRAWSURFACE3 this,LPDDSURFACEDESC ddsd
) {
if (TRACE_ON(ddraw)) {
TRACE(ddraw, "(%p)->GetSurfaceDesc(%p)\n",
@@ -718,12 +689,12 @@
return 0;
}
-static ULONG WINAPI IDirectDrawSurface_AddRef(LPDIRECTDRAWSURFACE this) {
+static ULONG WINAPI IDirectDrawSurface3_AddRef(LPDIRECTDRAWSURFACE3 this) {
TRACE(ddraw,"(%p)->AddRef()\n",this);
return ++(this->ref);
}
-static ULONG WINAPI DGA_IDirectDrawSurface_Release(LPDIRECTDRAWSURFACE this) {
+static ULONG WINAPI DGA_IDirectDrawSurface3_Release(LPDIRECTDRAWSURFACE3 this) {
TRACE(ddraw,"(%p)->Release()\n",this);
#ifdef HAVE_LIBXXF86DGA
if (!--(this->ref)) {
@@ -741,16 +712,15 @@
return this->ref;
}
-static ULONG WINAPI XShm_IDirectDrawSurface_Release(LPDIRECTDRAWSURFACE this) {
+static ULONG WINAPI XShm_IDirectDrawSurface3_Release(LPDIRECTDRAWSURFACE3 this) {
TRACE(ddraw,"(%p)->Release()\n",this);
#ifdef HAVE_LIBXXSHM
if (!--(this->ref)) {
this->s.ddraw->lpvtbl->fnRelease(this->s.ddraw);
- if (!this->t.xshm.surface_is_image_data) {
- HeapFree(GetProcessHeap(),0,this->s.surface);
- }
- XShmDetach(display,&this->t.xshm.shminfo);
- XDestroyImage(this->t.xshm.image);
+ HeapFree(GetProcessHeap(),0,this->s.surface);
+ this->t.xshm.image->data = NULL;
+ TSXShmDetach(display,&this->t.xshm.shminfo);
+ TSXDestroyImage(this->t.xshm.image);
shmdt(this->t.xshm.shminfo.shmaddr);
shmctl(this->t.xshm.shminfo.shmid, IPC_RMID, 0);
HeapFree(GetProcessHeap(),0,this);
@@ -760,22 +730,22 @@
return this->ref;
}
-static ULONG WINAPI Xlib_IDirectDrawSurface_Release(LPDIRECTDRAWSURFACE this) {
+static ULONG WINAPI Xlib_IDirectDrawSurface3_Release(LPDIRECTDRAWSURFACE3 this) {
TRACE(ddraw,"(%p)->Release()\n",this);
if (!--(this->ref)) {
this->s.ddraw->lpvtbl->fnRelease(this->s.ddraw);
- if (!this->t.xshm.surface_is_image_data) {
- HeapFree(GetProcessHeap(),0,this->s.surface);
- }
- XDestroyImage(this->t.xshm.image);
+ HeapFree(GetProcessHeap(),0,this->s.surface);
+ this->t.xlib.image->data = NULL;
+ TSXDestroyImage(this->t.xlib.image);
+ this->t.xlib.image = 0;
HeapFree(GetProcessHeap(),0,this);
return 0;
}
return this->ref;
}
-static HRESULT WINAPI IDirectDrawSurface_GetAttachedSurface(
- LPDIRECTDRAWSURFACE this,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE *lpdsf
+static HRESULT WINAPI IDirectDrawSurface3_GetAttachedSurface(
+ LPDIRECTDRAWSURFACE3 this,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE3 *lpdsf
) {
TRACE(ddraw, "(%p)->GetAttachedSurface(%p,%p)\n",
this, lpddsd, lpdsf);
@@ -792,674 +762,83 @@
return 0;
}
-static HRESULT WINAPI IDirectDrawSurface_Initialize(
- LPDIRECTDRAWSURFACE this,LPDIRECTDRAW ddraw,LPDDSURFACEDESC lpdsfd
+static HRESULT WINAPI IDirectDrawSurface3_Initialize(
+ LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAW ddraw,LPDDSURFACEDESC lpdsfd
) {
return DDERR_ALREADYINITIALIZED;
}
-static HRESULT WINAPI IDirectDrawSurface_GetPixelFormat(
- LPDIRECTDRAWSURFACE this,LPDDPIXELFORMAT pf
-) {
- return _getpixelformat(this->s.ddraw,pf);
-}
-
-static HRESULT WINAPI IDirectDrawSurface_GetBltStatus(LPDIRECTDRAWSURFACE this,DWORD dwFlags) {
- FIXME(ddraw,"(%p)->(0x%08lx),stub!\n",
- this,dwFlags
- );
- return 0;
-}
-
-static HRESULT WINAPI IDirectDrawSurface_GetOverlayPosition(
- LPDIRECTDRAWSURFACE this,LPLONG x1,LPLONG x2
-) {
- FIXME(ddraw,"(%p)->(%p,%p),stub!\n",
- this,x1,x2
- );
- return 0;
-}
-
-static HRESULT WINAPI IDirectDrawSurface_SetClipper(
- LPDIRECTDRAWSURFACE this,LPDIRECTDRAWCLIPPER clipper
-) {
- FIXME(ddraw,"(%p)->(%p),stub!\n",this,clipper);
- return 0;
-}
-
-static HRESULT WINAPI IDirectDrawSurface_AddAttachedSurface(
- LPDIRECTDRAWSURFACE this,LPDIRECTDRAWSURFACE surf
-) {
- FIXME(ddraw,"(%p)->(%p),stub!\n",this,surf);
- this->s.backbuffer = surf;
- return 0;
-}
-
-static HRESULT WINAPI IDirectDrawSurface_GetDC(LPDIRECTDRAWSURFACE this,HDC32* lphdc) {
- FIXME(ddraw,"(%p)->GetDC(%p),stub!\n",this,lphdc);
- return 0;
-}
-
-static HRESULT WINAPI DGA_IDirectDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE this,REFIID refiid,LPVOID *obj) {
- char xrefiid[50];
-
- WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
- TRACE(ddraw,"(%p)->(%s,%p)\n",this,xrefiid,obj);
-
- /* thats version 3 (DirectX 5) */
- if (!memcmp(&IID_IDirectDrawSurface3,refiid,sizeof(IID_IDirectDrawSurface3))) {
- this->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&dga_dds3vt;
- this->lpvtbl->fnAddRef(this);
- *obj = this;
- return 0;
- }
- /* thats version 2 (DirectX 3) */
- if (!memcmp(&IID_IDirectDrawSurface2,refiid,sizeof(IID_IDirectDrawSurface2))) {
- this->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&dga_dds2vt;
- *obj = this;
- return 0;
- }
- /* thats us */
- if (!memcmp(&IID_IDirectDrawSurface,refiid,sizeof(IID_IDirectDrawSurface))) {
- this->lpvtbl->fnAddRef(this);
- *obj = this;
- return 0;
- }
- WARN(ddraw,"(%p):interface for IID %s _NOT_ found!\n",this,xrefiid);
- return OLE_E_ENUM_NOMORE;
-}
-
-static HRESULT WINAPI XShm_IDirectDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE this,REFIID refiid,LPVOID *obj) {
- char xrefiid[50];
-
- WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
- TRACE(ddraw,"(%p)->(%s,%p)\n",this,xrefiid,obj);
-
- /* thats version 3 (DirectX 5) */
- if ( !memcmp(&IID_IDirectDrawSurface3,refiid,sizeof(IID_IDirectDrawSurface3))) {
- this->lpvtbl->fnAddRef(this);
- this->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&xshm_dds3vt;
- *obj = this;
- return 0;
- }
- /* thats version 2 (DirectX 3) */
- if (!memcmp(&IID_IDirectDrawSurface2,refiid,sizeof(IID_IDirectDrawSurface2))) {
- this->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&xshm_dds2vt;
- *obj = this;
- return 0;
- }
- /* thats us */
- if (!memcmp(&IID_IDirectDrawSurface,refiid,sizeof(IID_IDirectDrawSurface))) {
- this->lpvtbl->fnAddRef(this);
- *obj = this;
- return 0;
- }
- WARN(ddraw,"(%p):interface for IID %s _NOT_ found!\n",this,xrefiid);
- return OLE_E_ENUM_NOMORE;
-}
-
-static HRESULT WINAPI Xlib_IDirectDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE this,REFIID refiid,LPVOID *obj) {
- char xrefiid[50];
-
- WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
- TRACE(ddraw,"(%p)->(%s,%p)\n",this,xrefiid,obj);
-
- /* thats version 3 (DirectX 5) */
- if (!memcmp(&IID_IDirectDrawSurface3,refiid,sizeof(IID_IDirectDrawSurface3))) {
- this->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&xlib_dds3vt;
- this->lpvtbl->fnAddRef(this);
- *obj = this;
- return 0;
- }
- /* thats version 2 (DirectX 3) */
- if (!memcmp(&IID_IDirectDrawSurface2,refiid,sizeof(IID_IDirectDrawSurface2))) {
- this->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&xlib_dds2vt;
- *obj = this;
- return 0;
- }
- /* thats us */
- if (!memcmp(&IID_IDirectDrawSurface,refiid,sizeof(IID_IDirectDrawSurface))) {
- this->lpvtbl->fnAddRef(this);
- *obj = this;
- return 0;
- }
- WARN(ddraw,"(%p):interface for IID %s _NOT_ found!\n",this,xrefiid);
- return OLE_E_ENUM_NOMORE;
-}
-
-static HRESULT WINAPI IDirectDrawSurface_IsLost(LPDIRECTDRAWSURFACE this) {
- return 0; /* hmm */
-}
-
-static struct IDirectDrawSurface_VTable dga_ddsvt = {
- DGA_IDirectDrawSurface_QueryInterface,
- IDirectDrawSurface_AddRef,
- DGA_IDirectDrawSurface_Release,
- IDirectDrawSurface_AddAttachedSurface,
- (void*)5,
- IDirectDrawSurface_Blt,
- IDirectDrawSurface_BltBatch,
- IDirectDrawSurface_BltFast,
- (void*)9,
- (void*)10,
- (void*)11,
- DGA_IDirectDrawSurface_Flip,
- IDirectDrawSurface_GetAttachedSurface,
- IDirectDrawSurface_GetBltStatus,
- IDirectDrawSurface_GetCaps,
- (void*)16,
- (void*)17,
- IDirectDrawSurface_GetDC,
- (void*)19,
- IDirectDrawSurface_GetOverlayPosition,
- (void*)21,
- IDirectDrawSurface_GetPixelFormat,
- IDirectDrawSurface_GetSurfaceDesc,
- IDirectDrawSurface_Initialize,
- IDirectDrawSurface_IsLost,
- IDirectDrawSurface_Lock,
- (void*)27,
- (void*)28,
- IDirectDrawSurface_SetClipper,
- (void*)30,
- (void*)31,
- IDirectDrawSurface_SetPalette,
- DGA_IDirectDrawSurface_Unlock,
- (void*)34,
- (void*)35,
- (void*)36,
-};
-
-static struct IDirectDrawSurface_VTable xshm_ddsvt = {
- XShm_IDirectDrawSurface_QueryInterface,
- IDirectDrawSurface_AddRef,
- XShm_IDirectDrawSurface_Release,
- IDirectDrawSurface_AddAttachedSurface,
- (void*)5,
- IDirectDrawSurface_Blt,
- IDirectDrawSurface_BltBatch,
- IDirectDrawSurface_BltFast,
- (void*)9,
- (void*)10,
- (void*)11,
- XShm_IDirectDrawSurface_Flip,
- IDirectDrawSurface_GetAttachedSurface,
- IDirectDrawSurface_GetBltStatus,
- IDirectDrawSurface_GetCaps,
- (void*)16,
- (void*)17,
- IDirectDrawSurface_GetDC,
- (void*)19,
- IDirectDrawSurface_GetOverlayPosition,
- (void*)21,
- IDirectDrawSurface_GetPixelFormat,
- IDirectDrawSurface_GetSurfaceDesc,
- IDirectDrawSurface_Initialize,
- IDirectDrawSurface_IsLost,
- IDirectDrawSurface_Lock,
- (void*)27,
- (void*)28,
- IDirectDrawSurface_SetClipper,
- (void*)30,
- (void*)31,
- IDirectDrawSurface_SetPalette,
- XShm_IDirectDrawSurface_Unlock,
- (void*)34,
- (void*)35,
- (void*)36,
-};
-
-static struct IDirectDrawSurface_VTable xlib_ddsvt = {
- Xlib_IDirectDrawSurface_QueryInterface,
- IDirectDrawSurface_AddRef,
- Xlib_IDirectDrawSurface_Release,
- IDirectDrawSurface_AddAttachedSurface,
- (void*)5,
- IDirectDrawSurface_Blt,
- IDirectDrawSurface_BltBatch,
- IDirectDrawSurface_BltFast,
- (void*)9,
- (void*)10,
- (void*)11,
- Xlib_IDirectDrawSurface_Flip,
- IDirectDrawSurface_GetAttachedSurface,
- IDirectDrawSurface_GetBltStatus,
- IDirectDrawSurface_GetCaps,
- (void*)16,
- (void*)17,
- IDirectDrawSurface_GetDC,
- (void*)19,
- IDirectDrawSurface_GetOverlayPosition,
- (void*)21,
- IDirectDrawSurface_GetPixelFormat,
- IDirectDrawSurface_GetSurfaceDesc,
- IDirectDrawSurface_Initialize,
- IDirectDrawSurface_IsLost,
- IDirectDrawSurface_Lock,
- (void*)27,
- (void*)28,
- IDirectDrawSurface_SetClipper,
- (void*)30,
- (void*)31,
- IDirectDrawSurface_SetPalette,
- Xlib_IDirectDrawSurface_Unlock,
- (void*)34,
- (void*)35,
- (void*)36,
-};
-
-/******************************************************************************
- * IDirectDrawSurface2
- *
- * calls IDirectDrawSurface methods where possible
- */
-static HRESULT WINAPI IDirectDrawSurface2_Lock(
- LPDIRECTDRAWSURFACE2 this,LPRECT32 lprect,LPDDSURFACEDESC lpddsd,DWORD flags, HANDLE32 hnd
-) {
- return IDirectDrawSurface_Lock((LPDIRECTDRAWSURFACE)this,lprect,lpddsd,flags,hnd);
-}
-
-static HRESULT WINAPI DGA_IDirectDrawSurface2_Unlock(
- LPDIRECTDRAWSURFACE2 this,LPVOID surface
-) {
- return DGA_IDirectDrawSurface_Unlock((LPDIRECTDRAWSURFACE)this,surface);
-}
-
-static HRESULT WINAPI XShm_IDirectDrawSurface2_Unlock(
- LPDIRECTDRAWSURFACE2 this,LPVOID surface
-) {
- return DGA_IDirectDrawSurface_Unlock((LPDIRECTDRAWSURFACE)this,surface);
-}
-
-static HRESULT WINAPI Xlib_IDirectDrawSurface2_Unlock(
- LPDIRECTDRAWSURFACE2 this,LPVOID surface
-) {
- return DGA_IDirectDrawSurface_Unlock((LPDIRECTDRAWSURFACE)this,surface);
-}
-
-static HRESULT WINAPI IDirectDrawSurface2_SetPalette(
- LPDIRECTDRAWSURFACE2 this,LPDIRECTDRAWPALETTE pal
-) {
- return IDirectDrawSurface_SetPalette((LPDIRECTDRAWSURFACE)this,pal);
-}
-
-static ULONG WINAPI IDirectDrawSurface2_AddRef(LPDIRECTDRAWSURFACE2 this) {
- TRACE(ddraw,"(%p)->AddRef()\n",this);
- return ++(this->ref);
-}
-
-static ULONG WINAPI DGA_IDirectDrawSurface2_Release(LPDIRECTDRAWSURFACE2 this) {
- return DGA_IDirectDrawSurface_Release((LPDIRECTDRAWSURFACE)this);
-}
-
-static ULONG WINAPI XShm_IDirectDrawSurface2_Release(LPDIRECTDRAWSURFACE2 this) {
- return XShm_IDirectDrawSurface_Release((LPDIRECTDRAWSURFACE)this);
-}
-
-static ULONG WINAPI Xlib_IDirectDrawSurface2_Release(LPDIRECTDRAWSURFACE2 this) {
- return Xlib_IDirectDrawSurface_Release((LPDIRECTDRAWSURFACE)this);
-}
-
-static HRESULT WINAPI IDirectDrawSurface2_Blt(
- LPDIRECTDRAWSURFACE2 this,LPRECT32 rdst,LPDIRECTDRAWSURFACE2 src,LPRECT32 rsrc,DWORD dwFlags,LPDDBLTFX lpbltfx
-) {
- return IDirectDrawSurface_Blt((LPDIRECTDRAWSURFACE)this, rdst, (LPDIRECTDRAWSURFACE)src, rsrc, dwFlags,lpbltfx);
-}
-
-static HRESULT WINAPI IDirectDrawSurface2_BltFast(
- LPDIRECTDRAWSURFACE2 this,DWORD dstx,DWORD dsty,LPDIRECTDRAWSURFACE2 src,LPRECT32 rsrc,DWORD trans
-) {
- return IDirectDrawSurface_BltFast((LPDIRECTDRAWSURFACE)this,dstx,dsty,(LPDIRECTDRAWSURFACE)src,rsrc,trans);
-}
-
-static HRESULT WINAPI IDirectDrawSurface2_BltBatch(
- LPDIRECTDRAWSURFACE2 this,LPDDBLTBATCH ddbltbatch,DWORD x,DWORD y
-) {
- return IDirectDrawSurface_BltBatch((LPDIRECTDRAWSURFACE)this,ddbltbatch,x,y);
-}
-
-static HRESULT WINAPI DGA_IDirectDrawSurface2_GetAttachedSurface(
- LPDIRECTDRAWSURFACE2 this,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE2 *lpdsf
-) {
- HRESULT ret;
-
- ret = IDirectDrawSurface_GetAttachedSurface((LPDIRECTDRAWSURFACE)this,lpddsd,(LPDIRECTDRAWSURFACE*)lpdsf);
-
- if (!ret) {
- (*lpdsf)->lpvtbl = &dga_dds2vt;
- }
- return ret;
-}
-
-static HRESULT WINAPI XShm_IDirectDrawSurface2_GetAttachedSurface(
- LPDIRECTDRAWSURFACE2 this,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE2 *lpdsf
-) {
- HRESULT ret;
-
- ret = IDirectDrawSurface_GetAttachedSurface((LPDIRECTDRAWSURFACE)this,lpddsd,(LPDIRECTDRAWSURFACE*)lpdsf);
-
- if (!ret) {
- (*lpdsf)->lpvtbl = &xshm_dds2vt;
- }
- return ret;
-}
-
-static HRESULT WINAPI Xlib_IDirectDrawSurface2_GetAttachedSurface(
- LPDIRECTDRAWSURFACE2 this,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE2 *lpdsf
-) {
- HRESULT ret;
-
- ret = IDirectDrawSurface_GetAttachedSurface((LPDIRECTDRAWSURFACE)this,lpddsd,(LPDIRECTDRAWSURFACE*)lpdsf);
-
- if (!ret) {
- (*lpdsf)->lpvtbl = &xlib_dds2vt;
- }
- return ret;
-}
-
-static HRESULT WINAPI DGA_IDirectDrawSurface2_Flip(
- LPDIRECTDRAWSURFACE2 this,LPDIRECTDRAWSURFACE2 flipto,DWORD dwFlags
-) {
- return DGA_IDirectDrawSurface_Flip((LPDIRECTDRAWSURFACE)this,(LPDIRECTDRAWSURFACE)flipto,dwFlags);
-}
-
-static HRESULT WINAPI XShm_IDirectDrawSurface2_Flip(
- LPDIRECTDRAWSURFACE2 this,LPDIRECTDRAWSURFACE2 flipto,DWORD dwFlags
-) {
- return XShm_IDirectDrawSurface_Flip((LPDIRECTDRAWSURFACE)this,(LPDIRECTDRAWSURFACE)flipto,dwFlags);
-}
-
-static HRESULT WINAPI Xlib_IDirectDrawSurface2_Flip(
- LPDIRECTDRAWSURFACE2 this,LPDIRECTDRAWSURFACE2 flipto,DWORD dwFlags
-) {
- return Xlib_IDirectDrawSurface_Flip((LPDIRECTDRAWSURFACE)this,(LPDIRECTDRAWSURFACE)flipto,dwFlags);
-}
-
-static HRESULT WINAPI IDirectDrawSurface2_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE2 this,LPVOID context,LPDDENUMSURFACESCALLBACK esfcb) {
- FIXME(ddraw,"(%p)->(%p,%p),stub!\n",this,context,esfcb);
- return 0;
-}
-
-static HRESULT WINAPI DGA_IDirectDrawSurface2_QueryInterface(
- LPDIRECTDRAWSURFACE2 this,REFIID riid,LPVOID *ppobj
-) {
- return DGA_IDirectDrawSurface_QueryInterface((LPDIRECTDRAWSURFACE)this,riid,ppobj);
-}
-
-static HRESULT WINAPI XShm_IDirectDrawSurface2_QueryInterface(
- LPDIRECTDRAWSURFACE2 this,REFIID riid,LPVOID *ppobj
-) {
- return XShm_IDirectDrawSurface_QueryInterface((LPDIRECTDRAWSURFACE)this,riid,ppobj);
-}
-
-static HRESULT WINAPI Xlib_IDirectDrawSurface2_QueryInterface(
- LPDIRECTDRAWSURFACE2 this,REFIID riid,LPVOID *ppobj
-) {
- return Xlib_IDirectDrawSurface_QueryInterface((LPDIRECTDRAWSURFACE)this,riid,ppobj);
-}
-
-static HRESULT WINAPI IDirectDrawSurface2_IsLost(LPDIRECTDRAWSURFACE2 this) {
- return 0; /* hmm */
-}
-
-static struct IDirectDrawSurface2_VTable dga_dds2vt = {
- DGA_IDirectDrawSurface2_QueryInterface,
- IDirectDrawSurface2_AddRef,
- DGA_IDirectDrawSurface2_Release,
- (void*)4,
- (void*)5,
- IDirectDrawSurface2_Blt,
- IDirectDrawSurface2_BltBatch,
- IDirectDrawSurface2_BltFast,
- (void*)9,
- IDirectDrawSurface2_EnumAttachedSurfaces,
- (void*)11,
- DGA_IDirectDrawSurface2_Flip,
- DGA_IDirectDrawSurface2_GetAttachedSurface,
- (void*)14,
- (void*)15/*IDirectDrawSurface_GetCaps*/,
- (void*)16,
- (void*)17,
- (void*)18,
- (void*)19,
- (void*)20,
- (void*)21,
- (void*)22,
- (void*)23/*IDirectDrawSurface_GetSurfaceDesc*/,
- (void*)24,
- IDirectDrawSurface2_IsLost,
- IDirectDrawSurface2_Lock,
- (void*)27,
- (void*)28,
- (void*)29,
- (void*)30,
- (void*)31,
- IDirectDrawSurface2_SetPalette,
- DGA_IDirectDrawSurface2_Unlock,
- (void*)34,
- (void*)35,
- (void*)36,
- (void*)37,
- (void*)38,
- (void*)39,
-};
-
-static struct IDirectDrawSurface2_VTable xshm_dds2vt = {
- XShm_IDirectDrawSurface2_QueryInterface,
- IDirectDrawSurface2_AddRef,
- XShm_IDirectDrawSurface2_Release,
- (void*)4,
- (void*)5,
- IDirectDrawSurface2_Blt,
- IDirectDrawSurface2_BltBatch,
- IDirectDrawSurface2_BltFast,
- (void*)9,
- IDirectDrawSurface2_EnumAttachedSurfaces,
- (void*)11,
- XShm_IDirectDrawSurface2_Flip,
- XShm_IDirectDrawSurface2_GetAttachedSurface,
- (void*)14,
- (void*)15/*IDirectDrawSurface_GetCaps*/,
- (void*)16,
- (void*)17,
- (void*)18,
- (void*)19,
- (void*)20,
- (void*)21,
- (void*)22,
- (void*)23/*IDirectDrawSurface_GetSurfaceDesc*/,
- (void*)24,
- IDirectDrawSurface2_IsLost,
- IDirectDrawSurface2_Lock,
- (void*)27,
- (void*)28,
- (void*)29,
- (void*)30,
- (void*)31,
- IDirectDrawSurface2_SetPalette,
- XShm_IDirectDrawSurface2_Unlock,
- (void*)34,
- (void*)35,
- (void*)36,
- (void*)37,
- (void*)38,
- (void*)39,
-};
-
-static struct IDirectDrawSurface2_VTable xlib_dds2vt = {
- Xlib_IDirectDrawSurface2_QueryInterface,
- IDirectDrawSurface2_AddRef,
- Xlib_IDirectDrawSurface2_Release,
- (void*)4,
- (void*)5,
- IDirectDrawSurface2_Blt,
- IDirectDrawSurface2_BltBatch,
- IDirectDrawSurface2_BltFast,
- (void*)9,
- IDirectDrawSurface2_EnumAttachedSurfaces,
- (void*)11,
- Xlib_IDirectDrawSurface2_Flip,
- Xlib_IDirectDrawSurface2_GetAttachedSurface,
- (void*)14,
- (void*)15/*IDirectDrawSurface_GetCaps*/,
- (void*)16,
- (void*)17,
- (void*)18,
- (void*)19,
- (void*)20,
- (void*)21,
- (void*)22,
- (void*)23/*IDirectDrawSurface_GetSurfaceDesc*/,
- (void*)24,
- IDirectDrawSurface2_IsLost,
- IDirectDrawSurface2_Lock,
- (void*)27,
- (void*)28,
- (void*)29,
- (void*)30,
- (void*)31,
- IDirectDrawSurface2_SetPalette,
- Xlib_IDirectDrawSurface2_Unlock,
- (void*)34,
- (void*)35,
- (void*)36,
- (void*)37,
- (void*)38,
- (void*)39,
-};
-
-/******************************************************************************
- * IDirectDrawSurface3
- */
-static HRESULT WINAPI IDirectDrawSurface3_SetPalette(
- LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWPALETTE pal
-) {
- return IDirectDrawSurface_SetPalette((LPDIRECTDRAWSURFACE)this,pal);
-}
-
static HRESULT WINAPI IDirectDrawSurface3_GetPixelFormat(
LPDIRECTDRAWSURFACE3 this,LPDDPIXELFORMAT pf
) {
return _getpixelformat(this->s.ddraw,pf);
}
-static HRESULT WINAPI DGA_IDirectDrawSurface3_GetAttachedSurface(
- LPDIRECTDRAWSURFACE3 this,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE3 *lpdsf
-) {
- HRESULT ret;
-
- ret = IDirectDrawSurface_GetAttachedSurface((LPDIRECTDRAWSURFACE)this,lpddsd,(LPDIRECTDRAWSURFACE*)lpdsf);
-
- if (!ret) {
- (*lpdsf)->lpvtbl = &dga_dds3vt;
- }
- return ret;
-}
-
-static HRESULT WINAPI XShm_IDirectDrawSurface3_GetAttachedSurface(
- LPDIRECTDRAWSURFACE3 this,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE3 *lpdsf
-) {
- HRESULT ret;
-
- ret = IDirectDrawSurface_GetAttachedSurface((LPDIRECTDRAWSURFACE)this,lpddsd,(LPDIRECTDRAWSURFACE*)lpdsf);
-
- if (!ret) {
- (*lpdsf)->lpvtbl = &xshm_dds3vt;
- }
- return ret;
-}
-
-static HRESULT WINAPI Xlib_IDirectDrawSurface3_GetAttachedSurface(
- LPDIRECTDRAWSURFACE3 this,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE3 *lpdsf
-) {
- HRESULT ret;
-
- ret = IDirectDrawSurface_GetAttachedSurface((LPDIRECTDRAWSURFACE)this,lpddsd,(LPDIRECTDRAWSURFACE*)lpdsf);
-
- if (!ret) {
- (*lpdsf)->lpvtbl = &xlib_dds3vt;
- }
- return ret;
-}
-
-static ULONG WINAPI IDirectDrawSurface3_AddRef(LPDIRECTDRAWSURFACE3 this) {
- TRACE(ddraw,"(%p)->AddRef()\n",this);
- return ++(this->ref);
-}
-
-static ULONG WINAPI DGA_IDirectDrawSurface3_Release(LPDIRECTDRAWSURFACE3 this) {
- return DGA_IDirectDrawSurface_Release((LPDIRECTDRAWSURFACE)this);
-}
-
-static ULONG WINAPI XShm_IDirectDrawSurface3_Release(LPDIRECTDRAWSURFACE3 this) {
- return XShm_IDirectDrawSurface_Release((LPDIRECTDRAWSURFACE)this);
-}
-
-static ULONG WINAPI Xlib_IDirectDrawSurface3_Release(LPDIRECTDRAWSURFACE3 this) {
- return Xlib_IDirectDrawSurface_Release((LPDIRECTDRAWSURFACE)this);
-}
-
-static HRESULT WINAPI IDirectDrawSurface3_Blt(
- LPDIRECTDRAWSURFACE3 this,LPRECT32 rdst,LPDIRECTDRAWSURFACE3 src,
- LPRECT32 rsrc,DWORD dwFlags,LPDDBLTFX lpbltfx
-) {
- return IDirectDrawSurface_Blt((LPDIRECTDRAWSURFACE)this,rdst,(LPDIRECTDRAWSURFACE)src,rsrc,dwFlags,lpbltfx);
-}
-
-static HRESULT WINAPI IDirectDrawSurface3_IsLost(LPDIRECTDRAWSURFACE3 this) {
- return 0; /* hmm */
-}
-
-static HRESULT WINAPI IDirectDrawSurface3_Restore(LPDIRECTDRAWSURFACE3 this) {
+static HRESULT WINAPI IDirectDrawSurface3_GetBltStatus(LPDIRECTDRAWSURFACE3 this,DWORD dwFlags) {
+ FIXME(ddraw,"(%p)->(0x%08lx),stub!\n",this,dwFlags);
return 0;
}
-static HRESULT WINAPI IDirectDrawSurface3_GetBltStatus(
- LPDIRECTDRAWSURFACE3 this,DWORD dwflags
+static HRESULT WINAPI IDirectDrawSurface3_GetOverlayPosition(
+ LPDIRECTDRAWSURFACE3 this,LPLONG x1,LPLONG x2
) {
- return IDirectDrawSurface_GetBltStatus((LPDIRECTDRAWSURFACE)this,dwflags);
+ FIXME(ddraw,"(%p)->(%p,%p),stub!\n",this,x1,x2);
+ return 0;
}
-static HRESULT WINAPI DGA_IDirectDrawSurface3_Flip(
- LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWSURFACE3 flipto,DWORD dwFlags
+static HRESULT WINAPI IDirectDrawSurface3_SetClipper(
+ LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWCLIPPER clipper
) {
- return DGA_IDirectDrawSurface_Flip((LPDIRECTDRAWSURFACE)this,(LPDIRECTDRAWSURFACE)flipto,dwFlags);
+ FIXME(ddraw,"(%p)->(%p),stub!\n",this,clipper);
+ return 0;
}
-static HRESULT WINAPI XShm_IDirectDrawSurface3_Flip(
- LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWSURFACE3 flipto,DWORD dwFlags
+static HRESULT WINAPI IDirectDrawSurface3_AddAttachedSurface(
+ LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWSURFACE3 surf
) {
- return XShm_IDirectDrawSurface_Flip((LPDIRECTDRAWSURFACE)this,(LPDIRECTDRAWSURFACE)flipto,dwFlags);
+ FIXME(ddraw,"(%p)->(%p),stub!\n",this,surf);
+ this->s.backbuffer = surf;
+ return 0;
}
-static HRESULT WINAPI Xlib_IDirectDrawSurface3_Flip(
- LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWSURFACE3 flipto,DWORD dwFlags
-) {
- return Xlib_IDirectDrawSurface_Flip((LPDIRECTDRAWSURFACE)this,(LPDIRECTDRAWSURFACE)flipto,dwFlags);
+static HRESULT WINAPI IDirectDrawSurface3_GetDC(LPDIRECTDRAWSURFACE3 this,HDC32* lphdc) {
+ FIXME(ddraw,"(%p)->GetDC(%p)\n",this,lphdc);
+ *lphdc = GetDC32(this->s.ddraw->e.xlib.window);
+ return 0;
}
-static HRESULT WINAPI IDirectDrawSurface3_Lock(
- LPDIRECTDRAWSURFACE3 this,LPRECT32 lprect,LPDDSURFACEDESC lpddsd,DWORD flags, HANDLE32 hnd
-) {
- return IDirectDrawSurface_Lock((LPDIRECTDRAWSURFACE)this,lprect,lpddsd,flags,hnd);
+static HRESULT WINAPI IDirectDrawSurface3_ReleaseDC(LPDIRECTDRAWSURFACE3 this,HDC32 hdc) {
+ FIXME(ddraw,"(%p)->(0x%08lx),stub!\n",this,(long)hdc);
+ ReleaseDC32(this->s.ddraw->e.xlib.window,hdc);
+ return 0;
}
-static HRESULT WINAPI DGA_IDirectDrawSurface3_Unlock(
- LPDIRECTDRAWSURFACE3 this,LPVOID surface
-) {
- return DGA_IDirectDrawSurface_Unlock((LPDIRECTDRAWSURFACE)this,surface);
+
+static HRESULT WINAPI IDirectDrawSurface3_QueryInterface(LPDIRECTDRAWSURFACE3 this,REFIID refiid,LPVOID *obj) {
+ char xrefiid[50];
+
+ WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
+ TRACE(ddraw,"(%p)->(%s,%p)\n",this,xrefiid,obj);
+
+ /* DirectDrawSurface,DirectDrawSurface2 and DirectDrawSurface3 use
+ * the same interface. And IUnknown does that too of course.
+ */
+ if ( !memcmp(&IID_IDirectDrawSurface3,refiid,sizeof(IID)) ||
+ !memcmp(&IID_IDirectDrawSurface2,refiid,sizeof(IID)) ||
+ !memcmp(&IID_IDirectDrawSurface,refiid,sizeof(IID)) ||
+ !memcmp(&IID_IUnknown,refiid,sizeof(IID))
+ ) {
+ *obj = this;
+ this->lpvtbl->fnAddRef(this);
+ return 0;
+ }
+ FIXME(ddraw,"(%p):interface for IID %s NOT found!\n",this,xrefiid);
+ return OLE_E_ENUM_NOMORE;
}
-static HRESULT WINAPI XShm_IDirectDrawSurface3_Unlock(
- LPDIRECTDRAWSURFACE3 this,LPVOID surface
-) {
- return XShm_IDirectDrawSurface_Unlock((LPDIRECTDRAWSURFACE)this,surface);
-}
-
-static HRESULT WINAPI Xlib_IDirectDrawSurface3_Unlock(
- LPDIRECTDRAWSURFACE3 this,LPVOID surface
-) {
- return Xlib_IDirectDrawSurface_Unlock((LPDIRECTDRAWSURFACE)this,surface);
+static HRESULT WINAPI IDirectDrawSurface3_IsLost(LPDIRECTDRAWSURFACE3 this) {
+ FIXME(ddraw,"(%p)->(), stub!\n",this);
+ return 0; /* hmm */
}
static HRESULT WINAPI IDirectDrawSurface3_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE3 this,LPVOID context,LPDDENUMSURFACESCALLBACK esfcb) {
@@ -1467,61 +846,49 @@
return 0;
}
-static HRESULT WINAPI IDirectDrawSurface3_SetClipper(
- LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWCLIPPER clipper
-) {
- return IDirectDrawSurface_SetClipper((LPDIRECTDRAWSURFACE)this,clipper);
+static HRESULT WINAPI IDirectDrawSurface3_Restore(LPDIRECTDRAWSURFACE3 this) {
+ FIXME(ddraw,"(%p)->(),stub!\n",this);
+ return 0;
}
-static HRESULT WINAPI DGA_IDirectDrawSurface3_QueryInterface(
- LPDIRECTDRAWSURFACE3 this,REFIID riid,LPVOID *ppobj
+static HRESULT WINAPI IDirectDrawSurface3_SetColorKey(
+ LPDIRECTDRAWSURFACE3 this,DWORD x,LPDDCOLORKEY ckey
) {
- return DGA_IDirectDrawSurface_QueryInterface((LPDIRECTDRAWSURFACE)this,riid,ppobj);
-}
-
-static HRESULT WINAPI XShm_IDirectDrawSurface3_QueryInterface(
- LPDIRECTDRAWSURFACE3 this,REFIID riid,LPVOID *ppobj
-) {
- return XShm_IDirectDrawSurface_QueryInterface((LPDIRECTDRAWSURFACE)this,riid,ppobj);
-}
-
-static HRESULT WINAPI Xlib_IDirectDrawSurface3_QueryInterface(
- LPDIRECTDRAWSURFACE3 this,REFIID riid,LPVOID *ppobj
-) {
- return Xlib_IDirectDrawSurface_QueryInterface((LPDIRECTDRAWSURFACE)this,riid,ppobj);
+ FIXME(ddraw,"(%p)->(0x%08lx,%p),stub!\n",this,x,ckey);
+ return 0;
}
static struct IDirectDrawSurface3_VTable dga_dds3vt = {
- DGA_IDirectDrawSurface3_QueryInterface,
+ IDirectDrawSurface3_QueryInterface,
IDirectDrawSurface3_AddRef,
DGA_IDirectDrawSurface3_Release,
- (void*)4,
+ IDirectDrawSurface3_AddAttachedSurface,
(void*)5,
IDirectDrawSurface3_Blt,
- (void*)7,
- (void*)8,
+ IDirectDrawSurface3_BltBatch,
+ IDirectDrawSurface3_BltFast,
(void*)9,
IDirectDrawSurface3_EnumAttachedSurfaces,
(void*)11,
DGA_IDirectDrawSurface3_Flip,
- DGA_IDirectDrawSurface3_GetAttachedSurface,
+ IDirectDrawSurface3_GetAttachedSurface,
IDirectDrawSurface3_GetBltStatus,
- (void*)15,
+ IDirectDrawSurface3_GetCaps,
(void*)16,
(void*)17,
- (void*)18,
+ IDirectDrawSurface3_GetDC,
(void*)19,
- (void*)20,
+ IDirectDrawSurface3_GetOverlayPosition,
(void*)21,
IDirectDrawSurface3_GetPixelFormat,
- (void*)23,
- (void*)24,
+ IDirectDrawSurface3_GetSurfaceDesc,
+ IDirectDrawSurface3_Initialize,
IDirectDrawSurface3_IsLost,
IDirectDrawSurface3_Lock,
- (void*)27,
+ IDirectDrawSurface3_ReleaseDC,
IDirectDrawSurface3_Restore,
IDirectDrawSurface3_SetClipper,
- (void*)30,
+ IDirectDrawSurface3_SetColorKey,
(void*)31,
IDirectDrawSurface3_SetPalette,
DGA_IDirectDrawSurface3_Unlock,
@@ -1535,36 +902,36 @@
};
static struct IDirectDrawSurface3_VTable xshm_dds3vt = {
- XShm_IDirectDrawSurface3_QueryInterface,
+ IDirectDrawSurface3_QueryInterface,
IDirectDrawSurface3_AddRef,
XShm_IDirectDrawSurface3_Release,
- (void*)4,
+ IDirectDrawSurface3_AddAttachedSurface,
(void*)5,
IDirectDrawSurface3_Blt,
- (void*)7,
- (void*)8,
+ IDirectDrawSurface3_BltBatch,
+ IDirectDrawSurface3_BltFast,
(void*)9,
IDirectDrawSurface3_EnumAttachedSurfaces,
(void*)11,
XShm_IDirectDrawSurface3_Flip,
- XShm_IDirectDrawSurface3_GetAttachedSurface,
+ IDirectDrawSurface3_GetAttachedSurface,
IDirectDrawSurface3_GetBltStatus,
- (void*)15,
+ IDirectDrawSurface3_GetCaps,
(void*)16,
(void*)17,
- (void*)18,
+ IDirectDrawSurface3_GetDC,
(void*)19,
- (void*)20,
+ IDirectDrawSurface3_GetOverlayPosition,
(void*)21,
IDirectDrawSurface3_GetPixelFormat,
- (void*)23,
- (void*)24,
+ IDirectDrawSurface3_GetSurfaceDesc,
+ IDirectDrawSurface3_Initialize,
IDirectDrawSurface3_IsLost,
IDirectDrawSurface3_Lock,
- (void*)27,
+ IDirectDrawSurface3_ReleaseDC,
IDirectDrawSurface3_Restore,
IDirectDrawSurface3_SetClipper,
- (void*)30,
+ IDirectDrawSurface3_SetColorKey,
(void*)31,
IDirectDrawSurface3_SetPalette,
XShm_IDirectDrawSurface3_Unlock,
@@ -1578,36 +945,36 @@
};
static struct IDirectDrawSurface3_VTable xlib_dds3vt = {
- Xlib_IDirectDrawSurface3_QueryInterface,
+ IDirectDrawSurface3_QueryInterface,
IDirectDrawSurface3_AddRef,
Xlib_IDirectDrawSurface3_Release,
- (void*)4,
+ IDirectDrawSurface3_AddAttachedSurface,
(void*)5,
IDirectDrawSurface3_Blt,
- (void*)7,
- (void*)8,
+ IDirectDrawSurface3_BltBatch,
+ IDirectDrawSurface3_BltFast,
(void*)9,
IDirectDrawSurface3_EnumAttachedSurfaces,
(void*)11,
Xlib_IDirectDrawSurface3_Flip,
- Xlib_IDirectDrawSurface3_GetAttachedSurface,
+ IDirectDrawSurface3_GetAttachedSurface,
IDirectDrawSurface3_GetBltStatus,
- (void*)15,
+ IDirectDrawSurface3_GetCaps,
(void*)16,
(void*)17,
- (void*)18,
+ IDirectDrawSurface3_GetDC,
(void*)19,
- (void*)20,
+ IDirectDrawSurface3_GetOverlayPosition,
(void*)21,
IDirectDrawSurface3_GetPixelFormat,
- (void*)23,
- (void*)24,
+ IDirectDrawSurface3_GetSurfaceDesc,
+ IDirectDrawSurface3_Initialize,
IDirectDrawSurface3_IsLost,
IDirectDrawSurface3_Lock,
- (void*)27,
+ IDirectDrawSurface3_ReleaseDC,
IDirectDrawSurface3_Restore,
IDirectDrawSurface3_SetClipper,
- (void*)30,
+ IDirectDrawSurface3_SetColorKey,
(void*)31,
IDirectDrawSurface3_SetPalette,
Xlib_IDirectDrawSurface3_Unlock,
@@ -1646,6 +1013,13 @@
return 0;
}
+static HRESULT WINAPI IDirectDrawClipper_SetClipList(
+ LPDIRECTDRAWCLIPPER this,LPRGNDATA lprgn,DWORD hmm
+) {
+ FIXME(ddraw,"(%p,%p,%ld),stub!\n",this,lprgn,hmm);
+ return 0;
+}
+
static struct IDirectDrawClipper_VTable ddclipvt = {
(void*)1,
(void*)2,
@@ -1654,7 +1028,7 @@
(void*)5,
(void*)6,
(void*)7,
- (void*)8,
+ IDirectDrawClipper_SetClipList,
IDirectDrawClipper_SetHwnd
};
@@ -1668,7 +1042,7 @@
int i;
if (!this->cm) /* should not happen */ {
- TRACE(ddraw,"app tried to read colormap for non-palettized mode\n");
+ FIXME(ddraw,"app tried to read colormap for non-palettized mode\n");
return DDERR_GENERIC;
}
for (i=start;i<end;i++) {
@@ -1691,11 +1065,11 @@
this,x,start,end,palent
);
if (!this->cm) /* should not happen */ {
- TRACE(ddraw,"app tried to set colormap in non-palettized mode\n");
+ FIXME(ddraw,"app tried to set colormap in non-palettized mode\n");
return DDERR_GENERIC;
}
/* FIXME: free colorcells instead of freeing whole map */
- this->cm = TSXCopyColormapAndFree(display,this->cm);
+ /*this->cm = TSXCopyColormapAndFree(display,this->cm);*/
for (i=start;i<end;i++) {
xc.red = palent[i-start].peRed<<8;
xc.blue = palent[i-start].peBlue<<8;
@@ -1717,23 +1091,13 @@
HRESULT hres;
hres = common_IDirectDrawPalette_SetEntries(this,x,start,end,palent);
if (hres != 0) return hres;
- XF86DGAInstallColormap(display,DefaultScreen(display),this->cm);
+ TSXF86DGAInstallColormap(display,DefaultScreen(display),this->cm);
return 0;
#else /* defined(HAVE_LIBXXF86DGA) */
return E_UNEXPECTED;
#endif /* defined(HAVE_LIBXXF86DGA) */
}
-static HRESULT WINAPI Xlib_IDirectDrawPalette_SetEntries(
- LPDIRECTDRAWPALETTE this,DWORD x,DWORD start,DWORD end,LPPALETTEENTRY palent
-) {
- HRESULT hres;
- hres = common_IDirectDrawPalette_SetEntries(this,x,start,end,palent);
- if (hres != 0) return hres;
- TSXInstallColormap(display,this->cm);
- return 0;
-}
-
static ULONG WINAPI IDirectDrawPalette_Release(LPDIRECTDRAWPALETTE this) {
if (!--(this->ref)) {
if (this->cm) {
@@ -1773,7 +1137,7 @@
(void*)4,
IDirectDrawPalette_GetEntries,
IDirectDrawPalette_Initialize,
- Xlib_IDirectDrawPalette_SetEntries
+ common_IDirectDrawPalette_SetEntries
};
static struct IDirectDrawPalette_VTable xlib_ddpalvt = {
@@ -1783,7 +1147,7 @@
(void*)4,
IDirectDrawPalette_GetEntries,
IDirectDrawPalette_Initialize,
- Xlib_IDirectDrawPalette_SetEntries
+ common_IDirectDrawPalette_SetEntries
};
/*******************************************************************************
@@ -1850,8 +1214,7 @@
#ifdef HAVE_LIBXXF86DGA
int i;
- TRACE(ddraw, "(%p)->(%p,%p,%p)\n",
- this,lpddsd,lpdsf,lpunk);
+ TRACE(ddraw, "(%p)->(%p,%p,%p)\n",this,lpddsd,lpdsf,lpunk);
if (TRACE_ON(ddraw)) {
DUMP("[w=%ld,h=%ld,flags ",lpddsd->dwWidth,lpddsd->dwHeight);
_dump_DDSD(lpddsd->dwFlags);
@@ -1863,14 +1226,14 @@
*lpdsf = (LPDIRECTDRAWSURFACE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface));
this->lpvtbl->fnAddRef(this);
(*lpdsf)->ref = 1;
- (*lpdsf)->lpvtbl = &dga_ddsvt;
+ (*lpdsf)->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&dga_dds3vt;
if ( (lpddsd->dwFlags & DDSD_CAPS) &&
(lpddsd->ddsCaps.dwCaps & DDSCAPS_OFFSCREENPLAIN)
) {
if (!(lpddsd->dwFlags & DDSD_WIDTH))
lpddsd->dwWidth = this->e.dga.fb_width;
if (!(lpddsd->dwFlags & DDSD_HEIGHT))
- lpddsd->dwWidth = this->e.dga.fb_height;
+ lpddsd->dwHeight = this->e.dga.fb_height;
(*lpdsf)->s.surface = (LPBYTE)HeapAlloc(GetProcessHeap(),0,lpddsd->dwWidth*lpddsd->dwHeight*this->d.depth/8);
(*lpdsf)->t.dga.fb_height = -1;
(*lpdsf)->s.lpitch = lpddsd->dwWidth*this->d.depth/8;
@@ -1894,15 +1257,15 @@
(*lpdsf)->s.ddraw = this;
(*lpdsf)->s.backbuffer = NULL;
if (lpddsd->dwFlags & DDSD_BACKBUFFERCOUNT) {
- LPDIRECTDRAWSURFACE back;
+ LPDIRECTDRAWSURFACE3 back;
if (lpddsd->dwBackBufferCount>1)
FIXME(ddraw,"urks, wants to have more than one backbuffer (%ld)!\n",lpddsd->dwBackBufferCount);
- (*lpdsf)->s.backbuffer = back = (LPDIRECTDRAWSURFACE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface));
+ (*lpdsf)->s.backbuffer = back = (LPDIRECTDRAWSURFACE3)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface3));
this->lpvtbl->fnAddRef(this);
back->ref = 1;
- back->lpvtbl = &dga_ddsvt;
+ back->lpvtbl = (LPDIRECTDRAWSURFACE3_VTABLE)&dga_dds3vt;
for (i=0;i<32;i++)
if (!(this->e.dga.vpmask & (1<<i)))
break;
@@ -1931,8 +1294,7 @@
#ifdef HAVE_LIBXXSHM
XImage *img;
int shmid;
- TRACE(ddraw, "(%p)->CreateSurface(%p,%p,%p)\n",
- this,lpddsd,lpdsf,lpunk);
+ TRACE(ddraw,"(%p)->CreateSurface(%p,%p,%p)\n",this,lpddsd,lpdsf,lpunk);
if (TRACE_ON(ddraw)) {
fprintf(stderr,"[w=%ld,h=%ld,flags ",lpddsd->dwWidth,lpddsd->dwHeight);
_dump_DDSD(lpddsd->dwFlags);
@@ -1945,7 +1307,7 @@
*lpdsf = (LPDIRECTDRAWSURFACE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface));
this->lpvtbl->fnAddRef(this);
(*lpdsf)->ref = 1;
- (*lpdsf)->lpvtbl = &xshm_ddsvt;
+ (*lpdsf)->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&xshm_dds3vt;
(*lpdsf)->t.xshm.image = img =
XShmCreateImage(display, /*FIXME:visual*/0, /*FIXME:depth*/8, ZPixmap,
NULL, &(*lpdsf)->t.xshm.shminfo,
@@ -1953,9 +1315,8 @@
(*lpdsf)->t.xshm.shminfo.shmid = shmid =
shmget(IPC_PRIVATE, img->bytes_per_line*img->height, IPC_CREAT|0777);
(*lpdsf)->t.xshm.shminfo.shmaddr = img->data = shmat(shmid, 0, 0);
- XShmAttach(display, &(*lpdsf)->t.xshm.shminfo);
+ TSXShmAttach(display, &(*lpdsf)->t.xshm.shminfo);
/* POOLE FIXME: XShm: this will easily break */
- (*lpdsf)->t.xshm.surface_is_image_data = TRUE;
(*lpdsf)->s.surface = img->data;
/* END FIXME: XShm */
(*lpdsf)->s.lpitch = img->bytes_per_line;
@@ -1986,21 +1347,74 @@
*lpdsf = (LPDIRECTDRAWSURFACE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface));
this->lpvtbl->fnAddRef(this);
(*lpdsf)->ref = 1;
- (*lpdsf)->lpvtbl = &xlib_ddsvt;
- TRACE(ddraw,"using standard XImage for a primary surface\n");
- /* POOLE FIXME: Xlib: this will easily break */
- (*lpdsf)->t.xshm.surface_is_image_data = TRUE;
- (*lpdsf)->s.surface = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,640*480);
- (*lpdsf)->t.xlib.image = img =
- XCreateImage(display, /*FIXME:visual*/0, /*FIXME: depth*/8, ZPixmap,
- 0, (*lpdsf)->s.surface,
- /*FIXME:width*/640, /*FIXME:height*/480, 0, 640*1);
- /* END FIXME: Xlib */
- (*lpdsf)->s.lpitch = img->bytes_per_line;
- (*lpdsf)->s.width = img->width;
- (*lpdsf)->s.height = img->height;
+ (*lpdsf)->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&xlib_dds3vt;
+ if ( (lpddsd->dwFlags & DDSD_CAPS) &&
+ (lpddsd->ddsCaps.dwCaps & DDSCAPS_OFFSCREENPLAIN)
+ ) {
+ if (!(lpddsd->dwFlags & DDSD_WIDTH))
+ lpddsd->dwWidth = this->e.dga.fb_width;
+ if (!(lpddsd->dwFlags & DDSD_HEIGHT))
+ lpddsd->dwHeight = this->e.dga.fb_height;
+ (*lpdsf)->s.surface = (LPBYTE)HeapAlloc(GetProcessHeap(),0,lpddsd->dwWidth*lpddsd->dwHeight*this->d.depth/8);
+ TRACE(ddraw,"using system memory for a primary surface\n");
+ } else {
+ TRACE(ddraw,"using standard XImage for a primary surface\n");
+ /* FIXME: !8 bit images */
+ (*lpdsf)->s.surface = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,lpddsd->dwHeight*lpddsd->dwWidth);
+ (*lpdsf)->s.width = this->d.width;
+ (*lpdsf)->s.height = this->d.height;
+ }
(*lpdsf)->s.ddraw = this;
- (*lpdsf)->s.backbuffer = NULL;
+ (*lpdsf)->t.xlib.image = img =
+ TSXCreateImage( display,
+ DefaultVisualOfScreen(screen),
+ /*FIXME: depth*/8,
+ ZPixmap,
+ 0,
+ (*lpdsf)->s.surface,
+ (*lpdsf)->s.width,
+ (*lpdsf)->s.height,
+ 32,
+ (*lpdsf)->s.width*1
+ /* FIXME: !8 bit images */
+ );
+ /* END FIXME: Xlib */
+ (*lpdsf)->s.lpitch = img->bytes_per_line;
+ assert(img);
+ if (lpddsd->dwFlags & DDSD_BACKBUFFERCOUNT) {
+ LPDIRECTDRAWSURFACE3 back;
+
+ if (lpddsd->dwBackBufferCount>1)
+ FIXME(ddraw,"urks, wants to have more than one backbuffer (%ld)!\n",lpddsd->dwBackBufferCount);
+
+ (*lpdsf)->s.backbuffer = back = (LPDIRECTDRAWSURFACE3)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface3));
+ this->lpvtbl->fnAddRef(this);
+ back->ref = 1;
+ back->lpvtbl = (LPDIRECTDRAWSURFACE3_VTABLE)&xlib_dds3vt;
+ /* FIXME: !8 bit images */
+ back->s.surface = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,
+ img->width*img->height
+ );
+ back->t.xlib.image = TSXCreateImage(
+ display,
+ DefaultVisualOfScreen(screen),
+ /*FIXME: depth*/8,
+ ZPixmap,
+ 0,
+ back->s.surface,
+ this->d.width,
+ this->d.height,
+ 32,
+ this->d.width*1
+ /* FIXME: !8 bit images */
+ );
+ back->s.width = this->d.width;
+ back->s.height = this->d.height;
+ back->s.ddraw = this;
+ back->s.lpitch = back->t.xlib.image->bytes_per_line;
+ back->s.backbuffer = NULL; /* does not have a backbuffer, it is
+ * one! */
+ }
return 0;
}
@@ -2052,8 +1466,7 @@
#ifdef HAVE_LIBXXF86DGA
int i,*depths,depcount;
- TRACE(ddraw, "(%p)->(%ld,%ld,%ld)\n",
- this, width, height, depth);
+ TRACE(ddraw, "(%p)->(%ld,%ld,%ld)\n", this, width, height, depth);
depths = TSXListDepths(display,DefaultScreen(display),&depcount);
for (i=0;i<depcount;i++)
@@ -2064,8 +1477,8 @@
ERR(ddraw,"(w=%ld,h=%ld,d=%ld), unsupported depth!\n",width,height,depth);
return DDERR_UNSUPPORTEDMODE;
}
- if (this->e.dga.fb_width < width) {
- ERR(ddraw,"SetDisplayMode(w=%ld,h=%ld,d=%ld), width %ld exceeds framebuffer width %ld\n",width,height,depth,width,this->e.dga.fb_width);
+ if (this->d.width < width) {
+ ERR(ddraw,"SetDisplayMode(w=%ld,h=%ld,d=%ld), width %ld exceeds framebuffer width %ld\n",width,height,depth,width,this->d.width);
return DDERR_UNSUPPORTEDMODE;
}
this->d.width = width;
@@ -2079,9 +1492,9 @@
* can we save them? and restore them later? In a way that
* it works for the library too?
*/
- XF86DGADirectVideo(display,DefaultScreen(display),XF86DGADirectGraphics);
+ TSXF86DGADirectVideo(display,DefaultScreen(display),XF86DGADirectGraphics);
/*
- XF86DGASetViewPort(display,DefaultScreen(display),0,this->d.fb_height);
+ TSXF86DGASetViewPort(display,DefaultScreen(display),0,this->d.fb_height);
*/
#ifdef RESTORE_SIGNALS
@@ -2089,7 +1502,7 @@
#endif
return 0;
#else /* defined(HAVE_LIBXXF86DGA) */
- return E_UNEXPECTED
+ return E_UNEXPECTED;
#endif /* defined(HAVE_LIBXXF86DGA) */
}
@@ -2113,9 +1526,8 @@
MessageBox32A(0,buf,"WINE DirectDraw",MB_OK|MB_ICONSTOP);
return DDERR_UNSUPPORTEDMODE;
}
- /* POOLE FIXME: XShm */
- if (this->e.dga.fb_width < width) {
- sprintf(buf,"SetDisplayMode(w=%ld,h=%ld,d=%ld), width %ld exceeds framebuffer width %ld",width,height,depth,width,this->e.dga.fb_width);
+ if (this->d.width < width) {
+ sprintf(buf,"SetDisplayMode(w=%ld,h=%ld,d=%ld), width %ld exceeds framebuffer width %ld",width,height,depth,width,this->d.width);
MessageBox32A(0,buf,"WINE DirectDraw",MB_OK|MB_ICONSTOP);
return DDERR_UNSUPPORTEDMODE;
}
@@ -2151,19 +1563,34 @@
MessageBox32A(0,buf,"WINE DirectDraw",MB_OK|MB_ICONSTOP);
return DDERR_UNSUPPORTEDMODE;
}
- /* POOLE FIXME: Xlib */
- if (this->e.dga.fb_width < width) {
- sprintf(buf,"SetDisplayMode(w=%ld,h=%ld,d=%ld), width %ld exceeds framebuffer width %ld",width,height,depth,width,this->e.dga.fb_width);
+ if (this->d.width < width) {
+ sprintf(buf,"SetDisplayMode(w=%ld,h=%ld,d=%ld), width %ld exceeds framebuffer width %ld",width,height,depth,width,this->d.width);
MessageBox32A(0,buf,"WINE DirectDraw",MB_OK|MB_ICONSTOP);
return DDERR_UNSUPPORTEDMODE;
}
+ this->e.xlib.window = CreateWindowEx32A(
+ 0,
+ "WINE_DirectDraw",
+ "WINE_DirectDraw",
+ WS_VISIBLE|WS_SYSMENU|WS_THICKFRAME,
+ 0,0,
+ width,
+ height,
+ 0,
+ 0,
+ 0,
+ NULL
+ );
+ ShowWindow32(this->e.xlib.window,TRUE);
+ UpdateWindow32(this->e.xlib.window);
+ assert(this->e.xlib.window);
+ this->e.xlib.drawable = WIN_FindWndPtr(this->e.xlib.window)->window;
this->d.width = width;
this->d.height = height;
/* adjust fb_height, so we don't overlap */
if (this->e.dga.fb_height < height)
this->e.dga.fb_height = height;
this->d.depth = depth;
- /* END FIXME: Xlib */
return 0;
}
@@ -2243,6 +1670,7 @@
if (*lpddpal == NULL) return E_OUTOFMEMORY;
(*lpddpal)->ref = 1;
(*lpddpal)->ddraw = this;
+ (*lpddpal)->installed = 0;
if (this->d.depth<=8) {
(*lpddpal)->cm = TSXCreateColormap(display,DefaultRootWindow(display),DefaultVisualOfScreen(screen),AllocAll);
} else {
@@ -2269,9 +1697,7 @@
LPDIRECTDRAW this,DWORD x,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk
) {
HRESULT res;
- TRACE(ddraw,"(%p)->(%08lx,%p,%p,%p)\n",
- this,x,palent,lpddpal,lpunk
- );
+ TRACE(ddraw,"(%p)->(%08lx,%p,%p,%p)\n",this,x,palent,lpddpal,lpunk);
res = common_IDirectDraw_CreatePalette(this,x,palent,lpddpal,lpunk);
if (res != 0) return res;
(*lpddpal)->lpvtbl = &xshm_ddpalvt;
@@ -2281,22 +1707,28 @@
static HRESULT WINAPI Xlib_IDirectDraw_CreatePalette(
LPDIRECTDRAW this,DWORD x,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk
) {
- HRESULT res;
- TRACE(ddraw,"(%p)->(%08lx,%p,%p,%p)\n",
- this,x,palent,lpddpal,lpunk
- );
- res = common_IDirectDraw_CreatePalette(this,x,palent,lpddpal,lpunk);
- if (res != 0) return res;
+ TRACE(ddraw,"(%p)->(%08lx,%p,%p,%p)\n",this,x,palent,lpddpal,lpunk);
+ *lpddpal = (LPDIRECTDRAWPALETTE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawPalette));
+ if (*lpddpal == NULL) return E_OUTOFMEMORY;
+ (*lpddpal)->ref = 1;
+ (*lpddpal)->installed = 0;
+ (*lpddpal)->ddraw = this;
+ if (this->d.depth<=8) {
+ (*lpddpal)->cm = TSXCreateColormap(display,this->e.xlib.drawable,DefaultVisualOfScreen(screen),AllocAll);
+ TSXInstallColormap(display,(*lpddpal)->cm);
+ TSXSetWindowColormap(display,this->e.xlib.drawable,(*lpddpal)->cm);
+ } else
+ /* we don't want palettes in hicolor or truecolor */
+ (*lpddpal)->cm = 0;
(*lpddpal)->lpvtbl = &xlib_ddpalvt;
return 0;
}
static HRESULT WINAPI DGA_IDirectDraw_RestoreDisplayMode(LPDIRECTDRAW this) {
#ifdef HAVE_LIBXXF86DGA
- TRACE(ddraw, "(%p)->()\n",
- this);
+ TRACE(ddraw, "(%p)->()\n",this);
Sleep(1000);
- XF86DGADirectVideo(display,DefaultScreen(display),0);
+ TSXF86DGADirectVideo(display,DefaultScreen(display),0);
#ifdef RESTORE_SIGNALS
SIGNAL_InitEmulator();
#endif
@@ -2308,8 +1740,7 @@
static HRESULT WINAPI XShm_IDirectDraw_RestoreDisplayMode(LPDIRECTDRAW this) {
#ifdef HAVE_LIBXXF86DGA
- TRACE(ddraw, "(%p)->RestoreDisplayMode()\n",
- this);
+ TRACE(ddraw, "(%p)->RestoreDisplayMode()\n", this);
Sleep(1000);
return 0;
#else /* defined(HAVE_LIBXXF86DGA) */
@@ -2318,8 +1749,7 @@
}
static HRESULT WINAPI Xlib_IDirectDraw_RestoreDisplayMode(LPDIRECTDRAW this) {
- TRACE(ddraw, "(%p)->RestoreDisplayMode()\n",
- this);
+ TRACE(ddraw, "(%p)->RestoreDisplayMode()\n", this);
return 0;
}
@@ -2337,7 +1767,7 @@
static ULONG WINAPI DGA_IDirectDraw_Release(LPDIRECTDRAW this) {
#ifdef HAVE_LIBXXF86DGA
if (!--(this->ref)) {
- XF86DGADirectVideo(display,DefaultScreen(display),0);
+ TSXF86DGADirectVideo(display,DefaultScreen(display),0);
#ifdef RESTORE_SIGNALS
SIGNAL_InitEmulator();
#endif
@@ -3020,22 +2450,23 @@
*lplpDD = (LPDIRECTDRAW)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDraw));
(*lplpDD)->lpvtbl = &dga_ddvt;
(*lplpDD)->ref = 1;
- XF86DGAQueryVersion(display,&major,&minor);
+ TSXF86DGAQueryVersion(display,&major,&minor);
TRACE(ddraw,"XF86DGA is version %d.%d\n",major,minor);
- XF86DGAQueryDirectVideo(display,DefaultScreen(display),&flags);
+ TSXF86DGAQueryDirectVideo(display,DefaultScreen(display),&flags);
if (!(flags & XF86DGADirectPresent))
- MSG("direct video is NOT ENABLED.\n");
- XF86DGAGetVideo(display,DefaultScreen(display),&addr,&width,&banksize,&memsize);
+ MSG("direct video is NOT PRESENT.\n");
+ TSXF86DGAGetVideo(display,DefaultScreen(display),&addr,&width,&banksize,&memsize);
TRACE(ddraw,"video framebuffer: begin %p, width %d,banksize %d,memsize %d\n",
addr,width,banksize,memsize
);
(*lplpDD)->e.dga.fb_width = width;
+ (*lplpDD)->d.width = width;
(*lplpDD)->e.dga.fb_addr = addr;
(*lplpDD)->e.dga.fb_memsize = memsize;
(*lplpDD)->e.dga.fb_banksize = banksize;
- XF86DGAGetViewPortSize(display,DefaultScreen(display),&width,&height);
- XF86DGASetViewPort(display,DefaultScreen(display),0,0);
+ TSXF86DGAGetViewPortSize(display,DefaultScreen(display),&width,&height);
+ TSXF86DGASetViewPort(display,DefaultScreen(display),0,0);
(*lplpDD)->e.dga.fb_height = screenHeight;
(*lplpDD)->e.dga.vpmask = 0;
@@ -3059,54 +2490,77 @@
*lplpDD = (LPDIRECTDRAW)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDraw));
(*lplpDD)->lpvtbl = &xshm_ddvt;
(*lplpDD)->ref = 1;
- (*lplpDD)->e.xshm.drawable = 0; /* FIXME: make a window */
+ (*lplpDD)->e.xshm.drawable = DefaultRootWindow(display); /* FIXME: make a window */
(*lplpDD)->d.depth = DefaultDepthOfScreen(screen);
- (*lplpDD)->d.height = (*lplpDD)->d.width = 0; /* FIXME */
+ (*lplpDD)->d.height = screenHeight;
+ (*lplpDD)->d.width = screenWidth;
return 0;
#else /* defined(HAVE_LIBXXSHM) */
return DDERR_INVALIDDIRECTDRAWGUID;
#endif /* defined(HAVE_LIBXXSHM) */
}
+LRESULT WINAPI Xlib_DDWndProc(HWND32 hwnd,UINT32 msg,WPARAM32 wParam,LPARAM lParam) {
+ LRESULT ret;
+ /*FIXME(ddraw,"(0x%04x,%s,0x%08lx,0x%08lx),stub!\n",(int)hwnd,SPY_GetMsgName(msg),(long)wParam,(long)lParam); */
+ ret = DefWindowProc32A(hwnd,msg,wParam,lParam);
+ return ret;
+}
HRESULT WINAPI Xlib_DirectDrawCreate( LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnkOuter) {
+ WNDCLASS32A wc;
+
*lplpDD = (LPDIRECTDRAW)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDraw));
(*lplpDD)->lpvtbl = &xlib_ddvt;
(*lplpDD)->ref = 1;
- (*lplpDD)->e.xshm.drawable = 0; /* FIXME: make a window */
+ (*lplpDD)->e.xlib.drawable = 0; /* in SetDisplayMode */
+ wc.style = CS_GLOBALCLASS;
+ wc.lpfnWndProc = Xlib_DDWndProc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = 0;
+ wc.hInstance = 0;
+ wc.hIcon = 0;
+ wc.hCursor = (HCURSOR32)IDC_ARROW32A;
+ wc.hbrBackground= NULL_BRUSH;
+ wc.lpszMenuName = 0;
+ wc.lpszClassName= "WINE_DirectDraw";
+
+ (*lplpDD)->e.xlib.winclass = RegisterClass32A(&wc);
+
(*lplpDD)->d.depth = DefaultDepthOfScreen(screen);
- (*lplpDD)->d.height = (*lplpDD)->d.width = 0; /* FIXME */
+ (*lplpDD)->d.height = screenHeight;
+ (*lplpDD)->d.width = screenWidth;
return 0;
}
HRESULT WINAPI DirectDrawCreate( LPGUID lpGUID, LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnkOuter ) {
char xclsid[50];
- if (lpGUID)
+ if (HIWORD(lpGUID))
WINE_StringFromCLSID(lpGUID,xclsid);
- else
- strcpy(xclsid,"<null>");
+ else {
+ sprintf(xclsid,"<guid-%0x08x>",(int)lpGUID);
+ lpGUID = NULL;
+ }
TRACE(ddraw,"(%s,%p,%p)\n",xclsid,lplpDD,pUnkOuter);
if (!lpGUID) {
/* if they didn't request a particular interface, use the best
* supported one */
- if (DDRAW_DGA_Available()) {
+ if (DDRAW_DGA_Available())
lpGUID = &DGA_DirectDraw_GUID;
- } else if (DDRAW_XShm_Available()) {
+ else if (DDRAW_XShm_Available())
lpGUID = &XSHM_DirectDraw_GUID;
- } else {
+ else
lpGUID = &XLIB_DirectDraw_GUID;
- }
}
- if (!memcmp(lpGUID, &DGA_DirectDraw_GUID, sizeof(GUID))) {
+ if (!memcmp(lpGUID, &DGA_DirectDraw_GUID, sizeof(GUID)))
return DGA_DirectDrawCreate(lplpDD, pUnkOuter);
- } else if (!memcmp(lpGUID, &XSHM_DirectDraw_GUID, sizeof(GUID))) {
+ else if (!memcmp(lpGUID, &XSHM_DirectDraw_GUID, sizeof(GUID)))
return XShm_DirectDrawCreate(lplpDD, pUnkOuter);
- } else if (!memcmp(lpGUID, &XLIB_DirectDraw_GUID, sizeof(GUID))) {
+ else if (!memcmp(lpGUID, &XLIB_DirectDraw_GUID, sizeof(GUID)))
return Xlib_DirectDrawCreate(lplpDD, pUnkOuter);
- }
fprintf(stderr,"DirectDrawCreate(%s,%p,%p): did not recognize requested GUID\n",xclsid,lplpDD,pUnkOuter);
return DDERR_INVALIDDIRECTDRAWGUID;
diff --git a/graphics/painting.c b/graphics/painting.c
index 659e9e8..6797fcc 100644
--- a/graphics/painting.c
+++ b/graphics/painting.c
@@ -1104,8 +1104,8 @@
if(!dc) return FALSE;
if(dc && PATH_IsPathOpen(dc->w.path))
FIXME(gdi, "PATH_PolyBezier is not implemented!\n");
-// if(!PATH_PolyBezier(hdc, x, y))
-// return FALSE;
+/* if(!PATH_PolyBezier(hdc, x, y))
+ return FALSE; */
return dc->funcs->pPolyBezier&&
dc->funcs->pPolyBezier(dc, lppt[0], lppt+1, cPoints-1);
}
@@ -1131,8 +1131,8 @@
pt.y=dc->w.CursPosY;
if(dc && PATH_IsPathOpen(dc->w.path))
FIXME(gdi, "PATH_PolyBezierTo is not implemented!\n");
-// if(!PATH_PolyBezier(hdc, x, y))
-// return FALSE;
+/* if(!PATH_PolyBezier(hdc, x, y))
+ return FALSE; */
ret= dc->funcs->pPolyBezier &&
dc->funcs->pPolyBezier(dc, pt, lppt, cPoints);
if( dc->funcs->pMoveToEx)
diff --git a/graphics/path.c b/graphics/path.c
index b68d286..9fd23ca 100644
--- a/graphics/path.c
+++ b/graphics/path.c
@@ -199,9 +199,10 @@
/***********************************************************************
* CloseFigure32 (GDI32.16)
+ *
+ * FIXME: Check that SetLastError is being called correctly
*/
BOOL32 WINAPI CloseFigure32(HDC32 hdc)
-/* FIXME: Check that SetLastError is being called correctly */
{
GdiPath *pPath;
@@ -293,12 +294,14 @@
/***********************************************************************
* PathToRegion32 (GDI32.261)
- */
-HRGN32 WINAPI PathToRegion32(HDC32 hdc)
-/* FIXME: Check that SetLastError is being called correctly */
-/* The documentation does not state this explicitly, but a test under Windows
+ *
+ * FIXME
+ * Check that SetLastError is being called correctly
+ *
+ * The documentation does not state this explicitly, but a test under Windows
* shows that the region which is returned should be in device coordinates.
*/
+HRGN32 WINAPI PathToRegion32(HDC32 hdc)
{
GdiPath *pPath;
HRGN32 hrgnRval;
@@ -329,9 +332,11 @@
/***********************************************************************
* FillPath32 (GDI32.100)
+ *
+ * FIXME
+ * Check that SetLastError is being called correctly
*/
BOOL32 WINAPI FillPath32(HDC32 hdc)
-/* FIXME: Check that SetLastError is being called correctly */
{
GdiPath *pPath;
INT32 mapMode, graphicsMode;
@@ -413,9 +418,10 @@
/***********************************************************************
* SelectClipPath32 (GDI32.296)
+ * FIXME
+ * Check that SetLastError is being called correctly
*/
BOOL32 WINAPI SelectClipPath32(HDC32 hdc, INT32 iMode)
-/* FIXME: Check that SetLastError is being called correctly */
{
GdiPath *pPath;
HRGN32 hrgnPath, hrgnClip;
diff --git a/graphics/win16drv/init.c b/graphics/win16drv/init.c
index 10dbf65..e0f9699 100644
--- a/graphics/win16drv/init.c
+++ b/graphics/win16drv/init.c
@@ -177,7 +177,7 @@
if (lstrcmpi32A(printerEnabled,"on"))
{
MSG("Printing disabled in wine.conf or .winerc file\n");
- MSG("Use \"printer=on\" in the \"[wine]\" section to enable it.");
+ MSG("Use \"printer=on\" in the \"[wine]\" section to enable it.\n");
return FALSE;
}
diff --git a/graphics/wing.c b/graphics/wing.c
index f6dffa1..a68cacf 100644
--- a/graphics/wing.c
+++ b/graphics/wing.c
@@ -147,7 +147,7 @@
{
WORD sel = 0;
- XShmAttach(display, &p->si);
+ TSXShmAttach(display, &p->si);
bmpObjPtr->pixmap = XShmCreatePixmap(display, rootWindow,
p->si.shmaddr, &p->si, bmpObjPtr->bitmap.bmWidth,
bmpObjPtr->bitmap.bmHeight, bmpi->biBitCount );
diff --git a/graphics/x11drv/graphics.c b/graphics/x11drv/graphics.c
index 0f385ad..ef1cf1c 100644
--- a/graphics/x11drv/graphics.c
+++ b/graphics/x11drv/graphics.c
@@ -920,7 +920,7 @@
return result;
}
-/****************** WARNING: WORK IN PROGRESS AHEAD !!!! ****************
+/******************************************************************
*
* *Very* simple bezier drawing code,
*
@@ -938,82 +938,71 @@
* to avoid trucation errors the coordinates are
* shifted upwards. When used in drawing they are
* shifted down again, including correct rounding
- * and avoiding floating points
+ * and avoiding floating point arithmatic
+ * 4 bits should allow 27 bits coordinates which I saw
+ * somewere in the win32 doc's
+ *
*/
#define BEZIERSHIFTBITS 4
#define BEZIERSHIFTUP(x) ((x)<<BEZIERSHIFTBITS)
-#define BEZIERFACTOR BEZIERSHIFTUP(1)
+#define BEZIERPIXEL BEZIERSHIFTUP(1)
#define BEZIERSHIFTDOWN(x) (((x)+(1<<(BEZIERSHIFTBITS-1)))>>BEZIERSHIFTBITS)
/* maximum depth of recursion */
-#define BEZIERMAXDEPTH 6
+#define BEZIERMAXDEPTH 8
/* size of array to store points on */
/* enough for one curve */
-#define BEZMAXPOINTS ((1<<BEZIERMAXDEPTH)+1)
+#define BEZMAXPOINTS (150)
-/* calculate Bezier average, in this case the middle */
+/* calculate Bezier average, in this case the middle
+ * correctly rounded...
+ * */
#define BEZIERMIDDLE(Mid, P1, P2) \
- (Mid).x=((P1).x+(P2).x)/2;\
- (Mid).y=((P1).y+(P2).y)/2;
+ (Mid).x=((P1).x+(P2).x + 1)/2;\
+ (Mid).y=((P1).y+(P2).y + 1)/2;
-/* check to terminate recursion */
-static int BezierCheck( int level, POINT32 *Points)
+/**********************************************************
+* BezierCheck helper function to check
+* that recursion can be terminated
+* Points[0] and Points[3] are begin and endpoint
+* Points[1] and Points[2] are control points
+* level is the recursion depth
+* returns true if the recusion can be terminated
+*/
+static BOOL32 BezierCheck( int level, POINT32 *Points)
{
-#if 0
-/* this code works, it just is too much work for
- * the savings that are created. This should be done
- * with integer arithmetic and simpler.
- */
- double hyp, r1, r2;
- /* first check that the control points are "near" */
- if(Points[3].x>Points[0].x)
- if(Points[1].x > Points[3].x+BEZIERFACTOR ||
- Points[1].x < Points[0].x-BEZIERFACTOR ||
- Points[2].x > Points[3].x+BEZIERFACTOR ||
- Points[2].x < Points[0].x-BEZIERFACTOR)
- return FALSE;
- else
- if(Points[1].x < Points[3].x-BEZIERFACTOR ||
- Points[1].x > Points[0].x+BEZIERFACTOR ||
- Points[2].x < Points[3].x-BEZIERFACTOR ||
- Points[2].x > Points[0].x+BEZIERFACTOR)
- return FALSE;
- if(Points[3].y>Points[0].y)
- if(Points[1].y > Points[3].y+BEZIERFACTOR ||
- Points[1].y < Points[0].y-BEZIERFACTOR ||
- Points[2].y > Points[3].y+BEZIERFACTOR ||
- Points[2].y < Points[0].y-BEZIERFACTOR)
- return FALSE;
- else
- if(Points[1].x < Points[3].x-BEZIERFACTOR ||
- Points[1].x > Points[0].x+BEZIERFACTOR ||
- Points[2].x < Points[3].x-BEZIERFACTOR ||
- Points[2].x > Points[0].x+BEZIERFACTOR)
- return FALSE;o
-
- /* calculate the distance squared of the control point from
- * the line from begin and endpoint
- */
-
- hyp=((double)(Points[3].x-Points[0].x)*(double)(Points[3].x-Points[0].x)+
- (double) (Points[3].y-Points[0].y)*(double)(Points[3].y-Points[0].y));
- r1=((double)(Points[2].y-Points[0].y)*(double)(Points[3].x-Points[0].x)-
- (double) (Points[3].y-Points[0].y)*(double)(Points[2].x-Points[0].x))
- /BEZIERFACTOR;
- r2=((double)(Points[1].y-Points[0].y)*(double)(Points[3].x-Points[0].x)-
- (double)(Points[3].y-Points[0].y)*(double)(Points[1].x-Points[0].x))
- /BEZIERFACTOR;
- r1=r1*r1/hyp;
- r1=r2*r2/hyp;
- if( r1<1 && r2 <1){ /* distance less then a pixel */
-// fprintf(stderr,"level is %d\n", level);
- return TRUE;
+ INT32 dx, dy;
+ dx=Points[3].x-Points[0].x;
+ dy=Points[3].y-Points[0].y;
+ if(ABS(dy)<ABS(dx)){/* shallow line */
+ /* check that control points are between begin and end */
+ if( (Points[1].x-Points[0].x)*dx < 0 ||
+ (Points[2].x-Points[0].x)*dx < 0 ) return FALSE;
+ dx=BEZIERSHIFTDOWN(dx);
+ if(!dx) return TRUE;
+ if(abs(Points[1].y-Points[0].y-(dy/dx)*
+ BEZIERSHIFTDOWN(Points[1].x-Points[0].x)) > BEZIERPIXEL ||
+ abs(Points[2].y-Points[0].y-(dy/dx)*
+ BEZIERSHIFTDOWN(Points[2].x-Points[0].x)) > BEZIERPIXEL )
+ return FALSE;
+ else
+ return TRUE;
+ }else{ /* steep line */
+ /* check that control points are between begin and end */
+ if( (Points[1].y-Points[0].y)*dy < 0 ||
+ (Points[2].y-Points[0].y)*dy < 0 ) return FALSE;
+ dy=BEZIERSHIFTDOWN(dy);
+ if(!dy) return TRUE;
+ if(abs(Points[1].x-Points[0].x-(dx/dy)*
+ BEZIERSHIFTDOWN(Points[1].y-Points[0].y)) > BEZIERPIXEL ||
+ abs(Points[2].x-Points[0].x-(dx/dy)*
+ BEZIERSHIFTDOWN(Points[2].y-Points[0].y)) > BEZIERPIXEL )
+ return FALSE;
+ else
+ return TRUE;
}
-#endif
- return FALSE;
-
}
/***********************************************************************
@@ -1021,24 +1010,31 @@
* Draw a -what microsoft calls- bezier curve
* The routine recursively devides the curve
* in two parts until a straight line can be drawn
+ *
+ * level recusion depth counted backwards
+ * dc device context
+ * Points array of begin(0), end(3) and control points(1 and 2)
+ * XPoints array with points calculated sofar
+ * *pIx nr points calculated sofar
+ *
*/
static void X11DRV_Bezier(int level, DC * dc, POINT32 *Points,
- XPoint* xpoints, unsigned int* pix)
+ XPoint* xpoints, unsigned int* pIx)
{
- if(*pix == BEZMAXPOINTS){
+ if(*pIx == BEZMAXPOINTS){
TSXDrawLines( display, dc->u.x.drawable, dc->u.x.gc,
- xpoints, *pix, CoordModeOrigin );
- *pix=0;
+ xpoints, *pIx, CoordModeOrigin );
+ *pIx=0;
}
if(!level || BezierCheck(level, Points)) {
- if(*pix == 0){
- xpoints[*pix].x= dc->w.DCOrgX + BEZIERSHIFTDOWN(Points[0].x);
- xpoints[*pix].y= dc->w.DCOrgY + BEZIERSHIFTDOWN(Points[0].y);
- *pix=1;
+ if(*pIx == 0){
+ xpoints[*pIx].x= dc->w.DCOrgX + BEZIERSHIFTDOWN(Points[0].x);
+ xpoints[*pIx].y= dc->w.DCOrgY + BEZIERSHIFTDOWN(Points[0].y);
+ *pIx=1;
}
- xpoints[*pix].x= dc->w.DCOrgX + BEZIERSHIFTDOWN(Points[3].x);
- xpoints[*pix].y= dc->w.DCOrgY + BEZIERSHIFTDOWN(Points[3].y);
- (*pix) ++;
+ xpoints[*pIx].x= dc->w.DCOrgX + BEZIERSHIFTDOWN(Points[3].x);
+ xpoints[*pIx].y= dc->w.DCOrgY + BEZIERSHIFTDOWN(Points[3].y);
+ (*pIx) ++;
} else {
POINT32 Points2[4]; /* for the second recursive call */
Points2[3]=Points[3];
@@ -1053,8 +1049,8 @@
Points2[0]=Points[3];
/* do the two halves */
- X11DRV_Bezier(level-1, dc, Points, xpoints, pix);
- X11DRV_Bezier(level-1, dc, Points2, xpoints, pix);
+ X11DRV_Bezier(level-1, dc, Points, xpoints, pIx);
+ X11DRV_Bezier(level-1, dc, Points2, xpoints, pIx);
}
}
@@ -1081,9 +1077,9 @@
(Points+0)->x, (Points+0)->y,
(Points+1)->x, (Points+1)->y,
(Points+2)->x, (Points+2)->y);
- if(!count || count % 3){
+ if(!count || count % 3){/* paranoid */
WARN(graphics," bad value for count : %ld\n", count);
- return FALSE; /* paranoid */
+ return FALSE;
}
xpoints=(XPoint*) xmalloc( sizeof(XPoint)*BEZMAXPOINTS);
Points[3].x=BEZIERSHIFTUP(XLPTODP(dc,start.x));
@@ -1100,8 +1096,6 @@
}
if( ix) TSXDrawLines( display, dc->u.x.drawable, dc->u.x.gc,
xpoints, ix, CoordModeOrigin );
-// fprintf(stderr," ix is %d\n",ix);
free(xpoints);
return TRUE;
}
-/***************************END OF WORK IN PROGRESS ********************/
diff --git a/graphics/x11drv/xfont.c b/graphics/x11drv/xfont.c
index edefaf7..7120689 100644
--- a/graphics/x11drv/xfont.c
+++ b/graphics/x11drv/xfont.c
@@ -29,7 +29,7 @@
#define X_PFONT_MAGIC (0xFADE0000)
#define X_FMC_MAGIC (0x0000CAFE)
-#define MAX_FONT_FAMILIES 64
+#define MAX_FONT_FAMILIES 128
#define MAX_LFD_LENGTH 256
#define REMOVE_SUBSETS 1
@@ -575,7 +575,7 @@
Atom RAW_CAP_HEIGHT = TSXInternAtom(display, "RAW_CAP_HEIGHT", TRUE);
if(TSXGetFontProperty(x_fs, RAW_CAP_HEIGHT, &height))
*pIL = XFT->ascent -
- (INT32)(hypotf(XFT->a, XFT->b) / 1000.0 * height);
+ (INT32)(XFT->pixelsize / 1000.0 * height);
else
*pIL = 0;
return bHaveCapHeight && x_fs->per_char;
@@ -2015,7 +2015,7 @@
XGetFontProperty( pfo->fs, RAW_ASCENT, &PX->RAW_ASCENT );
XGetFontProperty( pfo->fs, RAW_DESCENT, &PX->RAW_DESCENT );
- PX->pixelsize = hypotf(PX->a, PX->b);
+ PX->pixelsize = hypot(PX->a, PX->b);
PX->ascent = PX->pixelsize / 1000.0 * PX->RAW_ASCENT;
PX->descent = PX->pixelsize / 1000.0 * PX->RAW_DESCENT;