910e62b5创建于 1月15日历史提交
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef UI_WM_CORE_CURSOR_UTIL_H_
#define UI_WM_CORE_CURSOR_UTIL_H_

#include <optional>

#include "base/component_export.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
#include "ui/display/display.h"

class SkBitmap;

namespace gfx {
class Point;
}

namespace ui {
struct CursorData;
}  // namespace ui

namespace wm {

// Returns the cursor data corresponding to `type` and the rest of the
// parameters. If `target_cursor_size_in_px` presents, it will load the cursor
// resource and scale the bitmap and hotspot to match
// `target_cursor_size_in_px`, if not it will load the cursor resource and
// scale the bitmap and hotspot to match `scale`. The bitmap and hotspot are
// both in physical pixels.
COMPONENT_EXPORT(UI_WM)
std::optional<ui::CursorData> GetCursorData(
    ui::mojom::CursorType type,
    float scale,
    std::optional<int> target_cursor_size_in_px,
    display::Display::Rotation rotation,
    SkColor color);

// Scale and rotate the cursor's bitmap and hotpoint.
// `bitmap_in_out` and `hotpoint_in_out` are used as
// both input and output.
COMPONENT_EXPORT(UI_WM)
void ScaleAndRotateCursorBitmapAndHotpoint(float scale,
                                           display::Display::Rotation rotation,
                                           SkBitmap* bitmap_in_out,
                                           gfx::Point* hotpoint_in_out);

// Returns data about the cursor `type`. The IDR will be placed in `resource_id`
// and the hotspot in `point`. If `is_animated` is true it means the resource
// should be animated. Returns false if resource data for `type` isn't
// available.
COMPONENT_EXPORT(UI_WM)
bool GetCursorDataFor(ui::mojom::CursorType type,
                      int* resource_id,
                      gfx::Point* point,
                      bool* is_animated);

// Applies `cursor_color` on black pixels only and recolors `bitmap`.
// This is a fallback function to the cases when dynamic coloration with
// lottie is not feasible.
COMPONENT_EXPORT(UI_WM)
SkBitmap GetColorAdjustedBitmap(const SkBitmap& bitmap, SkColor cursor_color);

// Invalidates the cache of lottie animations for cursors. This is necessary
// when properties that affect cursor lottie animation rendering, like color,
// are changed.
COMPONENT_EXPORT(UI_WM)
void ClearCursorAnimationCache();

}  // namespace wm

#endif  // UI_WM_CORE_CURSOR_UTIL_H_