NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

device.py (24329B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\carbonui\services\device.py
      2 import sys
      3 import time
      4 import blue
      5 import eveformat
      6 import uthread
      7 import trinity
      8 import log
      9 import localization
     10 import monolithsentry
     11 import sentry_sdk
     12 import evegraphics.settings as gfxsettings
     13 from carbonui import uiconst
     14 from carbonui.services import deviceSignals
     15 from carbonui.uicore import uicore, GetWindowName
     16 from carbon.common.script.sys import service
     17 from carbon.common.script.sys.serviceManager import ServiceManager
     18 from carbonui.window.layout import apply_desktop_window_layout, capture_desktop_window_layout
     19 MINIMUM_WINDOW_SIZE = (1024, 700)
     20 SCALE_VALUES = (0.9, 1.0, 1.1, 1.25, 1.5, 1.75, 2.0, 2.5, 3.0, 4.0)
     21 
     22 def _GetClientSettings():
     23     return settings
     24 
     25 
     26 def _GetWindowModeSettingsKey(windowMode):
     27     if windowMode == trinity.Tr2WindowMode.FULL_SCREEN:
     28         return gfxsettings.GFX_FULL_SCREEN_MODE_SETTINGS
     29     if windowMode == trinity.Tr2WindowMode.WINDOWED:
     30         return gfxsettings.GFX_WINDOWED_MODE_SETTINGS
     31     if windowMode == trinity.Tr2WindowMode.FIXED_WINDOW:
     32         return gfxsettings.GFX_FIXED_WINDOW_MODE_SETTINGS
     33     raise ValueError()
     34 
     35 
     36 def _SaveStateSettings(state):
     37     key = _GetWindowModeSettingsKey(state.windowMode)
     38     settings = {'adapter': state.adapter,
     39      'width': state.width,
     40      'height': state.height,
     41      'presentInterval': state.presentInterval}
     42     if state.windowMode == trinity.Tr2WindowMode.WINDOWED:
     43         settings['left'] = state.left
     44         settings['top'] = state.top
     45         settings['showState'] = state.showState
     46     gfxsettings.Set(key, settings, pending=False)
     47 
     48 
     49 def _ConstraintResolution(state, maxResolution):
     50     if maxResolution is None:
     51         return False
     52     r = min(state.width, state.height)
     53     if r > maxResolution:
     54         if r == state.height:
     55             state.width = 0
     56             state.height = maxResolution
     57         else:
     58             state.height = 0
     59             state.width = maxResolution
     60         return True
     61     return False
     62 
     63 
     64 def _LoadStateSettings(windowMode):
     65     key = _GetWindowModeSettingsKey(windowMode)
     66     state = trinity.mainWindow.GetDefaultState(windowMode)
     67     settings = gfxsettings.Get(key, None)
     68     if settings is None:
     69         if windowMode == trinity.Tr2WindowMode.FULL_SCREEN:
     70             res = gfxsettings.GetMaximumDefaultResolution()
     71             if _ConstraintResolution(state, res):
     72                 trinity.mainWindow.SanitizeState(state)
     73                 log.LogNotice('Constraining default fullscreen resolution to %sx%s' % (state.width, state.height))
     74         return state
     75     try:
     76         _LoadStateSettingsFromDict(state, settings)
     77     except:
     78         log.LogException()
     79         sys.exc_clear()
     80         return trinity.mainWindow.GetDefaultState(windowMode)
     81 
     82     return state
     83 
     84 
     85 def _LoadStateSettingsFromDict(state, settings):
     86     state.adapter = int(settings.get('adapter', 0))
     87     state.presentInterval = int(settings.get('presentInterval', trinity.PRESENT_INTERVAL.ONE))
     88     state.width = int(settings.get('width', 0))
     89     state.height = int(settings.get('height', 0))
     90     if state.windowMode == trinity.Tr2WindowMode.WINDOWED:
     91         if 'left' in settings and 'top' in settings:
     92             state.left = int(settings['left'])
     93             state.top = int(settings['top'])
     94         else:
     95             cm = trinity.adapters.GetCurrentDisplayMode(state.adapter)
     96             state.left = (cm.width - state.width) / 2
     97             state.top = (cm.height - state.height) / 2
     98         state.showState = settings.get('showState', trinity.Tr2WindowShowState.NORMAL)
     99 
    100 
    101 def _ConvertOldStateSettings(settings):
    102     return {'adapter': settings.get('Adapter', 0),
    103      'width': settings.get('BackBufferWidth', 0),
    104      'height': settings.get('BackBufferHeight', 0),
    105      'presentInterval': settings.get('PresentationInterval', trinity.PRESENT_INTERVAL.ONE)}
    106 
    107 
    108 def _HasNewStateSettings():
    109     if gfxsettings.Get(gfxsettings.GFX_FULL_SCREEN_MODE_SETTINGS, None):
    110         return True
    111     if gfxsettings.Get(gfxsettings.GFX_WINDOWED_MODE_SETTINGS, None):
    112         return True
    113     if gfxsettings.Get(gfxsettings.GFX_FIXED_WINDOW_MODE_SETTINGS, None):
    114         return True
    115     return False
    116 
    117 
    118 def HasOldUpscaling():
    119     return gfxsettings.Get(gfxsettings.GFX_FSR_MODE, 0) != 0
    120 
    121 
    122 class DeviceMgr(service.Service):
    123     __guid__ = 'svc.device'
    124     __servicename__ = 'device'
    125     __displayname__ = 'Device Service'
    126     __startupdependencies__ = ['settings']
    127     __exportedcalls__ = {'SetDevice': [],
    128      'GetSettings': [],
    129      'ResetMonitor': [],
    130      'ToggleWindowed': [],
    131      'CreateDevice': [],
    132      'GetResolutionOptions': [],
    133      'GetPresentationIntervalOptions': []}
    134 
    135     def __init__(self):
    136         super(DeviceMgr, self).__init__()
    137         self._aaTypes = []
    138         self._settings = {}
    139 
    140     def _MigrateSettings(self):
    141         personal = gfxsettings.Get(gfxsettings.GFX_DEVICE_SETTINGS).copy()
    142         if 'PresentationInterval' in personal and personal['PresentationInterval'] & 16 == 0:
    143             self.LogInfo('Upgrading PresentationInterval setting')
    144             if personal['PresentationInterval'] == -2147483648:
    145                 personal['PresentationInterval'] = trinity.PRESENT_INTERVAL.IMMEDIATE
    146             elif personal['PresentationInterval'] == 0:
    147                 personal['PresentationInterval'] = trinity.PRESENT_INTERVAL.ONE
    148             else:
    149                 personal['PresentationInterval'] = trinity.PRESENT_INTERVAL.ONE + personal['PresentationInterval'] - 1
    150         if gfxsettings.Get(gfxsettings.GFX_WINDOW_BORDER_FIXED, False):
    151             _LoadStateSettingsFromDict(self._settings[trinity.Tr2WindowMode.FIXED_WINDOW], _ConvertOldStateSettings(personal))
    152             gfxsettings.Set(gfxsettings.GFX_WINDOW_MODE, 2, False)
    153         elif personal.get('Windowed', False):
    154             _LoadStateSettingsFromDict(self._settings[trinity.Tr2WindowMode.WINDOWED], _ConvertOldStateSettings(personal))
    155             gfxsettings.Set(gfxsettings.GFX_WINDOW_MODE, 1, False)
    156         else:
    157             _LoadStateSettingsFromDict(self._settings[trinity.Tr2WindowMode.FULL_SCREEN], _ConvertOldStateSettings(personal))
    158             gfxsettings.Set(gfxsettings.GFX_WINDOW_MODE, 0, False)
    159         resolution = gfxsettings.Get(gfxsettings.GFX_RESOLUTION_WINDOWED)
    160         if resolution:
    161             self._settings[trinity.Tr2WindowMode.WINDOWED].width = resolution[0]
    162             self._settings[trinity.Tr2WindowMode.WINDOWED].height = resolution[1]
    163         resolution = gfxsettings.Get(gfxsettings.GFX_RESOLUTION_FULLSCREEN)
    164         if resolution:
    165             self._settings[trinity.Tr2WindowMode.FULL_SCREEN].width = resolution[0]
    166             self._settings[trinity.Tr2WindowMode.FULL_SCREEN].height = resolution[1]
    167 
    168     def Run(self, memStream = None):
    169         self.LogInfo('Starting DeviceMgr')
    170         gfx = gfxsettings.GraphicsSettings.GetGlobal()
    171         gfx.InitializeSettingsGroup(gfxsettings.SETTINGS_GROUP_DEVICE, _GetClientSettings().public.device)
    172         self._ApplyDeviceIndependentSettings()
    173         monolithsentry.set_sentry_crash_key()
    174 
    175     def _ApplyDeviceIndependentSettings(self):
    176         if not _GetClientSettings().public.generic.Get('resourceUnloading', 1):
    177             trinity.SetEveSpaceObjectResourceUnloadingEnabled(0)
    178         blue.classes.maxPendingDeletes = 20000
    179         blue.classes.maxTimeForPendingDeletes = 4.0
    180         blue.classes.pendingDeletesEnabled = True
    181         trinity.device.disableAsyncLoad = not bool(_GetClientSettings().public.generic.Get('asyncLoad', 1))
    182         gfxsettings.ValidateSettings()
    183         aaQuality = gfxsettings.Get(gfxsettings.GFX_ANTI_ALIASING)
    184         brightness = gfxsettings.Get(gfxsettings.GFX_BRIGHTNESS)
    185         trinity.settings.SetValue('eveSpaceSceneGammaBrightness', brightness)
    186         trinity.device.mipLevelSkipCount = gfxsettings.Get(gfxsettings.GFX_TEXTURE_QUALITY)
    187         self.SetResourceCacheSize()
    188         trinity.SetShaderModel(self._GetAppShaderModel())
    189         for k, v in self._GetAppSettings().iteritems():
    190             trinity.settings.SetValue(k, v)
    191 
    192         for path in self._GetAppMipLevelSkipExclusionDirectories():
    193             trinity.AddMipLevelSkipExclusionDirectory(path)
    194 
    195         try:
    196             trinity.settings.SetValue('fixFullscreenBehaviorForOldWindows', blue.sysinfo.os.majorVersion < 10)
    197         except LookupError:
    198             pass
    199 
    200     def Initialize(self):
    201         trinity.adapters.Refresh()
    202         adapters = list(range(trinity.adapters.GetAdapterCount()))
    203         if not adapters:
    204             self.LogError('No valid display adapter found')
    205             blue.os.Terminate(12)
    206         self.LogInfo('Found valid display adapters: %s' % adapters)
    207         self._settings = {i:_LoadStateSettings(i) for i in (trinity.Tr2WindowMode.FULL_SCREEN, trinity.Tr2WindowMode.WINDOWED, trinity.Tr2WindowMode.FIXED_WINDOW)}
    208         if not _HasNewStateSettings():
    209             if gfxsettings.Get(gfxsettings.GFX_DEVICE_SETTINGS):
    210                 self.LogInfo('No new-style settings found, reading old settings')
    211                 self._MigrateSettings()
    212             else:
    213                 self.LogInfo('No stored settings found')
    214                 fullscreen = self._settings[trinity.Tr2WindowMode.FULL_SCREEN]
    215                 aa = gfxsettings.GetDefaultAntiAliasingQuality(fullscreen.width, fullscreen.height)
    216                 gfxsettings.Set(gfxsettings.GFX_ANTI_ALIASING, min(gfxsettings.Get(gfxsettings.GFX_ANTI_ALIASING), aa), pending=False)
    217         if HasOldUpscaling():
    218             hasNewSettings = gfxsettings.Get(gfxsettings.GFX_UPSCALING_TECHNIQUE, gfxsettings.GFX_UPSCALING_TECHNIQUE_NONE) != gfxsettings.GFX_UPSCALING_TECHNIQUE_NONE
    219             oldSetting = gfxsettings.Get(gfxsettings.GFX_FSR_MODE, 0)
    220             if not hasNewSettings and oldSetting != 0:
    221                 gfxsettings.Set(gfxsettings.GFX_UPSCALING_TECHNIQUE, gfxsettings.GFX_UPSCALING_TECHNIQUE_FSR1, False)
    222                 gfxsettings.Set(gfxsettings.GFX_UPSCALING_SETTING, 2 ** oldSetting, False)
    223             if oldSetting != 0:
    224                 gfxsettings.Set(gfxsettings.GFX_FSR_MODE, 0, False)
    225         if not trinity.settings.GetValue('newUpscalersEnabled') and gfxsettings.Get(gfxsettings.GFX_UPSCALING_TECHNIQUE, gfxsettings.GFX_UPSCALING_TECHNIQUE_NONE) not in (gfxsettings.GFX_UPSCALING_TECHNIQUE_NONE, gfxsettings.GFX_UPSCALING_TECHNIQUE_FSR1):
    226             gfxsettings.Set(gfxsettings.GFX_UPSCALING_TECHNIQUE, gfxsettings.GFX_UPSCALING_TECHNIQUE_NONE, False)
    227         for each in self._settings.values():
    228             trinity.mainWindow.StoreStateSettings(each)
    229 
    230         self.LogInfo('Using settings: ', ' / '.join((str(x) for x in self._settings.values())))
    231 
    232     def Stop(self, memStream = None):
    233         self.LogInfo('Stopping DeviceMgr')
    234         service.Service.Stop(self)
    235 
    236     def GetShaderModelForShaderQuality(self, val):
    237         if val == 3:
    238             return 'SM_3_0_DEPTH'
    239         if val == 2:
    240             return 'SM_3_0_HI'
    241         return 'SM_3_0_LO'
    242 
    243     def _SaveSettings(self, window):
    244         mode = window.GetWindowState()
    245         windowMode = mode.windowMode
    246         if windowMode != trinity.Tr2WindowMode.WINDOWED or mode.showState != trinity.Tr2WindowShowState.MINIMIZED:
    247             self.LogInfo('Saving device settings: ', mode)
    248             self._settings[windowMode] = mode
    249             _SaveStateSettings(self._settings[windowMode])
    250             gfxsettings.Set(gfxsettings.GFX_WINDOW_MODE, windowMode, False)
    251             self.settings.SaveSettings()
    252             for each in self._settings.values():
    253                 trinity.mainWindow.StoreStateSettings(each)
    254 
    255     def _OnBeforeSwapChainChange(self, *args):
    256         ServiceManager.Instance().GetService('window').ProcessDeviceChange()
    257 
    258     def _OnWindowStateChange(self, *args):
    259         self._SaveSettings(trinity.mainWindow)
    260         with sentry_sdk.configure_scope() as scope:
    261             scope.set_tag('window_mode', 'fullscreen' if trinity.mainWindow.GetWindowState().windowMode == trinity.Tr2WindowMode.FULL_SCREEN else 'windowed')
    262         monolithsentry.set_sentry_crash_key()
    263 
    264     def _OnSwapChainChange(self, *args):
    265         ServiceManager.Instance().ScatterEvent('OnSetDevice')
    266         deviceSignals.on_set_device()
    267         if uicore.uilib:
    268             uicore.uilib.UpdateRootObjectSizes()
    269         ServiceManager.Instance().ScatterEvent('OnEndChangeDevice')
    270         deviceSignals.on_end_change_device()
    271 
    272     def ForceSize(self, width = 512, height = 512):
    273         trinity.mainWindow.SetMinimumSize(width, height)
    274         state = trinity.Tr2MainWindowState()
    275         state.windowMode = trinity.Tr2WindowMode.WINDOWED
    276         state.width = width
    277         state.height = height
    278         uthread.new(self._SetDevice, state)
    279 
    280     def CreateDevice(self):
    281         self.LogInfo('CreateDevice')
    282         if '/safemode' in blue.pyos.GetArg():
    283             self.SetToSafeMode()
    284         trinity.mainWindow.SetWindowTitle(GetWindowName())
    285         trinity.mainWindow.SetMinimumSize(*MINIMUM_WINDOW_SIZE)
    286         trinity.mainWindow.onBeforeSwapChainChange = self._OnBeforeSwapChainChange
    287         trinity.mainWindow.onWindowStateChange = self._OnWindowStateChange
    288         trinity.mainWindow.onSwapChainChange = self._OnSwapChainChange
    289         trinity.device.UpdateAvailableUpscalingTechniques()
    290         dev = trinity.device
    291         while not dev.DoesD3DDeviceExist():
    292             try:
    293                 self.Initialize()
    294                 dev.SetUpscaling(gfxsettings.Get(gfxsettings.GFX_UPSCALING_TECHNIQUE), gfxsettings.Get(gfxsettings.GFX_UPSCALING_SETTING), gfxsettings.Get(gfxsettings.GFX_FRAMEGENERATION_ENABLED))
    295                 self._SetDevice(self._settings[gfxsettings.Get(gfxsettings.GFX_WINDOW_MODE, 0)])
    296                 if not dev.DoesD3DDeviceExist():
    297                     blue.os.Pump()
    298                     time.sleep(0.5)
    299             except trinity.ALDeviceNotAvailable as e:
    300                 sys.exc_clear()
    301                 trinity.adapters.Refresh()
    302 
    303         gfxsettings.Set(gfxsettings.GFX_UPSCALING_TECHNIQUE, dev.upscalingTechnique)
    304         gfxsettings.Set(gfxsettings.GFX_UPSCALING_SETTING, dev.upscalingSetting)
    305         gfxsettings.Set(gfxsettings.GFX_FRAMEGENERATION_ENABLED, dev.frameGeneration)
    306 
    307     def ResetMonitor(self):
    308         self._SetDevice(trinity.Tr2MainWindowState())
    309 
    310     def IsWindowed(self):
    311         return trinity.mainWindow.GetWindowState().windowMode != trinity.Tr2WindowMode.FULL_SCREEN
    312 
    313     def GetDefaultResolution(self, windowState):
    314         if windowState.windowMode != trinity.Tr2WindowMode.FULL_SCREEN or self._settings[windowState.windowMode].adapter == windowState.adapter:
    315             state = self._settings[windowState.windowMode].CopyTo()
    316         else:
    317             state = trinity.Tr2MainWindowState()
    318             state.windowMode = windowState.windowMode
    319             state.adapter = windowState.adapter
    320         trinity.mainWindow.SanitizeState(state)
    321         return (state.width, state.height)
    322 
    323     def GetPreferedResolution(self, windowed):
    324         if windowed:
    325             state = self._settings[trinity.Tr2WindowMode.WINDOWED].CopyTo()
    326         else:
    327             state = self._settings[trinity.Tr2WindowMode.FULL_SCREEN].CopyTo()
    328         trinity.mainWindow.SanitizeState(state)
    329         return (state.width, state.height)
    330 
    331     def ToggleWindowed(self):
    332         if trinity.mainWindow.GetWindowState().windowMode != trinity.Tr2WindowMode.WINDOWED:
    333             windowMode = trinity.Tr2WindowMode.WINDOWED
    334         else:
    335             windowMode = trinity.Tr2WindowMode.FULL_SCREEN
    336         self._SetDevice(self._settings[windowMode])
    337         ServiceManager.Instance().ScatterEvent('OnToggleWindowed', isWindowed=windowMode != 0)
    338         deviceSignals.on_toggle_windowed(windowMode != 0)
    339 
    340     def _SetDevice(self, state):
    341         dev = trinity.device
    342         dev.viewport.width = state.width
    343         dev.viewport.height = state.height
    344         while True:
    345             try:
    346                 trinity.mainWindow.SetWindowState(state)
    347                 break
    348             except trinity.ALDeviceLostError:
    349                 blue.pyos.synchro.SleepWallclock(1000)
    350 
    351         return True
    352 
    353     def SetDevice(self, windowState):
    354         backup = trinity.mainWindow.GetWindowState().CopyTo()
    355         try:
    356             self._SetDevice(windowState)
    357         except:
    358             self._SetDevice(backup)
    359             return False
    360 
    361         newState = trinity.mainWindow.GetWindowState()
    362         if newState.windowMode == trinity.Tr2WindowMode.FULL_SCREEN and (newState.width != backup.width or newState.height != backup.height):
    363             self._AskForConfirmation(backup)
    364 
    365     def _AskForConfirmation(self, backup):
    366         loadingSvc = ServiceManager.Instance().GetService('loading')
    367         if hasattr(loadingSvc, 'CountDownWindow'):
    368             loadingSvc.CountDownWindow(localization.GetByLabel('/Carbon/UI/Service/Device/KeepDisplayChanges'), 15000, lambda *args: None, lambda *args: self._SetDevice(backup), inModalLayer=1)
    369 
    370     def GetSettings(self):
    371         return trinity.mainWindow.GetWindowState()
    372 
    373     def GetAdaptersEnumerated(self):
    374         options = []
    375         for i in range(trinity.adapters.GetAdapterCount()):
    376             identifier = trinity.adapters.GetAdapterInfo(i)
    377             identifierDesc = identifier.description.encode('ascii', 'ignore')
    378             identifierDesc += ' ' + str(i + 1)
    379             options.append((identifierDesc, i))
    380 
    381         return options
    382 
    383     def GetResolutionOptions(self, windowState):
    384         options = []
    385         for resolution in trinity.mainWindow.GetWindowSizeOptions(windowState.adapter, windowState.windowMode):
    386             options.append((localization.GetByLabel('/Carbon/UI/Service/Device/ScreenSize', width=resolution[0], height=resolution[1]), resolution))
    387 
    388         return options
    389 
    390     def GetPresentationIntervalOptions(self, windowMode):
    391         options = [(localization.GetByLabel('UI/SystemMenu/DisplayAndGraphics/Common/Off'), trinity.PRESENT_INTERVAL.IMMEDIATE), (localization.GetByLabel('UI/SystemMenu/DisplayAndGraphics/Common/On'), trinity.PRESENT_INTERVAL.ONE)]
    392         return options
    393 
    394     def SetResourceCacheSize(self):
    395         cacheSize = 128
    396         self.LogInfo('Setting resource cache size to', cacheSize, 'MB')
    397         MEG = 1048576
    398         finalSize = cacheSize * MEG
    399         blue.motherLode.maxMemUsage = finalSize
    400         return finalSize
    401 
    402     def SetToSafeMode(self):
    403         gfxsettings.Set(gfxsettings.GFX_TEXTURE_QUALITY, 2, pending=False)
    404         gfxsettings.Set(gfxsettings.GFX_SHADER_QUALITY, 1, pending=False)
    405         gfxsettings.Set(gfxsettings.GFX_POST_PROCESSING_QUALITY, 0, pending=False)
    406         gfxsettings.Set(gfxsettings.GFX_SHADOW_QUALITY, 0, pending=False)
    407 
    408     def _GetAppShaderModel(self):
    409         shaderQuality = gfxsettings.Get(gfxsettings.GFX_SHADER_QUALITY)
    410         return self.GetShaderModelForShaderQuality(shaderQuality)
    411 
    412     def _GetAppSettings(self):
    413         return gfxsettings.GetLodSettings()
    414 
    415     def _GetAppMipLevelSkipExclusionDirectories(self):
    416         return ['res:/UI/Texture']
    417 
    418     def RefreshSupportedAATypes(self, deviceSettings, formats, shaderModel = None):
    419         self._aaTypes = [gfxsettings.AA_QUALITY_DISABLED]
    420         self._aaTypes.append(gfxsettings.AA_QUALITY_TAA_LOW)
    421         self._aaTypes.append(gfxsettings.AA_QUALITY_TAA_MEDIUM)
    422         self._aaTypes.append(gfxsettings.AA_QUALITY_TAA_HIGH)
    423 
    424     def GetAntiAliasingLabel(self, aaQuality):
    425         aaLabels = {gfxsettings.AA_QUALITY_DISABLED: localization.GetByLabel('/Carbon/UI/Common/Disabled'),
    426          gfxsettings.AA_QUALITY_TAA_LOW: localization.GetByLabel('UI/SystemMenu/DisplayAndGraphics/Common/LowQuality'),
    427          gfxsettings.AA_QUALITY_TAA_MEDIUM: localization.GetByLabel('UI/SystemMenu/DisplayAndGraphics/Common/MediumQuality'),
    428          gfxsettings.AA_QUALITY_TAA_HIGH: localization.GetByLabel('UI/SystemMenu/DisplayAndGraphics/Common/HighQuality')}
    429         return aaLabels[aaQuality]
    430 
    431     def _GetCommonFormats(self, adapter):
    432         allFormats = (trinity.PIXEL_FORMAT.R16G16B16A16_FLOAT, trinity.PIXEL_FORMAT.B8G8R8X8_UNORM, trinity.PIXEL_FORMAT.B8G8R8A8_UNORM)
    433         return [ f for f in allFormats if trinity.adapters.SupportsRenderTargetFormat(adapter, f) ]
    434 
    435     def GetAntiAliasingOptions(self, deviceSettings, shaderModel = None):
    436         formats = self._GetCommonFormats(deviceSettings.adapter)
    437         self.RefreshSupportedAATypes(deviceSettings, formats, shaderModel)
    438         aaOptions = []
    439         for each in self._aaTypes:
    440             aaOptions.append((self.GetAntiAliasingLabel(each), each))
    441 
    442         return aaOptions
    443 
    444     def GetUIScalingOptions(self, windowed, height = None):
    445         if height is None:
    446             height = uicore.desktop.height
    447         options = [ (eveformat.percent(scale), scale) for scale in self.GetAllowedScaleValues(height) ]
    448         auto_scale_value = self.CapUIScaleValue(self._GetFallbackUIScale(windowed))
    449         auto_option = (localization.GetByLabel('UI/SystemMenu/DisplayAndGraphics/DisplaySetup/AutoUIScaleOption', scale=eveformat.percent(auto_scale_value)), uiconst.AUTO_UI_SCALE_OPTION_ID)
    450         options.insert(0, auto_option)
    451         return options
    452 
    453     def GetAllowedScaleValues(self, height = None):
    454         if height is None:
    455             height = uicore.desktop.height
    456         maxValue = max(height / float(MINIMUM_WINDOW_SIZE[1]), 1.0)
    457         allowed_values = [ value for value in SCALE_VALUES if value <= maxValue ]
    458         return allowed_values
    459 
    460     def CapUIScaleValue(self, checkValue):
    461         values = self.GetAllowedScaleValues(trinity.device.height)
    462         minScale = min(values)
    463         maxScale = max(values)
    464         return max(minScale, min(maxScale, checkValue))
    465 
    466     def SetupUIScaling(self):
    467         if not uicore.desktop:
    468             return
    469         windowed = self.IsWindowed()
    470         self.SetUIScaleValue(self.GetUIScaleValue(windowed), windowed)
    471 
    472     def SetUIScaleValue(self, scaleValue, windowed):
    473         self.LogInfo('SetUIScaleValue', scaleValue, 'windowed', windowed)
    474         capValue = self.CapUIScaleValue(scaleValue)
    475         self._SetUIScaleValue(capValue, windowed)
    476         if capValue != uicore.desktop.dpiScaling:
    477             PreUIScaleChange_DesktopLayout = capture_desktop_window_layout()
    478             oldValue = uicore.dpiScaling
    479             uicore.desktop.UpdateUIScaling(capValue, oldValue)
    480             self.LogInfo('SetUIScaleValue capValue', capValue)
    481             ServiceManager.Instance().ScatterEvent('OnUIScalingChange', (oldValue, capValue))
    482             apply_desktop_window_layout(PreUIScaleChange_DesktopLayout)
    483         else:
    484             self.LogInfo('SetUIScaleValue No Change')
    485 
    486     def _SetUIScaleValue(self, value, windowed):
    487         if windowed:
    488             gfxsettings.Set(gfxsettings.GFX_UI_SCALE_WINDOWED, value, pending=False)
    489         else:
    490             gfxsettings.Set(gfxsettings.GFX_UI_SCALE_FULLSCREEN, value, pending=False)
    491 
    492     def _GetFallbackUIScale(self, windowed):
    493         if trinity.mainWindow:
    494             state = trinity.mainWindow.GetWindowState()
    495             if windowed:
    496                 try:
    497                     cm = trinity.adapters.GetCurrentDisplayMode(state.adapter)
    498                 except trinity.ALError:
    499                     return 1.0
    500 
    501                 height = cm.height
    502             else:
    503                 height = state.height
    504             if height > 2160:
    505                 return 2.0
    506             if height > 1800:
    507                 return 1.5
    508             if height > 1440:
    509                 return 1.25
    510             if height < 900:
    511                 return 0.9
    512         return 1.0
    513 
    514     def GetUIScaleValue(self, windowed):
    515         fallback = self._GetFallbackUIScale(windowed)
    516         auto_ui_scale_setting_key = gfxsettings.GFX_UI_SCALE_WINDOWED_SET_AUTOMATICALLY if windowed else gfxsettings.GFX_UI_SCALE_FULLSCREEN_SET_AUTOMATICALLY
    517         auto = gfxsettings.Get(auto_ui_scale_setting_key)
    518         if auto:
    519             return fallback
    520         else:
    521             ui_scale_setting_key = gfxsettings.GFX_UI_SCALE_WINDOWED if windowed else gfxsettings.GFX_UI_SCALE_FULLSCREEN
    522             return gfxsettings.Get(ui_scale_setting_key, fallback)
    523 
    524     def ApplyTrinityUserSettings(self):
    525         effectsEnabled = gfxsettings.Get(gfxsettings.UI_EFFECTS_ENABLED)
    526         trailsEnabled = effectsEnabled and gfxsettings.Get(gfxsettings.UI_TRAILS_ENABLED)
    527         trinity.settings.SetValue('eveSpaceObjectTrailsEnabled', trailsEnabled)