Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers...
[reactos.git] / dll / directx / ddraw / Palette / createpalette.c
diff --git a/dll/directx/ddraw/Palette/createpalette.c b/dll/directx/ddraw/Palette/createpalette.c
new file mode 100644 (file)
index 0000000..ed1bdb0
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ * 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;
+}