diff options
| author | andreykproductengine <akleshchev@productengine.com> | 2016-09-30 17:36:50 +0300 | 
|---|---|---|
| committer | andreykproductengine <akleshchev@productengine.com> | 2016-09-30 17:36:50 +0300 | 
| commit | 89844b345e8bfc69c5f0bd49bdc402d0b1c24e3b (patch) | |
| tree | 5a7507c136582d8bdccb751ce83e466debf47f74 | |
| parent | 7a7dc795f64c7a8ac6de055db5fcfe83d821810d (diff) | |
MAINT-6786 scale gets out of bonds and causes crash
| -rw-r--r-- | indra/newview/llviewerwindow.cpp | 29 | 
1 files changed, 23 insertions, 6 deletions
| diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 9679f69e2c..4f4b33fa8c 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -251,6 +251,11 @@ BOOL				gDisplayBadge = FALSE;  static const U8 NO_FACE = 255;  BOOL gQuietSnapshot = FALSE; +// Minimum value for UIScaleFactor, also defined in preferences, ui_scale_slider +static const F32 MIN_UI_SCALE = 0.75f; +// 2.0 in preferences, but win10 supports larger scaling and value is used more as +// sanity check, so leaving space for larger values from DPI updates. +static const F32 MAX_UI_SCALE = 7.0f;  static const F32 MIN_DISPLAY_SCALE = 0.75f;  std::string	LLViewerWindow::sSnapshotBaseName; @@ -1595,9 +1600,16 @@ BOOL LLViewerWindow::handleDeviceChange(LLWindow *window)  void LLViewerWindow::handleDPIChanged(LLWindow *window, F32 ui_scale_factor, S32 window_width, S32 window_height)  { -    gSavedSettings.setF32("UIScaleFactor", ui_scale_factor); -    LLViewerWindow::reshape(window_width, window_height); -    mResDirty = true; +    if (ui_scale_factor >= MIN_UI_SCALE && ui_scale_factor <= MAX_UI_SCALE) +    { +        gSavedSettings.setF32("UIScaleFactor", ui_scale_factor); +        LLViewerWindow::reshape(window_width, window_height); +        mResDirty = true; +    } +    else +    { +        LL_WARNS() << "DPI change caused UI scale to go out of bounds: " << ui_scale_factor << LL_ENDL; +    }  }  void LLViewerWindow::handlePingWatchdog(LLWindow *window, const char * msg) @@ -1753,6 +1765,11 @@ LLViewerWindow::LLViewerWindow(const Params& p)  	F32 system_scale_factor = mWindow->getSystemUISize(); +	if (system_scale_factor < MIN_UI_SCALE || system_scale_factor > MAX_UI_SCALE) +	{ +		// reset to default; +		system_scale_factor = 1.f; +	}  	if (p.first_run || gSavedSettings.getF32("LastSystemUIScaleFactor") != system_scale_factor)  	{  		mSystemUIScaleFactorChanged = !p.first_run; @@ -1763,7 +1780,7 @@ LLViewerWindow::LLViewerWindow(const Params& p)  	// Get the real window rect the window was created with (since there are various OS-dependent reasons why  	// the size of a window or fullscreen context may have been adjusted slightly...) -	F32 ui_scale_factor = gSavedSettings.getF32("UIScaleFactor"); +	F32 ui_scale_factor = llclamp(gSavedSettings.getF32("UIScaleFactor"), MIN_UI_SCALE, MAX_UI_SCALE);  	mDisplayScale.setVec(llmax(1.f / mWindow->getPixelAspectRatio(), 1.f), llmax(mWindow->getPixelAspectRatio(), 1.f));  	mDisplayScale *= ui_scale_factor; @@ -5251,7 +5268,7 @@ F32	LLViewerWindow::getWorldViewAspectRatio() const  void LLViewerWindow::calcDisplayScale()  { -	F32 ui_scale_factor = gSavedSettings.getF32("UIScaleFactor"); +	F32 ui_scale_factor = llclamp(gSavedSettings.getF32("UIScaleFactor"), MIN_UI_SCALE, MAX_UI_SCALE);  	LLVector2 display_scale;  	display_scale.setVec(llmax(1.f / mWindow->getPixelAspectRatio(), 1.f), llmax(mWindow->getPixelAspectRatio(), 1.f));  	display_scale *= ui_scale_factor; @@ -5264,7 +5281,7 @@ void LLViewerWindow::calcDisplayScale()  	if (display_scale != mDisplayScale)  	{ -		LL_INFOS() << "Setting display scale to " << display_scale << LL_ENDL; +		LL_INFOS() << "Setting display scale to " << display_scale << " for ui scale: " << ui_scale_factor << LL_ENDL;  		mDisplayScale = display_scale;  		// Init default fonts | 
