Implemented DirectDraw's Hardware Abstraction Layer (HAL) interface.
[wine/multimedia.git] / dlls / ddraw / dpalette / hal.c
blob44dc9f4babac88dcb910620dcb65492f810889e3
1 /* DirectDrawPalette HAL driver
3 * Copyright 2001 TransGaming Technologies Inc.
4 */
6 #include "config.h"
7 #include "winerror.h"
8 #include "debugtools.h"
10 #include <assert.h>
11 #include <string.h>
13 #include "ddraw_private.h"
14 #include "dpalette/main.h"
15 #include "dpalette/hal.h"
16 #include "ddraw/main.h"
18 DEFAULT_DEBUG_CHANNEL(ddraw);
20 static ICOM_VTABLE(IDirectDrawPalette) DDRAW_HAL_Palette_VTable;
22 /******************************************************************************
23 * IDirectDrawPalette
25 HRESULT HAL_DirectDrawPalette_Construct(IDirectDrawPaletteImpl* This,
26 IDirectDrawImpl* pDD, DWORD dwFlags)
28 LPDDRAWI_DIRECTDRAW_GBL dd_gbl = pDD->local.lpGbl;
29 DDHAL_CREATEPALETTEDATA data;
30 HRESULT hr;
32 hr = Main_DirectDrawPalette_Construct(This, pDD, dwFlags);
33 if (FAILED(hr)) return hr;
35 This->final_release = HAL_DirectDrawPalette_final_release;
36 ICOM_INIT_INTERFACE(This, IDirectDrawPalette, DDRAW_HAL_Palette_VTable);
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);
47 return DD_OK;
50 HRESULT
51 HAL_DirectDrawPalette_Create(IDirectDrawImpl* pDD, DWORD dwFlags,
52 LPDIRECTDRAWPALETTE* ppPalette,
53 LPUNKNOWN pUnkOuter)
55 IDirectDrawPaletteImpl* This;
56 HRESULT hr;
58 if (pUnkOuter != NULL)
59 return CLASS_E_NOAGGREGATION; /* unchecked */
61 This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*This));
62 if (This == NULL) return E_OUTOFMEMORY;
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);
70 return hr;
73 HRESULT WINAPI
74 HAL_DirectDrawPalette_SetEntries(LPDIRECTDRAWPALETTE iface, DWORD dwFlags,
75 DWORD dwStart, DWORD dwCount,
76 LPPALETTEENTRY palent)
78 ICOM_THIS(IDirectDrawPaletteImpl,iface);
79 LPDDRAWI_DIRECTDRAW_GBL dd_gbl = This->local.lpDD_lcl->lpGbl;
80 DDHAL_SETENTRIESDATA data;
82 TRACE("(%p)->SetEntries(%08lx,%ld,%ld,%p)\n",This,dwFlags,dwStart,dwCount,
83 palent);
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);
95 return Main_DirectDrawPalette_SetEntries(iface, dwFlags, dwStart, dwCount, palent);
98 void HAL_DirectDrawPalette_final_release(IDirectDrawPaletteImpl* This)
100 LPDDRAWI_DIRECTDRAW_GBL dd_gbl = This->local.lpDD_lcl->lpGbl;
101 DDHAL_DESTROYPALETTEDATA data;
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);
111 Main_DirectDrawPalette_final_release(This);
114 static ICOM_VTABLE(IDirectDrawPalette) DDRAW_HAL_Palette_VTable =
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