< Summary

Class:Imagini.DisplayMode
Assembly:Imagini.Core
File(s):/home/razer/vscode-projects/project-grove/imagini/Imagini.Core/Display.cs
Covered lines:15
Uncovered lines:29
Coverable lines:44
Total lines:152
Line coverage:34% (15 of 44)
Covered branches:2
Total branches:2
Branch coverage:100% (2 of 2)

Metrics

MethodCyclomatic complexity NPath complexity Sequence coverage Branch coverage
ToString()100%100%
GetAvailable(...)2042.85%100%
GetCurrent(...)1030.76%100%
GetDesktop(...)1023.07%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>
 819        public int Width => _mode.w;
 20        /// <summary>
 21        /// Fullscreen height.
 22        /// </summary>
 823        public int Height => _mode.h;
 24        /// <summary>
 25        /// Refresh rate in Hz.
 26        /// </summary>
 027        public int RefreshRate => _mode.refresh_rate;
 28
 29        internal int displayIndex;
 30        internal int modeIndex;
 31
 032        public override string ToString() => $"{Width}x{Height} {RefreshRate}Hz (display {displayIndex}, mode {modeIndex
 33
 34        internal static List<DisplayMode> GetAvailable(int displayIndex)
 35        {
 8136            var result = new List<DisplayMode>();
 037            var numModes = TryGet(() =>
 8138                SDL_GetNumDisplayModes(displayIndex),
 039                "SDL_GetNumDisplayModes");
 801040            for (var modeIndex = 0; modeIndex < numModes; modeIndex++)
 41            {
 392442                var modeData = new SDL_DisplayMode();
 392443                SDL_GetDisplayMode(displayIndex, modeIndex, ref modeData);
 044                result.Add(new DisplayMode()
 045                {
 046                    _mode = modeData,
 047                    displayIndex = displayIndex,
 048                    modeIndex = modeIndex
 049                });
 50            }
 8151            return result;
 52        }
 53
 54        internal static DisplayMode GetCurrent(int displayIndex)
 55        {
 7756            var modeData = new SDL_DisplayMode();
 057            Try(() =>
 7758                SDL_GetCurrentDisplayMode(displayIndex, ref modeData),
 7759                "SDL_GetCurrentDisplayMode");
 060            var result = new DisplayMode()
 061            {
 062                _mode = modeData,
 063                displayIndex = displayIndex,
 064            };
 065            result.modeIndex = DisplayMode
 066                .GetAvailable(displayIndex)
 067                .IndexOf(result);
 7768            return result;
 69        }
 70
 71        internal static DisplayMode GetDesktop(int displayIndex)
 72        {
 273            var modeData = new SDL_DisplayMode();
 074            Try(() =>
 275                SDL_GetDesktopDisplayMode(displayIndex, ref modeData),
 076                "SDL_GetDesktopDisplayMode");
 077            var result = new DisplayMode()
 078            {
 079                _mode = modeData,
 080                displayIndex = displayIndex,
 081            };
 082            result.modeIndex = DisplayMode
 083                .GetAvailable(displayIndex)
 084                .IndexOf(result);
 285            return result;
 86        }
 87    }
 88
 89    /// <summary>
 90    /// Represents a display device.
 91    /// </summary>
 92    public class Display
 93    {
 94        private static List<Display> s_displays = new List<Display>();
 95        /// <summary>
 96        /// Returns all available display devices.
 97        /// </summary>
 98        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>
 104        public IEnumerable<DisplayMode> Modes { get; private set; }
 105        /// <summary>
 106        /// Returns the current display mode for this display.
 107        /// </summary>
 108        public DisplayMode CurrentMode { get; set; }
 109        /// <summary>
 110        /// Returns the desktop display mode for this display.
 111        /// </summary>
 112        public DisplayMode DesktopMode { get; set; }
 113        /// <summary>
 114        /// Returns the name of this display device.
 115        /// </summary>
 116        public string Name { get; private set; }
 117        internal SDL_Rect Bounds { get; private set; }
 118
 119        internal Display(int index)
 120        {
 121            _index = index;
 122            Modes = DisplayMode.GetAvailable(index);
 123            Name = SDL_GetDisplayName(_index);
 124            if (Name == null || Name == "") Name = _index.ToString();
 125            var bounds = new SDL_Rect();
 126            Try(() => SDL_GetDisplayBounds(_index, ref bounds), "SDL_GetDisplayBounds");
 127            Bounds = bounds;
 128            CurrentMode = DisplayMode.GetCurrent(_index);
 129            DesktopMode = DisplayMode.GetDesktop(_index);
 130        }
 131
 132        internal static void UpdateDisplayInfo()
 133        {
 134            s_displays.Clear();
 135            var numDisplays = TryGet(SDL_GetNumVideoDisplays, "SDL_GetNumVideoDisplays");
 136            for (var displayIndex = 0; displayIndex < numDisplays; displayIndex++)
 137                s_displays.Add(new Display(displayIndex));
 138        }
 139
 140        internal static int GetCurrentDisplayIndexForWindow(IntPtr window) =>
 141            TryGet(() => SDL_GetWindowDisplayIndex(window), "SDL_GetWindowDisplayIndex");
 142
 143        internal static Display GetCurrentDisplayForWindow(IntPtr window) =>
 144            s_displays[GetCurrentDisplayIndexForWindow(window)];
 145
 146        static Display()
 147        {
 148            Lifecycle.TryInitialize();
 149            UpdateDisplayInfo();
 150        }
 151    }
 152}