Module: wine Branch: refs/heads/master Commit: 7e12e2ac5b40b05d447a71bb26ac0db5a9c1da89 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=7e12e2ac5b40b05d447a71bb...
Author: Stefan Dösinger stefan@codeweavers.com Date: Tue May 9 21:04:07 2006 +0200
wined3d: Update the DIB section's palette on GetDC.
---
dlls/wined3d/surface.c | 87 ++++++++++++++++++++---------------------------- 1 files changed, 36 insertions(+), 51 deletions(-)
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 5c95a7e..48b4e36 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -944,6 +944,7 @@ HRESULT WINAPI IWineD3DSurfaceImpl_GetDC HDC ddc; DWORD *masks; HRESULT hr; + RGBQUAD col[256];
TRACE("(%p)->(%p)\n",This,pHDC);
@@ -958,17 +959,12 @@ HRESULT WINAPI IWineD3DSurfaceImpl_GetDC memset(&lock, 0, sizeof(lock)); /* To be sure */
/* Create a DIB section if there isn't a hdc yet */ - if(!This->hDC) - { - RGBQUAD col[256]; - - if(This->Flags & SFLAG_ACTIVELOCK) - { + if(!This->hDC) { + if(This->Flags & SFLAG_ACTIVELOCK) { ERR("Creating a DIB section while a lock is active. Uncertain consequences\n"); }
- switch (This->bytesPerPixel) - { + switch (This->bytesPerPixel) { case 2: case 4: /* Allocate extra space to store the RGB bit masks. */ @@ -1003,8 +999,7 @@ HRESULT WINAPI IWineD3DSurfaceImpl_GetDC
/* Get the bit masks */ masks = (DWORD *) &(b_info->bmiColors); - switch (This->resource.format) - { + switch (This->resource.format) { case WINED3DFMT_R8G8B8: usage = DIB_RGB_COLORS; b_info->bmiHeader.biCompression = BI_RGB; @@ -1037,8 +1032,7 @@ HRESULT WINAPI IWineD3DSurfaceImpl_GetDC }
ddc = CreateDCA("DISPLAY", NULL, NULL, NULL); - if (ddc == 0) - { + if (ddc == 0) { HeapFree(GetProcessHeap(), 0, b_info); return HRESULT_FROM_WIN32(GetLastError()); } @@ -1047,8 +1041,7 @@ HRESULT WINAPI IWineD3DSurfaceImpl_GetDC This->dib.DIBsection = CreateDIBSection(ddc, b_info, usage, &This->dib.bitmap_data, 0 /* Handle */, 0 /* Offset */); DeleteDC(ddc);
- if (!This->dib.DIBsection) - { + if (!This->dib.DIBsection) { ERR("CreateDIBSection failed!\n"); return HRESULT_FROM_WIN32(GetLastError()); } @@ -1057,8 +1050,7 @@ HRESULT WINAPI IWineD3DSurfaceImpl_GetDC TRACE("DIBSection at : %p\n", This->dib.bitmap_data);
/* copy the existing surface to the dib section */ - if(This->resource.allocatedMemory) - { + if(This->resource.allocatedMemory) { memcpy(This->dib.bitmap_data, This->resource.allocatedMemory, This->resource.size); /* We won't need that any more */ HeapFree(GetProcessHeap(), 0, This->resource.allocatedMemory); @@ -1075,39 +1067,6 @@ HRESULT WINAPI IWineD3DSurfaceImpl_GetDC This->palette ? This->palette->hpal : 0, FALSE);
- if(This->resource.format == WINED3DFMT_P8 || - This->resource.format == WINED3DFMT_A8P8) - { - unsigned int n; - if(This->palette) - { - PALETTEENTRY ent[256]; - - GetPaletteEntries(This->palette->hpal, 0, 256, ent); - for (n=0; n<256; n++) - { - col[n].rgbRed = ent[n].peRed; - col[n].rgbGreen = ent[n].peGreen; - col[n].rgbBlue = ent[n].peBlue; - col[n].rgbReserved = 0; - } - } - else - { - IWineD3DDeviceImpl *device = This->resource.wineD3DDevice; - - for (n=0; n<256; n++) - { - col[n].rgbRed = device->palettes[device->currentPalette][n].peRed; - col[n].rgbGreen = device->palettes[device->currentPalette][n].peGreen; - col[n].rgbBlue = device->palettes[device->currentPalette][n].peBlue; - col[n].rgbReserved = 0; - } - - } - SetDIBColorTable(This->hDC, 0, 256, col); - } - /* This is to make LockRect read the gl Texture although memory is allocated */ This->Flags |= SFLAG_NEWDC;
@@ -1120,13 +1079,39 @@ HRESULT WINAPI IWineD3DSurfaceImpl_GetDC NULL, 0); This->Flags &= ~SFLAG_NEWDC; - if(FAILED(hr)) - { + if(FAILED(hr)) { ERR("IWineD3DSurface_LockRect failed with hr = %08lx\n", hr); /* keep the dib section */ return hr; }
+ if(This->resource.format == WINED3DFMT_P8 || + This->resource.format == WINED3DFMT_A8P8) { + unsigned int n; + if(This->palette) { + PALETTEENTRY ent[256]; + + GetPaletteEntries(This->palette->hpal, 0, 256, ent); + for (n=0; n<256; n++) { + col[n].rgbRed = ent[n].peRed; + col[n].rgbGreen = ent[n].peGreen; + col[n].rgbBlue = ent[n].peBlue; + col[n].rgbReserved = 0; + } + } else { + IWineD3DDeviceImpl *device = This->resource.wineD3DDevice; + + for (n=0; n<256; n++) { + col[n].rgbRed = device->palettes[device->currentPalette][n].peRed; + col[n].rgbGreen = device->palettes[device->currentPalette][n].peGreen; + col[n].rgbBlue = device->palettes[device->currentPalette][n].peBlue; + col[n].rgbReserved = 0; + } + + } + SetDIBColorTable(This->hDC, 0, 256, col); + } + *pHDC = This->hDC; TRACE("returning %p\n",*pHDC); This->Flags |= SFLAG_DCINUSE;