Loading libs/androidfw/ResourceTypes.cpp +13 −4 Original line number Diff line number Diff line Loading @@ -2677,21 +2677,30 @@ 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. Always prefer // scaling down. // because the system will scale it. Scaling down // is generally better than scaling up. int h = thisDensity; int l = otherDensity; bool bImBigger = true; if (l > h) { std::swap(l, h); int t = h; h = l; l = t; 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; } } Loading libs/androidfw/tests/Config_test.cpp +4 −11 Original line number Diff line number Diff line Loading @@ -27,19 +27,15 @@ namespace android { static ResTable_config selectBest(const ResTable_config& target, const Vector<ResTable_config>& configs) { Vector<ResTable_config> matchedConfigs; ResTable_config bestConfig; memset(&bestConfig, 0, sizeof(bestConfig)); const size_t configCount = configs.size(); for (size_t i = 0; i < configCount; i++) { const ResTable_config& thisConfig = configs[i]; if (thisConfig.match(target)) { matchedConfigs.add(thisConfig); } if (!thisConfig.match(target)) { continue; } 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; } Loading Loading @@ -79,9 +75,6 @@ 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)); Loading Loading
libs/androidfw/ResourceTypes.cpp +13 −4 Original line number Diff line number Diff line Loading @@ -2677,21 +2677,30 @@ 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. Always prefer // scaling down. // because the system will scale it. Scaling down // is generally better than scaling up. int h = thisDensity; int l = otherDensity; bool bImBigger = true; if (l > h) { std::swap(l, h); int t = h; h = l; l = t; 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; } } Loading
libs/androidfw/tests/Config_test.cpp +4 −11 Original line number Diff line number Diff line Loading @@ -27,19 +27,15 @@ namespace android { static ResTable_config selectBest(const ResTable_config& target, const Vector<ResTable_config>& configs) { Vector<ResTable_config> matchedConfigs; ResTable_config bestConfig; memset(&bestConfig, 0, sizeof(bestConfig)); const size_t configCount = configs.size(); for (size_t i = 0; i < configCount; i++) { const ResTable_config& thisConfig = configs[i]; if (thisConfig.match(target)) { matchedConfigs.add(thisConfig); } if (!thisConfig.match(target)) { continue; } 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; } Loading Loading @@ -79,9 +75,6 @@ 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)); Loading