| // 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 |