document_transition_content_layer_impl.cc 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // Copyright 2021 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "cc/layers/document_transition_content_layer_impl.h"
  5. #include "base/memory/ptr_util.h"
  6. #include "cc/layers/append_quads_data.h"
  7. #include "cc/layers/layer_impl.h"
  8. #include "cc/trees/layer_tree_impl.h"
  9. #include "components/viz/common/quads/shared_element_draw_quad.h"
  10. #include "components/viz/common/quads/solid_color_draw_quad.h"
  11. #include "components/viz/common/shared_element_resource_id.h"
  12. namespace cc {
  13. // static
  14. std::unique_ptr<DocumentTransitionContentLayerImpl>
  15. DocumentTransitionContentLayerImpl::Create(
  16. LayerTreeImpl* tree_impl,
  17. int id,
  18. const viz::SharedElementResourceId& resource_id,
  19. bool is_live_content_layer) {
  20. return base::WrapUnique(new DocumentTransitionContentLayerImpl(
  21. tree_impl, id, resource_id, is_live_content_layer));
  22. }
  23. DocumentTransitionContentLayerImpl::DocumentTransitionContentLayerImpl(
  24. LayerTreeImpl* tree_impl,
  25. int id,
  26. const viz::SharedElementResourceId& resource_id,
  27. bool is_live_content_layer)
  28. : LayerImpl(tree_impl, id),
  29. resource_id_(resource_id),
  30. is_live_content_layer_(is_live_content_layer) {}
  31. DocumentTransitionContentLayerImpl::~DocumentTransitionContentLayerImpl() =
  32. default;
  33. std::unique_ptr<LayerImpl> DocumentTransitionContentLayerImpl::CreateLayerImpl(
  34. LayerTreeImpl* tree_impl) const {
  35. return DocumentTransitionContentLayerImpl::Create(
  36. tree_impl, id(), resource_id_, is_live_content_layer_);
  37. }
  38. void DocumentTransitionContentLayerImpl::
  39. NotifyKnownResourceIdsBeforeAppendQuads(
  40. const base::flat_set<viz::SharedElementResourceId>&
  41. known_resource_ids) {
  42. skip_unseen_resource_quads_ = known_resource_ids.count(resource_id_) == 0;
  43. }
  44. void DocumentTransitionContentLayerImpl::AppendQuads(
  45. viz::CompositorRenderPass* render_pass,
  46. AppendQuadsData* append_quads_data) {
  47. // Skip live content elements that don't have a corresponding resource render
  48. // passes.
  49. if (is_live_content_layer_ && skip_unseen_resource_quads_)
  50. return;
  51. float device_scale_factor = layer_tree_impl()->device_scale_factor();
  52. gfx::Rect quad_rect(
  53. gfx::ScaleToEnclosingRect(gfx::Rect(bounds()), device_scale_factor));
  54. gfx::Rect visible_quad_rect =
  55. draw_properties().occlusion_in_content_space.GetUnoccludedContentRect(
  56. gfx::Rect(bounds()));
  57. visible_quad_rect =
  58. gfx::ScaleToEnclosingRect(visible_quad_rect, device_scale_factor);
  59. visible_quad_rect = gfx::IntersectRects(quad_rect, visible_quad_rect);
  60. if (visible_quad_rect.IsEmpty())
  61. return;
  62. viz::SharedQuadState* shared_quad_state =
  63. render_pass->CreateAndAppendSharedQuadState();
  64. PopulateScaledSharedQuadState(shared_quad_state, device_scale_factor,
  65. contents_opaque());
  66. auto* quad =
  67. render_pass->CreateAndAppendDrawQuad<viz::SharedElementDrawQuad>();
  68. quad->SetNew(shared_quad_state, quad_rect, visible_quad_rect, resource_id_);
  69. append_quads_data->has_shared_element_resources = true;
  70. }
  71. const char* DocumentTransitionContentLayerImpl::LayerTypeAsString() const {
  72. return "cc::DocumentTransitionContentLayerImpl";
  73. }
  74. } // namespace cc