#include "ash/ambient/model/ambient_animation_photo_config.h"
#include "ash/ambient/util/ambient_util.h"
#include "ash/utility/lottie_util.h"
#include "base/containers/flat_map.h"
#include "base/logging.h"
#include "base/notreached.h"
#include "cc/paint/skottie_resource_metadata.h"
namespace ash {
namespace {
void ParseDynamicAssetsIdsInAnimation(
const cc::SkottieResourceMetadataMap& skottie_resource_metadata,
std::size_t& num_total_positions_out,
std::size_t& num_assets_per_position_out) {
base::flat_map<std::string, std::size_t> position_to_num_assets;
ambient::util::ParsedDynamicAssetId parsed_asset_id;
for (const auto& [asset_id, _] : skottie_resource_metadata.asset_storage()) {
if (!IsCustomizableLottieId(asset_id)) {
DVLOG(4) << "Ignoring static image asset id";
continue;
}
if (!ambient::util::ParseDynamicLottieAssetId(asset_id, parsed_asset_id)) {
NOTREACHED() << "Lottie file contains invalid dynamic asset id "
<< asset_id;
}
auto iter =
position_to_num_assets
.try_emplace(parsed_asset_id.position_id, 0)
.first;
++iter->second;
}
if (position_to_num_assets.empty()) {
num_total_positions_out = 0;
num_assets_per_position_out = 0;
return;
}
num_total_positions_out = position_to_num_assets.size();
num_assets_per_position_out = position_to_num_assets.begin()->second;
for (const auto& [position, num_assets_assigned] : position_to_num_assets) {
if (num_assets_assigned != num_assets_per_position_out) {
LOG(FATAL) << "Position " << position << " has " << num_assets_assigned
<< "assets. Expected " << num_assets_per_position_out;
}
}
}
}
ASH_EXPORT AmbientPhotoConfig CreateAmbientAnimationPhotoConfig(
const cc::SkottieResourceMetadataMap& skottie_resource_metadata) {
AmbientPhotoConfig config;
config.should_split_topics = true;
ParseDynamicAssetsIdsInAnimation(
skottie_resource_metadata,
config.topic_set_size,
config.num_topic_sets_to_buffer);
config.min_total_topics_required = 1;
config.refresh_topic_markers = {AmbientPhotoConfig::Marker::kUiStartRendering,
AmbientPhotoConfig::Marker::kUiCycleEnded};
return config;
}
}