123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// found in the LICENSE file.
423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h"
623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/logging.h"
8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "third_party/skia/include/core/SkBitmap.h"
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/base/cursor/cursors_aura.h"
1023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace ui {
1223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace {
1423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)BitmapCursorOzone* ToBitmapCursorOzone(PlatformCursor cursor) {
1623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return static_cast<BitmapCursorOzone*>(cursor);
1723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
1823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)PlatformCursor ToPlatformCursor(BitmapCursorOzone* cursor) {
2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return static_cast<PlatformCursor>(cursor);
2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_refptr<BitmapCursorOzone> CreateDefaultBitmapCursor(int type) {
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SkBitmap bitmap;
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::Point hotspot;
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (GetCursorBitmap(type, &bitmap, &hotspot))
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return new BitmapCursorOzone(bitmap, hotspot);
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return NULL;
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}  // namespace
3223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciBitmapCursorOzone::BitmapCursorOzone(const SkBitmap& bitmap,
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                     const gfx::Point& hotspot)
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : hotspot_(hotspot), frame_delay_ms_(0) {
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bitmaps_.push_back(bitmap);
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciBitmapCursorOzone::BitmapCursorOzone(const std::vector<SkBitmap>& bitmaps,
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                     const gfx::Point& hotspot,
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                     int frame_delay_ms)
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : bitmaps_(bitmaps), hotspot_(hotspot), frame_delay_ms_(frame_delay_ms) {
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_LT(0U, bitmaps.size());
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_LE(0, frame_delay_ms);
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciBitmapCursorOzone::~BitmapCursorOzone() {
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst gfx::Point& BitmapCursorOzone::hotspot() {
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return hotspot_;
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst SkBitmap& BitmapCursorOzone::bitmap() {
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return bitmaps_[0];
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst std::vector<SkBitmap>& BitmapCursorOzone::bitmaps() {
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return bitmaps_;
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint BitmapCursorOzone::frame_delay_ms() {
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return frame_delay_ms_;
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)BitmapCursorFactoryOzone::BitmapCursorFactoryOzone() {}
6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)BitmapCursorFactoryOzone::~BitmapCursorFactoryOzone() {}
6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_refptr<BitmapCursorOzone> BitmapCursorFactoryOzone::GetBitmapCursor(
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PlatformCursor platform_cursor) {
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return make_scoped_refptr(ToBitmapCursorOzone(platform_cursor));
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPlatformCursor BitmapCursorFactoryOzone::GetDefaultCursor(int type) {
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return GetDefaultCursorInternal(type).get();
7823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
7923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
8023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)PlatformCursor BitmapCursorFactoryOzone::CreateImageCursor(
8123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    const SkBitmap& bitmap,
8223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    const gfx::Point& hotspot) {
8323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  BitmapCursorOzone* cursor = new BitmapCursorOzone(bitmap, hotspot);
8423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  cursor->AddRef();  // Balanced by UnrefImageCursor.
8523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return ToPlatformCursor(cursor);
8623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
8723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPlatformCursor BitmapCursorFactoryOzone::CreateAnimatedCursor(
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::vector<SkBitmap>& bitmaps,
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const gfx::Point& hotspot,
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int frame_delay_ms) {
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_LT(0U, bitmaps.size());
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BitmapCursorOzone* cursor =
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new BitmapCursorOzone(bitmaps, hotspot, frame_delay_ms);
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cursor->AddRef();  // Balanced by UnrefImageCursor.
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return ToPlatformCursor(cursor);
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
9923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void BitmapCursorFactoryOzone::RefImageCursor(PlatformCursor cursor) {
10023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ToBitmapCursorOzone(cursor)->AddRef();
10123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
10223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
10323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void BitmapCursorFactoryOzone::UnrefImageCursor(PlatformCursor cursor) {
10423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ToBitmapCursorOzone(cursor)->Release();
10523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
10623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_refptr<BitmapCursorOzone>
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciBitmapCursorFactoryOzone::GetDefaultCursorInternal(int type) {
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (type == kCursorNone)
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;  // NULL is used for hidden cursor.
11123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!default_cursors_.count(type)) {
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Create new image cursor from default aura bitmap for this type. We hold a
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // ref forever because clients do not do refcounting for default cursors.
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_refptr<BitmapCursorOzone> cursor = CreateDefaultBitmapCursor(type);
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!cursor.get() && type != kCursorPointer)
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      cursor = GetDefaultCursorInternal(kCursorPointer);
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DCHECK(cursor.get()) << "Failed to load default cursor bitmap";
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default_cursors_[type] = cursor;
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returned owned default cursor for this type.
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return default_cursors_[type];
12423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
12523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
12623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}  // namespace ui
127