blob: bb5947a57e60e422d84e049bde2fef15d6bf5d04 [file] [log] [blame]
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/base/cursor/cursors_aura.h"
#include "grit/ui_resources.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/point.h"
namespace ui {
namespace {
struct HotPoint {
int x;
int y;
};
struct CursorData {
int id;
int resource_id;
HotPoint hot_1x;
HotPoint hot_2x;
};
struct CursorSet {
const CursorSetType id;
const CursorData* cursors;
const int length;
const CursorData* animated_cursors;
const int animated_length;
};
const CursorData kNormalCursors[] = {
{ui::kCursorNull, IDR_AURA_CURSOR_PTR, {4, 4}, {8, 9}},
{ui::kCursorPointer, IDR_AURA_CURSOR_PTR, {4, 4}, {8, 9}},
{ui::kCursorNoDrop, IDR_AURA_CURSOR_NO_DROP, {9, 9}, {18, 18}},
{ui::kCursorNotAllowed, IDR_AURA_CURSOR_NO_DROP, {9, 9}, {18, 18}},
{ui::kCursorCopy, IDR_AURA_CURSOR_COPY, {9, 9}, {18, 18}},
{ui::kCursorHand, IDR_AURA_CURSOR_HAND, {9, 4}, {19, 8}},
{ui::kCursorMove, IDR_AURA_CURSOR_MOVE, {11, 11}, {23, 23}},
{ui::kCursorNorthEastResize, IDR_AURA_CURSOR_NORTH_EAST_RESIZE,
{12, 11}, {25, 23}},
{ui::kCursorSouthWestResize, IDR_AURA_CURSOR_SOUTH_WEST_RESIZE,
{12, 11}, {25, 23}},
{ui::kCursorSouthEastResize, IDR_AURA_CURSOR_SOUTH_EAST_RESIZE,
{11, 11}, {24, 23}},
{ui::kCursorNorthWestResize, IDR_AURA_CURSOR_NORTH_WEST_RESIZE,
{11, 11}, {24, 23}},
{ui::kCursorNorthResize, IDR_AURA_CURSOR_NORTH_RESIZE, {11, 12}, {23, 23}},
{ui::kCursorSouthResize, IDR_AURA_CURSOR_SOUTH_RESIZE, {11, 12}, {23, 23}},
{ui::kCursorEastResize, IDR_AURA_CURSOR_EAST_RESIZE, {12, 11}, {25, 23}},
{ui::kCursorWestResize, IDR_AURA_CURSOR_WEST_RESIZE, {12, 11}, {25, 23}},
{ui::kCursorIBeam, IDR_AURA_CURSOR_IBEAM, {12, 12}, {24, 25}},
{ui::kCursorAlias, IDR_AURA_CURSOR_ALIAS, {8, 6}, {15, 11}},
{ui::kCursorCell, IDR_AURA_CURSOR_CELL, {11, 11}, {24, 23}},
{ui::kCursorContextMenu, IDR_AURA_CURSOR_CONTEXT_MENU, {4, 4}, {8, 9}},
{ui::kCursorCross, IDR_AURA_CURSOR_CROSSHAIR, {12, 12}, {25, 23}},
{ui::kCursorHelp, IDR_AURA_CURSOR_HELP, {4, 4}, {8, 9}},
{ui::kCursorVerticalText, IDR_AURA_CURSOR_XTERM_HORIZ, {12, 11}, {26, 23}},
{ui::kCursorZoomIn, IDR_AURA_CURSOR_ZOOM_IN, {10, 10}, {20, 20}},
{ui::kCursorZoomOut, IDR_AURA_CURSOR_ZOOM_OUT, {10, 10}, {20, 20}},
{ui::kCursorRowResize, IDR_AURA_CURSOR_ROW_RESIZE, {11, 12}, {23, 23}},
{ui::kCursorColumnResize, IDR_AURA_CURSOR_COL_RESIZE, {12, 11}, {25, 23}},
{ui::kCursorEastWestResize, IDR_AURA_CURSOR_EAST_WEST_RESIZE,
{12, 11}, {25, 23}},
{ui::kCursorNorthSouthResize, IDR_AURA_CURSOR_NORTH_SOUTH_RESIZE,
{11, 12}, {23, 23}},
{ui::kCursorNorthEastSouthWestResize,
IDR_AURA_CURSOR_NORTH_EAST_SOUTH_WEST_RESIZE, {12, 11}, {25, 23}},
{ui::kCursorNorthWestSouthEastResize,
IDR_AURA_CURSOR_NORTH_WEST_SOUTH_EAST_RESIZE, {11, 11}, {24, 23}},
{ui::kCursorGrab, IDR_AURA_CURSOR_GRAB, {8, 5}, {16, 10}},
{ui::kCursorGrabbing, IDR_AURA_CURSOR_GRABBING, {9, 9}, {18, 18}},
};
const CursorData kLargeCursors[] = {
{ui::kCursorNull, IDR_AURA_CURSOR_BIG_PTR, {10, 10}, {10, 10}},
{ui::kCursorPointer, IDR_AURA_CURSOR_BIG_PTR, {10, 10}, {10, 10}},
{ui::kCursorNoDrop, IDR_AURA_CURSOR_BIG_NO_DROP, {23, 23}, {23, 23}},
{ui::kCursorNotAllowed, IDR_AURA_CURSOR_BIG_NO_DROP, {23, 23}, {23, 23}},
{ui::kCursorCopy, IDR_AURA_CURSOR_BIG_COPY, {23, 23}, {23, 23}},
{ui::kCursorHand, IDR_AURA_CURSOR_BIG_HAND, {23, 10}, {23, 10}},
{ui::kCursorMove, IDR_AURA_CURSOR_BIG_MOVE, {28, 28}, {28, 28}},
{ui::kCursorNorthEastResize, IDR_AURA_CURSOR_BIG_NORTH_EAST_RESIZE,
{31, 28}, {31, 28}},
{ui::kCursorSouthWestResize, IDR_AURA_CURSOR_BIG_SOUTH_WEST_RESIZE,
{31, 28}, {31, 28}},
{ui::kCursorSouthEastResize, IDR_AURA_CURSOR_BIG_SOUTH_EAST_RESIZE,
{28, 28}, {28, 28}},
{ui::kCursorNorthWestResize, IDR_AURA_CURSOR_BIG_NORTH_WEST_RESIZE,
{28, 28}, {28, 28}},
{ui::kCursorNorthResize, IDR_AURA_CURSOR_BIG_NORTH_RESIZE,
{28, 31}, {28, 31}},
{ui::kCursorSouthResize, IDR_AURA_CURSOR_BIG_SOUTH_RESIZE,
{28, 31}, {28, 31}},
{ui::kCursorEastResize, IDR_AURA_CURSOR_BIG_EAST_RESIZE, {31, 28}, {31, 28}},
{ui::kCursorWestResize, IDR_AURA_CURSOR_BIG_WEST_RESIZE, {31, 28}, {31, 28}},
{ui::kCursorIBeam, IDR_AURA_CURSOR_BIG_IBEAM, {31, 31}, {31, 31}},
{ui::kCursorAlias, IDR_AURA_CURSOR_BIG_ALIAS, {51, 15}, {51, 11}},
{ui::kCursorCell, IDR_AURA_CURSOR_BIG_CELL, {28, 28}, {24, 23}},
{ui::kCursorContextMenu, IDR_AURA_CURSOR_BIG_CONTEXT_MENU, {4, 4}, {8, 9}},
{ui::kCursorCross, IDR_AURA_CURSOR_BIG_CROSSHAIR, {31, 31}, {31, 31}},
{ui::kCursorHelp, IDR_AURA_CURSOR_BIG_HELP, {10, 10}, {8, 9}},
{ui::kCursorVerticalText, IDR_AURA_CURSOR_BIG_XTERM_HORIZ,
{31, 28}, {31, 28}},
{ui::kCursorZoomIn, IDR_AURA_CURSOR_BIG_ZOOM_IN, {26, 26}, {26, 26}},
{ui::kCursorZoomOut, IDR_AURA_CURSOR_BIG_ZOOM_OUT, {26, 26}, {26, 26}},
{ui::kCursorRowResize, IDR_AURA_CURSOR_BIG_ROW_RESIZE, {28, 31}, {28, 31}},
{ui::kCursorColumnResize, IDR_AURA_CURSOR_BIG_COL_RESIZE, {31, 28}, {31, 28}},
{ui::kCursorEastWestResize, IDR_AURA_CURSOR_BIG_EAST_WEST_RESIZE,
{31, 28}, {31, 28}},
{ui::kCursorNorthSouthResize, IDR_AURA_CURSOR_BIG_NORTH_SOUTH_RESIZE,
{28, 31}, {28, 31}},
{ui::kCursorNorthEastSouthWestResize,
IDR_AURA_CURSOR_BIG_NORTH_EAST_SOUTH_WEST_RESIZE, {31, 28}, {31, 28}},
{ui::kCursorNorthWestSouthEastResize,
IDR_AURA_CURSOR_BIG_NORTH_WEST_SOUTH_EAST_RESIZE, {28, 28}, {28, 28}},
{ui::kCursorGrab, IDR_AURA_CURSOR_BIG_GRAB, {20, 13}, {20, 13}},
{ui::kCursorGrabbing, IDR_AURA_CURSOR_BIG_GRABBING, {23, 23}, {23, 23}},
};
const CursorData kAnimatedCursors[] = {
{ui::kCursorWait, IDR_THROBBER, {7, 7}, {14, 14}},
{ui::kCursorProgress, IDR_THROBBER, {7, 7}, {14, 14}},
};
const CursorSet kCursorSets[] = {
{
CURSOR_SET_NORMAL,
kNormalCursors, arraysize(kNormalCursors),
kAnimatedCursors, arraysize(kAnimatedCursors)
},
{
CURSOR_SET_LARGE,
kLargeCursors, arraysize(kLargeCursors),
// TODO(yoshiki): Replace animated cursors with big assets. crbug.com/247254
kAnimatedCursors, arraysize(kAnimatedCursors)
},
};
const CursorSet* GetCursorSetByType(CursorSetType cursor_set_id) {
for (size_t i = 0; i < arraysize(kCursorSets); ++i) {
if (kCursorSets[i].id == cursor_set_id)
return &kCursorSets[i];
}
return NULL;
}
bool SearchTable(const CursorData* table,
size_t table_length,
int id,
float scale_factor,
int* resource_id,
gfx::Point* point) {
bool resource_2x_available =
ResourceBundle::GetSharedInstance().max_scale_factor() ==
SCALE_FACTOR_200P;
for (size_t i = 0; i < table_length; ++i) {
if (table[i].id == id) {
*resource_id = table[i].resource_id;
*point = scale_factor == 1.0f || !resource_2x_available ?
gfx::Point(table[i].hot_1x.x, table[i].hot_1x.y) :
gfx::Point(table[i].hot_2x.x, table[i].hot_2x.y);
return true;
}
}
return false;
}
} // namespace
bool GetCursorDataFor(CursorSetType cursor_set_id,
int id,
float scale_factor,
int* resource_id,
gfx::Point* point) {
const CursorSet* cursor_set = GetCursorSetByType(cursor_set_id);
if (cursor_set &&
SearchTable(cursor_set->cursors,
cursor_set->length,
id, scale_factor, resource_id, point)) {
return true;
}
// Falls back to the default cursor set.
cursor_set = GetCursorSetByType(ui::CURSOR_SET_NORMAL);
DCHECK(cursor_set);
return SearchTable(cursor_set->cursors,
cursor_set->length,
id, scale_factor, resource_id, point);
}
bool GetAnimatedCursorDataFor(CursorSetType cursor_set_id,
int id,
float scale_factor,
int* resource_id,
gfx::Point* point) {
const CursorSet* cursor_set = GetCursorSetByType(cursor_set_id);
if (cursor_set &&
SearchTable(cursor_set->animated_cursors,
cursor_set->animated_length,
id, scale_factor, resource_id, point)) {
return true;
}
// Falls back to the default cursor set.
cursor_set = GetCursorSetByType(ui::CURSOR_SET_NORMAL);
DCHECK(cursor_set);
return SearchTable(cursor_set->animated_cursors,
cursor_set->animated_length,
id, scale_factor, resource_id, point);
}
} // namespace ui