blob: 6893a51774d5a63dea398d89a8e5007663ff819e [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "cc/view_transition/view_transition_request.h"
#include <algorithm>
#include <map>
#include <memory>
#include <sstream>
#include <utility>
#include <vector>
#include "base/functional/callback.h"
#include "base/functional/callback_helpers.h"
#include "base/memory/ptr_util.h"
#include "components/viz/common/quads/compositor_frame_transition_directive.h"
#include "components/viz/common/quads/compositor_render_pass.h"
namespace cc {
namespace {
std::string TypeToString(viz::CompositorFrameTransitionDirective::Type type) {
switch (type) {
case viz::CompositorFrameTransitionDirective::Type::kSave:
return "kSave";
case viz::CompositorFrameTransitionDirective::Type::kAnimateRenderer:
return "kAnimateRenderer";
case viz::CompositorFrameTransitionDirective::Type::kRelease:
return "kRelease";
}
return "<unknown>";
}
} // namespace
uint32_t ViewTransitionRequest::s_next_sequence_id_ = 1;
// static
std::unique_ptr<ViewTransitionRequest> ViewTransitionRequest::CreateCapture(
const blink::ViewTransitionToken& transition_token,
bool maybe_cross_frame_sink,
std::vector<viz::ViewTransitionElementResourceId> capture_ids,
ViewTransitionCaptureCallback commit_callback) {
return base::WrapUnique(new ViewTransitionRequest(
Type::kSave, transition_token, maybe_cross_frame_sink,
std::move(capture_ids), std::move(commit_callback)));
}
// static
std::unique_ptr<ViewTransitionRequest>
ViewTransitionRequest::CreateAnimateRenderer(
const blink::ViewTransitionToken& transition_token,
bool maybe_cross_frame_sink) {
return base::WrapUnique(new ViewTransitionRequest(
Type::kAnimateRenderer, transition_token, maybe_cross_frame_sink, {},
ViewTransitionCaptureCallback()));
}
// static
std::unique_ptr<ViewTransitionRequest> ViewTransitionRequest::CreateRelease(
const blink::ViewTransitionToken& transition_token,
bool maybe_cross_frame_sink) {
return base::WrapUnique(new ViewTransitionRequest(
Type::kRelease, transition_token, maybe_cross_frame_sink, {},
ViewTransitionCaptureCallback()));
}
ViewTransitionRequest::ViewTransitionRequest(
Type type,
const blink::ViewTransitionToken& transition_token,
bool maybe_cross_frame_sink,
std::vector<viz::ViewTransitionElementResourceId> capture_ids,
ViewTransitionCaptureCallback commit_callback)
: type_(type),
transition_token_(transition_token),
maybe_cross_frame_sink_(maybe_cross_frame_sink),
commit_callback_(std::move(commit_callback)),
sequence_id_(s_next_sequence_id_++),
capture_resource_ids_(std::move(capture_ids)) {
DCHECK(type_ == Type::kSave || !commit_callback_);
}
ViewTransitionRequest::~ViewTransitionRequest() = default;
viz::CompositorFrameTransitionDirective
ViewTransitionRequest::ConstructDirective(
const ViewTransitionElementMap& shared_element_render_pass_id_map,
const gfx::DisplayColorSpaces& display_color_spaces) const {
switch (type_) {
case Type::kRelease:
DCHECK(capture_resource_ids_.empty());
return viz::CompositorFrameTransitionDirective::CreateRelease(
transition_token_, maybe_cross_frame_sink_, sequence_id_);
case Type::kAnimateRenderer:
DCHECK(capture_resource_ids_.empty());
return viz::CompositorFrameTransitionDirective::CreateAnimate(
transition_token_, maybe_cross_frame_sink_, sequence_id_);
case Type::kSave:
break;
}
std::vector<viz::CompositorFrameTransitionDirective::SharedElement>
shared_elements(capture_resource_ids_.size());
for (size_t i = 0; i < shared_elements.size(); i++) {
const auto& capture_resource_id = capture_resource_ids_[i];
shared_elements[i].view_transition_element_resource_id =
capture_resource_id;
auto it = shared_element_render_pass_id_map.find(capture_resource_id);
if (it != shared_element_render_pass_id_map.end()) {
shared_elements[i].render_pass_id = it->second;
}
}
return viz::CompositorFrameTransitionDirective::CreateSave(
transition_token_, maybe_cross_frame_sink_, sequence_id_,
std::move(shared_elements), display_color_spaces);
}
bool ViewTransitionRequest::HasSubframeSnapshot() const {
for (const auto& id : capture_resource_ids_) {
if (id.for_subframe_snapshot()) {
return true;
}
}
return false;
}
std::string ViewTransitionRequest::ToString() const {
std::ostringstream str;
str << "[type: " << TypeToString(type_) << " sequence_id: " << sequence_id_
<< "]";
return str.str();
}
} // namespace cc