Module: wine Branch: master Commit: f37153ac7d43d1ebb157c193b7ca2c61084b8923 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f37153ac7d43d1ebb157c193b7...
Author: Ken Thomases ken@codeweavers.com Date: Thu Apr 4 14:26:08 2013 -0500
winemac: Initialize window surface to Mac-standard window background color instead of black.
---
dlls/winemac.drv/cocoa_window.m | 42 +++++++++++++++++++++++++++++++++++++++ dlls/winemac.drv/macdrv_cocoa.h | 1 + dlls/winemac.drv/surface.c | 5 +++- 3 files changed, 47 insertions(+), 1 deletions(-)
diff --git a/dlls/winemac.drv/cocoa_window.m b/dlls/winemac.drv/cocoa_window.m index 9911195..6a85d74 100644 --- a/dlls/winemac.drv/cocoa_window.m +++ b/dlls/winemac.drv/cocoa_window.m @@ -1796,3 +1796,45 @@ void macdrv_remove_view_opengl_context(macdrv_view v, macdrv_opengl_context c)
[pool release]; } + +/*********************************************************************** + * macdrv_window_background_color + * + * Returns the standard Mac window background color as a 32-bit value of + * the form 0x00rrggbb. + */ +uint32_t macdrv_window_background_color(void) +{ + static uint32_t result; + static dispatch_once_t once; + + // Annoyingly, [NSColor windowBackgroundColor] refuses to convert to other + // color spaces (RGB or grayscale). So, the only way to get RGB values out + // of it is to draw with it. + dispatch_once(&once, ^{ + OnMainThread(^{ + unsigned char rgbx[4]; + unsigned char *planes = rgbx; + NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:&planes + pixelsWide:1 + pixelsHigh:1 + bitsPerSample:8 + samplesPerPixel:3 + hasAlpha:NO + isPlanar:NO + colorSpaceName:NSCalibratedRGBColorSpace + bitmapFormat:0 + bytesPerRow:4 + bitsPerPixel:32]; + [NSGraphicsContext saveGraphicsState]; + [NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithBitmapImageRep:bitmap]]; + [[NSColor windowBackgroundColor] set]; + NSRectFill(NSMakeRect(0, 0, 1, 1)); + [NSGraphicsContext restoreGraphicsState]; + [bitmap release]; + result = rgbx[0] << 16 | rgbx[1] << 8 | rgbx[2]; + }); + }); + + return result; +} diff --git a/dlls/winemac.drv/macdrv_cocoa.h b/dlls/winemac.drv/macdrv_cocoa.h index 46d13a9..c4819c3 100644 --- a/dlls/winemac.drv/macdrv_cocoa.h +++ b/dlls/winemac.drv/macdrv_cocoa.h @@ -347,6 +347,7 @@ extern void macdrv_dispose_view(macdrv_view v) DECLSPEC_HIDDEN; extern void macdrv_set_view_window_and_frame(macdrv_view v, macdrv_window w, CGRect rect) DECLSPEC_HIDDEN; extern void macdrv_add_view_opengl_context(macdrv_view v, macdrv_opengl_context c) DECLSPEC_HIDDEN; extern void macdrv_remove_view_opengl_context(macdrv_view v, macdrv_opengl_context c) DECLSPEC_HIDDEN; +extern uint32_t macdrv_window_background_color(void) DECLSPEC_HIDDEN;
/* keyboard */ diff --git a/dlls/winemac.drv/surface.c b/dlls/winemac.drv/surface.c index 564d004..a27ff24 100644 --- a/dlls/winemac.drv/surface.c +++ b/dlls/winemac.drv/surface.c @@ -236,6 +236,7 @@ struct window_surface *create_surface(macdrv_window window, const RECT *rect, DWORD *colors; pthread_mutexattr_t attr; int err; + DWORD window_background;
surface = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, FIELD_OFFSET(struct macdrv_window_surface, info.bmiColors[3])); @@ -286,8 +287,10 @@ struct window_surface *create_surface(macdrv_window window, const RECT *rect, } update_blit_data(surface); surface->use_alpha = use_alpha; - surface->bits = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, surface->info.bmiHeader.biSizeImage); + surface->bits = HeapAlloc(GetProcessHeap(), 0, surface->info.bmiHeader.biSizeImage); if (!surface->bits) goto failed; + window_background = macdrv_window_background_color(); + memset_pattern4(surface->bits, &window_background, surface->info.bmiHeader.biSizeImage);
TRACE("created %p for %p %s bits %p-%p\n", surface, window, wine_dbgstr_rect(rect), surface->bits, surface->bits + surface->info.bmiHeader.biSizeImage);