1// Copyright 2014 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
5#include "content/common/cursors/webcursor.h"
6
7#include "third_party/WebKit/public/platform/WebCursorInfo.h"
8#include "ui/base/cursor/cursor.h"
9#include "ui/base/cursor/cursor_util.h"
10#include "ui/ozone/public/cursor_factory_ozone.h"
11
12namespace content {
13
14ui::PlatformCursor WebCursor::GetPlatformCursor() {
15  if (platform_cursor_)
16    return platform_cursor_;
17
18  SkBitmap bitmap;
19  ImageFromCustomData(&bitmap);
20  gfx::Point hotspot = hotspot_;
21  ui::ScaleAndRotateCursorBitmapAndHotpoint(
22      device_scale_factor_, rotation_, &bitmap, &hotspot);
23
24  return ui::CursorFactoryOzone::GetInstance()->CreateImageCursor(bitmap,
25                                                                  hotspot);
26}
27
28void WebCursor::SetDisplayInfo(const gfx::Display& display) {
29  if (rotation_ == display.rotation() &&
30      device_scale_factor_ == display.device_scale_factor())
31    return;
32
33  device_scale_factor_ = display.device_scale_factor();
34  rotation_ = display.rotation();
35  if (platform_cursor_)
36    ui::CursorFactoryOzone::GetInstance()->UnrefImageCursor(platform_cursor_);
37  platform_cursor_ = NULL;
38  // It is not necessary to recreate platform_cursor_ yet, since it will be
39  // recreated on demand when GetPlatformCursor is called.
40}
41
42void WebCursor::InitPlatformData() {
43  platform_cursor_ = NULL;
44  device_scale_factor_ = 1.f;
45  rotation_ = gfx::Display::ROTATE_0;
46}
47
48bool WebCursor::SerializePlatformData(Pickle* pickle) const {
49  return true;
50}
51
52bool WebCursor::DeserializePlatformData(PickleIterator* iter) {
53  return true;
54}
55
56bool WebCursor::IsPlatformDataEqual(const WebCursor& other) const {
57  return true;
58}
59
60void WebCursor::CleanupPlatformData() {
61  if (platform_cursor_) {
62    ui::CursorFactoryOzone::GetInstance()->UnrefImageCursor(platform_cursor_);
63    platform_cursor_ = NULL;
64  }
65}
66
67void WebCursor::CopyPlatformData(const WebCursor& other) {
68  if (platform_cursor_)
69    ui::CursorFactoryOzone::GetInstance()->UnrefImageCursor(platform_cursor_);
70  platform_cursor_ = other.platform_cursor_;
71  if (platform_cursor_)
72    ui::CursorFactoryOzone::GetInstance()->RefImageCursor(platform_cursor_);
73
74  device_scale_factor_ = other.device_scale_factor_;
75}
76
77}  // namespace content
78