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

Side by Side Diff: components/exo/pointer.cc

Issue 2777343002: exo: Rotate cursor snapshot for rotated displays (Closed)
Patch Set: Add comment Created 3 years, 7 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
« no previous file with comments | « components/exo/pointer.h ('k') | ui/display/display.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "components/exo/pointer.h" 5 #include "components/exo/pointer.h"
6 6
7 #include "ash/public/cpp/shell_window_ids.h" 7 #include "ash/public/cpp/shell_window_ids.h"
8 #include "cc/output/copy_output_request.h" 8 #include "cc/output/copy_output_request.h"
9 #include "cc/output/copy_output_result.h" 9 #include "cc/output/copy_output_result.h"
10 #include "components/exo/pointer_delegate.h" 10 #include "components/exo/pointer_delegate.h"
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 // Reparent the cursor to the root window where the mouse is located. 274 // Reparent the cursor to the root window where the mouse is located.
275 if (container->GetRootWindow() != cursor_->GetRootWindow()) { 275 if (container->GetRootWindow() != cursor_->GetRootWindow()) {
276 if (cursor_->parent()) 276 if (cursor_->parent())
277 cursor_->parent()->RemoveChild(cursor_.get()); 277 cursor_->parent()->RemoveChild(cursor_.get());
278 container->AddChild(cursor_.get()); 278 container->AddChild(cursor_.get());
279 } 279 }
280 280
281 auto info = helper->GetDisplayInfo(display.id()); 281 auto info = helper->GetDisplayInfo(display.id());
282 display_scale_ = info.GetEffectiveUIScale() * info.device_scale_factor(); 282 display_scale_ = info.GetEffectiveUIScale() * info.device_scale_factor();
283 device_scale_factor_ = display.device_scale_factor(); 283 device_scale_factor_ = display.device_scale_factor();
284 rotation_ = display.rotation();
284 285
285 if (focus_ && surface_) 286 if (focus_ && surface_)
286 CaptureCursor(); 287 CaptureCursor();
287 } 288 }
288 289
289 //////////////////////////////////////////////////////////////////////////////// 290 ////////////////////////////////////////////////////////////////////////////////
290 // SurfaceDelegate overrides: 291 // SurfaceDelegate overrides:
291 292
292 void Pointer::OnSurfaceCommit() { 293 void Pointer::OnSurfaceCommit() {
293 surface_->CheckIfSurfaceHierarchyNeedsCommitToNewSurfaces(); 294 surface_->CheckIfSurfaceHierarchyNeedsCommitToNewSurfaces();
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 330
330 void Pointer::CaptureCursor() { 331 void Pointer::CaptureCursor() {
331 DCHECK(surface_); 332 DCHECK(surface_);
332 DCHECK(focus_); 333 DCHECK(focus_);
333 334
334 float scale = cursor_scale_ * display_scale_; 335 float scale = cursor_scale_ * display_scale_;
335 float layer_scale = scale / device_scale_factor_; 336 float layer_scale = scale / device_scale_factor_;
336 337
337 gfx::Transform transform; 338 gfx::Transform transform;
338 transform.Scale(layer_scale, layer_scale); 339 transform.Scale(layer_scale, layer_scale);
340 transform.Rotate(display::Display::RotateToDegree(rotation_));
339 surface_->window()->SetTransform(transform); 341 surface_->window()->SetTransform(transform);
340 342
343 gfx::Point hotspot = hotspot_;
344 aura::Window::ConvertPointToTarget(surface_->window(), cursor_.get(),
345 &hotspot);
346
341 std::unique_ptr<cc::CopyOutputRequest> request = 347 std::unique_ptr<cc::CopyOutputRequest> request =
342 cc::CopyOutputRequest::CreateBitmapRequest( 348 cc::CopyOutputRequest::CreateBitmapRequest(
343 base::Bind(&Pointer::OnCursorCaptured, 349 base::Bind(&Pointer::OnCursorCaptured,
344 cursor_capture_weak_ptr_factory_.GetWeakPtr(), 350 cursor_capture_weak_ptr_factory_.GetWeakPtr(),
345 gfx::ScaleToFlooredPoint(hotspot_, scale))); 351 gfx::ScaleToFlooredPoint(hotspot, scale)));
346 352
347 request->set_source(cursor_capture_source_id_); 353 request->set_source(cursor_capture_source_id_);
348 cursor_->layer()->RequestCopyOfOutput(std::move(request)); 354 cursor_->layer()->RequestCopyOfOutput(std::move(request));
349 } 355 }
350 356
351 void Pointer::OnCursorCaptured(const gfx::Point& hotspot, 357 void Pointer::OnCursorCaptured(gfx::Point hotspot,
352 std::unique_ptr<cc::CopyOutputResult> result) { 358 std::unique_ptr<cc::CopyOutputResult> result) {
353 if (!focus_) 359 if (!focus_)
354 return; 360 return;
355 361
356 gfx::NativeCursor cursor = ui::CursorType::kNull; 362 gfx::NativeCursor cursor = ui::CursorType::kNull;
357 if (!result->IsEmpty()) { 363 if (!result->IsEmpty()) {
358 DCHECK(result->HasBitmap()); 364 DCHECK(result->HasBitmap());
359 std::unique_ptr<SkBitmap> bitmap = result->TakeBitmap(); 365 std::unique_ptr<SkBitmap> bitmap = result->TakeBitmap();
360 366
367 switch (rotation_) {
368 case display::Display::ROTATE_0:
369 break;
370
371 case display::Display::ROTATE_90:
372 hotspot += gfx::Vector2d(bitmap->height(), 0);
373 break;
374
375 case display::Display::ROTATE_180:
376 hotspot += gfx::Vector2d(bitmap->width(), bitmap->height());
377 break;
378
379 case display::Display::ROTATE_270:
380 hotspot += gfx::Vector2d(0, bitmap->width());
381 break;
382 }
383
361 ui::PlatformCursor platform_cursor; 384 ui::PlatformCursor platform_cursor;
362 #if defined(USE_OZONE) 385 #if defined(USE_OZONE)
363 // TODO(reveman): Add interface for creating cursors from GpuMemoryBuffers 386 // TODO(reveman): Add interface for creating cursors from GpuMemoryBuffers
364 // and use that here instead of the current bitmap API. crbug.com/686600 387 // and use that here instead of the current bitmap API. crbug.com/686600
365 platform_cursor = ui::CursorFactoryOzone::GetInstance()->CreateImageCursor( 388 platform_cursor = ui::CursorFactoryOzone::GetInstance()->CreateImageCursor(
366 *bitmap.get(), hotspot, cursor_scale_); 389 *bitmap.get(), hotspot, cursor_scale_);
367 #elif defined(USE_X11) 390 #elif defined(USE_X11)
368 XcursorImage* image = ui::SkBitmapToXcursorImage(bitmap.get(), hotspot); 391 XcursorImage* image = ui::SkBitmapToXcursorImage(bitmap.get(), hotspot);
369 platform_cursor = ui::CreateReffedCustomXCursor(image); 392 platform_cursor = ui::CreateReffedCustomXCursor(image);
370 #endif 393 #endif
(...skipping 16 matching lines...) Expand all
387 if (!root_window) 410 if (!root_window)
388 return; 411 return;
389 412
390 aura::client::CursorClient* cursor_client = 413 aura::client::CursorClient* cursor_client =
391 aura::client::GetCursorClient(root_window); 414 aura::client::GetCursorClient(root_window);
392 if (cursor_client) 415 if (cursor_client)
393 cursor_client->SetCursor(cursor); 416 cursor_client->SetCursor(cursor);
394 } 417 }
395 418
396 } // namespace exo 419 } // namespace exo
OLDNEW
« no previous file with comments | « components/exo/pointer.h ('k') | ui/display/display.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698