blob: 32ff66136497bbec28fb3e54baf6e23014e52905 [file] [log] [blame]
// Copyright 2014 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/image_cursors.h"
#include <float.h>
#include <stddef.h>
#include "base/logging.h"
#include "base/macros.h"
#include "base/strings/string16.h"
#include "ui/base/cursor/cursor.h"
#include "ui/base/cursor/cursor_loader.h"
#include "ui/base/cursor/cursors_aura.h"
#include "ui/display/display.h"
#include "ui/gfx/geometry/point.h"
namespace ui {
namespace {
const int kImageCursorIds[] = {
kCursorNull,
kCursorPointer,
kCursorNoDrop,
kCursorNotAllowed,
kCursorCopy,
kCursorHand,
kCursorMove,
kCursorNorthEastResize,
kCursorSouthWestResize,
kCursorSouthEastResize,
kCursorNorthWestResize,
kCursorNorthResize,
kCursorSouthResize,
kCursorEastResize,
kCursorWestResize,
kCursorIBeam,
kCursorAlias,
kCursorCell,
kCursorContextMenu,
kCursorCross,
kCursorHelp,
kCursorVerticalText,
kCursorZoomIn,
kCursorZoomOut,
kCursorRowResize,
kCursorColumnResize,
kCursorEastWestResize,
kCursorNorthSouthResize,
kCursorNorthEastSouthWestResize,
kCursorNorthWestSouthEastResize,
kCursorGrab,
kCursorGrabbing,
};
const int kAnimatedCursorIds[] = {
kCursorWait,
kCursorProgress
};
} // namespace
ImageCursors::ImageCursors() : cursor_set_(CURSOR_SET_NORMAL) {
}
ImageCursors::~ImageCursors() {
}
float ImageCursors::GetScale() const {
if (!cursor_loader_) {
NOTREACHED();
// Returning default on release build as it's not serious enough to crash
// even if this ever happens.
return 1.0f;
}
return cursor_loader_->scale();
}
display::Display::Rotation ImageCursors::GetRotation() const {
if (!cursor_loader_) {
NOTREACHED();
// Returning default on release build as it's not serious enough to crash
// even if this ever happens.
return display::Display::ROTATE_0;
}
return cursor_loader_->rotation();
}
bool ImageCursors::SetDisplay(const display::Display& display,
float scale_factor) {
if (!cursor_loader_) {
cursor_loader_.reset(CursorLoader::Create());
} else if (cursor_loader_->rotation() == display.rotation() &&
cursor_loader_->scale() == scale_factor) {
return false;
}
cursor_loader_->set_rotation(display.rotation());
cursor_loader_->set_scale(scale_factor);
ReloadCursors();
return true;
}
void ImageCursors::ReloadCursors() {
float device_scale_factor = cursor_loader_->scale();
cursor_loader_->UnloadAll();
for (size_t i = 0; i < arraysize(kImageCursorIds); ++i) {
int resource_id = -1;
gfx::Point hot_point;
bool success = GetCursorDataFor(cursor_set_,
kImageCursorIds[i],
device_scale_factor,
&resource_id,
&hot_point);
DCHECK(success);
cursor_loader_->LoadImageCursor(kImageCursorIds[i], resource_id, hot_point);
}
for (size_t i = 0; i < arraysize(kAnimatedCursorIds); ++i) {
int resource_id = -1;
gfx::Point hot_point;
bool success = GetAnimatedCursorDataFor(cursor_set_,
kAnimatedCursorIds[i],
device_scale_factor,
&resource_id,
&hot_point);
DCHECK(success);
cursor_loader_->LoadAnimatedCursor(kAnimatedCursorIds[i],
resource_id,
hot_point,
kAnimatedCursorFrameDelayMs);
}
}
void ImageCursors::SetCursorSet(CursorSetType cursor_set) {
if (cursor_set_ == cursor_set)
return;
cursor_set_ = cursor_set;
if (cursor_loader_.get())
ReloadCursors();
}
void ImageCursors::SetPlatformCursor(gfx::NativeCursor* cursor) {
cursor_loader_->SetPlatformCursor(cursor);
}
} // namespace ui