[PATCH 1/4] winemac.drv: Simplify control flow in copy_display_modes.

Dean Greer gcenx83 at gmail.com
Mon Mar 21 17:08:38 CDT 2022


Do you happen to know if this also resolves
https://bugs.winehq.org/show_bug.cgi?id=52354

On Mon, Mar 21, 2022 at 5:32 PM Tim Clem <tclem at codeweavers.com> wrote:

> Signed-off-by: Tim Clem <tclem at codeweavers.com>
> ---
>  dlls/winemac.drv/display.c | 107 ++++++++++++++++++-------------------
>  1 file changed, 52 insertions(+), 55 deletions(-)
>
> diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c
> index 2ac8f32fa18a..a54e78c22376 100644
> --- a/dlls/winemac.drv/display.c
> +++ b/dlls/winemac.drv/display.c
> @@ -620,74 +620,71 @@ 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);
> +            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;
> +            CGDisplayModeRef old_mode, new_mode =
> (CGDisplayModeRef)CFArrayGetValueAtIndex(modes, i);
> +            BOOL old_is_original, new_is_original =
> display_mode_matches_descriptor(new_mode, desc);
>              CFDictionaryRef key = create_mode_dict(new_mode,
> new_is_original);
>
>              /* 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;
> +                goto better;
>
> -                if (pixel_encoding)
> +            pixel_encoding = CGDisplayModeCopyPixelEncoding(new_mode);
> +            if (pixel_encoding)
> +            {
> +                BOOL bpp30 = CFEqual(pixel_encoding,
> CFSTR(kIO30BitDirectPixels));
> +                CFRelease(pixel_encoding);
> +                if (bpp30)
>                  {
> -                    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;
> -                    }
> +                    /* 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. */
> +                    goto next;
>                  }
> +            }
>
> -                old_mode =
> (CGDisplayModeRef)CFDictionaryGetValue(modes_by_size, key);
> -                if (old_mode)
> -                {
> -                    BOOL old_is_original =
> display_mode_matches_descriptor(old_mode, desc);
> +            old_mode =
> (CGDisplayModeRef)CFDictionaryGetValue(modes_by_size, key);
> +            if (!old_mode)
> +                goto better;
>
> -                    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;
> -                        }
> -                    }
> -                }
> +            /* Prefer the original mode over any similar mode. */
> +            old_is_original = display_mode_matches_descriptor(old_mode,
> desc);
> +            if (old_is_original)
> +                goto next;
> +
> +            /* 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)
> +                goto better;
> +            else if (!new_size_same && old_size_same)
> +                goto next;
> +            else
> +            {
> +                /* Otherwise, prefer the mode with the smaller pixel
> size. */
> +                if (old_width_pixels < new_width_pixels ||
> old_height_pixels < new_height_pixels)
> +                    goto next;
>              }
>
> -            if (better)
> -                CFDictionarySetValue(modes_by_size, key, new_mode);
> +better:
> +            CFDictionarySetValue(modes_by_size, key, new_mode);
>
> +next:
>              CFRelease(key);
>          }
>
> --
> 2.34.1
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20220321/57504e8d/attachment.htm>


More information about the wine-devel mailing list