Module: wine
Branch: master
Commit: 5c09278ab6eb7d2611b57bfb2111d043d5d30b2c
URL: https://source.winehq.org/git/wine.git/?a=commit;h=5c09278ab6eb7d2611b57bfb…
Author: Tim Clem <tclem(a)codeweavers.com>
Date: Tue Mar 22 11:05:59 2022 -0700
winemac.drv: Simplify control flow in copy_display_modes.
Introduce a helper function to determine if a mode is preferred over
another.
Signed-off-by: Tim Clem <tclem(a)codeweavers.com>
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
dlls/winemac.drv/display.c | 123 ++++++++++++++++++++++-----------------------
1 file changed, 61 insertions(+), 62 deletions(-)
diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c
index 2ac8f32fa18..cc3bbc6cffc 100644
--- a/dlls/winemac.drv/display.c
+++ b/dlls/winemac.drv/display.c
@@ -576,6 +576,65 @@ static CFDictionaryRef create_mode_dict(CGDisplayModeRef display_mode, BOOL is_o
return ret;
}
+
+
+static BOOL mode_is_preferred(CGDisplayModeRef new_mode, CGDisplayModeRef old_mode,
+ struct display_mode_descriptor *original_mode_desc)
+{
+ CFStringRef pixel_encoding;
+ size_t width_points, height_points;
+ size_t old_width_pixels, old_height_pixels, new_width_pixels, new_height_pixels;
+ BOOL old_size_same, new_size_same;
+
+ /* If a given mode is the user's default, then always list it in preference to any similar
+ modes that may exist. */
+ if (display_mode_matches_descriptor(new_mode, original_mode_desc))
+ return TRUE;
+
+ pixel_encoding = CGDisplayModeCopyPixelEncoding(new_mode);
+ if (pixel_encoding)
+ {
+ BOOL bpp30 = CFEqual(pixel_encoding, CFSTR(kIO30BitDirectPixels));
+ CFRelease(pixel_encoding);
+ if (bpp30)
+ {
+ /* This is an odd pixel encoding. It seems it's only returned
+ when using kCGDisplayShowDuplicateLowResolutionModes. It's
+ 32bpp in terms of the actual raster layout, but it's 10
+ bits per component. I think that no Windows program is
+ likely to need it and they will probably be confused by it.
+ Skip it. */
+ return FALSE;
+ }
+ }
+
+ if (!old_mode)
+ return TRUE;
+
+ /* Prefer the original mode over any similar mode. */
+ if (display_mode_matches_descriptor(old_mode, original_mode_desc))
+ return FALSE;
+
+ /* Otherwise, prefer a mode whose pixel size equals its point size over one which
+ is scaled. */
+ width_points = CGDisplayModeGetWidth(new_mode);
+ height_points = CGDisplayModeGetHeight(new_mode);
+ new_width_pixels = CGDisplayModeGetPixelWidth(new_mode);
+ new_height_pixels = CGDisplayModeGetPixelHeight(new_mode);
+ old_width_pixels = CGDisplayModeGetPixelWidth(old_mode);
+ old_height_pixels = CGDisplayModeGetPixelHeight(old_mode);
+ new_size_same = (new_width_pixels == width_points && new_height_pixels == height_points);
+ old_size_same = (old_width_pixels == width_points && old_height_pixels == height_points);
+
+ if (new_size_same && !old_size_same)
+ return TRUE;
+
+ if (!new_size_same && old_size_same)
+ return FALSE;
+
+ /* Otherwise, prefer the mode with the smaller pixel size. */
+ return new_width_pixels < old_width_pixels && new_height_pixels < old_height_pixels;
+}
#endif
@@ -620,72 +679,12 @@ static CFArrayRef copy_display_modes(CGDirectDisplayID display)
count = CFArrayGetCount(modes);
for (i = 0; i < count; i++)
{
- BOOL better = TRUE;
CGDisplayModeRef new_mode = (CGDisplayModeRef)CFArrayGetValueAtIndex(modes, i);
BOOL new_is_original = display_mode_matches_descriptor(new_mode, desc);
CFDictionaryRef key = create_mode_dict(new_mode, new_is_original);
+ CGDisplayModeRef old_mode = (CGDisplayModeRef)CFDictionaryGetValue(modes_by_size, key);
- /* If a given mode is the user's default, then always list it in preference to any similar
- modes that may exist. */
- if (new_is_original)
- better = TRUE;
- else
- {
- CFStringRef pixel_encoding = CGDisplayModeCopyPixelEncoding(new_mode);
- CGDisplayModeRef old_mode;
-
- if (pixel_encoding)
- {
- BOOL bpp30 = CFEqual(pixel_encoding, CFSTR(kIO30BitDirectPixels));
- CFRelease(pixel_encoding);
- if (bpp30)
- {
- /* This is an odd pixel encoding. It seems it's only returned
- when using kCGDisplayShowDuplicateLowResolutionModes. It's
- 32bpp in terms of the actual raster layout, but it's 10
- bits per component. I think that no Windows program is
- likely to need it and they will probably be confused by it.
- Skip it. */
- CFRelease(key);
- continue;
- }
- }
-
- old_mode = (CGDisplayModeRef)CFDictionaryGetValue(modes_by_size, key);
- if (old_mode)
- {
- BOOL old_is_original = display_mode_matches_descriptor(old_mode, desc);
-
- if (old_is_original)
- better = FALSE;
- else
- {
- /* Otherwise, prefer a mode whose pixel size equals its point size over one which
- is scaled. */
- size_t width_points = CGDisplayModeGetWidth(new_mode);
- size_t height_points = CGDisplayModeGetHeight(new_mode);
- size_t new_width_pixels = CGDisplayModeGetPixelWidth(new_mode);
- size_t new_height_pixels = CGDisplayModeGetPixelHeight(new_mode);
- size_t old_width_pixels = CGDisplayModeGetPixelWidth(old_mode);
- size_t old_height_pixels = CGDisplayModeGetPixelHeight(old_mode);
- BOOL new_size_same = (new_width_pixels == width_points && new_height_pixels == height_points);
- BOOL old_size_same = (old_width_pixels == width_points && old_height_pixels == height_points);
-
- if (new_size_same && !old_size_same)
- better = TRUE;
- else if (!new_size_same && old_size_same)
- better = FALSE;
- else
- {
- /* Otherwise, prefer the mode with the smaller pixel size. */
- if (old_width_pixels < new_width_pixels || old_height_pixels < new_height_pixels)
- better = FALSE;
- }
- }
- }
- }
-
- if (better)
+ if (mode_is_preferred(new_mode, old_mode, desc))
CFDictionarySetValue(modes_by_size, key, new_mode);
CFRelease(key);