Fix packing of values at offset 16.

Our bitmask for setting the highest bit to 0 for
0b11100000 (0xef) instead of 0b01111111 (0x7f) so
we would end up setting bit 5 of each offset to
zero. Fix this and expand test coverage by adding
a fake language (tgp) that has this bit set in both
its bytes.

This issue was discovered while adding CTS tests for
"tgl".

Change-Id: Ibb6de03000951c907c252049771039ab7466187a
This commit is contained in:
Narayan Kamath
2014-06-30 15:59:39 +01:00
parent 7165bd6d74
commit b297591622
2 changed files with 27 additions and 3 deletions

View File

@@ -1597,9 +1597,9 @@ void ResTable_config::copyFromDeviceNoSwap(const ResTable_config& o) {
out[0] = in[0];
out[1] = in[1];
} else {
uint8_t first = (in[0] - base) & 0x00ef;
uint8_t second = (in[1] - base) & 0x00ef;
uint8_t third = (in[2] - base) & 0x00ef;
uint8_t first = (in[0] - base) & 0x007f;
uint8_t second = (in[1] - base) & 0x007f;
uint8_t third = (in[2] - base) & 0x007f;
out[0] = (0x80 | (third << 2) | (second >> 3));
out[1] = ((second << 5) | first);

View File

@@ -75,6 +75,30 @@ TEST(ResourceTypesTest, ResourceConfig_packAndUnpack3LetterLanguage) {
EXPECT_EQ(0, out[3]);
}
TEST(ResourceTypesTest, ResourceConfig_packAndUnpack3LetterLanguageAtOffset16) {
ResTable_config config;
config.packLanguage("tgp");
// We had a bug where we would accidentally mask
// the 5th bit of both bytes
//
// packed[0] = 1011 1100
// packed[1] = 1101 0011
//
// which is equivalent to:
// 1 [0] [1] [2]
// 1-01111-00110-10011
EXPECT_EQ(0xbc, config.language[0]);
EXPECT_EQ(0xd3, config.language[1]);
char out[4] = { 1, 1, 1, 1};
config.unpackLanguage(out);
EXPECT_EQ('t', out[0]);
EXPECT_EQ('g', out[1]);
EXPECT_EQ('p', out[2]);
EXPECT_EQ(0, out[3]);
}
TEST(ResourceTypesTest, ResourceConfig_packAndUnpack3LetterRegion) {
ResTable_config config;
config.packRegion("419");