- Update to trunk
[reactos.git] / dll / directx / ddraw / Ddraw / callbacks_dd_hel.c
index 8592543..57c30e3 100644 (file)
@@ -75,9 +75,46 @@ DWORD CALLBACK  HelDdCanCreateSurface(LPDDHAL_CANCREATESURFACEDATA lpCanCreateSu
     DX_STUB;
 }
 
-DWORD CALLBACK  HelDdCreatePalette(LPDDHAL_CREATEPALETTEDATA lpCreatePalette)
+DWORD CALLBACK HelDdCreatePalette(LPDDHAL_CREATEPALETTEDATA lpCreatePalette)
 {
-    DX_STUB;
+    DDRAWI_DDRAWPALETTE_GBL* ddPalGbl = lpCreatePalette->lpDDPalette;
+    LOGPALETTE* logPal ;
+    WORD size=1;
+
+    if(ddPalGbl->dwFlags & DDRAWIPAL_2)
+        size = 2;
+    else if(ddPalGbl->dwFlags & DDRAWIPAL_4)
+        size = 4;
+    else if(ddPalGbl->dwFlags & DDRAWIPAL_16)
+        size = 16;
+    else if(ddPalGbl->dwFlags & DDRAWIPAL_256)
+        size = 256;
+
+    DxHeapMemAlloc(logPal, sizeof(LOGPALETTE) + size*sizeof(PALETTEENTRY));
+    if(logPal == NULL)
+    {
+        lpCreatePalette->ddRVal = DDERR_OUTOFMEMORY;
+        return DDHAL_DRIVER_HANDLED;
+    }
+
+    logPal->palVersion = 0x300;
+    logPal->palNumEntries = size;
+    CopyMemory(&logPal->palPalEntry[0], lpCreatePalette->lpColorTable, size*sizeof(PALETTEENTRY));
+
+    ddPalGbl->hHELGDIPalette = CreatePalette(logPal);
+
+    if (ddPalGbl->hHELGDIPalette == NULL)
+    {
+        DxHeapMemFree(logPal);
+        lpCreatePalette->ddRVal = DDERR_INVALIDOBJECT;
+        return DDHAL_DRIVER_HANDLED;
+    }
+
+    DxHeapMemFree(logPal);
+    ddPalGbl->lpColorTable = lpCreatePalette->lpColorTable;
+    ddPalGbl->dwFlags |= DDRAWIPAL_INHEL | DDRAWIPAL_GDI ;
+    lpCreatePalette->ddRVal = DD_OK;
+    return DDHAL_DRIVER_HANDLED;
 }
 
 DWORD CALLBACK  HelDdGetScanLine(LPDDHAL_GETSCANLINEDATA lpGetScanLine)