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

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: Rebase works! 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 af29f1f6d4128ec12289b1f3ce1d724520a5c6fa..5793f9f8c9ca78179da286eeb8a098156cdf5992 100644
--- a/components/mus/display_manager.cc
+++ b/components/mus/display_manager.cc
@@ -56,12 +56,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();
+ for (auto it = children.rbegin(); it != children.rend(); ++it) {
+ DrawViewTree(pass, *it, absolute_bounds.OffsetFromOrigin(),
rjkroege 2015/09/16 21:31:37 can you remind me why there are multiple view tree
Fady Samuel 2015/09/17 18:31:42 We don't really. This is recursively visiting the
+ combined_opacity);
+ }
}
gfx::Transform quad_to_target_transform;
@@ -201,19 +203,7 @@ 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();
+ scoped_ptr<cc::CompositorFrame> frame(GenerateCompositorFrame());
rjkroege 2015/09/16 21:31:37 you assemble the top-level OutputSurface Composito
Fady Samuel 2015/09/17 18:31:42 Done.
frame_pending_ = true;
if (top_level_display_client_) {
top_level_display_client_->SubmitCompositorFrame(
@@ -255,6 +245,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;
+ 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);
}
@@ -276,7 +293,21 @@ void DefaultDisplayManager::DispatchEvent(ui::Event* event) {
mojo_event->pointer_data->horizontal_wheel =
ConvertUIWheelValueToMojoValue(wheel_event->y_offset());
}
- 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->x = transformed_point.x();
rjkroege 2015/09/16 21:31:37 you don't translate the screen coords? they are in
Fady Samuel 2015/09/17 18:31:42 I'm not translating the screen coordinates. I'm ac
+ mojo_event->pointer_data->y = transformed_point.y();
+ }
+ delegate_->OnEvent(id, mojo_event.Pass());
switch (event->type()) {
case ui::ET_MOUSE_PRESSED:
@@ -319,7 +350,7 @@ void DefaultDisplayManager::DispatchEvent(ui::Event* event) {
key_press_event->GetText(), key_press_event->GetUnmodifiedText())));
char_event.set_platform_keycode(key_press_event->platform_keycode());
- 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