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)#ifndef UI_BASE_CURSOR_OZONE_BITMAP_CURSOR_FACTORY_OZONE_H_
623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define UI_BASE_CURSOR_OZONE_BITMAP_CURSOR_FACTORY_OZONE_H_
723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include <map>
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/memory/ref_counted.h"
1123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h"
1223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/base/cursor/cursor.h"
1323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/base/ui_base_export.h"
1423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/gfx/geometry/point.h"
156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ui/ozone/public/cursor_factory_ozone.h"
1623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace ui {
1823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// A cursor that is an SkBitmap combined with a gfx::Point hotspot.
2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class UI_BASE_EXPORT BitmapCursorOzone
2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    : public base::RefCounted<BitmapCursorOzone> {
2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) public:
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BitmapCursorOzone(const SkBitmap& bitmap, const gfx::Point& hotspot);
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BitmapCursorOzone(const std::vector<SkBitmap>& bitmaps,
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    const gfx::Point& hotspot,
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    int frame_delay_ms);
2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gfx::Point& hotspot();
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const SkBitmap& bitmap();
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // For animated cursors.
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::vector<SkBitmap>& bitmaps();
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int frame_delay_ms();
3423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
3523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) private:
3623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  friend class base::RefCounted<BitmapCursorOzone>;
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ~BitmapCursorOzone();
3823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<SkBitmap> bitmaps_;
4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  gfx::Point hotspot_;
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int frame_delay_ms_;
42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DISALLOW_COPY_AND_ASSIGN(BitmapCursorOzone);
4423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)};
4523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// CursorFactoryOzone implementation for bitmapped cursors.
4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)//
4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// This is a base class for platforms where PlatformCursor is an SkBitmap
4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// combined with a gfx::Point for the hotspot.
5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)//
5123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Subclasses need only implement SetBitmapCursor() as everything else is
5223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// implemented here.
5323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class UI_BASE_EXPORT BitmapCursorFactoryOzone : public CursorFactoryOzone {
5423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) public:
5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  BitmapCursorFactoryOzone();
5623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual ~BitmapCursorFactoryOzone();
5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Convert PlatformCursor to BitmapCursorOzone.
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static scoped_refptr<BitmapCursorOzone> GetBitmapCursor(
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      PlatformCursor platform_cursor);
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // CursorFactoryOzone:
6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual PlatformCursor GetDefaultCursor(int type) OVERRIDE;
6423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual PlatformCursor CreateImageCursor(const SkBitmap& bitmap,
6523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                           const gfx::Point& hotspot) OVERRIDE;
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual PlatformCursor CreateAnimatedCursor(
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const std::vector<SkBitmap>& bitmaps,
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const gfx::Point& hotspot,
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      int frame_delay_ms) OVERRIDE;
7023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual void RefImageCursor(PlatformCursor cursor) OVERRIDE;
7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual void UnrefImageCursor(PlatformCursor cursor) OVERRIDE;
72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private:
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Get cached BitmapCursorOzone for a default cursor.
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<BitmapCursorOzone> GetDefaultCursorInternal(int type);
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Default cursors are cached & owned by the factory.
78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  typedef std::map<int, scoped_refptr<BitmapCursorOzone> > DefaultCursorMap;
79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DefaultCursorMap default_cursors_;
80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DISALLOW_COPY_AND_ASSIGN(BitmapCursorFactoryOzone);
8223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)};
8323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
8423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}  // namespace ui
8523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
8623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif  // UI_BASE_CURSOR_OZONE_BITMAP_CURSOR_FACTORY_OZONE_H_
87