diff --git a/Common/System/Display.cpp b/Common/System/Display.cpp index 79038890b8..13a734087d 100644 --- a/Common/System/Display.cpp +++ b/Common/System/Display.cpp @@ -58,7 +58,7 @@ void DisplayProperties::Print() { printf("dp_xres/yres: %d, %d\n", dp_xres, dp_yres); printf("pixel_xres/yres: %d, %d\n", pixel_xres, pixel_yres); - printf("dpi, dpi_scale: %f, %f\n", dpi, dpi_scale); + printf("dpi_scale: %f\n", dpi_scale); printf("pixel_in_dps: %f\n", pixel_in_dps); printf("dpi_real: %f\n", dpi_scale_real); diff --git a/Common/System/Display.h b/Common/System/Display.h index 98f350690f..a1afec1d7b 100644 --- a/Common/System/Display.h +++ b/Common/System/Display.h @@ -16,20 +16,20 @@ enum class DisplayRotation { }; struct DisplayProperties { - // Display resolution in virtual ("display") pixels - int dp_xres; - int dp_yres; // Display resolution in true pixels. int pixel_xres; int pixel_yres; - float dpi = 1.0f; float dpi_scale = 1.0f; - // pixel_xres/yres in dps + // Display resolution in virtual ("display") pixels + int dp_xres; + int dp_yres; + + // Size of a physical pixel in dps float pixel_in_dps = 1.0f; - // If DPI is overridden (like in small window mode), these are still the original DPI. + // If DPI is overridden (like in small window mode), this is still the original DPI scale factor. float dpi_scale_real = 1.0f; float display_hz = 60.0f; diff --git a/UI/DevScreens.cpp b/UI/DevScreens.cpp index c280b156ef..07fa45863e 100644 --- a/UI/DevScreens.cpp +++ b/UI/DevScreens.cpp @@ -646,11 +646,11 @@ void SystemInfoScreen::CreateTabs() { System_GetPropertyInt(SYSPROP_DISPLAY_XRES), System_GetPropertyInt(SYSPROP_DISPLAY_YRES)))); #endif - displayInfo->Add(new InfoItem(si->T("UI resolution"), StringFromFormat("%dx%d (%s: %0.2f)", + displayInfo->Add(new InfoItem(si->T("UI resolution"), StringFromFormat("%dx%d (%s: %d)", g_display.dp_xres, g_display.dp_yres, si->T_cstr("DPI"), - g_display.dpi))); + System_GetPropertyInt(SYSPROP_DISPLAY_DPI)))); displayInfo->Add(new InfoItem(si->T("Pixel resolution"), StringFromFormat("%dx%d", g_display.pixel_xres, g_display.pixel_yres))); @@ -1311,22 +1311,25 @@ void TouchTestScreen::DrawForeground(UIContext &dc) { truncate_cpy(extra_debug, Android_GetInputDeviceDebugString().c_str()); #endif + // Hm, why don't we print all the info on Android? +#if PPSSPP_PLATFORM(ANDROID) + snprintf(buffer, sizeof(buffer), + "display_res: %dx%d\n", + (int)System_GetPropertyInt(SYSPROP_DISPLAY_XRES), (int)System_GetPropertyInt(SYSPROP_DISPLAY_YRES)); +#else snprintf(buffer, sizeof(buffer), -#if PPSSPP_PLATFORM(ANDROID) "display_res: %dx%d\n" -#endif "dp_res: %dx%d pixel_res: %dx%d\n" - "g_dpi: %0.3f g_dpi_scale: %0.3f\n" - "g_dpi_scale_real: %0.3f\n" + "dpi_scale: %0.3f\n" + "dpi_scale_real: %0.3f\n" "delta: %0.2f ms fps: %0.3f\n%s", -#if PPSSPP_PLATFORM(ANDROID) (int)System_GetPropertyInt(SYSPROP_DISPLAY_XRES), (int)System_GetPropertyInt(SYSPROP_DISPLAY_YRES), -#endif g_display.dp_xres, g_display.dp_yres, g_display.pixel_xres, g_display.pixel_yres, - g_display.dpi, g_display.dpi_scale, + g_display.dpi_scale, g_display.dpi_scale_real, delta * 1000.0, 1.0 / delta, extra_debug); +#endif // On Android, also add joystick debug data. dc.DrawTextShadow(buffer, bounds.centerX(), bounds.y + 20.0f, 0xFFFFFFFF, FLAG_DYNAMIC_ASCII); diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index 59bb55c820..ed9cb7227e 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -1520,31 +1520,37 @@ static bool IsWindowSmall(int pixelWidth, int pixelHeight) { bool Native_UpdateScreenScale(int pixel_width, int pixel_height) { bool smallWindow; - float g_logical_dpi = System_GetPropertyFloat(SYSPROP_DISPLAY_LOGICAL_DPI); - g_display.dpi = System_GetPropertyFloat(SYSPROP_DISPLAY_DPI); + const bool px_changed = g_display.pixel_xres != pixel_width || g_display.pixel_yres != pixel_height; - if (g_display.dpi < 0.0f) { - g_display.dpi = 96.0f; + float g_logical_dpi = System_GetPropertyFloat(SYSPROP_DISPLAY_LOGICAL_DPI); + float dpi = System_GetPropertyFloat(SYSPROP_DISPLAY_DPI); + + if (dpi < 0.0f) { + dpi = 96.0f; } if (g_logical_dpi < 0.0f) { g_logical_dpi = 96.0f; } - g_display.dpi_scale_real = g_logical_dpi / g_display.dpi; + g_display.dpi_scale_real = g_logical_dpi / dpi; g_display.dpi_scale = g_display.dpi_scale_real; + float scaleFactor = 1.0f; + smallWindow = IsWindowSmall(pixel_width, pixel_height); if (smallWindow) { - g_display.dpi /= 2.0f; - g_display.dpi_scale *= 2.0f; + scaleFactor = 0.5f; } + + // No need to change ".dpi" here. + g_display.dpi_scale /= scaleFactor; + g_display.pixel_in_dps = 1.0f / g_display.dpi_scale; int new_dp_xres = (int)(pixel_width * g_display.dpi_scale); int new_dp_yres = (int)(pixel_height * g_display.dpi_scale); - bool dp_changed = new_dp_xres != g_display.dp_xres || new_dp_yres != g_display.dp_yres; - bool px_changed = g_display.pixel_xres != pixel_width || g_display.pixel_yres != pixel_height; + const bool dp_changed = new_dp_xres != g_display.dp_xres || new_dp_yres != g_display.dp_yres; if (!dp_changed && !px_changed) { return false; diff --git a/UWP/PPSSPP_UWPMain.cpp b/UWP/PPSSPP_UWPMain.cpp index 324191eec5..f6a8419954 100644 --- a/UWP/PPSSPP_UWPMain.cpp +++ b/UWP/PPSSPP_UWPMain.cpp @@ -147,13 +147,13 @@ void PPSSPP_UWPMain::UpdateScreenState() { std::swap(g_display.pixel_xres, g_display.pixel_yres); } - g_display.dpi = m_deviceResources->GetActualDpi(); + float dpi = m_deviceResources->GetActualDpi(); if (System_GetPropertyInt(SYSPROP_DEVICE_TYPE) == DEVICE_TYPE_MOBILE) { // Boost DPI a bit to look better. - g_display.dpi *= 96.0f / 136.0f; + dpi *= 96.0f / 136.0f; } - g_display.dpi_scale_real = 96.0f / g_display.dpi; + g_display.dpi_scale_real = 96.0f / dpi; g_display.dpi_scale = g_display.dpi_scale_real; g_display.pixel_in_dps = 1.0f / g_display.dpi_scale; diff --git a/android/jni/app-android.cpp b/android/jni/app-android.cpp index 4b4f864194..b273de135a 100644 --- a/android/jni/app-android.cpp +++ b/android/jni/app-android.cpp @@ -412,6 +412,8 @@ int64_t System_GetPropertyInt(SystemProperty prop) { return display_xres; case SYSPROP_DISPLAY_YRES: return display_yres; + case SYSPROP_DISPLAY_DPI: + return display_dpi; case SYSPROP_AUDIO_SAMPLE_RATE: return sampleRate; case SYSPROP_AUDIO_FRAMES_PER_BUFFER: @@ -999,8 +1001,8 @@ extern "C" jboolean Java_org_ppsspp_ppsspp_NativeRenderer_displayInit(JNIEnv * e } static void recalculateDpi() { - g_display.dpi = (float)display_dpi; g_display.dpi_scale_real = 240.0f / (float)display_dpi; + g_display.dpi_scale = g_display.dpi_scale_real; g_display.dp_xres = display_xres * g_display.dpi_scale; @@ -1009,7 +1011,7 @@ static void recalculateDpi() { g_display.pixel_in_dps = (float)g_display.pixel_xres / g_display.dp_xres; INFO_LOG(Log::G3D, "RecalcDPI: display_xres=%d display_yres=%d pixel_xres=%d pixel_yres=%d", display_xres, display_yres, g_display.pixel_xres, g_display.pixel_yres); - INFO_LOG(Log::G3D, "RecalcDPI: g_dpi=%f g_dpi_scale=%f dp_xres=%d dp_yres=%d", g_display.dpi, g_display.dpi_scale, g_display.dp_xres, g_display.dp_yres); + INFO_LOG(Log::G3D, "RecalcDPI: g_dpi=%d g_dpi_scale=%f dp_xres=%d dp_yres=%d", display_dpi, g_display.dpi_scale, g_display.dp_xres, g_display.dp_yres); } extern "C" void JNICALL Java_org_ppsspp_ppsspp_NativeApp_backbufferResize(JNIEnv *, jclass, jint bufw, jint bufh, jint format) { diff --git a/ios/DisplayManager.mm b/ios/DisplayManager.mm index 62f53452f5..c2dae42cf1 100644 --- a/ios/DisplayManager.mm +++ b/ios/DisplayManager.mm @@ -142,13 +142,14 @@ std::swap(size.height, size.width); } + float dpi; if (screen == [UIScreen mainScreen]) { - g_display.dpi = (IS_IPAD() ? 200.0f : 150.0f) * scale; + dpi = (IS_IPAD() ? 200.0f : 150.0f) * scale; } else { float diagonal = sqrt(size.height * size.height + size.width * size.width); - g_display.dpi = diagonal * scale * 0.1f; + dpi = diagonal * scale * 0.1f; } - g_display.dpi_scale_real = 240.0f / g_display.dpi; + g_display.dpi_scale_real = 240.0f / dpi; g_display.dpi_scale = g_display.dpi_scale_real; @@ -161,7 +162,7 @@ g_display.pixel_in_dps = (float)g_display.pixel_xres / (float)g_display.dp_xres; [[sharedViewController getView] setContentScaleFactor:scale]; - + // PSP native resize PSP_CoreParameter().pixelWidth = g_display.pixel_xres; PSP_CoreParameter().pixelHeight = g_display.pixel_yres;