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 "ui/base/cursor/image_cursors.h"
6
7 #include <float.h>
8
9 #include "base/logging.h"
10 #include "base/strings/string16.h"
11 #include "ui/base/cursor/cursor.h"
12 #include "ui/base/cursor/cursor_loader.h"
13 #include "ui/base/cursor/cursors_aura.h"
14 #include "ui/gfx/display.h"
15 #include "ui/gfx/point.h"
16
17 namespace ui {
18
19 namespace {
20
21 const int kImageCursorIds[] = {
22 kCursorNull,
23 kCursorPointer,
24 kCursorNoDrop,
25 kCursorNotAllowed,
26 kCursorCopy,
27 kCursorHand,
28 kCursorMove,
29 kCursorNorthEastResize,
30 kCursorSouthWestResize,
31 kCursorSouthEastResize,
32 kCursorNorthWestResize,
33 kCursorNorthResize,
34 kCursorSouthResize,
35 kCursorEastResize,
36 kCursorWestResize,
37 kCursorIBeam,
38 kCursorAlias,
39 kCursorCell,
40 kCursorContextMenu,
41 kCursorCross,
42 kCursorHelp,
43 kCursorVerticalText,
44 kCursorZoomIn,
45 kCursorZoomOut,
46 kCursorRowResize,
47 kCursorColumnResize,
48 kCursorEastWestResize,
49 kCursorNorthSouthResize,
50 kCursorNorthEastSouthWestResize,
51 kCursorNorthWestSouthEastResize,
52 kCursorGrab,
53 kCursorGrabbing,
54 };
55
56 const int kAnimatedCursorIds[] = {
57 kCursorWait,
58 kCursorProgress
59 };
60
61 } // namespace
62
ImageCursors()63 ImageCursors::ImageCursors() : cursor_set_(CURSOR_SET_NORMAL) {
64 }
65
~ImageCursors()66 ImageCursors::~ImageCursors() {
67 }
68
GetScale() const69 float ImageCursors::GetScale() const {
70 if (!cursor_loader_) {
71 NOTREACHED();
72 // Returning default on release build as it's not serious enough to crash
73 // even if this ever happens.
74 return 1.0f;
75 }
76 return cursor_loader_->scale();
77 }
78
GetRotation() const79 gfx::Display::Rotation ImageCursors::GetRotation() const {
80 if (!cursor_loader_) {
81 NOTREACHED();
82 // Returning default on release build as it's not serious enough to crash
83 // even if this ever happens.
84 return gfx::Display::ROTATE_0;
85 }
86 return cursor_loader_->rotation();
87 }
88
SetDisplay(const gfx::Display & display,float scale_factor)89 bool ImageCursors::SetDisplay(const gfx::Display& display,
90 float scale_factor) {
91 if (!cursor_loader_) {
92 cursor_loader_.reset(CursorLoader::Create());
93 } else if (cursor_loader_->rotation() == display.rotation() &&
94 cursor_loader_->scale() == scale_factor) {
95 return false;
96 }
97
98 cursor_loader_->set_rotation(display.rotation());
99 cursor_loader_->set_scale(scale_factor);
100 ReloadCursors();
101 return true;
102 }
103
ReloadCursors()104 void ImageCursors::ReloadCursors() {
105 float device_scale_factor = cursor_loader_->scale();
106
107 cursor_loader_->UnloadAll();
108
109 for (size_t i = 0; i < arraysize(kImageCursorIds); ++i) {
110 int resource_id = -1;
111 gfx::Point hot_point;
112 bool success = GetCursorDataFor(cursor_set_,
113 kImageCursorIds[i],
114 device_scale_factor,
115 &resource_id,
116 &hot_point);
117 DCHECK(success);
118 cursor_loader_->LoadImageCursor(kImageCursorIds[i], resource_id, hot_point);
119 }
120 for (size_t i = 0; i < arraysize(kAnimatedCursorIds); ++i) {
121 int resource_id = -1;
122 gfx::Point hot_point;
123 bool success = GetAnimatedCursorDataFor(cursor_set_,
124 kAnimatedCursorIds[i],
125 device_scale_factor,
126 &resource_id,
127 &hot_point);
128 DCHECK(success);
129 cursor_loader_->LoadAnimatedCursor(kAnimatedCursorIds[i],
130 resource_id,
131 hot_point,
132 kAnimatedCursorFrameDelayMs);
133 }
134 }
135
SetCursorSet(CursorSetType cursor_set)136 void ImageCursors::SetCursorSet(CursorSetType cursor_set) {
137 if (cursor_set_ == cursor_set)
138 return;
139
140 cursor_set_ = cursor_set;
141
142 if (cursor_loader_.get())
143 ReloadCursors();
144 }
145
SetPlatformCursor(gfx::NativeCursor * cursor)146 void ImageCursors::SetPlatformCursor(gfx::NativeCursor* cursor) {
147 cursor_loader_->SetPlatformCursor(cursor);
148 }
149
150 } // namespace ui
151