<div dir="auto">Do you happen to know if this also resolves <div><a href="https://bugs.winehq.org/show_bug.cgi?id=52354">https://bugs.winehq.org/show_bug.cgi?id=52354</a></div></div><div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Mar 21, 2022 at 5:32 PM Tim Clem <<a href="mailto:tclem@codeweavers.com">tclem@codeweavers.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)">Signed-off-by: Tim Clem <<a href="mailto:tclem@codeweavers.com" target="_blank">tclem@codeweavers.com</a>><br>
---<br>
dlls/winemac.drv/display.c | 107 ++++++++++++++++++-------------------<br>
1 file changed, 52 insertions(+), 55 deletions(-)<br>
<br>
diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c<br>
index 2ac8f32fa18a..a54e78c22376 100644<br>
--- a/dlls/winemac.drv/display.c<br>
+++ b/dlls/winemac.drv/display.c<br>
@@ -620,74 +620,71 @@ static CFArrayRef copy_display_modes(CGDirectDisplayID display)<br>
count = CFArrayGetCount(modes);<br>
for (i = 0; i < count; i++)<br>
{<br>
- BOOL better = TRUE;<br>
- CGDisplayModeRef new_mode = (CGDisplayModeRef)CFArrayGetValueAtIndex(modes, i);<br>
- BOOL new_is_original = display_mode_matches_descriptor(new_mode, desc);<br>
+ CFStringRef pixel_encoding;<br>
+ size_t width_points, height_points;<br>
+ size_t old_width_pixels, old_height_pixels, new_width_pixels, new_height_pixels;<br>
+ BOOL old_size_same, new_size_same;<br>
+ CGDisplayModeRef old_mode, new_mode = (CGDisplayModeRef)CFArrayGetValueAtIndex(modes, i);<br>
+ BOOL old_is_original, new_is_original = display_mode_matches_descriptor(new_mode, desc);<br>
CFDictionaryRef key = create_mode_dict(new_mode, new_is_original);<br>
<br>
/* If a given mode is the user's default, then always list it in preference to any similar<br>
modes that may exist. */<br>
if (new_is_original)<br>
- better = TRUE;<br>
- else<br>
- {<br>
- CFStringRef pixel_encoding = CGDisplayModeCopyPixelEncoding(new_mode);<br>
- CGDisplayModeRef old_mode;<br>
+ goto better;<br>
<br>
- if (pixel_encoding)<br>
+ pixel_encoding = CGDisplayModeCopyPixelEncoding(new_mode);<br>
+ if (pixel_encoding)<br>
+ {<br>
+ BOOL bpp30 = CFEqual(pixel_encoding, CFSTR(kIO30BitDirectPixels));<br>
+ CFRelease(pixel_encoding);<br>
+ if (bpp30)<br>
{<br>
- BOOL bpp30 = CFEqual(pixel_encoding, CFSTR(kIO30BitDirectPixels));<br>
- CFRelease(pixel_encoding);<br>
- if (bpp30)<br>
- {<br>
- /* This is an odd pixel encoding. It seems it's only returned<br>
- when using kCGDisplayShowDuplicateLowResolutionModes. It's<br>
- 32bpp in terms of the actual raster layout, but it's 10<br>
- bits per component. I think that no Windows program is<br>
- likely to need it and they will probably be confused by it.<br>
- Skip it. */<br>
- CFRelease(key);<br>
- continue;<br>
- }<br>
+ /* This is an odd pixel encoding. It seems it's only returned<br>
+ when using kCGDisplayShowDuplicateLowResolutionModes. It's<br>
+ 32bpp in terms of the actual raster layout, but it's 10<br>
+ bits per component. I think that no Windows program is<br>
+ likely to need it and they will probably be confused by it.<br>
+ Skip it. */<br>
+ goto next;<br>
}<br>
+ }<br>
<br>
- old_mode = (CGDisplayModeRef)CFDictionaryGetValue(modes_by_size, key);<br>
- if (old_mode)<br>
- {<br>
- BOOL old_is_original = display_mode_matches_descriptor(old_mode, desc);<br>
+ old_mode = (CGDisplayModeRef)CFDictionaryGetValue(modes_by_size, key);<br>
+ if (!old_mode)<br>
+ goto better;<br>
<br>
- if (old_is_original)<br>
- better = FALSE;<br>
- else<br>
- {<br>
- /* Otherwise, prefer a mode whose pixel size equals its point size over one which<br>
- is scaled. */<br>
- size_t width_points = CGDisplayModeGetWidth(new_mode);<br>
- size_t height_points = CGDisplayModeGetHeight(new_mode);<br>
- size_t new_width_pixels = CGDisplayModeGetPixelWidth(new_mode);<br>
- size_t new_height_pixels = CGDisplayModeGetPixelHeight(new_mode);<br>
- size_t old_width_pixels = CGDisplayModeGetPixelWidth(old_mode);<br>
- size_t old_height_pixels = CGDisplayModeGetPixelHeight(old_mode);<br>
- BOOL new_size_same = (new_width_pixels == width_points && new_height_pixels == height_points);<br>
- BOOL old_size_same = (old_width_pixels == width_points && old_height_pixels == height_points);<br>
-<br>
- if (new_size_same && !old_size_same)<br>
- better = TRUE;<br>
- else if (!new_size_same && old_size_same)<br>
- better = FALSE;<br>
- else<br>
- {<br>
- /* Otherwise, prefer the mode with the smaller pixel size. */<br>
- if (old_width_pixels < new_width_pixels || old_height_pixels < new_height_pixels)<br>
- better = FALSE;<br>
- }<br>
- }<br>
- }<br>
+ /* Prefer the original mode over any similar mode. */<br>
+ old_is_original = display_mode_matches_descriptor(old_mode, desc);<br>
+ if (old_is_original)<br>
+ goto next;<br>
+<br>
+ /* Otherwise, prefer a mode whose pixel size equals its point size over one which<br>
+ is scaled. */<br>
+ width_points = CGDisplayModeGetWidth(new_mode);<br>
+ height_points = CGDisplayModeGetHeight(new_mode);<br>
+ new_width_pixels = CGDisplayModeGetPixelWidth(new_mode);<br>
+ new_height_pixels = CGDisplayModeGetPixelHeight(new_mode);<br>
+ old_width_pixels = CGDisplayModeGetPixelWidth(old_mode);<br>
+ old_height_pixels = CGDisplayModeGetPixelHeight(old_mode);<br>
+ new_size_same = (new_width_pixels == width_points && new_height_pixels == height_points);<br>
+ old_size_same = (old_width_pixels == width_points && old_height_pixels == height_points);<br>
+<br>
+ if (new_size_same && !old_size_same)<br>
+ goto better;<br>
+ else if (!new_size_same && old_size_same)<br>
+ goto next;<br>
+ else<br>
+ {<br>
+ /* Otherwise, prefer the mode with the smaller pixel size. */<br>
+ if (old_width_pixels < new_width_pixels || old_height_pixels < new_height_pixels)<br>
+ goto next;<br>
}<br>
<br>
- if (better)<br>
- CFDictionarySetValue(modes_by_size, key, new_mode);<br>
+better:<br>
+ CFDictionarySetValue(modes_by_size, key, new_mode);<br>
<br>
+next:<br>
CFRelease(key);<br>
}<br>
<br>
-- <br>
2.34.1<br>
<br>
<br>
</blockquote></div></div>