diff options
author | 2021-10-14 17:53:39 +0000 | |
---|---|---|
committer | 2021-10-19 21:41:52 +0000 | |
commit | 49243877490fa1a0e7b0f9041e4505468c3a81b0 (patch) | |
tree | cc458a6c56f5d1a3fab3124addd503aa2cfeabcb | |
parent | b7d107e6f6e79d5f1359aee97867978b6715485f (diff) |
Always select the next higher density bucket when picking resources
Test: ran and updated Config_test.cpp
Fix: 183136881
Change-Id: Ife1575caedb2cf3fbc2d3659c34a52e1207575c6
-rw-r--r-- | libs/androidfw/ResourceTypes.cpp | 17 | ||||
-rw-r--r-- | libs/androidfw/tests/Config_test.cpp | 15 |
2 files changed, 15 insertions, 17 deletions
diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp index cae2d0bc16b3..50117ce9e69b 100644 --- a/libs/androidfw/ResourceTypes.cpp +++ b/libs/androidfw/ResourceTypes.cpp @@ -2677,30 +2677,21 @@ bool ResTable_config::isBetterThan(const ResTable_config& o, // DENSITY_ANY is now dealt with. We should look to // pick a density bucket and potentially scale it. // Any density is potentially useful - // because the system will scale it. Scaling down - // is generally better than scaling up. + // because the system will scale it. Always prefer + // scaling down. int h = thisDensity; int l = otherDensity; bool bImBigger = true; if (l > h) { - int t = h; - h = l; - l = t; + std::swap(l, h); bImBigger = false; } - if (requestedDensity >= h) { - // requested value higher than both l and h, give h - return bImBigger; - } if (l >= requestedDensity) { // requested value lower than both l and h, give l return !bImBigger; - } - // saying that scaling down is 2x better than up - if (((2 * l) - requestedDensity) * h > requestedDensity * requestedDensity) { - return !bImBigger; } else { + // otherwise give h return bImBigger; } } diff --git a/libs/androidfw/tests/Config_test.cpp b/libs/androidfw/tests/Config_test.cpp index b54915f03c29..f5fd0f20d580 100644 --- a/libs/androidfw/tests/Config_test.cpp +++ b/libs/androidfw/tests/Config_test.cpp @@ -27,15 +27,19 @@ namespace android { static ResTable_config selectBest(const ResTable_config& target, const Vector<ResTable_config>& configs) { - ResTable_config bestConfig; - memset(&bestConfig, 0, sizeof(bestConfig)); + Vector<ResTable_config> matchedConfigs; const size_t configCount = configs.size(); for (size_t i = 0; i < configCount; i++) { const ResTable_config& thisConfig = configs[i]; - if (!thisConfig.match(target)) { - continue; + if (thisConfig.match(target)) { + matchedConfigs.add(thisConfig); } + } + ResTable_config bestConfig = matchedConfigs[0]; + const size_t matchingConfigCount = matchedConfigs.size(); + for (size_t i = 1; i < matchingConfigCount; i++) { + const ResTable_config& thisConfig = configs[i]; if (thisConfig.isBetterThan(bestConfig, &target)) { bestConfig = thisConfig; } @@ -75,6 +79,9 @@ TEST(ConfigTest, shouldSelectBestDensity) { configs.add(buildDensityConfig(int(ResTable_config::DENSITY_HIGH) + 20)); ASSERT_EQ(expectedBest, selectBest(deviceConfig, configs)); + configs.add(buildDensityConfig(int(ResTable_config::DENSITY_XHIGH) - 1)); + ASSERT_EQ(expectedBest, selectBest(deviceConfig, configs)); + expectedBest = buildDensityConfig(ResTable_config::DENSITY_XHIGH); configs.add(expectedBest); ASSERT_EQ(expectedBest, selectBest(deviceConfig, configs)); |