Home | History | Annotate | Download | only in cursor
      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 
     12 namespace ui {
     13 namespace {
     14 
     15 struct HotPoint {
     16   int x;
     17   int y;
     18 };
     19 
     20 struct CursorData {
     21   int id;
     22   int resource_id;
     23   HotPoint hot_1x;
     24   HotPoint hot_2x;
     25 };
     26 
     27 const 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 
     70 const CursorData kAnimatedCursors[] = {
     71   {ui::kCursorWait, IDR_THROBBER, {7, 7}, {14, 14}},
     72   {ui::kCursorProgress, IDR_THROBBER, {7, 7}, {14, 14}},
     73 };
     74 
     75 bool 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 
     99 bool 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 
    107 bool 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