Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f9b5c2fa authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "AAPT2: Ensure PNG endianness in 9-patch serialization"

parents 1e0094eb edba9410
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -598,6 +598,9 @@ std::unique_ptr<uint8_t[]> NinePatch::serializeBase(size_t* outLen) const {
                                       (const int32_t*) verticalStretchRegions.data(),
                                       regionColors.data(),
                                       buffer.get());
    // Convert to file endianness.
    reinterpret_cast<android::Res_png_9patch*>(buffer.get())->deviceToFile();

    *outLen = data.serializedSize();
    return buffer;
}
@@ -661,7 +664,9 @@ std::unique_ptr<uint8_t[]> NinePatch::serializeRoundedRectOutline(size_t* outLen
}

::std::ostream& operator<<(::std::ostream& out, const NinePatch& ninePatch) {
    return out << "padding: " << ninePatch.padding
    return out << "horizontalStretch:" << util::joiner(ninePatch.horizontalStretchRegions, " ")
            << " verticalStretch:" << util::joiner(ninePatch.verticalStretchRegions, " ")
            << " padding: " << ninePatch.padding
            << ", bounds: " << ninePatch.layoutBounds
            << ", outline: " << ninePatch.outline
            << " rad=" << ninePatch.outlineRadius
+36 −0
Original line number Diff line number Diff line
@@ -168,6 +168,14 @@ static uint8_t* kOutlineRadius5x5[] = {
        (uint8_t*) WHITE WHITE WHITE WHITE WHITE,
};

static uint8_t* kStretchAndPadding5x5[] = {
        (uint8_t*) WHITE WHITE BLACK WHITE WHITE,
        (uint8_t*) WHITE RED   RED   RED   WHITE,
        (uint8_t*) BLACK RED   RED   RED   BLACK,
        (uint8_t*) WHITE RED   RED   RED   WHITE,
        (uint8_t*) WHITE WHITE BLACK WHITE WHITE,
};

TEST(NinePatchTest, Minimum3x3) {
    std::string err;
    EXPECT_EQ(nullptr, NinePatch::create(k2x2, 2, 2, &err));
@@ -319,4 +327,32 @@ TEST(NinePatchTest, OutlineRadius) {
    EXPECT_EQ(3.4142f, ninePatch->outlineRadius);
}

::testing::AssertionResult bigEndianOne(uint8_t* cursor) {
    if (cursor[0] == 0 && cursor[1] == 0 && cursor[2] == 0 && cursor[3] == 1) {
        return ::testing::AssertionSuccess();
    }
    return ::testing::AssertionFailure() << "Not BigEndian 1";
}

TEST(NinePatchTest, SerializePngEndianness) {
    std::string err;
    std::unique_ptr<NinePatch> ninePatch = NinePatch::create(kStretchAndPadding5x5, 5, 5, &err);
    ASSERT_NE(nullptr, ninePatch);

    size_t len;
    std::unique_ptr<uint8_t[]> data = ninePatch->serializeBase(&len);
    ASSERT_NE(nullptr, data);
    ASSERT_NE(0u, len);

    // Skip past wasDeserialized + numXDivs + numYDivs + numColors + xDivsOffset + yDivsOffset
    // (12 bytes)
    uint8_t* cursor = data.get() + 12;

    // Check that padding is big-endian. Expecting value 1.
    EXPECT_TRUE(bigEndianOne(cursor));
    EXPECT_TRUE(bigEndianOne(cursor + 4));
    EXPECT_TRUE(bigEndianOne(cursor + 8));
    EXPECT_TRUE(bigEndianOne(cursor + 12));
}

} // namespace aapt