1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS DirectX
4 * FILE: dll/directx/ddraw/Palette/createpalette.c
5 * PURPOSE: IDirectDrawPalette Creation
6 * PROGRAMMER: J�r�me Gardou
7 *
8 */
9 #include "rosdraw.h"
10
ConvertPCapsFlags(DWORD dwFlags)11 DWORD ConvertPCapsFlags(DWORD dwFlags)
12 {
13 DWORD ret = 0;
14 if(dwFlags & DDPCAPS_4BIT)
15 ret|=DDRAWIPAL_16;
16 if(dwFlags & DDPCAPS_8BIT)
17 ret|=DDRAWIPAL_256;
18 if(dwFlags & DDPCAPS_8BITENTRIES)
19 ret|=DDRAWIPAL_STORED_8INDEX;
20 if(dwFlags & DDPCAPS_ALLOW256)
21 ret|=DDRAWIPAL_ALLOW256;
22 if(dwFlags & DDPCAPS_ALPHA)
23 ret|=DDRAWIPAL_ALPHA;
24 if(dwFlags & DDPCAPS_1BIT)
25 ret|=DDRAWIPAL_2;
26 if(dwFlags & DDPCAPS_2BIT)
27 ret|=DDRAWIPAL_4;
28
29 return ret;
30 }
31
32 HRESULT
Internal_CreatePalette(LPDDRAWI_DIRECTDRAW_INT pDDraw,DWORD dwFlags,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE * ppPalette,LPUNKNOWN pUnkOuter)33 Internal_CreatePalette( LPDDRAWI_DIRECTDRAW_INT pDDraw, DWORD dwFlags,
34 LPPALETTEENTRY palent, LPDIRECTDRAWPALETTE* ppPalette, LPUNKNOWN pUnkOuter)
35 {
36 DDHAL_CREATEPALETTEDATA mDdCreatePalette = { 0 };
37
38 LPDDRAWI_DDRAWPALETTE_INT ThisPalInt = NULL;
39 LPDDRAWI_DDRAWPALETTE_LCL ThisPalLcl = NULL;
40 LPDDRAWI_DDRAWPALETTE_GBL ThisPalGbl = NULL;
41
42 HRESULT ret;
43
44 if(pUnkOuter)
45 {
46 return CLASS_E_NOAGGREGATION;
47 }
48
49 if(!(pDDraw->lpLcl->dwLocalFlags & DDRAWILCL_SETCOOPCALLED))
50 {
51 return DDERR_NOCOOPERATIVELEVELSET;
52 }
53
54
55 if (pDDraw->lpLcl->dwProcessId != GetCurrentProcessId() )
56 {
57 return DDERR_INVALIDOBJECT;
58 }
59
60 /* Allocate the palette interface and needed members */
61 DxHeapMemAlloc(ThisPalInt, sizeof( DDRAWI_DDRAWPALETTE_INT ) );
62 if( ThisPalInt == NULL )
63 {
64 ret = DDERR_OUTOFMEMORY;
65 goto cleanup;
66 }
67
68 DxHeapMemAlloc(ThisPalLcl, sizeof( DDRAWI_DDRAWPALETTE_LCL ) );
69 if( ThisPalLcl == NULL )
70 {
71 ret = DDERR_OUTOFMEMORY;
72 goto cleanup;
73 }
74
75 DxHeapMemAlloc(ThisPalGbl, sizeof( DDRAWI_DDRAWPALETTE_GBL ) );
76 if( ThisPalGbl == NULL )
77 {
78 ret = DDERR_OUTOFMEMORY;
79 goto cleanup;
80 }
81
82 /*Some initial setup*/
83
84 ThisPalInt->lpLcl = ThisPalLcl;
85 ThisPalLcl->lpGbl = ThisPalGbl;
86
87 ThisPalLcl->lpDD_lcl = ThisPalGbl->lpDD_lcl = pDDraw->lpLcl;
88 ThisPalGbl->dwFlags = ConvertPCapsFlags(dwFlags);
89
90 ThisPalInt->lpVtbl = (PVOID)&DirectDrawPalette_Vtable;
91 ThisPalGbl->dwProcessId = GetCurrentProcessId();
92
93 mDdCreatePalette.lpDD = pDDraw->lpLcl->lpGbl;
94 mDdCreatePalette.lpDDPalette = ThisPalGbl;
95 if(pDDraw->lpLcl->lpGbl->lpDDCBtmp->HALDD.dwFlags & DDHAL_CB32_CREATEPALETTE) {
96 mDdCreatePalette.CreatePalette = pDDraw->lpLcl->lpGbl->lpDDCBtmp->HALDD.CreatePalette;
97 DX_STUB_str("Using HAL CreatePalette\n");
98 }
99 else {
100 mDdCreatePalette.CreatePalette = pDDraw->lpLcl->lpGbl->lpDDCBtmp->HELDD.CreatePalette;
101 DX_STUB_str("Using HEL CreatePalette\n");
102 }
103 mDdCreatePalette.ddRVal = DDERR_GENERIC;
104 mDdCreatePalette.lpColorTable = palent;
105
106 if (mDdCreatePalette.CreatePalette(&mDdCreatePalette) == DDHAL_DRIVER_NOTHANDLED)
107 {
108 DX_STUB_str("mDdCreateSurface failed with DDHAL_DRIVER_NOTHANDLED.");
109 ret = DDERR_NOTINITIALIZED;
110 goto cleanup;
111 }
112
113 if (mDdCreatePalette.ddRVal != DD_OK)
114 {
115 DX_STUB_str("mDdCreateSurface failed.");
116 ret = mDdCreatePalette.ddRVal;
117 goto cleanup;
118 }
119
120 *ppPalette = (LPDIRECTDRAWPALETTE)ThisPalInt;
121 ThisPalInt->lpLink = pDDraw->lpLcl->lpGbl->palList;
122 pDDraw->lpLcl->lpGbl->palList = ThisPalInt;
123 ThisPalInt->lpLcl->dwReserved1 = (ULONG_PTR)pDDraw;
124 IDirectDrawPalette_AddRef(*ppPalette);
125
126 return DD_OK;
127
128 cleanup:
129 if(ThisPalInt) DxHeapMemFree(ThisPalInt);
130 if(ThisPalLcl) DxHeapMemFree(ThisPalLcl);
131 if(ThisPalGbl) DxHeapMemFree(ThisPalGbl);
132
133 return ret;
134 }
135