< Summary

Class:Imagini.Display
Assembly:Imagini.Core
File(s):/home/razer/vscode-projects/project-grove/imagini/Imagini.Core/Display.cs
Covered lines:28
Uncovered lines:0
Coverable lines:28
Total lines:152
Line coverage:100% (28 of 28)
Covered branches:4
Total branches:6
Branch coverage:66.6% (4 of 6)

Metrics

MethodCyclomatic complexity NPath complexity Sequence coverage Branch coverage
.cctor()10100%100%
.ctor(...)40100%50%
UpdateDisplayInfo()20100%100%
GetCurrentDisplayIndexForWindow(...)10100%100%
GetCurrentDisplayForWindow(...)10100%100%

File(s)

/home/razer/vscode-projects/project-grove/imagini/Imagini.Core/Display.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3
 4using static Imagini.ErrorHandler;
 5using static SDL2.SDL_rect;
 6using static SDL2.SDL_video;
 7
 8namespace Imagini
 9{
 10    /// <summary>
 11    /// Defines a fullscreen display mode.
 12    /// </summary>
 13    public struct DisplayMode
 14    {
 15        internal SDL_DisplayMode _mode;
 16        /// <summary>
 17        /// Fullscreen width.
 18        /// </summary>
 19        public int Width => _mode.w;
 20        /// <summary>
 21        /// Fullscreen height.
 22        /// </summary>
 23        public int Height => _mode.h;
 24        /// <summary>
 25        /// Refresh rate in Hz.
 26        /// </summary>
 27        public int RefreshRate => _mode.refresh_rate;
 28
 29        internal int displayIndex;
 30        internal int modeIndex;
 31
 32        public override string ToString() => $"{Width}x{Height} {RefreshRate}Hz (display {displayIndex}, mode {modeIndex
 33
 34        internal static List<DisplayMode> GetAvailable(int displayIndex)
 35        {
 36            var result = new List<DisplayMode>();
 37            var numModes = TryGet(() =>
 38                SDL_GetNumDisplayModes(displayIndex),
 39                "SDL_GetNumDisplayModes");
 40            for (var modeIndex = 0; modeIndex < numModes; modeIndex++)
 41            {
 42                var modeData = new SDL_DisplayMode();
 43                SDL_GetDisplayMode(displayIndex, modeIndex, ref modeData);
 44                result.Add(new DisplayMode()
 45                {
 46                    _mode = modeData,
 47                    displayIndex = displayIndex,
 48                    modeIndex = modeIndex
 49                });
 50            }
 51            return result;
 52        }
 53
 54        internal static DisplayMode GetCurrent(int displayIndex)
 55        {
 56            var modeData = new SDL_DisplayMode();
 57            Try(() =>
 58                SDL_GetCurrentDisplayMode(displayIndex, ref modeData),
 59                "SDL_GetCurrentDisplayMode");
 60            var result = new DisplayMode()
 61            {
 62                _mode = modeData,
 63                displayIndex = displayIndex,
 64            };
 65            result.modeIndex = DisplayMode
 66                .GetAvailable(displayIndex)
 67                .IndexOf(result);
 68            return result;
 69        }
 70
 71        internal static DisplayMode GetDesktop(int displayIndex)
 72        {
 73            var modeData = new SDL_DisplayMode();
 74            Try(() =>
 75                SDL_GetDesktopDisplayMode(displayIndex, ref modeData),
 76                "SDL_GetDesktopDisplayMode");
 77            var result = new DisplayMode()
 78            {
 79                _mode = modeData,
 80                displayIndex = displayIndex,
 81            };
 82            result.modeIndex = DisplayMode
 83                .GetAvailable(displayIndex)
 84                .IndexOf(result);
 85            return result;
 86        }
 87    }
 88
 89    /// <summary>
 90    /// Represents a display device.
 91    /// </summary>
 92    public class Display
 93    {
 194        private static List<Display> s_displays = new List<Display>();
 95        /// <summary>
 96        /// Returns all available display devices.
 97        /// </summary>
 398        public static IReadOnlyList<Display> All => s_displays;
 99
 100        private int _index;
 101        /// <summary>
 102        /// Returns the available display modes for this display.
 103        /// </summary>
 8104        public IEnumerable<DisplayMode> Modes { get; private set; }
 105        /// <summary>
 106        /// Returns the current display mode for this display.
 107        /// </summary>
 5108        public DisplayMode CurrentMode { get; set; }
 109        /// <summary>
 110        /// Returns the desktop display mode for this display.
 111        /// </summary>
 5112        public DisplayMode DesktopMode { get; set; }
 113        /// <summary>
 114        /// Returns the name of this display device.
 115        /// </summary>
 8116        public string Name { get; private set; }
 2117        internal SDL_Rect Bounds { get; private set; }
 118
 2119        internal Display(int index)
 120        {
 2121            _index = index;
 2122            Modes = DisplayMode.GetAvailable(index);
 2123            Name = SDL_GetDisplayName(_index);
 2124            if (Name == null || Name == "") Name = _index.ToString();
 2125            var bounds = new SDL_Rect();
 4126            Try(() => SDL_GetDisplayBounds(_index, ref bounds), "SDL_GetDisplayBounds");
 2127            Bounds = bounds;
 2128            CurrentMode = DisplayMode.GetCurrent(_index);
 2129            DesktopMode = DisplayMode.GetDesktop(_index);
 2130        }
 131
 132        internal static void UpdateDisplayInfo()
 133        {
 1134            s_displays.Clear();
 1135            var numDisplays = TryGet(SDL_GetNumVideoDisplays, "SDL_GetNumVideoDisplays");
 6136            for (var displayIndex = 0; displayIndex < numDisplays; displayIndex++)
 2137                s_displays.Add(new Display(displayIndex));
 1138        }
 139
 140        internal static int GetCurrentDisplayIndexForWindow(IntPtr window) =>
 160141            TryGet(() => SDL_GetWindowDisplayIndex(window), "SDL_GetWindowDisplayIndex");
 142
 143        internal static Display GetCurrentDisplayForWindow(IntPtr window) =>
 2144            s_displays[GetCurrentDisplayIndexForWindow(window)];
 145
 146        static Display()
 147        {
 1148            Lifecycle.TryInitialize();
 1149            UpdateDisplayInfo();
 1150        }
 151    }
 152}