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