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