Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygencreatepalette.c
Go to the documentation of this file.
00001 /* $Id$ 00002 * 00003 * COPYRIGHT: See COPYING in the top level directory 00004 * PROJECT: ReactOS DirectX 00005 * FILE: ddraw/surface/createsurface.c 00006 * PURPOSE: IDirectDrawPalette Creation 00007 * PROGRAMMER: Jérôme Gardou 00008 * 00009 */ 00010 #include "rosdraw.h" 00011 00012 DWORD ConvertPCapsFlags(DWORD dwFlags) 00013 { 00014 DWORD ret = 0; 00015 if(dwFlags & DDPCAPS_4BIT) 00016 ret|=DDRAWIPAL_16; 00017 if(dwFlags & DDPCAPS_8BIT) 00018 ret|=DDRAWIPAL_256; 00019 if(dwFlags & DDPCAPS_8BITENTRIES) 00020 ret|=DDRAWIPAL_STORED_8INDEX; 00021 if(dwFlags & DDPCAPS_ALLOW256) 00022 ret|=DDRAWIPAL_ALLOW256; 00023 if(dwFlags & DDPCAPS_ALPHA) 00024 ret|=DDRAWIPAL_ALPHA; 00025 if(dwFlags & DDPCAPS_1BIT) 00026 ret|=DDRAWIPAL_2; 00027 if(dwFlags & DDPCAPS_2BIT) 00028 ret|=DDRAWIPAL_4; 00029 00030 return ret; 00031 } 00032 00033 HRESULT 00034 Internal_CreatePalette( LPDDRAWI_DIRECTDRAW_INT pDDraw, DWORD dwFlags, 00035 LPPALETTEENTRY palent, LPDIRECTDRAWPALETTE* ppPalette, LPUNKNOWN pUnkOuter) 00036 { 00037 DDHAL_CREATEPALETTEDATA mDdCreatePalette = { 0 }; 00038 00039 LPDDRAWI_DDRAWPALETTE_INT ThisPalInt = NULL; 00040 LPDDRAWI_DDRAWPALETTE_LCL ThisPalLcl = NULL; 00041 LPDDRAWI_DDRAWPALETTE_GBL ThisPalGbl = NULL; 00042 00043 HRESULT ret; 00044 00045 if(pUnkOuter) 00046 { 00047 return CLASS_E_NOAGGREGATION; 00048 } 00049 00050 if(!(pDDraw->lpLcl->dwLocalFlags & DDRAWILCL_SETCOOPCALLED)) 00051 { 00052 return DDERR_NOCOOPERATIVELEVELSET; 00053 } 00054 00055 00056 if (pDDraw->lpLcl->dwProcessId != GetCurrentProcessId() ) 00057 { 00058 return DDERR_INVALIDOBJECT; 00059 } 00060 00061 /* Allocate the palette interface and needed members */ 00062 DxHeapMemAlloc(ThisPalInt, sizeof( DDRAWI_DDRAWPALETTE_INT ) ); 00063 if( ThisPalInt == NULL ) 00064 { 00065 ret = DDERR_OUTOFMEMORY; 00066 goto cleanup; 00067 } 00068 00069 DxHeapMemAlloc(ThisPalLcl, sizeof( DDRAWI_DDRAWPALETTE_LCL ) ); 00070 if( ThisPalLcl == NULL ) 00071 { 00072 ret = DDERR_OUTOFMEMORY; 00073 goto cleanup; 00074 } 00075 00076 DxHeapMemAlloc(ThisPalGbl, sizeof( DDRAWI_DDRAWPALETTE_GBL ) ); 00077 if( ThisPalGbl == NULL ) 00078 { 00079 ret = DDERR_OUTOFMEMORY; 00080 goto cleanup; 00081 } 00082 00083 /*Some initial setup*/ 00084 00085 ThisPalInt->lpLcl = ThisPalLcl; 00086 ThisPalLcl->lpGbl = ThisPalGbl; 00087 00088 ThisPalLcl->lpDD_lcl = ThisPalGbl->lpDD_lcl = pDDraw->lpLcl; 00089 ThisPalGbl->dwFlags = ConvertPCapsFlags(dwFlags); 00090 00091 ThisPalInt->lpVtbl = (PVOID)&DirectDrawPalette_Vtable; 00092 ThisPalGbl->dwProcessId = GetCurrentProcessId(); 00093 00094 mDdCreatePalette.lpDD = pDDraw->lpLcl->lpGbl; 00095 mDdCreatePalette.lpDDPalette = ThisPalGbl; 00096 if(pDDraw->lpLcl->lpGbl->lpDDCBtmp->HALDD.dwFlags & DDHAL_CB32_CREATEPALETTE) { 00097 mDdCreatePalette.CreatePalette = pDDraw->lpLcl->lpGbl->lpDDCBtmp->HALDD.CreatePalette; 00098 DX_STUB_str("Using HAL CreatePalette\n"); 00099 } 00100 else { 00101 mDdCreatePalette.CreatePalette = pDDraw->lpLcl->lpGbl->lpDDCBtmp->HELDD.CreatePalette; 00102 DX_STUB_str("Using HEL CreatePalette\n"); 00103 } 00104 mDdCreatePalette.ddRVal = DDERR_GENERIC; 00105 mDdCreatePalette.lpColorTable = palent; 00106 00107 if (mDdCreatePalette.CreatePalette(&mDdCreatePalette) == DDHAL_DRIVER_NOTHANDLED) 00108 { 00109 DX_STUB_str("mDdCreateSurface failed with DDHAL_DRIVER_NOTHANDLED."); 00110 ret = DDERR_NOTINITIALIZED; 00111 goto cleanup; 00112 } 00113 00114 if (mDdCreatePalette.ddRVal != DD_OK) 00115 { 00116 DX_STUB_str("mDdCreateSurface failed."); 00117 ret = mDdCreatePalette.ddRVal; 00118 goto cleanup; 00119 } 00120 00121 *ppPalette = (LPDIRECTDRAWPALETTE)ThisPalInt; 00122 ThisPalInt->lpLink = pDDraw->lpLcl->lpGbl->palList; 00123 pDDraw->lpLcl->lpGbl->palList = ThisPalInt; 00124 ThisPalInt->lpLcl->dwReserved1 = (ULONG_PTR)pDDraw; 00125 IDirectDrawPalette_AddRef(*ppPalette); 00126 00127 return DD_OK; 00128 00129 cleanup: 00130 if(ThisPalInt) DxHeapMemFree(ThisPalInt); 00131 if(ThisPalLcl) DxHeapMemFree(ThisPalLcl); 00132 if(ThisPalGbl) DxHeapMemFree(ThisPalGbl); 00133 00134 return ret; 00135 } Generated on Sun May 27 2012 04:21:25 for ReactOS by
1.7.6.1
|