summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jeremy Meyer <jakmcbane@google.com> 2021-10-14 17:53:39 +0000
committer Jeremy Meyer <jakmcbane@google.com> 2021-10-19 21:41:52 +0000
commit49243877490fa1a0e7b0f9041e4505468c3a81b0 (patch)
treecc458a6c56f5d1a3fab3124addd503aa2cfeabcb
parentb7d107e6f6e79d5f1359aee97867978b6715485f (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.cpp17
-rw-r--r--libs/androidfw/tests/Config_test.cpp15
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));