ntdll: NtQueryInformationToken change parameters according to PSDK.
[wine] / dlls / ddraw / ddraw_private.h
1 /*
2  * Copyright 2000-2001 TransGaming Technologies Inc.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
18
19 #ifndef __WINE_DLLS_DDRAW_DDRAW_PRIVATE_H
20 #define __WINE_DLLS_DDRAW_DDRAW_PRIVATE_H
21
22 /* MAY NOT CONTAIN X11 or DGA specific includes/defines/structs! */
23
24 #include <stdarg.h>
25 #include <stdio.h>
26
27 #include "windef.h"
28 #include "winbase.h"
29 #include "wtypes.h"
30 #include "wingdi.h"
31 #include "winuser.h"
32 #include "ddraw.h"
33 #include "d3d.h"
34 #include "ddcomimpl.h"
35 #include "ddrawi.h"
36
37 /* XXX Put this somewhere proper. */
38 #define DD_STRUCT_INIT(x)                       \
39         do {                                    \
40                 memset((x), 0, sizeof(*(x)));   \
41                 (x)->dwSize = sizeof(*x);       \
42         } while (0)
43
44 #define DD_STRUCT_COPY_BYSIZE(to,from)                  \
45         do {                                            \
46                 DWORD __size = (to)->dwSize;            \
47                 DWORD __copysize = __size;              \
48                 DWORD __resetsize = __size;             \
49                 assert(to != from);                     \
50                 if (__resetsize > sizeof(*to))          \
51                     __resetsize = sizeof(*to);          \
52                 memset(to,0,__resetsize);               \
53                 if ((from)->dwSize < __size)            \
54                     __copysize = (from)->dwSize;        \
55                 memcpy(to,from,__copysize);             \
56                 (to)->dwSize = __size;/*restore size*/  \
57         } while (0)
58
59 #define MAKE_FOURCC(a,b,c,d) ((a << 0) | (b << 8) | (c << 16) | (d << 24))
60
61 /*****************************************************************************
62  * IDirectDraw implementation structure
63  */
64
65 typedef struct IDirectDrawImpl IDirectDrawImpl;
66 typedef struct IDirectDrawPaletteImpl IDirectDrawPaletteImpl;
67 typedef struct IDirectDrawClipperImpl IDirectDrawClipperImpl;
68 typedef struct IDirectDrawSurfaceImpl IDirectDrawSurfaceImpl;
69 typedef struct IDirect3DDeviceImpl IDirect3DDeviceImpl;
70
71 typedef void (*pixel_convert_func)(void *src, void *dst, DWORD width,
72                                    DWORD height, LONG pitch,
73                                    IDirectDrawPaletteImpl *palette);
74
75 typedef void (*palette_convert_func)(LPPALETTEENTRY palent,
76                                      void *screen_palette, DWORD start,
77                                      DWORD count);
78
79 struct IDirectDrawImpl
80 {
81     ICOM_VFIELD_MULTI(IDirectDraw7);
82     ICOM_VFIELD_MULTI(IDirectDraw4);
83     ICOM_VFIELD_MULTI(IDirectDraw2);
84     ICOM_VFIELD_MULTI(IDirectDraw);
85     ICOM_VFIELD_MULTI(IDirect3D7);
86     ICOM_VFIELD_MULTI(IDirect3D3);
87     ICOM_VFIELD_MULTI(IDirect3D2);
88     ICOM_VFIELD_MULTI(IDirect3D);
89
90     LONG ref;
91
92     /* TRUE if created via DirectDrawCreateEx or CoCreateInstance,
93      * FALSE if created via DirectDrawCreate. */
94     BOOL ex;
95
96     /* Linked list of surfaces, joined by next_ddraw in IDirectSurfaceImpl. */
97     IDirectDrawSurfaceImpl* surfaces;
98     /* Linked list of palettes, joined by next_ddraw. */
99     IDirectDrawPaletteImpl* palettes;
100     /* Linked list of clippers, joined by next_ddraw. */
101     IDirectDrawClipperImpl* clippers;
102
103     IDirectDrawSurfaceImpl* primary_surface;
104
105     DDRAWI_DIRECTDRAW_LCL local;
106     DDCAPS caps;
107
108     HWND window;
109     DWORD cooperative_level;
110     WNDPROC original_wndproc;
111
112     DWORD width, height;
113     LONG pitch;
114     DDPIXELFORMAT pixelformat;
115     DWORD cur_scanline;
116
117     /* Should each of these go into some structure? */
118     DWORD orig_width, orig_height;
119     LONG orig_pitch;
120     DDPIXELFORMAT orig_pixelformat;
121
122     /* Called when the refcount goes to 0. */
123     void (*final_release)(IDirectDrawImpl *This);
124
125     HRESULT (*set_exclusive_mode)(IDirectDrawImpl *This, DWORD dwExcl);
126
127     HRESULT (*create_palette)(IDirectDrawImpl* This, DWORD dwFlags,
128                               LPDIRECTDRAWPALETTE* ppPalette,
129                               LPUNKNOWN pUnkOuter);
130
131     /* Surface creation functions. For all of these, pOuter == NULL. */
132
133     /* Do not create any backbuffers or the flipping chain. */
134     HRESULT (*create_primary)(IDirectDrawImpl* This,
135                               const DDSURFACEDESC2* pDDSD,
136                               LPDIRECTDRAWSURFACE7* ppSurf, LPUNKNOWN pOuter);
137
138     /* Primary may be NULL if we are creating an unattached backbuffer. */
139     HRESULT (*create_backbuffer)(IDirectDrawImpl* This,
140                                  const DDSURFACEDESC2* pDDSD,
141                                  LPDIRECTDRAWSURFACE7* ppSurf,
142                                  LPUNKNOWN pOuter,
143                                  IDirectDrawSurfaceImpl* primary);
144
145     /* shiny happy offscreenplain surfaces */
146     HRESULT (*create_offscreen)(IDirectDrawImpl* This,
147                                 const DDSURFACEDESC2* pDDSD,
148                                 LPDIRECTDRAWSURFACE7* ppSurf,
149                                 LPUNKNOWN pOuter);
150
151     /* dwMipMapLevel is specified as per OpenGL. (i.e. 0 is base) */
152     HRESULT (*create_texture)(IDirectDrawImpl* This,
153                               const DDSURFACEDESC2* pDDSD,
154                               LPDIRECTDRAWSURFACE7* ppSurf, LPUNKNOWN pOuter,
155                               DWORD dwMipMapLevel);
156
157     HRESULT (*create_zbuffer)(IDirectDrawImpl* This,
158                               const DDSURFACEDESC2* pDDSD,
159                               LPDIRECTDRAWSURFACE7* ppSurf, LPUNKNOWN pOuter);
160
161     LPVOID      private;
162
163     /* Everything below here is still questionable. */
164
165     DDPIXELFORMAT screen_pixelformat;
166
167     int           pixmap_depth;
168     pixel_convert_func pixel_convert;
169     palette_convert_func palette_convert;
170
171     /* Use to fool some too strict games */
172     INT32 (*allocate_memory)(IDirectDrawImpl *This, DWORD mem);
173     void (*free_memory)(IDirectDrawImpl *This, DWORD mem);
174     DWORD total_vidmem, available_vidmem;
175     
176     /* IDirect3D fields */
177     LPVOID d3d_private;
178
179     /* Used as a callback function to create a texture */
180     HRESULT (*d3d_create_texture)(IDirectDrawImpl *d3d, IDirectDrawSurfaceImpl *tex, BOOLEAN at_creation, IDirectDrawSurfaceImpl *main);
181
182     /* Used as a callback for Devices to tell to the D3D object it's been created */
183     HRESULT (*d3d_added_device)(IDirectDrawImpl *d3d, IDirect3DDeviceImpl *device);
184     HRESULT (*d3d_removed_device)(IDirectDrawImpl *d3d, IDirect3DDeviceImpl *device);
185
186     /* This is needed for delayed texture creation and Z buffer blits */
187     IDirect3DDeviceImpl *current_device;
188
189     /* This is for the fake mainWindow */
190     ATOM        winclass;
191     PAINTSTRUCT ps;
192     BOOL        paintable;
193 };
194
195 /*****************************************************************************
196  * IDirectDrawPalette implementation structure
197  */
198 struct IDirectDrawPaletteImpl
199 {
200     /* IUnknown fields */
201     ICOM_VFIELD_MULTI(IDirectDrawPalette);
202     LONG ref;
203
204     DDRAWI_DDRAWPALETTE_LCL local;
205     DDRAWI_DDRAWPALETTE_GBL global;
206
207     /* IDirectDrawPalette fields */
208     HPALETTE            hpal;
209     WORD                palVersion, palNumEntries; /* LOGPALETTE */
210     PALETTEENTRY        palents[256];
211     /* This is to store the palette in 'screen format' */
212     int                 screen_palents[256];
213
214     VOID (*final_release)(IDirectDrawPaletteImpl* This);
215
216     IDirectDrawImpl* ddraw_owner;
217     IDirectDrawPaletteImpl* prev_ddraw;
218     IDirectDrawPaletteImpl* next_ddraw;
219
220     LPVOID              private;
221 };
222
223 /*****************************************************************************
224  * IDirectDrawClipper implementation structure
225  */
226 struct IDirectDrawClipperImpl
227 {
228     /* IUnknown fields */
229     ICOM_VFIELD_MULTI(IDirectDrawClipper);
230     LONG ref;
231
232     /* IDirectDrawClipper fields */
233     HWND hWnd;
234
235     IDirectDrawImpl* ddraw_owner;
236     IDirectDrawClipperImpl* prev_ddraw;
237     IDirectDrawClipperImpl* next_ddraw;
238 };
239
240 /*****************************************************************************
241  * IDirectDrawSurface implementation structure
242  */
243
244 struct IDirectDrawSurfaceImpl
245 {
246     /* IUnknown fields */
247     ICOM_VFIELD_MULTI(IDirectDrawSurface7);
248     ICOM_VFIELD_MULTI(IDirectDrawSurface3);
249     ICOM_VFIELD_MULTI(IDirectDrawGammaControl);
250     ICOM_VFIELD_MULTI(IDirect3DTexture2);
251     ICOM_VFIELD_MULTI(IDirect3DTexture);
252     LONG ref;
253
254     struct IDirectDrawSurfaceImpl* attached; /* attached surfaces */
255
256     struct IDirectDrawSurfaceImpl* next_ddraw; /* ddraw surface chain */
257     struct IDirectDrawSurfaceImpl* prev_ddraw;
258     struct IDirectDrawSurfaceImpl* next_attached; /* attached surface chain */
259     struct IDirectDrawSurfaceImpl* prev_attached;
260
261     IDirectDrawImpl* ddraw_owner;
262     IDirectDrawSurfaceImpl* surface_owner;
263
264     IDirectDrawPaletteImpl* palette; /* strong ref */
265     IDirectDrawClipperImpl* clipper; /* strong ref */
266
267     DDRAWI_DDRAWSURFACE_LCL local;
268     DDRAWI_DDRAWSURFACE_MORE more;
269     /* FIXME: since Flip should swap the GBL structures, they should
270      * probably not be embedded into the IDirectDrawSurfaceImpl structure... */
271     LPDDRAWI_DDRAWSURFACE_GBL_MORE gmore;
272     DDRAWI_DDRAWSURFACE_GBL global;
273     DDRAWI_DDRAWSURFACE_GBL_MORE global_more;
274
275     DDSURFACEDESC2 surface_desc;
276
277     HDC hDC;
278     RECT lastlockrect;
279     DWORD lastlocktype;
280     BOOL dc_in_use;
281     BOOL locked;
282
283     HRESULT (*duplicate_surface)(IDirectDrawSurfaceImpl* src,
284                                  LPDIRECTDRAWSURFACE7* dst);
285     void (*final_release)(IDirectDrawSurfaceImpl *This);
286     HRESULT (*late_allocate)(IDirectDrawSurfaceImpl *This);
287     BOOL (*attach)(IDirectDrawSurfaceImpl *This, IDirectDrawSurfaceImpl *to);
288     BOOL (*detach)(IDirectDrawSurfaceImpl *This);
289     void (*lock_update)(IDirectDrawSurfaceImpl* This, LPCRECT pRect, DWORD dwFlags);
290     void (*unlock_update)(IDirectDrawSurfaceImpl* This, LPCRECT pRect);
291     void (*lose_surface)(IDirectDrawSurfaceImpl* This);
292     BOOL (*flip_data)(IDirectDrawSurfaceImpl* front,
293                       IDirectDrawSurfaceImpl* back,
294                       DWORD dwFlags);
295     void (*flip_update)(IDirectDrawSurfaceImpl* front, DWORD dwFlags);
296     HRESULT (*get_dc)(IDirectDrawSurfaceImpl* This, HDC* phDC);
297     HRESULT (*release_dc)(IDirectDrawSurfaceImpl* This, HDC hDC);
298     void (*set_palette)(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* pal);
299     void (*update_palette)(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* pal,
300                            DWORD dwStart, DWORD dwCount, LPPALETTEENTRY palent);
301     HWND (*get_display_window)(IDirectDrawSurfaceImpl *This);
302     HRESULT (*get_gamma_ramp)(IDirectDrawSurfaceImpl *This, DWORD dwFlags, LPDDGAMMARAMP lpGammaRamp);
303     HRESULT (*set_gamma_ramp)(IDirectDrawSurfaceImpl *This, DWORD dwFlags, LPDDGAMMARAMP lpGammaRamp);
304
305     struct PrivateData* private_data;
306
307     DWORD max_lod;
308     DWORD priority;
309
310     BOOL lost;
311
312     DWORD uniqueness_value;
313
314     LPVOID private;
315
316     /* Everything below here is dodgy. */
317     /* For Direct3D use */
318     LPVOID aux_ctx, aux_data;
319     void (*aux_release)(LPVOID ctx, LPVOID data);
320     BOOL (*aux_flip)(LPVOID ctx, LPVOID data);
321     void (*aux_unlock)(LPVOID ctx, LPVOID data, LPRECT lpRect);
322     HRESULT (*aux_blt)(struct IDirectDrawSurfaceImpl *This, LPRECT rdst, LPDIRECTDRAWSURFACE7 src, LPRECT rsrc, DWORD dwFlags, LPDDBLTFX lpbltfx);
323     HRESULT (*aux_bltfast)(struct IDirectDrawSurfaceImpl *This, DWORD dstx, DWORD dsty, LPDIRECTDRAWSURFACE7 src, LPRECT rsrc, DWORD trans);
324     HRESULT (*aux_setcolorkey_cb)(struct IDirectDrawSurfaceImpl *texture, DWORD dwFlags, LPDDCOLORKEY ckey );
325     /* This is to get the D3DDevice object associated to this surface */
326     struct IDirect3DDeviceImpl *d3ddevice;
327     /* This is for texture */
328     IDirectDrawSurfaceImpl *mip_main;
329     int mipmap_level;
330     LPVOID tex_private;
331     void (*lock_update_prev)(IDirectDrawSurfaceImpl* This, LPCRECT pRect, DWORD dwFlags);
332     void (*unlock_update_prev)(IDirectDrawSurfaceImpl* This, LPCRECT pRect);
333     BOOLEAN (*get_dirty_status)(IDirectDrawSurfaceImpl* This, LPCRECT pRect);
334 };
335
336 /*****************************************************************************
337  * Driver initialisation functions.
338  */
339 BOOL DDRAW_HAL_Init(HINSTANCE, DWORD, LPVOID);
340 BOOL DDRAW_User_Init(HINSTANCE, DWORD, LPVOID);
341
342 typedef struct {
343     const DDDEVICEIDENTIFIER2* info;
344     int preference;     /* how good we are. dga might get 100, xlib 50*/
345     HRESULT (*create)(const GUID*, LPDIRECTDRAW7*, LPUNKNOWN, BOOL ex);
346
347     /* For IDirectDraw7::Initialize. */
348     HRESULT (*init)(IDirectDrawImpl *, const GUID*);
349 } ddraw_driver;
350
351 void DDRAW_register_driver(const ddraw_driver*);
352
353 const ddraw_driver* DDRAW_FindDriver(const GUID* guid);
354
355 /******************************************************************************
356  * Random utilities
357  */
358
359 /* Get DDSCAPS of surface (shortcutmacro) */
360 #define SDDSCAPS(iface) ((iface)->s.surface_desc.ddsCaps.dwCaps)
361 /* Get the number of bytes per pixel for a given surface */
362 #define PFGET_BPP(pf) (pf.dwFlags&DDPF_PALETTEINDEXED8?1:((pf.u1.dwRGBBitCount+7)/8))
363 #define GET_BPP(desc) PFGET_BPP(desc.u4.ddpfPixelFormat)
364
365 LONG DDRAW_width_bpp_to_pitch(DWORD width, DWORD bpp);
366
367 typedef struct {
368     unsigned short      bpp,depth;
369     unsigned int        rmask,gmask,bmask;
370 } ConvertMode;
371
372 typedef struct {
373     void (*pixel_convert)(void *src, void *dst, DWORD width, DWORD height, LONG pitch, IDirectDrawPaletteImpl* palette);
374     void (*palette_convert)(LPPALETTEENTRY palent, void *screen_palette, DWORD start, DWORD count);
375 } ConvertFuncs;
376
377 typedef struct {
378     ConvertMode screen, dest;
379     ConvertFuncs funcs;
380 } Convert;
381
382 extern Convert ModeEmulations[8];
383 extern int _common_depth_to_pixelformat(DWORD depth,LPDIRECTDRAW ddraw);
384 extern BOOL opengl_initialized;
385 extern BOOL s3tc_initialized;
386
387 typedef void (*FUNC_FETCH_2D_TEXEL_RGBA_DXT1)(int srcRowStride, const BYTE *pixdata, int i, int j, void *texel);
388 typedef void (*FUNC_FETCH_2D_TEXEL_RGBA_DXT3)(int srcRowStride, const BYTE *pixdata, int i, int j, void *texel);
389 typedef void (*FUNC_FETCH_2D_TEXEL_RGBA_DXT5)(int srcRowStride, const BYTE *pixdata, int i, int j, void *texel);
390
391 extern FUNC_FETCH_2D_TEXEL_RGBA_DXT1 fetch_2d_texel_rgba_dxt1;
392 extern FUNC_FETCH_2D_TEXEL_RGBA_DXT3 fetch_2d_texel_rgba_dxt3;
393 extern FUNC_FETCH_2D_TEXEL_RGBA_DXT5 fetch_2d_texel_rgba_dxt5;
394
395 /******************************************************************************
396  * Structure conversion (for thunks)
397  */
398 void DDRAW_Convert_DDSCAPS_1_To_2(const DDSCAPS* pIn, DDSCAPS2* pOut);
399 void DDRAW_Convert_DDDEVICEIDENTIFIER_2_To_1(const DDDEVICEIDENTIFIER2* pIn,
400                                              DDDEVICEIDENTIFIER* pOut);
401
402 /******************************************************************************
403  * Debugging / Flags output functions
404  */
405 extern void DDRAW_dump_DDBLTFX(DWORD flagmask);
406 extern void DDRAW_dump_DDBLTFAST(DWORD flagmask);
407 extern void DDRAW_dump_DDBLT(DWORD flagmask);
408 extern void DDRAW_dump_DDSCAPS(const DDSCAPS *in);
409 extern void DDRAW_dump_DDSCAPS2(const DDSCAPS2 *in);
410 extern void DDRAW_dump_pixelformat_flag(DWORD flagmask);
411 extern void DDRAW_dump_paletteformat(DWORD dwFlags);
412 extern void DDRAW_dump_pixelformat(const DDPIXELFORMAT *in);
413 extern void DDRAW_dump_colorkeyflag(DWORD ck);
414 extern void DDRAW_dump_surface_desc(const DDSURFACEDESC2 *lpddsd);
415 extern void DDRAW_dump_cooperativelevel(DWORD cooplevel);
416 extern void DDRAW_dump_lockflag(DWORD lockflag);
417 extern void DDRAW_dump_DDCOLORKEY(const DDCOLORKEY *in);
418 extern void DDRAW_dump_DDCAPS(const DDCAPS *lpcaps);
419 extern void DDRAW_dump_DDENUMSURFACES(DWORD flagmask);
420 extern void DDRAW_dump_surface_to_disk(IDirectDrawSurfaceImpl *surface, FILE *f, int scale) ;
421
422 /* Used for generic dumping */
423 typedef struct
424 {
425     DWORD val;
426     const char* name;
427 } flag_info;
428
429 #define FE(x) { x, #x }
430
431 typedef struct
432 {
433     DWORD val;
434     const char* name;
435     void (*func)(const void *);
436     ptrdiff_t offset;
437 } member_info;
438
439 #define DDRAW_dump_flags(flags,names,num_names) DDRAW_dump_flags_(flags, names, num_names, 1)
440 #define ME(x,f,e) { x, #x, (void (*)(const void *))(f), offsetof(STRUCT, e) }
441
442 extern void DDRAW_dump_flags_(DWORD flags, const flag_info* names, size_t num_names, int newline);
443 extern void DDRAW_dump_members(DWORD flags, const void* data, const member_info* mems, size_t num_mems);
444
445 void DirectDrawSurface_RegisterClass(void);
446 void DirectDrawSurface_UnregisterClass(void);
447
448 extern const IDirectDrawSurface3Vtbl DDRAW_IDDS3_Thunk_VTable;
449
450 /*****************************************************************************
451  * IDirectDrawClipper declarations
452  */
453 HRESULT DDRAW_CreateClipper(IUnknown* pUnkOuter, REFIID riid, LPVOID* ppObj);
454 void Main_DirectDrawClipper_ForceDestroy(IDirectDrawClipperImpl* This);
455
456 HRESULT WINAPI
457 Main_DirectDrawClipper_SetHwnd(LPDIRECTDRAWCLIPPER iface, DWORD dwFlags,
458                                HWND hWnd);
459 ULONG WINAPI Main_DirectDrawClipper_Release(LPDIRECTDRAWCLIPPER iface);
460 HRESULT WINAPI
461 Main_DirectDrawClipper_GetClipList(LPDIRECTDRAWCLIPPER iface, LPRECT lpRect,
462                                    LPRGNDATA lpClipList, LPDWORD lpdwSize);
463 HRESULT WINAPI
464 Main_DirectDrawClipper_SetClipList(LPDIRECTDRAWCLIPPER iface,LPRGNDATA lprgn,
465                                    DWORD dwFlag);
466 HRESULT WINAPI
467 Main_DirectDrawClipper_QueryInterface(LPDIRECTDRAWCLIPPER iface, REFIID riid,
468                                       LPVOID* ppvObj);
469 ULONG WINAPI Main_DirectDrawClipper_AddRef( LPDIRECTDRAWCLIPPER iface );
470 HRESULT WINAPI
471 Main_DirectDrawClipper_GetHWnd(LPDIRECTDRAWCLIPPER iface, HWND* hWndPtr);
472 HRESULT WINAPI
473 Main_DirectDrawClipper_Initialize(LPDIRECTDRAWCLIPPER iface, LPDIRECTDRAW lpDD,
474                                   DWORD dwFlags);
475 HRESULT WINAPI
476 Main_DirectDrawClipper_IsClipListChanged(LPDIRECTDRAWCLIPPER iface,
477                                          BOOL* lpbChanged);
478
479 /*****************************************************************************
480  * IDirectDrawPalette MAIN declarations
481  */
482 HRESULT Main_DirectDrawPalette_Construct(IDirectDrawPaletteImpl* This,
483                                          IDirectDrawImpl* pDD, DWORD dwFlags);
484 void Main_DirectDrawPalette_final_release(IDirectDrawPaletteImpl* This);
485
486 HRESULT Main_DirectDrawPalette_Create(IDirectDrawImpl* pDD, DWORD dwFlags,
487                                       LPDIRECTDRAWPALETTE* ppPalette,
488                                       LPUNKNOWN pUnkOuter);
489 void Main_DirectDrawPalette_ForceDestroy(IDirectDrawPaletteImpl* This);
490
491 DWORD Main_DirectDrawPalette_Size(DWORD dwFlags);
492
493 HRESULT WINAPI
494 Main_DirectDrawPalette_GetEntries(LPDIRECTDRAWPALETTE iface, DWORD dwFlags,
495                                   DWORD dwStart, DWORD dwCount,
496                                   LPPALETTEENTRY palent);
497 HRESULT WINAPI
498 Main_DirectDrawPalette_SetEntries(LPDIRECTDRAWPALETTE iface, DWORD dwFlags,
499                                   DWORD dwStart, DWORD dwCount,
500                                   LPPALETTEENTRY palent);
501 ULONG WINAPI
502 Main_DirectDrawPalette_Release(LPDIRECTDRAWPALETTE iface);
503 ULONG WINAPI Main_DirectDrawPalette_AddRef(LPDIRECTDRAWPALETTE iface);
504 HRESULT WINAPI
505 Main_DirectDrawPalette_Initialize(LPDIRECTDRAWPALETTE iface,
506                                   LPDIRECTDRAW ddraw, DWORD dwFlags,
507                                   LPPALETTEENTRY palent);
508 HRESULT WINAPI
509 Main_DirectDrawPalette_GetCaps(LPDIRECTDRAWPALETTE iface, LPDWORD lpdwCaps);
510 HRESULT WINAPI
511 Main_DirectDrawPalette_QueryInterface(LPDIRECTDRAWPALETTE iface,
512                                       REFIID refiid, LPVOID *obj);
513
514 /*****************************************************************************
515  * IDirectDrawPalette HAL declarations
516  */
517 HRESULT HAL_DirectDrawPalette_Construct(IDirectDrawPaletteImpl* This,
518                                          IDirectDrawImpl* pDD, DWORD dwFlags);
519 void HAL_DirectDrawPalette_final_release(IDirectDrawPaletteImpl* This);
520
521 HRESULT HAL_DirectDrawPalette_Create(IDirectDrawImpl* pDD, DWORD dwFlags,
522                                      LPDIRECTDRAWPALETTE* ppPalette,
523                                      LPUNKNOWN pUnkOuter);
524
525 HRESULT WINAPI
526 HAL_DirectDrawPalette_SetEntries(LPDIRECTDRAWPALETTE iface, DWORD dwFlags,
527                                  DWORD dwStart, DWORD dwCount,
528                                  LPPALETTEENTRY palent);
529
530 /*****************************************************************************
531  * IDirectDraw MAIN declarations
532  */
533 /* internal virtual functions */
534 void Main_DirectDraw_final_release(IDirectDrawImpl* This);
535 HRESULT Main_create_offscreen(IDirectDrawImpl* This, const DDSURFACEDESC2 *pDDSD,
536                               LPDIRECTDRAWSURFACE7* ppSurf, LPUNKNOWN pOuter);
537 HRESULT Main_create_texture(IDirectDrawImpl* This, const DDSURFACEDESC2 *pDDSD,
538                             LPDIRECTDRAWSURFACE7* ppSurf, LPUNKNOWN pOuter,
539                             DWORD dwMipMapLevel);
540 HRESULT Main_create_zbuffer(IDirectDrawImpl* This, const DDSURFACEDESC2 *pDDSD,
541                             LPDIRECTDRAWSURFACE7* ppSurf, LPUNKNOWN pOuter);
542
543 /* internal functions */
544 HRESULT Main_DirectDraw_Construct(IDirectDrawImpl *This, BOOL ex);
545 void Main_DirectDraw_AddSurface(IDirectDrawImpl* This,
546                                 IDirectDrawSurfaceImpl* surface);
547 void Main_DirectDraw_RemoveSurface(IDirectDrawImpl* This,
548                                    IDirectDrawSurfaceImpl* surface);
549 void Main_DirectDraw_AddClipper(IDirectDrawImpl* This,
550                                 IDirectDrawClipperImpl* clipper);
551 void Main_DirectDraw_RemoveClipper(IDirectDrawImpl* This,
552                                    IDirectDrawClipperImpl* clipper);
553 void Main_DirectDraw_AddPalette(IDirectDrawImpl* This,
554                                 IDirectDrawPaletteImpl* palette);
555 void Main_DirectDraw_RemovePalette(IDirectDrawImpl* This,
556                                    IDirectDrawPaletteImpl* palette);
557
558 /* interface functions */
559 ULONG WINAPI Main_DirectDraw_AddRef(LPDIRECTDRAW7 iface);
560 ULONG WINAPI Main_DirectDraw_Release(LPDIRECTDRAW7 iface);
561 HRESULT WINAPI Main_DirectDraw_QueryInterface(LPDIRECTDRAW7 iface,
562                                               REFIID refiid,LPVOID *obj);
563 HRESULT WINAPI Main_DirectDraw_Compact(LPDIRECTDRAW7 iface);
564 HRESULT WINAPI Main_DirectDraw_CreateClipper(LPDIRECTDRAW7 iface,
565                                              DWORD dwFlags,
566                                              LPDIRECTDRAWCLIPPER *ppClipper,
567                                              IUnknown *pUnkOuter);
568 HRESULT WINAPI
569 Main_DirectDraw_CreatePalette(LPDIRECTDRAW7 iface, DWORD dwFlags,
570                               LPPALETTEENTRY palent,
571                               LPDIRECTDRAWPALETTE* ppPalette,
572                               LPUNKNOWN pUnknown);
573 HRESULT WINAPI
574 Main_DirectDraw_CreateSurface(LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD,
575                               LPDIRECTDRAWSURFACE7 *ppSurf,
576                               IUnknown *pUnkOuter);
577 HRESULT WINAPI
578 Main_DirectDraw_DuplicateSurface(LPDIRECTDRAW7 iface, LPDIRECTDRAWSURFACE7 src,
579                                  LPDIRECTDRAWSURFACE7* dst);
580 HRESULT WINAPI
581 Main_DirectDraw_EnumSurfaces(LPDIRECTDRAW7 iface, DWORD dwFlags,
582                              LPDDSURFACEDESC2 lpDDSD2, LPVOID context,
583                              LPDDENUMSURFACESCALLBACK7 callback);
584 HRESULT WINAPI
585 Main_DirectDraw_EvaluateMode(LPDIRECTDRAW7 iface,DWORD a,DWORD* b);
586 HRESULT WINAPI Main_DirectDraw_FlipToGDISurface(LPDIRECTDRAW7 iface);
587 HRESULT WINAPI
588 Main_DirectDraw_GetCaps(LPDIRECTDRAW7 iface, LPDDCAPS pDriverCaps,
589                         LPDDCAPS pHELCaps);
590 HRESULT WINAPI
591 Main_DirectDraw_GetFourCCCodes(LPDIRECTDRAW7 iface, LPDWORD pNumCodes,
592                                LPDWORD pCodes);
593 HRESULT WINAPI
594 Main_DirectDraw_GetGDISurface(LPDIRECTDRAW7 iface,
595                               LPDIRECTDRAWSURFACE7 *lplpGDIDDSSurface);
596 HRESULT WINAPI
597 Main_DirectDraw_GetMonitorFrequency(LPDIRECTDRAW7 iface,LPDWORD freq);
598 HRESULT WINAPI
599 Main_DirectDraw_GetScanLine(LPDIRECTDRAW7 iface, LPDWORD lpdwScanLine);
600 HRESULT WINAPI
601 Main_DirectDraw_GetSurfaceFromDC(LPDIRECTDRAW7 iface, HDC hdc,
602                                  LPDIRECTDRAWSURFACE7 *lpDDS);
603 HRESULT WINAPI
604 Main_DirectDraw_GetVerticalBlankStatus(LPDIRECTDRAW7 iface, LPBOOL status);
605 HRESULT WINAPI
606 Main_DirectDraw_Initialize(LPDIRECTDRAW7 iface, LPGUID lpGuid);
607 HRESULT WINAPI Main_DirectDraw_RestoreAllSurfaces(LPDIRECTDRAW7 iface);
608 HRESULT WINAPI
609 Main_DirectDraw_SetCooperativeLevel(LPDIRECTDRAW7 iface, HWND hwnd,
610                                     DWORD cooplevel);
611 HRESULT WINAPI
612 Main_DirectDraw_SetDisplayMode(LPDIRECTDRAW7 iface, DWORD dwWidth,
613                                DWORD dwHeight, LONG lPitch,
614                                DWORD dwRefreshRate, DWORD dwFlags,
615                                const DDPIXELFORMAT* pixelformat);
616 HRESULT WINAPI Main_DirectDraw_RestoreDisplayMode(LPDIRECTDRAW7 iface);
617 HRESULT WINAPI
618 Main_DirectDraw_WaitForVerticalBlank(LPDIRECTDRAW7 iface, DWORD dwFlags,
619                                      HANDLE h);
620 HRESULT WINAPI
621 Main_DirectDraw_GetDisplayMode(LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD);
622 HRESULT WINAPI
623 Main_DirectDraw_GetAvailableVidMem(LPDIRECTDRAW7 iface,LPDDSCAPS2 ddscaps,
624                                    LPDWORD total, LPDWORD free);
625 HRESULT WINAPI Main_DirectDraw_TestCooperativeLevel(LPDIRECTDRAW7 iface);
626 HRESULT WINAPI
627 Main_DirectDraw_StartModeTest(LPDIRECTDRAW7 iface, LPSIZE pModes,
628                               DWORD dwNumModes, DWORD dwFlags);
629
630 /*****************************************************************************
631  * IDirectDraw USER object declarations
632  */
633 #define USER_DDRAW_PRIV(ddraw) ((User_DirectDrawImpl*)((ddraw)->private))
634 #define USER_DDRAW_PRIV_VAR(name,ddraw) \
635         User_DirectDrawImpl* name = USER_DDRAW_PRIV(ddraw)
636
637 typedef struct
638 {
639     int empty;
640     /* empty */
641 } User_DirectDrawImpl_Part;
642
643 typedef struct
644 {
645     User_DirectDrawImpl_Part user;
646 } User_DirectDrawImpl;
647
648 void User_DirectDraw_final_release(IDirectDrawImpl* This);
649 HRESULT User_DirectDraw_create_primary(IDirectDrawImpl* This,
650                                        const DDSURFACEDESC2* pDDSD,
651                                        LPDIRECTDRAWSURFACE7* ppSurf,
652                                        LPUNKNOWN pOuter);
653 HRESULT User_DirectDraw_create_backbuffer(IDirectDrawImpl* This,
654                                           const DDSURFACEDESC2* pDDSD,
655                                           LPDIRECTDRAWSURFACE7* ppSurf,
656                                           LPUNKNOWN pOuter,
657                                           IDirectDrawSurfaceImpl* primary);
658 HRESULT User_DirectDraw_Construct(IDirectDrawImpl *This, BOOL ex);
659 HRESULT User_DirectDraw_Create(const GUID* pGUID, LPDIRECTDRAW7* pIface,
660                                IUnknown* pUnkOuter, BOOL ex);
661
662 HRESULT WINAPI
663 User_DirectDraw_EnumDisplayModes(LPDIRECTDRAW7 iface, DWORD dwFlags,
664                                  LPDDSURFACEDESC2 pDDSD, LPVOID context,
665                                  LPDDENUMMODESCALLBACK2 callback);
666 HRESULT WINAPI
667 User_DirectDraw_GetDeviceIdentifier(LPDIRECTDRAW7 iface,
668                                     LPDDDEVICEIDENTIFIER2 pDDDI,
669                                     DWORD dwFlags);
670 HRESULT WINAPI
671 User_DirectDraw_SetDisplayMode(LPDIRECTDRAW7 iface, DWORD dwWidth,
672                                DWORD dwHeight, DWORD dwBPP,
673                                DWORD dwRefreshRate, DWORD dwFlags);
674
675 /*****************************************************************************
676  * IDirectDraw HAL declarations
677  */
678 #define HAL_DDRAW_PRIV(ddraw) \
679         ((HAL_DirectDrawImpl*)((ddraw)->private))
680 #define HAL_DDRAW_PRIV_VAR(name,ddraw) \
681         HAL_DirectDrawImpl* name = HAL_DDRAW_PRIV(ddraw)
682
683 typedef struct
684 {
685     DWORD next_vofs;
686 } HAL_DirectDrawImpl_Part;
687
688 typedef struct
689 {
690     User_DirectDrawImpl_Part user;
691     HAL_DirectDrawImpl_Part hal;
692 } HAL_DirectDrawImpl;
693
694 void HAL_DirectDraw_final_release(IDirectDrawImpl* This);
695 HRESULT HAL_DirectDraw_create_primary(IDirectDrawImpl* This,
696                                       const DDSURFACEDESC2* pDDSD,
697                                       LPDIRECTDRAWSURFACE7* ppSurf,
698                                       LPUNKNOWN pOuter);
699 HRESULT HAL_DirectDraw_create_backbuffer(IDirectDrawImpl* This,
700                                          const DDSURFACEDESC2* pDDSD,
701                                          LPDIRECTDRAWSURFACE7* ppSurf,
702                                          LPUNKNOWN pOuter,
703                                          IDirectDrawSurfaceImpl* primary);
704 HRESULT HAL_DirectDraw_create_texture(IDirectDrawImpl* This,
705                                       const DDSURFACEDESC2* pDDSD,
706                                       LPDIRECTDRAWSURFACE7* ppSurf,
707                                       LPUNKNOWN pOuter,
708                                       DWORD dwMipMapLevel);
709
710 HRESULT HAL_DirectDraw_Construct(IDirectDrawImpl *This, BOOL ex);
711 HRESULT HAL_DirectDraw_Create(const GUID* pGUID, LPDIRECTDRAW7* pIface,
712                                    IUnknown* pUnkOuter, BOOL ex);
713
714 HRESULT WINAPI
715 HAL_DirectDraw_GetDeviceIdentifier(LPDIRECTDRAW7 iface,
716                                         LPDDDEVICEIDENTIFIER2 pDDDI,
717                                         DWORD dwFlags);
718 HRESULT WINAPI
719 HAL_DirectDraw_SetDisplayMode(LPDIRECTDRAW7 iface, DWORD dwWidth,
720                                    DWORD dwHeight, DWORD dwBPP,
721                                    DWORD dwRefreshRate, DWORD dwFlags);
722 HRESULT WINAPI HAL_DirectDraw_RestoreDisplayMode(LPDIRECTDRAW7 iface);
723
724 /*****************************************************************************
725  * IDirectDrawSurface MAIN declarations
726  */
727 /* Support for IDirectDrawSurface7::Set/Get/FreePrivateData. I don't think
728  * anybody uses it for much so a good implementation is optional. */
729 typedef struct PrivateData
730 {
731     struct PrivateData* next;
732     struct PrivateData* prev;
733
734     GUID tag;
735     DWORD flags; /* DDSPD_* */
736     DWORD uniqueness_value;
737
738     union
739     {
740         LPVOID data;
741         LPUNKNOWN object;
742     } ptr;
743
744     DWORD size;
745 } PrivateData;
746
747 extern const IDirectDrawGammaControlVtbl DDRAW_IDDGC_VTable;
748
749 /* Non-interface functions */
750 HRESULT Main_DirectDrawSurface_Construct(IDirectDrawSurfaceImpl* This,
751                                          IDirectDrawImpl* pDD,
752                                          const DDSURFACEDESC2* pDDSD);
753 void Main_DirectDrawSurface_ForceDestroy(IDirectDrawSurfaceImpl* This);
754
755 void Main_DirectDrawSurface_final_release(IDirectDrawSurfaceImpl* This);
756 HRESULT Main_DirectDrawSurface_late_allocate(IDirectDrawSurfaceImpl* This);
757 BOOL Main_DirectDrawSurface_attach(IDirectDrawSurfaceImpl *This,
758                                    IDirectDrawSurfaceImpl *to);
759 BOOL Main_DirectDrawSurface_detach(IDirectDrawSurfaceImpl *This);
760 void Main_DirectDrawSurface_lock_update(IDirectDrawSurfaceImpl* This,
761                                         LPCRECT pRect, DWORD dwFlags);
762 void Main_DirectDrawSurface_unlock_update(IDirectDrawSurfaceImpl* This,
763                                           LPCRECT pRect);
764 void Main_DirectDrawSurface_lose_surface(IDirectDrawSurfaceImpl* This);
765 void Main_DirectDrawSurface_set_palette(IDirectDrawSurfaceImpl* This,
766                                         IDirectDrawPaletteImpl* pal);
767 void Main_DirectDrawSurface_update_palette(IDirectDrawSurfaceImpl* This,
768                                            IDirectDrawPaletteImpl* pal,
769                                            DWORD dwStart, DWORD dwCount,
770                                            LPPALETTEENTRY palent);
771 HWND Main_DirectDrawSurface_get_display_window(IDirectDrawSurfaceImpl* This);
772
773 HRESULT Main_DirectDrawSurface_get_gamma_ramp(IDirectDrawSurfaceImpl* This,
774                                               DWORD dwFlags,
775                                               LPDDGAMMARAMP lpGammaRamp);
776 HRESULT Main_DirectDrawSurface_set_gamma_ramp(IDirectDrawSurfaceImpl* This,
777                                               DWORD dwFlags,
778                                               LPDDGAMMARAMP lpGammaRamp);
779
780 BOOL Main_DirectDrawSurface_flip_data(IDirectDrawSurfaceImpl* front,
781                                       IDirectDrawSurfaceImpl* back,
782                                       DWORD dwFlags);
783
784 #define CHECK_LOST(This)                                        \
785         do {                                                    \
786                 if (This->lost) return DDERR_SURFACELOST;       \
787         } while (0)
788
789 #define CHECK_TEXTURE(This)                                     \
790         do {                                                    \
791                 if (!(This->surface_desc.ddsCaps.dwCaps2        \
792                       & DDSCAPS2_TEXTUREMANAGE))                \
793                         return DDERR_INVALIDOBJECT;             \
794         } while (0)
795
796 #define LOCK_OBJECT(This) do { } while (0)
797 #define UNLOCK_OBJECT(This) do { } while (0)
798
799 /* IDirectDrawSurface7 (partial) implementation */
800 ULONG WINAPI Main_DirectDrawSurface_AddRef(LPDIRECTDRAWSURFACE7 iface);
801 ULONG WINAPI Main_DirectDrawSurface_Release(LPDIRECTDRAWSURFACE7 iface);
802 HRESULT WINAPI
803 Main_DirectDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE7 iface, REFIID riid,
804                                       LPVOID* ppObj);
805 HRESULT WINAPI
806 Main_DirectDrawSurface_AddAttachedSurface(LPDIRECTDRAWSURFACE7 iface,
807                                           LPDIRECTDRAWSURFACE7 pAttach);
808 HRESULT WINAPI
809 Main_DirectDrawSurface_AddOverlayDirtyRect(LPDIRECTDRAWSURFACE7 iface,
810                                            LPRECT pRect);
811 HRESULT WINAPI
812 Main_DirectDrawSurface_BltBatch(LPDIRECTDRAWSURFACE7 iface,
813                                 LPDDBLTBATCH pBatch, DWORD dwCount,
814                                 DWORD dwFlags);
815 HRESULT WINAPI
816 Main_DirectDrawSurface_ChangeUniquenessValue(LPDIRECTDRAWSURFACE7 iface);
817 HRESULT WINAPI
818 Main_DirectDrawSurface_DeleteAttachedSurface(LPDIRECTDRAWSURFACE7 iface,
819                                              DWORD dwFlags,
820                                              LPDIRECTDRAWSURFACE7 pAttach);
821 HRESULT WINAPI
822 Main_DirectDrawSurface_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE7 iface,
823                                             LPVOID context,
824                                             LPDDENUMSURFACESCALLBACK7 cb);
825 HRESULT WINAPI
826 Main_DirectDrawSurface_EnumOverlayZOrders(LPDIRECTDRAWSURFACE7 iface,
827                                           DWORD dwFlags, LPVOID context,
828                                           LPDDENUMSURFACESCALLBACK7 cb);
829 HRESULT WINAPI
830 Main_DirectDrawSurface_Flip(LPDIRECTDRAWSURFACE7 iface,
831                             LPDIRECTDRAWSURFACE7 override, DWORD dwFlags);
832 HRESULT WINAPI
833 Main_DirectDrawSurface_FreePrivateData(LPDIRECTDRAWSURFACE7 iface,
834                                        REFGUID tag);
835 HRESULT WINAPI
836 Main_DirectDrawSurface_GetAttachedSurface(LPDIRECTDRAWSURFACE7 iface,
837                                           LPDDSCAPS2 pCaps,
838                                           LPDIRECTDRAWSURFACE7* ppSurface);
839 HRESULT WINAPI
840 Main_DirectDrawSurface_GetBltStatus(LPDIRECTDRAWSURFACE7 iface,
841                                     DWORD dwFlags);
842 HRESULT WINAPI
843 Main_DirectDrawSurface_GetCaps(LPDIRECTDRAWSURFACE7 iface,
844                                LPDDSCAPS2 pCaps);
845 HRESULT WINAPI
846 Main_DirectDrawSurface_GetClipper(LPDIRECTDRAWSURFACE7 iface,
847                                   LPDIRECTDRAWCLIPPER* ppClipper);
848 HRESULT WINAPI
849 Main_DirectDrawSurface_GetColorKey(LPDIRECTDRAWSURFACE7 iface,
850                                    DWORD dwFlags, LPDDCOLORKEY pCKey);
851 HRESULT WINAPI
852 Main_DirectDrawSurface_GetDC(LPDIRECTDRAWSURFACE7 iface, HDC *phDC);
853 HRESULT WINAPI
854 Main_DirectDrawSurface_GetDDInterface(LPDIRECTDRAWSURFACE7 iface,
855                                       LPVOID* pDD);
856 HRESULT WINAPI
857 Main_DirectDrawSurface_GetFlipStatus(LPDIRECTDRAWSURFACE7 iface,
858                                      DWORD dwFlags);
859 HRESULT WINAPI
860 Main_DirectDrawSurface_GetLOD(LPDIRECTDRAWSURFACE7 iface,
861                               LPDWORD pdwMaxLOD);
862 HRESULT WINAPI
863 Main_DirectDrawSurface_GetOverlayPosition(LPDIRECTDRAWSURFACE7 iface,
864                                           LPLONG pX, LPLONG pY);
865 HRESULT WINAPI
866 Main_DirectDrawSurface_GetPalette(LPDIRECTDRAWSURFACE7 iface,
867                                   LPDIRECTDRAWPALETTE* ppPalette);
868 HRESULT WINAPI
869 Main_DirectDrawSurface_GetPixelFormat(LPDIRECTDRAWSURFACE7 iface,
870                                       LPDDPIXELFORMAT pDDPixelFormat);
871 HRESULT WINAPI
872 Main_DirectDrawSurface_GetPriority(LPDIRECTDRAWSURFACE7 iface,
873                                    LPDWORD pdwPriority);
874 HRESULT WINAPI
875 Main_DirectDrawSurface_GetPrivateData(LPDIRECTDRAWSURFACE7 iface, REFGUID tag,
876                                       LPVOID pBuffer, LPDWORD pcbBufferSize);
877 HRESULT WINAPI
878 Main_DirectDrawSurface_GetSurfaceDesc(LPDIRECTDRAWSURFACE7 iface,
879                                       LPDDSURFACEDESC2 pDDSD);
880 HRESULT WINAPI
881 Main_DirectDrawSurface_GetUniquenessValue(LPDIRECTDRAWSURFACE7 iface,
882                                           LPDWORD pValue);
883 HRESULT WINAPI
884 Main_DirectDrawSurface_Initialize(LPDIRECTDRAWSURFACE7 iface,
885                                   LPDIRECTDRAW pDD, LPDDSURFACEDESC2 pDDSD);
886 HRESULT WINAPI
887 Main_DirectDrawSurface_IsLost(LPDIRECTDRAWSURFACE7 iface);
888 HRESULT WINAPI
889 Main_DirectDrawSurface_Lock(LPDIRECTDRAWSURFACE7 iface, LPRECT prect,
890                             LPDDSURFACEDESC2 pDDSD, DWORD flags, HANDLE h);
891 HRESULT WINAPI
892 Main_DirectDrawSurface_PageLock(LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags);
893 HRESULT WINAPI
894 Main_DirectDrawSurface_PageUnlock(LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags);
895 HRESULT WINAPI
896 Main_DirectDrawSurface_ReleaseDC(LPDIRECTDRAWSURFACE7 iface, HDC hDC);
897 HRESULT WINAPI
898 Main_DirectDrawSurface_SetClipper(LPDIRECTDRAWSURFACE7 iface,
899                                   LPDIRECTDRAWCLIPPER pDDClipper);
900 HRESULT WINAPI
901 Main_DirectDrawSurface_SetColorKey(LPDIRECTDRAWSURFACE7 iface,
902                                    DWORD dwFlags, LPDDCOLORKEY pCKey);
903 HRESULT WINAPI
904 Main_DirectDrawSurface_SetLOD(LPDIRECTDRAWSURFACE7 iface, DWORD dwMaxLOD);
905 HRESULT WINAPI
906 Main_DirectDrawSurface_SetOverlayPosition(LPDIRECTDRAWSURFACE7 iface,
907                                           LONG X, LONG Y);
908 HRESULT WINAPI
909 Main_DirectDrawSurface_SetPalette(LPDIRECTDRAWSURFACE7 iface,
910                                   LPDIRECTDRAWPALETTE pPalette);
911 HRESULT WINAPI
912 Main_DirectDrawSurface_SetPriority(LPDIRECTDRAWSURFACE7 iface,
913                                    DWORD dwPriority);
914 HRESULT WINAPI
915 Main_DirectDrawSurface_SetPrivateData(LPDIRECTDRAWSURFACE7 iface,
916                                       REFGUID tag, LPVOID pData,
917                                       DWORD cbSize, DWORD dwFlags);
918 HRESULT WINAPI
919 Main_DirectDrawSurface_Unlock(LPDIRECTDRAWSURFACE7 iface, LPRECT pRect);
920 HRESULT WINAPI
921 Main_DirectDrawSurface_UpdateOverlay(LPDIRECTDRAWSURFACE7 iface,
922                                      LPRECT pSrcRect,
923                                      LPDIRECTDRAWSURFACE7 pDstSurface,
924                                      LPRECT pDstRect, DWORD dwFlags,
925                                      LPDDOVERLAYFX pFX);
926 HRESULT WINAPI
927 Main_DirectDrawSurface_UpdateOverlayDisplay(LPDIRECTDRAWSURFACE7 iface,
928                                             DWORD dwFlags);
929 HRESULT WINAPI
930 Main_DirectDrawSurface_UpdateOverlayZOrder(LPDIRECTDRAWSURFACE7 iface,
931                                            DWORD dwFlags,
932                                            LPDIRECTDRAWSURFACE7 pDDSRef);
933
934 /*****************************************************************************
935  * IDirectDrawSurface DIB declarations
936  */
937 #define DIB_PRIV(surf) ((DIB_DirectDrawSurfaceImpl*)((surf)->private))
938
939 #define DIB_PRIV_VAR(name, surf) \
940         DIB_DirectDrawSurfaceImpl* name = DIB_PRIV(surf)
941
942 struct DIB_DirectDrawSurfaceImpl_Part
943 {
944     HBITMAP DIBsection;
945     void* bitmap_data;
946     HGDIOBJ holdbitmap;
947     BOOL client_memory;
948     DWORD d3d_data[4]; /* room for Direct3D driver data */
949 };
950
951 typedef struct
952 {
953     struct DIB_DirectDrawSurfaceImpl_Part dib;
954 } DIB_DirectDrawSurfaceImpl;
955
956 HRESULT
957 DIB_DirectDrawSurface_Construct(IDirectDrawSurfaceImpl *This,
958                                 IDirectDrawImpl *pDD,
959                                 const DDSURFACEDESC2 *pDDSD);
960 HRESULT
961 DIB_DirectDrawSurface_Create(IDirectDrawImpl *pDD,
962                              const DDSURFACEDESC2 *pDDSD,
963                              LPDIRECTDRAWSURFACE7 *ppSurf,
964                              IUnknown *pUnkOuter);
965
966 void DIB_DirectDrawSurface_final_release(IDirectDrawSurfaceImpl* This);
967 BOOL DIB_DirectDrawSurface_flip_data(IDirectDrawSurfaceImpl* front,
968                                      IDirectDrawSurfaceImpl* back,
969                                      DWORD dwFlags);
970
971 void DIB_DirectDrawSurface_set_palette(IDirectDrawSurfaceImpl* This,
972                                        IDirectDrawPaletteImpl* pal);
973 void DIB_DirectDrawSurface_update_palette(IDirectDrawSurfaceImpl* This,
974                                           IDirectDrawPaletteImpl* pal,
975                                           DWORD dwStart, DWORD dwCount,
976                                           LPPALETTEENTRY palent);
977
978 HRESULT DIB_DirectDrawSurface_get_dc(IDirectDrawSurfaceImpl* This, HDC* phDC);
979 HRESULT DIB_DirectDrawSurface_release_dc(IDirectDrawSurfaceImpl* This,HDC hDC);
980
981 HRESULT DIB_DirectDrawSurface_alloc_dc(IDirectDrawSurfaceImpl* This,HDC* phDC);
982 HRESULT DIB_DirectDrawSurface_free_dc(IDirectDrawSurfaceImpl* This, HDC hDC);
983
984 HRESULT WINAPI
985 DIB_DirectDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface, LPRECT prcDest,
986                           LPDIRECTDRAWSURFACE7 pSrcSurf, LPRECT prcSrc,
987                           DWORD dwFlags, LPDDBLTFX pBltFx);
988 HRESULT WINAPI
989 DIB_DirectDrawSurface_BltFast(LPDIRECTDRAWSURFACE7 iface, DWORD dwX,
990                               DWORD dwY, LPDIRECTDRAWSURFACE7 pSrcSurf,
991                               LPRECT prcSrc, DWORD dwTrans);
992 HRESULT WINAPI DIB_DirectDrawSurface_Restore(LPDIRECTDRAWSURFACE7 iface);
993 HRESULT WINAPI
994 DIB_DirectDrawSurface_SetSurfaceDesc(LPDIRECTDRAWSURFACE7 iface,
995                                      LPDDSURFACEDESC2 pDDSD, DWORD dwFlags);
996
997 /*****************************************************************************
998  * IDirectDrawSurface USER declarations
999  */
1000 #define USER_PRIV(surf) ((User_DirectDrawSurfaceImpl*)((surf)->private))
1001
1002 #define USER_PRIV_VAR(name,surf) \
1003         User_DirectDrawSurfaceImpl* name = USER_PRIV(surf)
1004
1005 struct User_DirectDrawSurfaceImpl_Part
1006 {
1007     HWND window;
1008     HDC cached_dc;
1009     HANDLE update_thread, update_event, refresh_event;
1010     volatile int wait_count, in_refresh;
1011     CRITICAL_SECTION crit;
1012 };
1013
1014 typedef struct
1015 {
1016     struct DIB_DirectDrawSurfaceImpl_Part dib;
1017     struct User_DirectDrawSurfaceImpl_Part user;
1018 } User_DirectDrawSurfaceImpl;
1019
1020 HRESULT User_DirectDrawSurface_Construct(IDirectDrawSurfaceImpl* This,
1021                                          IDirectDrawImpl* pDD,
1022                                          const DDSURFACEDESC2* pDDSD);
1023
1024 HRESULT User_DirectDrawSurface_Create(IDirectDrawImpl *pDD,
1025                                       const DDSURFACEDESC2 *pDDSD,
1026                                       LPDIRECTDRAWSURFACE7 *ppSurf,
1027                                       IUnknown *pUnkOuter);
1028
1029 void User_DirectDrawSurface_final_release(IDirectDrawSurfaceImpl* This);
1030
1031 void User_DirectDrawSurface_lock_update(IDirectDrawSurfaceImpl* This,
1032                                         LPCRECT pRect, DWORD dwFlags);
1033 void User_DirectDrawSurface_unlock_update(IDirectDrawSurfaceImpl* This,
1034                                           LPCRECT pRect);
1035 void User_DirectDrawSurface_set_palette(IDirectDrawSurfaceImpl* This,
1036                                         IDirectDrawPaletteImpl* pal);
1037 void User_DirectDrawSurface_update_palette(IDirectDrawSurfaceImpl* This,
1038                                            IDirectDrawPaletteImpl* pal,
1039                                            DWORD dwStart, DWORD dwCount,
1040                                            LPPALETTEENTRY palent);
1041 HRESULT User_DirectDrawSurface_duplicate_surface(IDirectDrawSurfaceImpl* This,
1042                                                  LPDIRECTDRAWSURFACE7* ppDup);
1043 BOOL User_DirectDrawSurface_flip_data(IDirectDrawSurfaceImpl* front,
1044                                       IDirectDrawSurfaceImpl* back,
1045                                       DWORD dwFlags);
1046 void User_DirectDrawSurface_flip_update(IDirectDrawSurfaceImpl* This,
1047                                         DWORD dwFlags);
1048 HWND User_DirectDrawSurface_get_display_window(IDirectDrawSurfaceImpl* This);
1049
1050 HRESULT User_DirectDrawSurface_get_dc(IDirectDrawSurfaceImpl* This, HDC* phDC);
1051 HRESULT User_DirectDrawSurface_release_dc(IDirectDrawSurfaceImpl* This,
1052                                           HDC hDC);
1053
1054 HRESULT User_DirectDrawSurface_get_gamma_ramp(IDirectDrawSurfaceImpl* This,
1055                                               DWORD dwFlags,
1056                                               LPDDGAMMARAMP lpGammaRamp);
1057 HRESULT User_DirectDrawSurface_set_gamma_ramp(IDirectDrawSurfaceImpl* This,
1058                                               DWORD dwFlags,
1059                                               LPDDGAMMARAMP lpGammaRamp);
1060
1061 /*****************************************************************************
1062  * IDirectDrawSurface HAL declarations
1063  */
1064 #define HAL_PRIV(surf) ((HAL_DirectDrawSurfaceImpl*)((surf)->private))
1065
1066 #define HAL_PRIV_VAR(name,surf) \
1067         HAL_DirectDrawSurfaceImpl* name = HAL_PRIV(surf)
1068
1069 struct HAL_DirectDrawSurfaceImpl_Part
1070 {
1071     DWORD need_late;
1072     LPVOID fb_addr;
1073     DWORD fb_pitch, fb_vofs;
1074 };
1075
1076 typedef struct
1077 {
1078     struct DIB_DirectDrawSurfaceImpl_Part dib;
1079     struct User_DirectDrawSurfaceImpl_Part user;
1080     struct HAL_DirectDrawSurfaceImpl_Part hal;
1081 } HAL_DirectDrawSurfaceImpl;
1082
1083 HRESULT HAL_DirectDrawSurface_Construct(IDirectDrawSurfaceImpl* This,
1084                                         IDirectDrawImpl* pDD,
1085                                         const DDSURFACEDESC2* pDDSD);
1086
1087 HRESULT HAL_DirectDrawSurface_Create(IDirectDrawImpl *pDD,
1088                                      const DDSURFACEDESC2 *pDDSD,
1089                                      LPDIRECTDRAWSURFACE7 *ppSurf,
1090                                      IUnknown *pUnkOuter);
1091
1092 void HAL_DirectDrawSurface_final_release(IDirectDrawSurfaceImpl* This);
1093 HRESULT HAL_DirectDrawSurface_late_allocate(IDirectDrawSurfaceImpl* This);
1094
1095 void HAL_DirectDrawSurface_set_palette(IDirectDrawSurfaceImpl* This,
1096                                        IDirectDrawPaletteImpl* pal);
1097 void HAL_DirectDrawSurface_update_palette(IDirectDrawSurfaceImpl* This,
1098                                           IDirectDrawPaletteImpl* pal,
1099                                           DWORD dwStart, DWORD dwCount,
1100                                           LPPALETTEENTRY palent);
1101 HRESULT HAL_DirectDrawSurface_duplicate_surface(IDirectDrawSurfaceImpl* This,
1102                                                 LPDIRECTDRAWSURFACE7* ppDup);
1103 void HAL_DirectDrawSurface_lock_update(IDirectDrawSurfaceImpl* This,
1104                                        LPCRECT pRect, DWORD dwFlags);
1105 void HAL_DirectDrawSurface_unlock_update(IDirectDrawSurfaceImpl* This,
1106                                          LPCRECT pRect);
1107 BOOL HAL_DirectDrawSurface_flip_data(IDirectDrawSurfaceImpl* front,
1108                                      IDirectDrawSurfaceImpl* back,
1109                                      DWORD dwFlags);
1110 void HAL_DirectDrawSurface_flip_update(IDirectDrawSurfaceImpl* This,
1111                                        DWORD dwFlags);
1112 HWND HAL_DirectDrawSurface_get_display_window(IDirectDrawSurfaceImpl* This);
1113
1114 /*****************************************************************************
1115  * IDirectDrawSurface FAKEZBUFFER declarations
1116  */
1117 typedef struct
1118 {
1119     BOOLEAN in_memory;
1120 } FakeZBuffer_DirectDrawSurfaceImpl;
1121
1122 HRESULT FakeZBuffer_DirectDrawSurface_Construct(IDirectDrawSurfaceImpl* This,
1123                                                 IDirectDrawImpl* pDD,
1124                                                 const DDSURFACEDESC2* pDDSD);
1125
1126 HRESULT FakeZBuffer_DirectDrawSurface_Create(IDirectDrawImpl* pDD,
1127                                              const DDSURFACEDESC2* pDDSD,
1128                                              LPDIRECTDRAWSURFACE7* ppSurf,
1129                                              IUnknown* pUnkOuter);
1130
1131 void FakeZBuffer_DirectDrawSurface_final_release(IDirectDrawSurfaceImpl* This);
1132
1133 HRESULT FakeZBuffer_DirectDrawSurface_duplicate_surface(IDirectDrawSurfaceImpl* This,
1134                                                         LPDIRECTDRAWSURFACE7* ppDup);
1135
1136 #endif /* __WINE_DLLS_DDRAW_DDRAW_PRIVATE_H */