123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314 |
- // Copyright 2022 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #include "cc/paint/skottie_serialization_history.h"
- #include <cstdint>
- #include "cc/paint/paint_flags.h"
- #include "cc/paint/skottie_frame_data.h"
- #include "cc/paint/skottie_resource_metadata.h"
- #include "cc/paint/skottie_text_property_value.h"
- #include "cc/paint/skottie_wrapper.h"
- #include "cc/test/lottie_test_data.h"
- #include "cc/test/skia_common.h"
- #include "testing/gmock/include/gmock/gmock.h"
- #include "testing/gtest/include/gtest/gtest.h"
- #include "ui/gfx/geometry/rect_f.h"
- #include "ui/gfx/geometry/size.h"
- namespace cc {
- namespace {
- using ::testing::Contains;
- using ::testing::IsEmpty;
- using ::testing::Pair;
- using ::testing::UnorderedElementsAre;
- class SkottieSerializationHistoryTest : public ::testing::Test {
- protected:
- static constexpr int64_t kTestPurgePeriod = 2;
- SkottieSerializationHistoryTest() : history_(kTestPurgePeriod) {}
- SkottieSerializationHistory history_;
- SkottieFrameDataMap empty_images;
- SkottieTextPropertyValueMap empty_text_map;
- };
- TEST_F(SkottieSerializationHistoryTest, FilterNewSkottieFrameImages) {
- auto skottie = CreateSkottieFromString(
- CreateCustomLottieDataWith2Assets("asset_a", "asset_b"));
- PaintImage image_1 = CreateBitmapImage(gfx::Size(10, 10));
- PaintImage image_2 = CreateBitmapImage(gfx::Size(20, 20));
- PaintImage image_3 = CreateBitmapImage(gfx::Size(30, 30));
- PaintImage image_4 = CreateBitmapImage(gfx::Size(40, 40));
- SkottieFrameDataMap images = {
- {HashSkottieResourceId("asset_a"),
- {image_1, PaintFlags::FilterQuality::kMedium}},
- {HashSkottieResourceId("asset_b"),
- {image_2, PaintFlags::FilterQuality::kMedium}},
- };
- history_.FilterNewSkottieFrameState(*skottie, images, empty_text_map);
- EXPECT_THAT(
- images,
- UnorderedElementsAre(
- Pair(HashSkottieResourceId("asset_a"),
- SkottieFrameData({image_1, PaintFlags::FilterQuality::kMedium})),
- Pair(HashSkottieResourceId("asset_b"),
- SkottieFrameData(
- {image_2, PaintFlags::FilterQuality::kMedium}))));
- images = {
- {HashSkottieResourceId("asset_a"),
- {image_3, PaintFlags::FilterQuality::kMedium}},
- {HashSkottieResourceId("asset_b"),
- {image_2, PaintFlags::FilterQuality::kMedium}},
- };
- history_.FilterNewSkottieFrameState(*skottie, images, empty_text_map);
- EXPECT_THAT(
- images,
- UnorderedElementsAre(Pair(
- HashSkottieResourceId("asset_a"),
- SkottieFrameData({image_3, PaintFlags::FilterQuality::kMedium}))));
- images = {
- {HashSkottieResourceId("asset_a"),
- {image_3, PaintFlags::FilterQuality::kMedium}},
- {HashSkottieResourceId("asset_b"),
- {image_4, PaintFlags::FilterQuality::kMedium}},
- };
- history_.FilterNewSkottieFrameState(*skottie, images, empty_text_map);
- EXPECT_THAT(
- images,
- UnorderedElementsAre(Pair(
- HashSkottieResourceId("asset_b"),
- SkottieFrameData({image_4, PaintFlags::FilterQuality::kMedium}))));
- history_.FilterNewSkottieFrameState(*skottie, images, empty_text_map);
- EXPECT_THAT(images, IsEmpty());
- }
- TEST_F(SkottieSerializationHistoryTest, HandlesEmptyImages) {
- auto skottie = CreateSkottieFromString(
- CreateCustomLottieDataWith2Assets("asset_a", "asset_b"));
- PaintImage blank_image;
- PaintImage image_1 = CreateBitmapImage(gfx::Size(10, 10));
- PaintImage image_2 = CreateBitmapImage(gfx::Size(20, 20));
- ;
- SkottieFrameDataMap images = {
- {HashSkottieResourceId("asset_a"),
- {blank_image, PaintFlags::FilterQuality::kMedium}},
- {HashSkottieResourceId("asset_b"),
- {image_2, PaintFlags::FilterQuality::kMedium}},
- };
- history_.FilterNewSkottieFrameState(*skottie, images, empty_text_map);
- EXPECT_THAT(
- images,
- Contains(Pair(HashSkottieResourceId("asset_a"),
- SkottieFrameData(
- {blank_image, PaintFlags::FilterQuality::kMedium}))));
- images = {{HashSkottieResourceId("asset_a"),
- {image_1, PaintFlags::FilterQuality::kMedium}}};
- history_.FilterNewSkottieFrameState(*skottie, images, empty_text_map);
- EXPECT_THAT(
- images,
- Contains(Pair(
- HashSkottieResourceId("asset_a"),
- SkottieFrameData({image_1, PaintFlags::FilterQuality::kMedium}))));
- images = {{HashSkottieResourceId("asset_a"),
- {blank_image, PaintFlags::FilterQuality::kMedium}}};
- history_.FilterNewSkottieFrameState(*skottie, images, empty_text_map);
- EXPECT_THAT(
- images,
- Contains(Pair(HashSkottieResourceId("asset_a"),
- SkottieFrameData(
- {blank_image, PaintFlags::FilterQuality::kMedium}))));
- history_.FilterNewSkottieFrameState(*skottie, images, empty_text_map);
- EXPECT_THAT(images, IsEmpty());
- }
- TEST_F(SkottieSerializationHistoryTest, FilterNewSkottieFrameText) {
- auto skottie = CreateSkottie(gfx::Size(10, 10), 1);
- SkottieTextPropertyValueMap text_map = {
- {HashSkottieResourceId("node_a"),
- SkottieTextPropertyValue("test_1a", gfx::RectF(1, 1, 1, 1))},
- {HashSkottieResourceId("node_b"),
- SkottieTextPropertyValue("test_1b", gfx::RectF(2, 2, 2, 2))},
- };
- history_.FilterNewSkottieFrameState(*skottie, empty_images, text_map);
- EXPECT_THAT(
- text_map,
- UnorderedElementsAre(
- Pair(HashSkottieResourceId("node_a"),
- SkottieTextPropertyValue("test_1a", gfx::RectF(1, 1, 1, 1))),
- Pair(HashSkottieResourceId("node_b"),
- SkottieTextPropertyValue("test_1b", gfx::RectF(2, 2, 2, 2)))));
- text_map = {
- {HashSkottieResourceId("node_a"),
- SkottieTextPropertyValue("test_2a", gfx::RectF(1, 1, 1, 1))},
- {HashSkottieResourceId("node_b"),
- SkottieTextPropertyValue("test_1b", gfx::RectF(2, 2, 2, 2))},
- };
- history_.FilterNewSkottieFrameState(*skottie, empty_images, text_map);
- EXPECT_THAT(
- text_map,
- UnorderedElementsAre(
- Pair(HashSkottieResourceId("node_a"),
- SkottieTextPropertyValue("test_2a", gfx::RectF(1, 1, 1, 1)))));
- text_map = {
- {HashSkottieResourceId("node_a"),
- SkottieTextPropertyValue("test_2a", gfx::RectF(3, 3, 3, 3))},
- {HashSkottieResourceId("node_b"),
- SkottieTextPropertyValue("test_1b", gfx::RectF(2, 2, 2, 2))},
- };
- history_.FilterNewSkottieFrameState(*skottie, empty_images, text_map);
- EXPECT_THAT(
- text_map,
- UnorderedElementsAre(
- Pair(HashSkottieResourceId("node_a"),
- SkottieTextPropertyValue("test_2a", gfx::RectF(3, 3, 3, 3)))));
- history_.FilterNewSkottieFrameState(*skottie, empty_images, text_map);
- EXPECT_THAT(text_map, IsEmpty());
- }
- TEST_F(SkottieSerializationHistoryTest,
- FilterNewSkottieFrameImagesTakesQualityIntoAccount) {
- auto skottie = CreateSkottieFromString(
- CreateCustomLottieDataWith2Assets("asset_a", "asset_b"));
- PaintImage image_1 = CreateBitmapImage(gfx::Size(10, 10));
- PaintImage image_2 = CreateBitmapImage(gfx::Size(20, 20));
- SkottieFrameDataMap images = {
- {HashSkottieResourceId("asset_a"),
- {image_1, PaintFlags::FilterQuality::kMedium}},
- {HashSkottieResourceId("asset_b"),
- {image_2, PaintFlags::FilterQuality::kMedium}},
- };
- history_.FilterNewSkottieFrameState(*skottie, images, empty_text_map);
- images = {
- {HashSkottieResourceId("asset_a"),
- {image_1, PaintFlags::FilterQuality::kHigh}},
- {HashSkottieResourceId("asset_b"),
- {image_2, PaintFlags::FilterQuality::kMedium}},
- };
- history_.FilterNewSkottieFrameState(*skottie, images, empty_text_map);
- EXPECT_THAT(
- images,
- UnorderedElementsAre(
- Pair(HashSkottieResourceId("asset_a"),
- SkottieFrameData({image_1, PaintFlags::FilterQuality::kHigh}))));
- }
- TEST_F(SkottieSerializationHistoryTest,
- FilterNewSkottieFrameStateMultipleAnimations) {
- auto skottie_1 = CreateSkottieFromString(
- CreateCustomLottieDataWith2Assets("asset_1a", "asset_1b"));
- auto skottie_2 = CreateSkottieFromString(
- CreateCustomLottieDataWith2Assets("asset_2a", "asset_2b"));
- PaintImage image_1 = CreateBitmapImage(gfx::Size(10, 10));
- PaintImage image_2 = CreateBitmapImage(gfx::Size(20, 20));
- PaintImage image_3 = CreateBitmapImage(gfx::Size(30, 30));
- PaintImage image_4 = CreateBitmapImage(gfx::Size(40, 40));
- SkottieFrameDataMap images_1 = {
- {HashSkottieResourceId("asset_1a"),
- {image_1, PaintFlags::FilterQuality::kMedium}},
- {HashSkottieResourceId("asset_1b"),
- {image_2, PaintFlags::FilterQuality::kMedium}},
- };
- SkottieFrameDataMap images_2 = {
- {HashSkottieResourceId("asset_2a"),
- {image_1, PaintFlags::FilterQuality::kMedium}},
- {HashSkottieResourceId("asset_2b"),
- {image_2, PaintFlags::FilterQuality::kMedium}},
- };
- history_.FilterNewSkottieFrameState(*skottie_1, images_1, empty_text_map);
- history_.FilterNewSkottieFrameState(*skottie_2, images_2, empty_text_map);
- EXPECT_THAT(
- images_2,
- UnorderedElementsAre(
- Pair(HashSkottieResourceId("asset_2a"),
- SkottieFrameData({image_1, PaintFlags::FilterQuality::kMedium})),
- Pair(HashSkottieResourceId("asset_2b"),
- SkottieFrameData(
- {image_2, PaintFlags::FilterQuality::kMedium}))));
- images_1 = {
- {HashSkottieResourceId("asset_1a"),
- {image_3, PaintFlags::FilterQuality::kMedium}},
- {HashSkottieResourceId("asset_1b"),
- {image_2, PaintFlags::FilterQuality::kMedium}},
- };
- images_2 = {
- {HashSkottieResourceId("asset_2a"),
- {image_4, PaintFlags::FilterQuality::kMedium}},
- {HashSkottieResourceId("asset_2b"),
- {image_2, PaintFlags::FilterQuality::kMedium}},
- };
- history_.FilterNewSkottieFrameState(*skottie_1, images_1, empty_text_map);
- history_.FilterNewSkottieFrameState(*skottie_2, images_2, empty_text_map);
- EXPECT_THAT(
- images_2,
- UnorderedElementsAre(Pair(
- HashSkottieResourceId("asset_2a"),
- SkottieFrameData({image_4, PaintFlags::FilterQuality::kMedium}))));
- }
- TEST_F(SkottieSerializationHistoryTest, RequestInactiveAnimationsPurge) {
- auto skottie_1 = CreateSkottieFromString(
- CreateCustomLottieDataWith2Assets("asset_1a", "asset_1b"));
- auto skottie_2 = CreateSkottieFromString(
- CreateCustomLottieDataWith2Assets("asset_2a", "asset_2b"));
- PaintImage image_1 = CreateBitmapImage(gfx::Size(10, 10));
- PaintImage image_2 = CreateBitmapImage(gfx::Size(20, 20));
- SkottieFrameDataMap images_1 = {
- {HashSkottieResourceId("asset_1a"),
- {image_1, PaintFlags::FilterQuality::kMedium}},
- {HashSkottieResourceId("asset_1b"),
- {image_2, PaintFlags::FilterQuality::kMedium}},
- };
- SkottieFrameDataMap images_2 = {
- {HashSkottieResourceId("asset_2a"),
- {image_1, PaintFlags::FilterQuality::kMedium}},
- {HashSkottieResourceId("asset_2b"),
- {image_2, PaintFlags::FilterQuality::kMedium}},
- };
- history_.FilterNewSkottieFrameState(*skottie_1, images_1, empty_text_map);
- history_.FilterNewSkottieFrameState(*skottie_2, images_2, empty_text_map);
- history_.RequestInactiveAnimationsPurge();
- history_.FilterNewSkottieFrameState(*skottie_1, images_1, empty_text_map);
- // Only |skottie_2| should be purged here since |skottie_1| was updated after
- // the first purge.
- history_.RequestInactiveAnimationsPurge();
- history_.FilterNewSkottieFrameState(*skottie_1, images_1, empty_text_map);
- history_.FilterNewSkottieFrameState(*skottie_2, images_2, empty_text_map);
- EXPECT_THAT(images_1, IsEmpty());
- // History for |skottie_2| should start again.
- EXPECT_THAT(
- images_2,
- UnorderedElementsAre(
- Pair(HashSkottieResourceId("asset_2a"),
- SkottieFrameData({image_1, PaintFlags::FilterQuality::kMedium})),
- Pair(HashSkottieResourceId("asset_2b"),
- SkottieFrameData(
- {image_2, PaintFlags::FilterQuality::kMedium}))));
- }
- } // namespace
- } // namespace cc
|