Added an unknown VxD error code.
[wine] / dlls / ddraw / dpalette / hal.c
1 /*      DirectDrawPalette HAL driver
2  *
3  * Copyright 2001 TransGaming Technologies Inc.
4  */
5
6 #include "config.h"
7 #include "winerror.h"
8 #include "debugtools.h"
9
10 #include <assert.h>
11 #include <string.h>
12
13 #include "ddraw_private.h"
14 #include "dpalette/main.h"
15 #include "dpalette/hal.h"
16 #include "ddraw/main.h"
17
18 DEFAULT_DEBUG_CHANNEL(ddraw);
19
20 static ICOM_VTABLE(IDirectDrawPalette) DDRAW_HAL_Palette_VTable;
21
22 /******************************************************************************
23  *                      IDirectDrawPalette
24  */
25 HRESULT HAL_DirectDrawPalette_Construct(IDirectDrawPaletteImpl* This,
26                                         IDirectDrawImpl* pDD, DWORD dwFlags)
27 {
28     LPDDRAWI_DIRECTDRAW_GBL dd_gbl = pDD->local.lpGbl;
29     DDHAL_CREATEPALETTEDATA data;
30     HRESULT hr;
31
32     hr = Main_DirectDrawPalette_Construct(This, pDD, dwFlags);
33     if (FAILED(hr)) return hr;
34
35     This->final_release = HAL_DirectDrawPalette_final_release;
36     ICOM_INIT_INTERFACE(This, IDirectDrawPalette, DDRAW_HAL_Palette_VTable);
37
38     /* initialize HAL palette */
39     data.lpDD = dd_gbl;
40     data.lpDDPalette = &This->global;
41     data.lpColorTable = NULL;
42     data.ddRVal = 0;
43     data.CreatePalette = dd_gbl->lpDDCBtmp->HALDD.CreatePalette;
44     if (data.CreatePalette)
45         data.CreatePalette(&data);
46
47     return DD_OK;
48 }
49
50 HRESULT
51 HAL_DirectDrawPalette_Create(IDirectDrawImpl* pDD, DWORD dwFlags,
52                              LPDIRECTDRAWPALETTE* ppPalette,
53                              LPUNKNOWN pUnkOuter)
54 {
55     IDirectDrawPaletteImpl* This;
56     HRESULT hr;
57
58     if (pUnkOuter != NULL)
59         return CLASS_E_NOAGGREGATION; /* unchecked */
60
61     This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*This));
62     if (This == NULL) return E_OUTOFMEMORY;
63
64     hr = HAL_DirectDrawPalette_Construct(This, pDD, dwFlags);
65     if (FAILED(hr))
66         HeapFree(GetProcessHeap(), 0, This);
67     else
68         *ppPalette = ICOM_INTERFACE(This, IDirectDrawPalette);
69
70     return hr;
71 }
72
73 HRESULT WINAPI
74 HAL_DirectDrawPalette_SetEntries(LPDIRECTDRAWPALETTE iface, DWORD dwFlags,
75                                  DWORD dwStart, DWORD dwCount,
76                                  LPPALETTEENTRY palent)
77 {
78     ICOM_THIS(IDirectDrawPaletteImpl,iface);
79     LPDDRAWI_DIRECTDRAW_GBL dd_gbl = This->local.lpDD_lcl->lpGbl;
80     DDHAL_SETENTRIESDATA data;
81
82     TRACE("(%p)->SetEntries(%08lx,%ld,%ld,%p)\n",This,dwFlags,dwStart,dwCount,
83           palent);
84
85     data.lpDD = dd_gbl;
86     data.lpDDPalette = &This->global;
87     data.dwBase = dwStart;
88     data.dwNumEntries = dwCount;
89     data.lpEntries = palent;
90     data.ddRVal = 0;
91     data.SetEntries = dd_gbl->lpDDCBtmp->HALDDPalette.SetEntries;
92     if (data.SetEntries)
93         data.SetEntries(&data);
94
95     return Main_DirectDrawPalette_SetEntries(iface, dwFlags, dwStart, dwCount, palent);
96 }
97
98 void HAL_DirectDrawPalette_final_release(IDirectDrawPaletteImpl* This)
99 {
100     LPDDRAWI_DIRECTDRAW_GBL dd_gbl = This->local.lpDD_lcl->lpGbl;
101     DDHAL_DESTROYPALETTEDATA data;
102
103     /* destroy HAL palette */
104     data.lpDD = dd_gbl;
105     data.lpDDPalette = &This->global;
106     data.ddRVal = 0;
107     data.DestroyPalette = dd_gbl->lpDDCBtmp->HALDDPalette.DestroyPalette;
108     if (data.DestroyPalette)
109         data.DestroyPalette(&data);
110
111     Main_DirectDrawPalette_final_release(This);
112 }
113
114 static ICOM_VTABLE(IDirectDrawPalette) DDRAW_HAL_Palette_VTable =
115 {
116     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
117     Main_DirectDrawPalette_QueryInterface,
118     Main_DirectDrawPalette_AddRef,
119     Main_DirectDrawPalette_Release,
120     Main_DirectDrawPalette_GetCaps,
121     Main_DirectDrawPalette_GetEntries,
122     Main_DirectDrawPalette_Initialize,
123     HAL_DirectDrawPalette_SetEntries
124 };