Ken Thomases : winemac: Synthesize 8- and 16-bpp display modes if the system doesn't provide any.
Alexandre Julliard
julliard at winehq.org
Thu Mar 28 15:30:23 CDT 2013
Module: wine
Branch: master
Commit: 5c8d6a0b93d44366500710355f1455a61a578cb2
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5c8d6a0b93d44366500710355f1455a61a578cb2
Author: Ken Thomases <ken at 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;
More information about the wine-cvs
mailing list