Module: wine Branch: master Commit: 5c8d6a0b93d44366500710355f1455a61a578cb2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=5c8d6a0b93d44366500710355f...
Author: Ken Thomases ken@codeweavers.com Date: Wed Mar 27 12:05:35 2013 -0500
winemac: Synthesize 8- and 16-bpp display modes if the system doesn't provide any.
macdrv_ChangeDisplaySettingsEx() ignores the requested bpp, anyway, so we can report any values we think programs will want.
---
dlls/winemac.drv/display.c | 87 ++++++++++++++++++++++++++++++++++---------- 1 files changed, 67 insertions(+), 20 deletions(-)
diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c index 85c903d..9ed02f8 100644 --- a/dlls/winemac.drv/display.c +++ b/dlls/winemac.drv/display.c @@ -33,6 +33,7 @@ BOOL CDECL macdrv_EnumDisplaySettingsEx(LPCWSTR devname, DWORD mode, LPDEVMODEW
static CFArrayRef modes; +static BOOL modes_has_8bpp, modes_has_16bpp; static int default_mode_bpp; static CRITICAL_SECTION modes_section; static CRITICAL_SECTION_DEBUG critsect_debug = @@ -469,6 +470,8 @@ BOOL CDECL macdrv_EnumDisplaySettingsEx(LPCWSTR devname, DWORD mode, struct macdrv_display *displays = NULL; int num_displays; CGDisplayModeRef display_mode; + int display_mode_bpp; + BOOL synthesized = FALSE; double rotation; uint32_t io_flags;
@@ -494,42 +497,84 @@ BOOL CDECL macdrv_EnumDisplaySettingsEx(LPCWSTR devname, DWORD mode, { TRACE("mode %d (current) -- getting current mode\n", mode); display_mode = CGDisplayCopyDisplayMode(displays[0].displayID); + display_mode_bpp = display_mode_bits_per_pixel(display_mode); } else { + DWORD count, i; + EnterCriticalSection(&modes_section);
if (mode == 0 || !modes) { if (modes) CFRelease(modes); modes = CGDisplayCopyAllDisplayModes(displays[0].displayID, NULL); + modes_has_8bpp = modes_has_16bpp = FALSE; + + if (modes) + { + count = CFArrayGetCount(modes); + for (i = 0; i < count && !(modes_has_8bpp && modes_has_16bpp); i++) + { + CGDisplayModeRef mode = (CGDisplayModeRef)CFArrayGetValueAtIndex(modes, i); + int bpp = display_mode_bits_per_pixel(mode); + if (bpp == 8) + modes_has_8bpp = TRUE; + else if (bpp == 16) + modes_has_16bpp = TRUE; + } + } }
display_mode = NULL; if (modes) { - if (flags & EDS_RAWMODE) - { - if (mode < CFArrayGetCount(modes)) - display_mode = (CGDisplayModeRef)CFRetain(CFArrayGetValueAtIndex(modes, mode)); - } - else + int default_bpp = get_default_bpp(); + DWORD seen_modes = 0; + + count = CFArrayGetCount(modes); + for (i = 0; i < count; i++) { - DWORD count, i, safe_modes = 0; - count = CFArrayGetCount(modes); - for (i = 0; i < count; i++) + CGDisplayModeRef candidate = (CGDisplayModeRef)CFArrayGetValueAtIndex(modes, i); + + io_flags = CGDisplayModeGetIOFlags(candidate); + if (!(flags & EDS_RAWMODE) && + (!(io_flags & kDisplayModeValidFlag) || !(io_flags & kDisplayModeSafeFlag))) + continue; + + seen_modes++; + if (seen_modes > mode) + { + display_mode = (CGDisplayModeRef)CFRetain(candidate); + display_mode_bpp = display_mode_bits_per_pixel(display_mode); + break; + } + + /* We only synthesize modes from those having the default bpp. */ + if (display_mode_bits_per_pixel(candidate) != default_bpp) + continue; + + if (!modes_has_8bpp) + { + seen_modes++; + if (seen_modes > mode) + { + display_mode = (CGDisplayModeRef)CFRetain(candidate); + display_mode_bpp = 8; + synthesized = TRUE; + break; + } + } + + if (!modes_has_16bpp) { - CGDisplayModeRef candidate = (CGDisplayModeRef)CFArrayGetValueAtIndex(modes, i); - io_flags = CGDisplayModeGetIOFlags(candidate); - if ((io_flags & kDisplayModeValidFlag) && - (io_flags & kDisplayModeSafeFlag)) + seen_modes++; + if (seen_modes > mode) { - safe_modes++; - if (safe_modes > mode) - { - display_mode = (CGDisplayModeRef)CFRetain(candidate); - break; - } + display_mode = (CGDisplayModeRef)CFRetain(candidate); + display_mode_bpp = 16; + synthesized = TRUE; + break; } } } @@ -557,7 +602,7 @@ BOOL CDECL macdrv_EnumDisplaySettingsEx(LPCWSTR devname, DWORD mode, devmode->dmDisplayFixedOutput = DMDFO_CENTER; devmode->dmFields |= DM_DISPLAYFIXEDOUTPUT;
- devmode->dmBitsPerPel = display_mode_bits_per_pixel(display_mode); + devmode->dmBitsPerPel = display_mode_bpp; if (devmode->dmBitsPerPel) devmode->dmFields |= DM_BITSPERPEL;
@@ -587,6 +632,8 @@ BOOL CDECL macdrv_EnumDisplaySettingsEx(LPCWSTR devname, DWORD mode, TRACE(" stretched"); if (devmode->dmDisplayFlags & DM_INTERLACED) TRACE(" interlaced"); + if (synthesized) + TRACE(" (synthesized)"); TRACE("\n");
return TRUE;