/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS DirectX * FILE: dll/directx/ddraw/Palette/createpalette.c * PURPOSE: IDirectDrawPalette Creation * PROGRAMMER: Jérôme Gardou * */ #include "rosdraw.h" DWORD ConvertPCapsFlags(DWORD dwFlags) { DWORD ret = 0; if(dwFlags & DDPCAPS_4BIT) ret|=DDRAWIPAL_16; if(dwFlags & DDPCAPS_8BIT) ret|=DDRAWIPAL_256; if(dwFlags & DDPCAPS_8BITENTRIES) ret|=DDRAWIPAL_STORED_8INDEX; if(dwFlags & DDPCAPS_ALLOW256) ret|=DDRAWIPAL_ALLOW256; if(dwFlags & DDPCAPS_ALPHA) ret|=DDRAWIPAL_ALPHA; if(dwFlags & DDPCAPS_1BIT) ret|=DDRAWIPAL_2; if(dwFlags & DDPCAPS_2BIT) ret|=DDRAWIPAL_4; return ret; } HRESULT Internal_CreatePalette( LPDDRAWI_DIRECTDRAW_INT pDDraw, DWORD dwFlags, LPPALETTEENTRY palent, LPDIRECTDRAWPALETTE* ppPalette, LPUNKNOWN pUnkOuter) { DDHAL_CREATEPALETTEDATA mDdCreatePalette = { 0 }; LPDDRAWI_DDRAWPALETTE_INT ThisPalInt = NULL; LPDDRAWI_DDRAWPALETTE_LCL ThisPalLcl = NULL; LPDDRAWI_DDRAWPALETTE_GBL ThisPalGbl = NULL; HRESULT ret; if(pUnkOuter) { return CLASS_E_NOAGGREGATION; } if(!(pDDraw->lpLcl->dwLocalFlags & DDRAWILCL_SETCOOPCALLED)) { return DDERR_NOCOOPERATIVELEVELSET; } if (pDDraw->lpLcl->dwProcessId != GetCurrentProcessId() ) { return DDERR_INVALIDOBJECT; } /* Allocate the palette interface and needed members */ DxHeapMemAlloc(ThisPalInt, sizeof( DDRAWI_DDRAWPALETTE_INT ) ); if( ThisPalInt == NULL ) { ret = DDERR_OUTOFMEMORY; goto cleanup; } DxHeapMemAlloc(ThisPalLcl, sizeof( DDRAWI_DDRAWPALETTE_LCL ) ); if( ThisPalLcl == NULL ) { ret = DDERR_OUTOFMEMORY; goto cleanup; } DxHeapMemAlloc(ThisPalGbl, sizeof( DDRAWI_DDRAWPALETTE_GBL ) ); if( ThisPalGbl == NULL ) { ret = DDERR_OUTOFMEMORY; goto cleanup; } /*Some initial setup*/ ThisPalInt->lpLcl = ThisPalLcl; ThisPalLcl->lpGbl = ThisPalGbl; ThisPalLcl->lpDD_lcl = ThisPalGbl->lpDD_lcl = pDDraw->lpLcl; ThisPalGbl->dwFlags = ConvertPCapsFlags(dwFlags); ThisPalInt->lpVtbl = (PVOID)&DirectDrawPalette_Vtable; ThisPalGbl->dwProcessId = GetCurrentProcessId(); mDdCreatePalette.lpDD = pDDraw->lpLcl->lpGbl; mDdCreatePalette.lpDDPalette = ThisPalGbl; if(pDDraw->lpLcl->lpGbl->lpDDCBtmp->HALDD.dwFlags & DDHAL_CB32_CREATEPALETTE) { mDdCreatePalette.CreatePalette = pDDraw->lpLcl->lpGbl->lpDDCBtmp->HALDD.CreatePalette; DX_STUB_str("Using HAL CreatePalette\n"); } else { mDdCreatePalette.CreatePalette = pDDraw->lpLcl->lpGbl->lpDDCBtmp->HELDD.CreatePalette; DX_STUB_str("Using HEL CreatePalette\n"); } mDdCreatePalette.ddRVal = DDERR_GENERIC; mDdCreatePalette.lpColorTable = palent; if (mDdCreatePalette.CreatePalette(&mDdCreatePalette) == DDHAL_DRIVER_NOTHANDLED) { DX_STUB_str("mDdCreateSurface failed with DDHAL_DRIVER_NOTHANDLED."); ret = DDERR_NOTINITIALIZED; goto cleanup; } if (mDdCreatePalette.ddRVal != DD_OK) { DX_STUB_str("mDdCreateSurface failed."); ret = mDdCreatePalette.ddRVal; goto cleanup; } *ppPalette = (LPDIRECTDRAWPALETTE)ThisPalInt; ThisPalInt->lpLink = pDDraw->lpLcl->lpGbl->palList; pDDraw->lpLcl->lpGbl->palList = ThisPalInt; ThisPalInt->lpLcl->dwReserved1 = (ULONG_PTR)pDDraw; IDirectDrawPalette_AddRef(*ppPalette); return DD_OK; cleanup: if(ThisPalInt) DxHeapMemFree(ThisPalInt); if(ThisPalLcl) DxHeapMemFree(ThisPalLcl); if(ThisPalGbl) DxHeapMemFree(ThisPalGbl); return ret; }