From f37153ac7d43d1ebb157c193b7ca2c61084b8923 Mon Sep 17 00:00:00 2001 From: Ken Thomases Date: Thu, 4 Apr 2013 14:26:08 -0500 Subject: [PATCH] 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 deletion(-) diff --git a/dlls/winemac.drv/cocoa_window.m b/dlls/winemac.drv/cocoa_window.m index 99111953c26..6a85d7471b2 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 46d13a9e291..c4819c31996 100644 --- a/dlls/winemac.drv/macdrv_cocoa.h +++ b/dlls/winemac.drv/macdrv_cocoa.h @@ -347,6 +347,7 @@ extern void macdrv_set_window_color_key(macdrv_window w, CGFloat keyRed, CGFloat 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 564d004f711..a27ff246a9a 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);