Commit 9d25386e authored by Mitsuru Oshima's avatar Mitsuru Oshima Committed by Commit Bot

Add 2.4 scale factor

Updated per go/cros-ppi-spectrum. [270-310) now uses 2.4 and
use 2.2525.. only for Slate which has 3000x2000 panel.
No change to ARC++ scale for this range.

2.4 * 1600 produces small error (0.00024). Make sure it's
within the epsilon used in cc. (0.001) so that the screenshot size
is correct (See DisplayChangeObserverTest.FindDeviceScaleFactor)

Bug: 1070828
Test: covered by unittests. manually tested on yoga and nocturne
Change-Id: I2899fd774fcbd461231282b97fecead6a308b949
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2397321
Commit-Queue: Mitsuru Oshima <oshima@chromium.org>
Reviewed-by: default avatarYusuke Sato <yusukes@chromium.org>
Reviewed-by: default avatarZentaro Kavanagh <zentaro@chromium.org>
Cr-Commit-Position: refs/heads/master@{#807774}
parent ff3d332e
...@@ -309,6 +309,8 @@ int32_t GetLcdDensityForDeviceScaleFactor(float device_scale_factor) { ...@@ -309,6 +309,8 @@ int32_t GetLcdDensityForDeviceScaleFactor(float device_scale_factor) {
constexpr float kEpsilon = 0.001; constexpr float kEpsilon = 0.001;
if (std::abs(device_scale_factor - display::kDsf_2_252) < kEpsilon) if (std::abs(device_scale_factor - display::kDsf_2_252) < kEpsilon)
return 280; return 280;
if (std::abs(device_scale_factor - 2.4f) < kEpsilon)
return 280;
if (std::abs(device_scale_factor - 1.6f) < kEpsilon) if (std::abs(device_scale_factor - 1.6f) < kEpsilon)
return 213; // TVDPI return 213; // TVDPI
if (std::abs(device_scale_factor - display::kDsf_1_777) < kEpsilon) if (std::abs(device_scale_factor - display::kDsf_1_777) < kEpsilon)
......
...@@ -266,6 +266,7 @@ TEST_F(ArcUtilTest, ScaleFactorToDensity) { ...@@ -266,6 +266,7 @@ TEST_F(ArcUtilTest, ScaleFactorToDensity) {
EXPECT_EQ(240, GetLcdDensityForDeviceScaleFactor(display::kDsf_1_777)); EXPECT_EQ(240, GetLcdDensityForDeviceScaleFactor(display::kDsf_1_777));
EXPECT_EQ(240, GetLcdDensityForDeviceScaleFactor(2.0f)); EXPECT_EQ(240, GetLcdDensityForDeviceScaleFactor(2.0f));
EXPECT_EQ(280, GetLcdDensityForDeviceScaleFactor(display::kDsf_2_252)); EXPECT_EQ(280, GetLcdDensityForDeviceScaleFactor(display::kDsf_2_252));
EXPECT_EQ(280, GetLcdDensityForDeviceScaleFactor(2.4f));
EXPECT_EQ(320, GetLcdDensityForDeviceScaleFactor(display::kDsf_2_666)); EXPECT_EQ(320, GetLcdDensityForDeviceScaleFactor(display::kDsf_2_666));
// Bad scale factors shouldn't blow up. // Bad scale factors shouldn't blow up.
......
...@@ -47,9 +47,8 @@ struct DeviceScaleFactorDPIThreshold { ...@@ -47,9 +47,8 @@ struct DeviceScaleFactorDPIThreshold {
// Update the list of zoom levels whenever a new device scale factor is added // Update the list of zoom levels whenever a new device scale factor is added
// here. See zoom level list in /ui/display/manager/display_util.cc // here. See zoom level list in /ui/display/manager/display_util.cc
const DeviceScaleFactorDPIThreshold kThresholdTableForInternal[] = { const DeviceScaleFactorDPIThreshold kThresholdTableForInternal[] = {
{300.f, kDsf_2_666}, {270.0f, kDsf_2_252}, {230.0f, 2.0f}, {310.f, kDsf_2_666}, {270.0f, 2.4f}, {230.0f, 2.0f}, {220.0f, kDsf_1_777},
{220.0f, kDsf_1_777}, {180.0f, 1.6f}, {150.0f, 1.25f}, {180.0f, 1.6f}, {150.0f, 1.25f}, {0.0f, 1.0f},
{0.0f, 1.0f},
}; };
// Returns a list of display modes for the given |output| that doesn't exclude // Returns a list of display modes for the given |output| that doesn't exclude
...@@ -355,16 +354,9 @@ ManagedDisplayInfo DisplayChangeObserver::CreateManagedDisplayInfo( ...@@ -355,16 +354,9 @@ ManagedDisplayInfo DisplayChangeObserver::CreateManagedDisplayInfo(
? kInchInMm * mode_info->size().width() / ? kInchInMm * mode_info->size().width() /
snapshot->physical_size().width() snapshot->physical_size().width()
: 0; : 0;
constexpr gfx::Size k225DisplaySizeHack(3000, 2000);
if (snapshot->type() == DISPLAY_CONNECTION_TYPE_INTERNAL) { if (snapshot->type() == DISPLAY_CONNECTION_TYPE_INTERNAL) {
new_info.set_native(true); new_info.set_native(true);
// This is a stopgap hack to deal with b/74845106. Unfortunately, some old device_scale_factor = FindDeviceScaleFactor(dpi, mode_info->size());
// devices (like evt) does not have a firmware fix, so we need to keep this.
if (mode_info->size() == k225DisplaySizeHack)
device_scale_factor = kDsf_2_252;
else if (dpi)
device_scale_factor = FindDeviceScaleFactor(dpi);
} else { } else {
ManagedDisplayMode mode; ManagedDisplayMode mode;
if (display_manager_->GetSelectedModeForDisplayId(snapshot->display_id(), if (display_manager_->GetSelectedModeForDisplayId(snapshot->display_id(),
...@@ -414,10 +406,19 @@ ManagedDisplayInfo DisplayChangeObserver::CreateManagedDisplayInfo( ...@@ -414,10 +406,19 @@ ManagedDisplayInfo DisplayChangeObserver::CreateManagedDisplayInfo(
} }
// static // static
float DisplayChangeObserver::FindDeviceScaleFactor(float dpi) { float DisplayChangeObserver::FindDeviceScaleFactor(
for (size_t i = 0; i < base::size(kThresholdTableForInternal); ++i) { float dpi,
if (dpi >= kThresholdTableForInternal[i].dpi) const gfx::Size& size_in_pixels) {
return kThresholdTableForInternal[i].device_scale_factor; // Nocturne has special scale factor 3000/1332=2.252.. for the panel 3kx2k.
constexpr gfx::Size k225DisplaySizeHack(3000, 2000);
if (size_in_pixels == k225DisplaySizeHack)
return kDsf_2_252;
else {
for (size_t i = 0; i < base::size(kThresholdTableForInternal); ++i) {
if (dpi >= kThresholdTableForInternal[i].dpi)
return kThresholdTableForInternal[i].device_scale_factor;
}
} }
return 1.0f; return 1.0f;
} }
......
...@@ -57,7 +57,9 @@ class DISPLAY_MANAGER_EXPORT DisplayChangeObserver ...@@ -57,7 +57,9 @@ class DISPLAY_MANAGER_EXPORT DisplayChangeObserver
void OnInputDeviceConfigurationChanged(uint8_t input_device_types) override; void OnInputDeviceConfigurationChanged(uint8_t input_device_types) override;
// Exposed for testing. // Exposed for testing.
DISPLAY_EXPORT static float FindDeviceScaleFactor(float dpi); DISPLAY_EXPORT static float FindDeviceScaleFactor(
float dpi,
const gfx::Size& size_in_pixels);
private: private:
friend class DisplayChangeObserverTest; friend class DisplayChangeObserverTest;
......
...@@ -32,7 +32,7 @@ float ComputeDeviceScaleFactor(float diagonal_inch, ...@@ -32,7 +32,7 @@ float ComputeDeviceScaleFactor(float diagonal_inch,
float diagonal_pixel = std::sqrt(std::pow(resolution.width(), 2) + float diagonal_pixel = std::sqrt(std::pow(resolution.width(), 2) +
std::pow(resolution.height(), 2)); std::pow(resolution.height(), 2));
float dpi = diagonal_pixel / diagonal_inch; float dpi = diagonal_pixel / diagonal_inch;
return DisplayChangeObserver::FindDeviceScaleFactor(dpi); return DisplayChangeObserver::FindDeviceScaleFactor(dpi, resolution);
} }
std::unique_ptr<DisplayMode> MakeDisplayMode(int width, std::unique_ptr<DisplayMode> MakeDisplayMode(int width,
...@@ -196,12 +196,20 @@ TEST_P(DisplayChangeObserverTest, GetEmptyExternalManagedDisplayModeList) { ...@@ -196,12 +196,20 @@ TEST_P(DisplayChangeObserverTest, GetEmptyExternalManagedDisplayModeList) {
TEST_P(DisplayChangeObserverTest, FindDeviceScaleFactor) { TEST_P(DisplayChangeObserverTest, FindDeviceScaleFactor) {
// sanity check // sanity check
EXPECT_EQ(1.25f, DisplayChangeObserver::FindDeviceScaleFactor(150)); EXPECT_EQ(1.25f,
EXPECT_EQ(1.6f, DisplayChangeObserver::FindDeviceScaleFactor(180)); DisplayChangeObserver::FindDeviceScaleFactor(150, gfx::Size()));
EXPECT_EQ(kDsf_1_777, DisplayChangeObserver::FindDeviceScaleFactor(220)); EXPECT_EQ(1.6f,
EXPECT_EQ(2.f, DisplayChangeObserver::FindDeviceScaleFactor(230)); DisplayChangeObserver::FindDeviceScaleFactor(180, gfx::Size()));
EXPECT_EQ(kDsf_2_252, DisplayChangeObserver::FindDeviceScaleFactor(270)); EXPECT_EQ(kDsf_1_777,
EXPECT_EQ(kDsf_2_666, DisplayChangeObserver::FindDeviceScaleFactor(300)); DisplayChangeObserver::FindDeviceScaleFactor(220, gfx::Size()));
EXPECT_EQ(2.f,
DisplayChangeObserver::FindDeviceScaleFactor(230, gfx::Size()));
EXPECT_EQ(2.4f,
DisplayChangeObserver::FindDeviceScaleFactor(270, gfx::Size()));
EXPECT_EQ(kDsf_2_252, DisplayChangeObserver::FindDeviceScaleFactor(
0, gfx::Size(3000, 2000)));
EXPECT_EQ(kDsf_2_666,
DisplayChangeObserver::FindDeviceScaleFactor(310, gfx::Size()));
constexpr struct Data { constexpr struct Data {
const float diagonal_size; const float diagonal_size;
const gfx::Size resolution; const gfx::Size resolution;
...@@ -225,6 +233,7 @@ TEST_P(DisplayChangeObserverTest, FindDeviceScaleFactor) { ...@@ -225,6 +233,7 @@ TEST_P(DisplayChangeObserverTest, FindDeviceScaleFactor) {
{10.1f, {1920, 1200}, kDsf_1_777, {1080, 675}, false}, {10.1f, {1920, 1200}, kDsf_1_777, {1080, 675}, false},
{11.0f, {2160, 1440}, 2.f, {1080, 720}, false}, {11.0f, {2160, 1440}, 2.f, {1080, 720}, false},
{12.3f, {3000, 2000}, kDsf_2_252, {1332, 888}, true}, {12.3f, {3000, 2000}, kDsf_2_252, {1332, 888}, true},
{15.6f, {3840, 2160}, 2.4f, {1600, 900}, true},
{13.1f, {3840, 2160}, kDsf_2_666, {1440, 810}, false}, {13.1f, {3840, 2160}, kDsf_2_666, {1440, 810}, false},
// clang-format on // clang-format on
}; };
...@@ -263,10 +272,12 @@ TEST_P(DisplayChangeObserverTest, FindDeviceScaleFactor) { ...@@ -263,10 +272,12 @@ TEST_P(DisplayChangeObserverTest, FindDeviceScaleFactor) {
float max_scale_factor = kDsf_2_666; float max_scale_factor = kDsf_2_666;
// Erroneous values should still work. // Erroneous values should still work.
EXPECT_EQ(1.0f, DisplayChangeObserver::FindDeviceScaleFactor(-100.0f)); EXPECT_EQ(1.0f,
EXPECT_EQ(1.0f, DisplayChangeObserver::FindDeviceScaleFactor(0.0f)); DisplayChangeObserver::FindDeviceScaleFactor(-100.0f, gfx::Size()));
EXPECT_EQ(max_scale_factor, EXPECT_EQ(1.0f,
DisplayChangeObserver::FindDeviceScaleFactor(10000.0f)); DisplayChangeObserver::FindDeviceScaleFactor(0.0f, gfx::Size()));
EXPECT_EQ(max_scale_factor, DisplayChangeObserver::FindDeviceScaleFactor(
10000.0f, gfx::Size()));
} }
TEST_P(DisplayChangeObserverTest, TEST_P(DisplayChangeObserverTest,
......
...@@ -50,7 +50,7 @@ constexpr std::array<ZoomListBucket, 8> kZoomListBuckets{{ ...@@ -50,7 +50,7 @@ constexpr std::array<ZoomListBucket, 8> kZoomListBuckets{{
// zoom values that includes a zoom level to go to the native resolution of the // zoom values that includes a zoom level to go to the native resolution of the
// display. Ensure that the list of DSFs are in sync with the list of default // display. Ensure that the list of DSFs are in sync with the list of default
// device scale factors in display_change_observer.cc. // device scale factors in display_change_observer.cc.
constexpr std::array<ZoomListBucketDsf, 6> kZoomListBucketsForDsf{{ constexpr std::array<ZoomListBucketDsf, 7> kZoomListBucketsForDsf{{
{1.25f, {0.7f, 1.f / 1.25f, 0.85f, 0.9f, 0.95f, 1.f, 1.1f, 1.2f, 1.3f}}, {1.25f, {0.7f, 1.f / 1.25f, 0.85f, 0.9f, 0.95f, 1.f, 1.1f, 1.2f, 1.3f}},
{1.6f, {1.f / 1.6f, 0.7f, 0.75f, 0.8f, 0.85f, 0.9f, 1.f, 1.15f, 1.3f}}, {1.6f, {1.f / 1.6f, 0.7f, 0.75f, 0.8f, 0.85f, 0.9f, 1.f, 1.15f, 1.3f}},
{kDsf_1_777, {kDsf_1_777,
...@@ -58,6 +58,7 @@ constexpr std::array<ZoomListBucketDsf, 6> kZoomListBucketsForDsf{{ ...@@ -58,6 +58,7 @@ constexpr std::array<ZoomListBucketDsf, 6> kZoomListBucketsForDsf{{
{2.f, {1.f / 2.f, 0.6f, 0.7f, 0.8f, 0.9f, 1.f, 1.1f, 1.25f, 1.5f}}, {2.f, {1.f / 2.f, 0.6f, 0.7f, 0.8f, 0.9f, 1.f, 1.1f, 1.25f, 1.5f}},
{kDsf_2_252, {kDsf_2_252,
{1.f / kDsf_2_252, 0.6f, 0.7f, 0.8f, 0.9f, 1.f, 1.15f, 1.3f, 1.5f}}, {1.f / kDsf_2_252, 0.6f, 0.7f, 0.8f, 0.9f, 1.f, 1.15f, 1.3f, 1.5f}},
{2.4f, {1.f / 2.4f, 0.5f, 0.6f, 0.8f, 0.9f, 1.f, 1.2f, 1.35f, 1.5f}},
{kDsf_2_666, {kDsf_2_666,
{1.f / kDsf_2_666, 0.5f, 0.6f, 0.8f, 0.9f, 1.f, 1.2f, 1.35f, 1.5f}}, {1.f / kDsf_2_666, 0.5f, 0.6f, 0.8f, 0.9f, 1.f, 1.2f, 1.35f, 1.5f}},
}}; }};
......
...@@ -62,7 +62,7 @@ TEST_F(DisplayUtilTest, DisplayZoomsWithInternal) { ...@@ -62,7 +62,7 @@ TEST_F(DisplayUtilTest, DisplayZoomsWithInternal) {
float previous_dsf = 0.f; float previous_dsf = 0.f;
for (const auto& dpi : kDpis) { for (const auto& dpi : kDpis) {
SCOPED_TRACE(base::StringPrintf("dpi=%f", dpi)); SCOPED_TRACE(base::StringPrintf("dpi=%f", dpi));
float dsf = DisplayChangeObserver::FindDeviceScaleFactor(dpi); float dsf = DisplayChangeObserver::FindDeviceScaleFactor(dpi, gfx::Size());
// Make sure each dpis is mapped to different dsf. // Make sure each dpis is mapped to different dsf.
EXPECT_NE(previous_dsf, dsf); EXPECT_NE(previous_dsf, dsf);
previous_dsf = dsf; previous_dsf = dsf;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment