Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(314)

Unified Diff: components/mus/display_manager.cc

Issue 1328953003: Mandoline: Support transforms and clipping of OOPIFs and events (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed Rob's comments Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/mus/display_manager.cc
diff --git a/components/mus/display_manager.cc b/components/mus/display_manager.cc
index 195d5a138e3f83ccfd862abccdfe004256e96109..93ac4d83a19ba85f1ef6a84417c5c38c018c5206 100644
--- a/components/mus/display_manager.cc
+++ b/components/mus/display_manager.cc
@@ -47,6 +47,9 @@ using mojo::Size;
namespace mus {
namespace {
+// DrawViewTree recursively visits ServerViews, creating a SurfaceDrawQuad for
+// each that lacks one. For Views that already have CompositorFrames, we can
+// skip this step and let cc::SurfaceAggregator do the heavy lifting.
rjkroege 2015/09/17 19:03:56 this code is all on the critical redraw path? On
Fady Samuel 2015/09/17 20:00:21 GenerateCompositorFrame is the top level call. Do
void DrawViewTree(cc::RenderPass* pass,
const ServerView* view,
const gfx::Vector2d& parent_to_root_origin_offset,
@@ -56,12 +59,14 @@ void DrawViewTree(cc::RenderPass* pass,
const gfx::Rect absolute_bounds =
view->bounds() + parent_to_root_origin_offset;
- std::vector<const ServerView*> children(view->GetChildren());
- const float combined_opacity = opacity * view->opacity();
- for (std::vector<const ServerView*>::reverse_iterator it = children.rbegin();
- it != children.rend(); ++it) {
- DrawViewTree(pass, *it, absolute_bounds.OffsetFromOrigin(),
- combined_opacity);
+
+ if (!view->parent() || view->surface_id().is_null()) {
+ std::vector<const ServerView*> children(view->GetChildren());
+ const float combined_opacity = opacity * view->opacity();
rjkroege 2015/09/17 19:08:05 do we have pre-multiplied alpha? if we do (pre-mul
Fady Samuel 2015/09/17 20:00:21 Done.
+ for (auto it = children.rbegin(); it != children.rend(); ++it) {
+ DrawViewTree(pass, *it, absolute_bounds.OffsetFromOrigin(),
+ combined_opacity);
+ }
}
gfx::Transform quad_to_target_transform;
@@ -192,19 +197,8 @@ void DefaultDisplayManager::Draw() {
if (!delegate_->GetRootView()->visible())
return;
- scoped_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create();
- render_pass->damage_rect = dirty_rect_;
- render_pass->output_rect = gfx::Rect(metrics_.size_in_pixels.To<gfx::Size>());
-
- DrawViewTree(render_pass.get(), delegate_->GetRootView(), gfx::Vector2d(),
- 1.0f);
-
- scoped_ptr<cc::DelegatedFrameData> frame_data(new cc::DelegatedFrameData);
- frame_data->device_scale_factor = 1.f;
- frame_data->render_pass_list.push_back(render_pass.Pass());
-
- scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame);
- frame->delegated_frame_data = frame_data.Pass();
+ // TODO(fsamuel): We should add a trace for generating a top level frame.
+ scoped_ptr<cc::CompositorFrame> frame(GenerateCompositorFrame());
frame_pending_ = true;
if (top_level_display_client_) {
top_level_display_client_->SubmitCompositorFrame(
@@ -246,6 +240,33 @@ void DefaultDisplayManager::UpdateMetrics(const gfx::Size& size,
delegate_->OnViewportMetricsChanged(old_metrics, metrics_);
}
+scoped_ptr<cc::CompositorFrame>
+DefaultDisplayManager::GenerateCompositorFrame() {
+ scoped_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create();
+ render_pass->damage_rect = dirty_rect_;
+ render_pass->output_rect = gfx::Rect(metrics_.size_in_pixels.To<gfx::Size>());
+
+ DrawViewTree(render_pass.get(),
+ delegate_->GetRootView(),
+ gfx::Vector2d(), 1.0f);
+
+ scoped_ptr<cc::DelegatedFrameData> frame_data(new cc::DelegatedFrameData);
+ frame_data->device_scale_factor = 1.f;
rjkroege 2015/09/17 19:08:05 ? won't this break native apps that have their CF
Fady Samuel 2015/09/17 20:00:21 Done.
+ frame_data->render_pass_list.push_back(render_pass.Pass());
+
+ scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame);
+ frame->delegated_frame_data = frame_data.Pass();
+ return frame.Pass();
+}
+
+const cc::CompositorFrame*
+DefaultDisplayManager::GetLastCompositorFrame() const {
+ if (!top_level_display_client_)
+ return nullptr;
+
+ return top_level_display_client_->GetLastCompositorFrame();
+}
+
void DefaultDisplayManager::OnBoundsChanged(const gfx::Rect& new_bounds) {
UpdateMetrics(new_bounds.size(), metrics_.device_pixel_ratio);
}
@@ -257,7 +278,21 @@ void DefaultDisplayManager::OnDamageRect(const gfx::Rect& damaged_region) {
void DefaultDisplayManager::DispatchEvent(ui::Event* event) {
mojo::EventPtr mojo_event(mojo::Event::From(*event));
- delegate_->OnEvent(mojo_event.Pass());
+ ViewId id;
+ if (event->IsLocatedEvent() && !!top_level_display_client_) {
+ ui::LocatedEvent* located_event = static_cast<ui::LocatedEvent*>(event);
+ gfx::Point transformed_point;
+ cc::SurfaceId target_surface =
+ surfaces_state_->hit_tester()->GetTargetSurfaceAtPoint(
+ top_level_display_client_->surface_id(),
+ located_event->location(),
+ &transformed_point);
+ id = ViewIdFromTransportId(
+ cc::SurfaceIdAllocator::NamespaceForId(target_surface));
+ mojo_event->pointer_data->location->x = transformed_point.x();
+ mojo_event->pointer_data->location->y = transformed_point.y();
+ }
+ delegate_->OnEvent(id, mojo_event.Pass());
switch (event->type()) {
case ui::ET_MOUSE_PRESSED:
@@ -299,7 +334,7 @@ void DefaultDisplayManager::DispatchEvent(ui::Event* event) {
key_press_event->GetLocatedWindowsKeyboardCode(),
key_press_event->GetText(), key_press_event->GetUnmodifiedText())));
- delegate_->OnEvent(mojo::Event::From(char_event));
+ delegate_->OnEvent(id, mojo::Event::From(char_event));
}
#endif
}

Powered by Google App Engine
This is Rietveld 408576698