123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 |
- // Copyright 2021 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_mru_resource_provider.h"
- #include <utility>
- #include "base/bind.h"
- #include "base/containers/flat_map.h"
- #include "base/files/file_path.h"
- #include "base/memory/raw_ptr.h"
- #include "base/strings/string_piece.h"
- #include "cc/paint/paint_image.h"
- #include "cc/paint/skottie_resource_metadata.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 "third_party/abseil-cpp/absl/types/optional.h"
- #include "third_party/skia/include/core/SkRefCnt.h"
- #include "third_party/skia/modules/skresources/include/SkResources.h"
- #include "ui/gfx/geometry/size.h"
- namespace cc {
- namespace {
- using ::testing::Contains;
- using ::testing::Eq;
- using ::testing::FieldsAre;
- using ::testing::Key;
- using ::testing::Optional;
- using ::testing::Pair;
- using ::testing::SizeIs;
- using ::testing::UnorderedElementsAre;
- class FrameDataStub {
- public:
- using FrameData = skresources::ImageAsset::FrameData;
- void SetAssetFrameData(base::StringPiece asset_id,
- FrameData current_frame_data) {
- asset_to_frame_data_[HashSkottieResourceId(asset_id)] =
- std::move(current_frame_data);
- asset_to_result_[HashSkottieResourceId(asset_id)] =
- SkottieWrapper::FrameDataFetchResult::NEW_DATA_AVAILABLE;
- }
- void SetAssetResult(base::StringPiece asset_id,
- SkottieWrapper::FrameDataFetchResult current_result) {
- asset_to_result_[HashSkottieResourceId(asset_id)] = current_result;
- }
- SkottieWrapper::FrameDataFetchResult GetFrameDataForAsset(
- SkottieResourceIdHash asset_id,
- float t,
- sk_sp<SkImage>& image_out,
- SkSamplingOptions& sampling_out) const {
- if (asset_to_frame_data_.contains(asset_id)) {
- image_out = asset_to_frame_data_.at(asset_id).image;
- sampling_out = asset_to_frame_data_.at(asset_id).sampling;
- }
- return asset_to_result_.contains(asset_id)
- ? asset_to_result_.at(asset_id)
- : SkottieWrapper::FrameDataFetchResult::NO_UPDATE;
- }
- private:
- base::flat_map<SkottieResourceIdHash, FrameData> asset_to_frame_data_;
- base::flat_map<SkottieResourceIdHash, SkottieWrapper::FrameDataFetchResult>
- asset_to_result_;
- };
- class SkottieMRUResourceProviderTest : public ::testing::Test {
- protected:
- void Init(base::StringPiece animation_json) {
- provider_ = sk_make_sp<SkottieMRUResourceProvider>(
- base::BindRepeating(&FrameDataStub::GetFrameDataForAsset,
- base::Unretained(&frame_data_stub_)),
- animation_json);
- provider_base_ = provider_.get();
- }
- FrameDataStub frame_data_stub_;
- sk_sp<SkottieMRUResourceProvider> provider_;
- raw_ptr<skresources::ResourceProvider> provider_base_;
- };
- TEST_F(SkottieMRUResourceProviderTest, ProvidesMostRecentFrameDataForAsset) {
- Init(R"({
- "assets": [
- {
- "id": "test-resource-id"
- }
- ]
- })");
- sk_sp<skresources::ImageAsset> asset = provider_base_->loadImageAsset(
- "test-resource-path", "test-resource-name", "test-resource-id");
- PaintImage image_1 = CreateBitmapImage(gfx::Size(10, 10));
- frame_data_stub_.SetAssetFrameData("test-resource-id",
- {.image = image_1.GetSwSkImage()});
- EXPECT_THAT(asset->getFrameData(/*t=*/0).image, Eq(image_1.GetSwSkImage()));
- // The same image should be re-used for the next timestamp.
- frame_data_stub_.SetAssetResult(
- "test-resource-id", SkottieWrapper::FrameDataFetchResult::NO_UPDATE);
- EXPECT_THAT(asset->getFrameData(/*t=*/0.1).image, Eq(image_1.GetSwSkImage()));
- // Now the new image should be used.
- PaintImage image_2 = CreateBitmapImage(gfx::Size(20, 20));
- frame_data_stub_.SetAssetFrameData("test-resource-id",
- {.image = image_2.GetSwSkImage()});
- EXPECT_THAT(asset->getFrameData(/*t=*/0.2).image, Eq(image_2.GetSwSkImage()));
- }
- TEST_F(SkottieMRUResourceProviderTest, ProvidesFrameDataForMultipleAssets) {
- Init(R"({
- "assets": [
- {
- "id": "test-resource-id-1"
- },
- {
- "id": "test-resource-id-2"
- }
- ]
- })");
- sk_sp<skresources::ImageAsset> asset_1 = provider_base_->loadImageAsset(
- "test-resource-path", "test-resource-name", "test-resource-id-1");
- sk_sp<skresources::ImageAsset> asset_2 = provider_base_->loadImageAsset(
- "test-resource-path", "test-resource-name", "test-resource-id-2");
- PaintImage image_1 = CreateBitmapImage(gfx::Size(10, 10));
- frame_data_stub_.SetAssetFrameData("test-resource-id-1",
- {.image = image_1.GetSwSkImage()});
- PaintImage image_2 = CreateBitmapImage(gfx::Size(20, 20));
- frame_data_stub_.SetAssetFrameData("test-resource-id-2",
- {.image = image_2.GetSwSkImage()});
- EXPECT_THAT(asset_1->getFrameData(/*t=*/0).image, Eq(image_1.GetSwSkImage()));
- EXPECT_THAT(asset_2->getFrameData(/*t=*/0).image, Eq(image_2.GetSwSkImage()));
- }
- TEST_F(SkottieMRUResourceProviderTest, ReturnsCorrectImageAssetMetadata) {
- Init(R"({
- "assets": [
- {
- "id": "test-resource-id-1",
- "w": 100,
- "h": 101
- },
- {
- "id": "test-resource-id-2",
- "w": 200,
- "h": 201
- }
- ]
- })");
- sk_sp<skresources::ImageAsset> asset_1 = provider_base_->loadImageAsset(
- "test-resource-path-1", "test-resource-name-1", "test-resource-id-1");
- sk_sp<skresources::ImageAsset> asset_2 = provider_base_->loadImageAsset(
- "test-resource-path-2", "test-resource-name-2", "test-resource-id-2");
- EXPECT_THAT(
- provider_->GetImageAssetMetadata().asset_storage(),
- UnorderedElementsAre(
- Pair("test-resource-id-1",
- FieldsAre(base::FilePath(
- FILE_PATH_LITERAL(
- "test-resource-path-1/test-resource-name-1"))
- .NormalizePathSeparators(),
- Optional(gfx::Size(100, 101)))),
- Pair("test-resource-id-2",
- FieldsAre(base::FilePath(
- FILE_PATH_LITERAL(
- "test-resource-path-2/test-resource-name-2"))
- .NormalizePathSeparators(),
- Optional(gfx::Size(200, 201))))));
- }
- TEST_F(SkottieMRUResourceProviderTest, HandlesMissingAssetDimensions) {
- Init(R"({
- "assets": [
- {
- "id": "test-resource-id"
- }
- ]
- })");
- sk_sp<skresources::ImageAsset> asset_1 = provider_base_->loadImageAsset(
- "test-resource-path", "test-resource-name", "test-resource-id");
- EXPECT_THAT(
- provider_->GetImageAssetMetadata().asset_storage(),
- UnorderedElementsAre(Pair(
- "test-resource-id",
- FieldsAre(base::FilePath(FILE_PATH_LITERAL(
- "test-resource-path/test-resource-name"))
- .NormalizePathSeparators(),
- Eq(absl::nullopt)))));
- }
- TEST_F(SkottieMRUResourceProviderTest, HandlesIncompleteDimensions) {
- Init(R"({
- "assets": [
- {
- "id": "test-resource-id",
- "w": 100
- }
- ]
- })");
- sk_sp<skresources::ImageAsset> asset_1 = provider_base_->loadImageAsset(
- "test-resource-path", "test-resource-name", "test-resource-id");
- EXPECT_THAT(
- provider_->GetImageAssetMetadata().asset_storage(),
- UnorderedElementsAre(Pair(
- "test-resource-id",
- FieldsAre(base::FilePath(FILE_PATH_LITERAL(
- "test-resource-path/test-resource-name"))
- .NormalizePathSeparators(),
- Eq(absl::nullopt)))));
- Init(R"({
- "assets": [
- {
- "id": "test-resource-id",
- "h": 100
- }
- ]
- })");
- asset_1 = provider_base_->loadImageAsset(
- "test-resource-path", "test-resource-name", "test-resource-id");
- EXPECT_THAT(
- provider_->GetImageAssetMetadata().asset_storage(),
- UnorderedElementsAre(Pair(
- "test-resource-id",
- FieldsAre(base::FilePath(FILE_PATH_LITERAL(
- "test-resource-path/test-resource-name"))
- .NormalizePathSeparators(),
- Eq(absl::nullopt)))));
- }
- TEST_F(SkottieMRUResourceProviderTest, HandlesInvalidDimensions) {
- Init(R"({
- "assets": [
- {
- "id": "test-resource-id",
- "w": -100
- }
- ]
- })");
- sk_sp<skresources::ImageAsset> asset_1 = provider_base_->loadImageAsset(
- "test-resource-path", "test-resource-name", "test-resource-id");
- EXPECT_THAT(
- provider_->GetImageAssetMetadata().asset_storage(),
- UnorderedElementsAre(Pair(
- "test-resource-id",
- FieldsAre(base::FilePath(FILE_PATH_LITERAL(
- "test-resource-path/test-resource-name"))
- .NormalizePathSeparators(),
- Eq(absl::nullopt)))));
- Init(R"({
- "assets": [
- {
- "id": "test-resource-id",
- "h": -100
- }
- ]
- })");
- asset_1 = provider_base_->loadImageAsset(
- "test-resource-path", "test-resource-name", "test-resource-id");
- EXPECT_THAT(
- provider_->GetImageAssetMetadata().asset_storage(),
- UnorderedElementsAre(Pair(
- "test-resource-id",
- FieldsAre(base::FilePath(FILE_PATH_LITERAL(
- "test-resource-path/test-resource-name"))
- .NormalizePathSeparators(),
- Eq(absl::nullopt)))));
- }
- } // namespace
- } // namespace cc
|