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

Side by Side Diff: ui/aura/root_window.cc

Issue 12983010: Manually compute inverted matrix for screen rotation (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 9 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/aura/root_window.h" 5 #include "ui/aura/root_window.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/auto_reset.h" 9 #include "base/auto_reset.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 gfx::AcceleratedWidget widget) { 152 gfx::AcceleratedWidget widget) {
153 return reinterpret_cast<RootWindow*>( 153 return reinterpret_cast<RootWindow*>(
154 ui::ViewProp::GetValue(widget, kRootWindowForAcceleratedWidget)); 154 ui::ViewProp::GetValue(widget, kRootWindowForAcceleratedWidget));
155 } 155 }
156 156
157 void RootWindow::Init() { 157 void RootWindow::Init() {
158 compositor()->SetScaleAndSize(GetDeviceScaleFactorFromDisplay(this), 158 compositor()->SetScaleAndSize(GetDeviceScaleFactorFromDisplay(this),
159 host_->GetBounds().size()); 159 host_->GetBounds().size());
160 Window::Init(ui::LAYER_NOT_DRAWN); 160 Window::Init(ui::LAYER_NOT_DRAWN);
161 compositor()->SetRootLayer(layer()); 161 compositor()->SetRootLayer(layer());
162 SetTransformInternal(gfx::Transform()); 162 gfx::Transform identity;
163 SetTransformInternal(identity, identity);
163 UpdateWindowSize(host_->GetBounds().size()); 164 UpdateWindowSize(host_->GetBounds().size());
164 Env::GetInstance()->NotifyRootWindowInitialized(this); 165 Env::GetInstance()->NotifyRootWindowInitialized(this);
165 Show(); 166 Show();
166 } 167 }
167 168
168 void RootWindow::ShowRootWindow() { 169 void RootWindow::ShowRootWindow() {
169 host_->Show(); 170 host_->Show();
170 } 171 }
171 172
172 void RootWindow::HideRootWindow() { 173 void RootWindow::HideRootWindow() {
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
396 } 397 }
397 398
398 void RootWindow::ConvertPointToHost(gfx::Point* point) const { 399 void RootWindow::ConvertPointToHost(gfx::Point* point) const {
399 gfx::Point3F point_3f(*point); 400 gfx::Point3F point_3f(*point);
400 GetRootTransform().TransformPoint(point_3f); 401 GetRootTransform().TransformPoint(point_3f);
401 *point = gfx::ToFlooredPoint(point_3f.AsPointF()); 402 *point = gfx::ToFlooredPoint(point_3f.AsPointF());
402 } 403 }
403 404
404 void RootWindow::ConvertPointFromHost(gfx::Point* point) const { 405 void RootWindow::ConvertPointFromHost(gfx::Point* point) const {
405 gfx::Point3F point_3f(*point); 406 gfx::Point3F point_3f(*point);
406 GetRootTransform().TransformPointReverse(point_3f); 407 GetInvertedRootTransform().TransformPoint(point_3f);
407 *point = gfx::ToFlooredPoint(point_3f.AsPointF()); 408 *point = gfx::ToFlooredPoint(point_3f.AsPointF());
408 } 409 }
409 410
410 void RootWindow::ProcessedTouchEvent(ui::TouchEvent* event, 411 void RootWindow::ProcessedTouchEvent(ui::TouchEvent* event,
411 Window* window, 412 Window* window,
412 ui::EventResult result) { 413 ui::EventResult result) {
413 scoped_ptr<ui::GestureRecognizer::Gestures> gestures; 414 scoped_ptr<ui::GestureRecognizer::Gestures> gestures;
414 gestures.reset(gesture_recognizer_->ProcessTouchEventForGesture( 415 gestures.reset(gesture_recognizer_->ProcessTouchEventForGesture(
415 *event, result, window)); 416 *event, result, window));
416 ProcessGestures(gestures.get()); 417 ProcessGestures(gestures.get());
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 487
487 RootWindow* RootWindow::GetRootWindow() { 488 RootWindow* RootWindow::GetRootWindow() {
488 return this; 489 return this;
489 } 490 }
490 491
491 const RootWindow* RootWindow::GetRootWindow() const { 492 const RootWindow* RootWindow::GetRootWindow() const {
492 return this; 493 return this;
493 } 494 }
494 495
495 void RootWindow::SetTransform(const gfx::Transform& transform) { 496 void RootWindow::SetTransform(const gfx::Transform& transform) {
496 SetTransformInternal(transform); 497 gfx::Transform invert;
498 if (!transform.GetInverse(&invert))
499 NOTREACHED() << "Singular matrix is set.";
500 SetTransformPair(transform, invert);
501 }
502
503 void RootWindow::SetTransformPair(const gfx::Transform& transform,
504 const gfx::Transform& invert) {
505 SetTransformInternal(transform, invert);
497 506
498 // If the layer is not animating, then we need to update the host size 507 // If the layer is not animating, then we need to update the host size
499 // immediately. 508 // immediately.
500 if (!layer()->GetAnimator()->is_animating()) 509 if (!layer()->GetAnimator()->is_animating())
501 OnHostResized(host_->GetBounds().size()); 510 OnHostResized(host_->GetBounds().size());
502 } 511 }
503 512
504 void RootWindow::SetTransformInternal(const gfx::Transform& transform) { 513 void RootWindow::SetTransformInternal(const gfx::Transform& transform,
514 const gfx::Transform& inverted) {
505 gfx::Insets insets = host_->GetInsets(); 515 gfx::Insets insets = host_->GetInsets();
506 gfx::Transform translate; 516 gfx::Transform translate;
517 invert_transform_ = inverted;
518 invert_transform_.Scale(root_window_scale_, root_window_scale_);
519
507 if (insets.top() != 0 || insets.left() != 0) { 520 if (insets.top() != 0 || insets.left() != 0) {
508 float device_scale_factor = GetDeviceScaleFactor(); 521 float device_scale_factor = GetDeviceScaleFactor();
509 translate.Translate(insets.left() / device_scale_factor, 522 float x_offset = insets.left() / device_scale_factor;
510 insets.top() / device_scale_factor); 523 float y_offset = insets.top() / device_scale_factor;
511 Window::SetTransform(translate * transform); 524 translate.Translate(x_offset, y_offset);
525 invert_transform_.Translate(-x_offset, -y_offset);
512 } 526 }
513 float invert = 1.0f / root_window_scale_; 527 float inverted_scale = 1.0f / root_window_scale_;
514 translate.Scale(invert, invert); 528 translate.Scale(inverted_scale, inverted_scale);
529
515 Window::SetTransform(translate * transform); 530 Window::SetTransform(translate * transform);
516 } 531 }
517 532
518 //////////////////////////////////////////////////////////////////////////////// 533 ////////////////////////////////////////////////////////////////////////////////
519 // RootWindow, ui::EventTarget implementation: 534 // RootWindow, ui::EventTarget implementation:
520 535
521 ui::EventTarget* RootWindow::GetParentTarget() { 536 ui::EventTarget* RootWindow::GetParentTarget() {
522 return client::GetEventClient(this) ? 537 return client::GetEventClient(this) ?
523 client::GetEventClient(this)->GetToplevelEventTarget() : 538 client::GetEventClient(this)->GetToplevelEventTarget() :
524 Env::GetInstance(); 539 Env::GetInstance();
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
664 mouse_pressed_handler_ = NULL; 679 mouse_pressed_handler_ = NULL;
665 mouse_moved_handler_ = NULL; 680 mouse_moved_handler_ = NULL;
666 mouse_event_dispatch_target_ = NULL; 681 mouse_event_dispatch_target_ = NULL;
667 } 682 }
668 683
669 //////////////////////////////////////////////////////////////////////////////// 684 ////////////////////////////////////////////////////////////////////////////////
670 // RootWindow, private: 685 // RootWindow, private:
671 686
672 void RootWindow::TransformEventForDeviceScaleFactor(bool keep_inside_root, 687 void RootWindow::TransformEventForDeviceScaleFactor(bool keep_inside_root,
673 ui::LocatedEvent* event) { 688 ui::LocatedEvent* event) {
674 event->UpdateForRootTransform(GetRootTransform()); 689 event->UpdateForRootTransform(GetInvertedRootTransform());
675 #if defined(OS_CHROMEOS) 690 #if defined(OS_CHROMEOS)
676 const gfx::Rect& root_bounds = bounds(); 691 const gfx::Rect& root_bounds = bounds();
677 if (keep_inside_root & 692 if (keep_inside_root &
678 host_->GetBounds().Contains(event->system_location()) && 693 host_->GetBounds().Contains(event->system_location()) &&
679 !root_bounds.Contains(event->root_location())) { 694 !root_bounds.Contains(event->root_location())) {
680 // Make sure that the mouse location inside the host window gets 695 // Make sure that the mouse location inside the host window gets
681 // translated inside root window. 696 // translated inside root window.
682 // TODO(oshima): This is (hopefully) short term bandaid to deal 697 // TODO(oshima): This is (hopefully) short term bandaid to deal
683 // with calculation error in inverted matrix. We'll try better 698 // with calculation error due to the fact that we rotate in dip
684 // alternative (crbug.com/222483) for m28. 699 // coordinates instead of pixels. crbug.com/222483.
685 int x = event->location().x(); 700 int x = event->location().x();
686 int y = event->location().y(); 701 int y = event->location().y();
687 x = std::min(std::max(x, root_bounds.x()), root_bounds.right()); 702 x = std::min(std::max(x, root_bounds.x()), root_bounds.right());
688 y = std::min(std::max(y, root_bounds.y()), root_bounds.bottom()); 703 y = std::min(std::max(y, root_bounds.y()), root_bounds.bottom());
689 const gfx::Point new_location(x, y); 704 const gfx::Point new_location(x, y);
690 event->set_location(new_location); 705 event->set_location(new_location);
691 event->set_root_location(new_location); 706 event->set_root_location(new_location);
692 } 707 }
693 #endif // defined(OS_CHROMEOS) 708 #endif // defined(OS_CHROMEOS)
694 } 709 }
(...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after
1172 } 1187 }
1173 1188
1174 gfx::Transform RootWindow::GetRootTransform() const { 1189 gfx::Transform RootWindow::GetRootTransform() const {
1175 float scale = ui::GetDeviceScaleFactor(layer()); 1190 float scale = ui::GetDeviceScaleFactor(layer());
1176 gfx::Transform transform; 1191 gfx::Transform transform;
1177 transform.Scale(scale, scale); 1192 transform.Scale(scale, scale);
1178 transform *= layer()->transform(); 1193 transform *= layer()->transform();
1179 return transform; 1194 return transform;
1180 } 1195 }
1181 1196
1197 gfx::Transform RootWindow::GetInvertedRootTransform() const {
1198 float scale = ui::GetDeviceScaleFactor(layer());
1199 gfx::Transform transform;
1200 transform.Scale(1.0f / scale, 1.0f / scale);
1201 return invert_transform_ * transform;
1202 }
1203
1182 } // namespace aura 1204 } // namespace aura
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698