1// Copyright (c) 2013 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/cursors_aura.h"
6
7#include "grit/ui_resources.h"
8#include "ui/base/cursor/cursor.h"
9#include "ui/base/resource/resource_bundle.h"
10#include "ui/gfx/point.h"
11
12namespace ui {
13namespace {
14
15struct HotPoint {
16  int x;
17  int y;
18};
19
20struct CursorData {
21  int id;
22  int resource_id;
23  HotPoint hot_1x;
24  HotPoint hot_2x;
25};
26
27const CursorData kImageCursors[] = {
28  {ui::kCursorNull, IDR_AURA_CURSOR_PTR, {4, 4}, {8, 9}},
29  {ui::kCursorPointer, IDR_AURA_CURSOR_PTR, {4, 4}, {8, 9}},
30  {ui::kCursorNoDrop, IDR_AURA_CURSOR_NO_DROP, {9, 9}, {18, 18}},
31  {ui::kCursorNotAllowed, IDR_AURA_CURSOR_NO_DROP, {9, 9}, {18, 18}},
32  {ui::kCursorCopy, IDR_AURA_CURSOR_COPY, {9, 9}, {18, 18}},
33  {ui::kCursorHand, IDR_AURA_CURSOR_HAND, {9, 4}, {19, 8}},
34  {ui::kCursorMove, IDR_AURA_CURSOR_MOVE, {11, 11}, {23, 23}},
35  {ui::kCursorNorthEastResize, IDR_AURA_CURSOR_NORTH_EAST_RESIZE,
36   {12, 11}, {25, 23}},
37  {ui::kCursorSouthWestResize, IDR_AURA_CURSOR_SOUTH_WEST_RESIZE,
38   {12, 11}, {25, 23}},
39  {ui::kCursorSouthEastResize, IDR_AURA_CURSOR_SOUTH_EAST_RESIZE,
40   {11, 11}, {24, 23}},
41  {ui::kCursorNorthWestResize, IDR_AURA_CURSOR_NORTH_WEST_RESIZE,
42   {11, 11}, {24, 23}},
43  {ui::kCursorNorthResize, IDR_AURA_CURSOR_NORTH_RESIZE, {11, 12}, {23, 23}},
44  {ui::kCursorSouthResize, IDR_AURA_CURSOR_SOUTH_RESIZE, {11, 12}, {23, 23}},
45  {ui::kCursorEastResize, IDR_AURA_CURSOR_EAST_RESIZE, {12, 11}, {25, 23}},
46  {ui::kCursorWestResize, IDR_AURA_CURSOR_WEST_RESIZE, {12, 11}, {25, 23}},
47  {ui::kCursorIBeam, IDR_AURA_CURSOR_IBEAM, {12, 12}, {24, 25}},
48  {ui::kCursorAlias, IDR_AURA_CURSOR_ALIAS, {8, 6}, {15, 11}},
49  {ui::kCursorCell, IDR_AURA_CURSOR_CELL, {11, 11}, {24, 23}},
50  {ui::kCursorContextMenu, IDR_AURA_CURSOR_CONTEXT_MENU, {4, 4}, {8, 9}},
51  {ui::kCursorCross, IDR_AURA_CURSOR_CROSSHAIR, {12, 12}, {25, 23}},
52  {ui::kCursorHelp, IDR_AURA_CURSOR_HELP, {4, 4}, {8, 9}},
53  {ui::kCursorVerticalText, IDR_AURA_CURSOR_XTERM_HORIZ, {12, 11}, {26, 23}},
54  {ui::kCursorZoomIn, IDR_AURA_CURSOR_ZOOM_IN, {10, 10}, {20, 20}},
55  {ui::kCursorZoomOut, IDR_AURA_CURSOR_ZOOM_OUT, {10, 10}, {20, 20}},
56  {ui::kCursorRowResize, IDR_AURA_CURSOR_ROW_RESIZE, {11, 12}, {23, 23}},
57  {ui::kCursorColumnResize, IDR_AURA_CURSOR_COL_RESIZE, {12, 11}, {25, 23}},
58  {ui::kCursorEastWestResize, IDR_AURA_CURSOR_EAST_WEST_RESIZE,
59   {12, 11}, {25, 23}},
60  {ui::kCursorNorthSouthResize, IDR_AURA_CURSOR_NORTH_SOUTH_RESIZE,
61   {11, 12}, {23, 23}},
62  {ui::kCursorNorthEastSouthWestResize,
63   IDR_AURA_CURSOR_NORTH_EAST_SOUTH_WEST_RESIZE, {12, 11}, {25, 23}},
64  {ui::kCursorNorthWestSouthEastResize,
65   IDR_AURA_CURSOR_NORTH_WEST_SOUTH_EAST_RESIZE, {11, 11}, {24, 23}},
66  {ui::kCursorGrab, IDR_AURA_CURSOR_GRAB, {8, 5}, {16, 10}},
67  {ui::kCursorGrabbing, IDR_AURA_CURSOR_GRABBING, {9, 9}, {18, 18}},
68};
69
70const CursorData kAnimatedCursors[] = {
71  {ui::kCursorWait, IDR_THROBBER, {7, 7}, {14, 14}},
72  {ui::kCursorProgress, IDR_THROBBER, {7, 7}, {14, 14}},
73};
74
75bool SearchTable(const CursorData* table,
76                 size_t table_length,
77                 int id,
78                 float scale_factor,
79                 int* resource_id,
80                 gfx::Point* point) {
81  bool resource_2x_available =
82      ResourceBundle::GetSharedInstance().max_scale_factor() ==
83      SCALE_FACTOR_200P;
84  for (size_t i = 0; i < table_length; ++i) {
85    if (table[i].id == id) {
86      *resource_id = table[i].resource_id;
87      *point = scale_factor == 1.0f || !resource_2x_available ?
88               gfx::Point(table[i].hot_1x.x, table[i].hot_1x.y) :
89               gfx::Point(table[i].hot_2x.x, table[i].hot_2x.y);
90      return true;
91    }
92  }
93
94  return false;
95}
96
97}  // namespace
98
99bool GetCursorDataFor(int id,
100                      float scale_factor,
101                      int* resource_id,
102                      gfx::Point* point) {
103  return SearchTable(kImageCursors, arraysize(kImageCursors),
104                     id, scale_factor, resource_id, point);
105}
106
107bool GetAnimatedCursorDataFor(int id,
108                              float scale_factor,
109                              int* resource_id,
110                              gfx::Point* point) {
111  return SearchTable(kAnimatedCursors, arraysize(kAnimatedCursors),
112                     id, scale_factor, resource_id, point);
113}
114
115}  // namespace ui
116