#ifndef UI_WM_CORE_CURSOR_LOADER_H_
#define UI_WM_CORE_CURSOR_LOADER_H_
#include <map>
#include <memory>
#include "base/component_export.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "ui/aura/client/cursor_shape_client.h"
#include "ui/base/cursor/cursor.h"
#include "ui/base/cursor/cursor_factory.h"
#include "ui/base/cursor/cursor_size.h"
#include "ui/base/cursor/mojom/cursor_type.mojom-forward.h"
#include "ui/display/display.h"
namespace ui {
class PlatformCursor;
}
namespace wm {
class COMPONENT_EXPORT(UI_WM) CursorLoader
: public aura::client::CursorShapeClient,
public ui::CursorFactoryObserver {
public:
explicit CursorLoader(bool use_platform_cursors = true);
CursorLoader(const CursorLoader&) = delete;
CursorLoader& operator=(const CursorLoader&) = delete;
~CursorLoader() override;
void OnThemeLoaded() override;
display::Display::Rotation rotation() const { return rotation_; }
bool SetDisplay(const display::Display& display);
void SetSize(ui::CursorSize size);
ui::CursorSize size() const { return size_; }
void SetLargeCursorSizeInDip(int large_cursor_size_in_dip);
int large_cursor_size_in_dip() const { return large_cursor_size_in_dip_; }
void SetColor(SkColor color);
void SetPlatformCursor(ui::Cursor* cursor);
std::optional<ui::CursorData> GetCursorData(
const ui::Cursor& cursor) const override;
private:
void UnloadCursors();
void ApplyColorAndLargeSize(ui::CursorData& data_in_and_out) const;
scoped_refptr<ui::PlatformCursor> CursorFromType(ui::mojom::CursorType type);
scoped_refptr<ui::PlatformCursor> LoadCursorFromAsset(
ui::mojom::CursorType type);
const bool use_platform_cursors_;
std::map<ui::mojom::CursorType, scoped_refptr<ui::PlatformCursor>>
image_cursors_;
raw_ptr<ui::CursorFactory> factory_ = nullptr;
float scale_ = 1.0f;
float resource_scale_ = 1.0f;
display::Display::Rotation rotation_ = display::Display::ROTATE_0;
ui::CursorSize size_ = ui::CursorSize::kNormal;
int large_cursor_size_in_dip_ = ui::kDefaultLargeCursorSize;
SkColor color_ = ui::kDefaultCursorColor;
};
}
#endif