#ifdef UNSAFE_BUFFERS_BUILD
#pragma allow_unsafe_buffers
#endif
#include "ui/wm/core/cursor_util.h"
#include <cfloat>
#include <memory>
#include <optional>
#include "base/check_op.h"
#include "base/containers/contains.h"
#include "base/containers/flat_map.h"
#include "base/no_destructor.h"
#include "base/notreached.h"
#include "base/ranges/algorithm.h"
#include "cc/paint/skottie_wrapper.h"
#include "skia/ext/image_operations.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/base/cursor/cursor.h"
#include "ui/base/cursor/cursor_size.h"
#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/base/resource/resource_scale_factor.h"
#include "ui/display/display_transform.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/geometry/skia_conversions.h"
#include "ui/gfx/geometry/transform.h"
#include "ui/gfx/image/image_skia.h"
#include "ui/gfx/image/image_skia_rep.h"
#include "ui/gfx/skbitmap_operations.h"
#include "ui/lottie/animation.h"
#include "ui/resources/grit/ui_resources.h"
namespace wm {
namespace {
CursorType;
AnimationCache;
AnimationCache& GetAnimationCache() { … }
bool ConvertSkBitmapAlphaType(SkBitmap* bitmap, SkAlphaType alpha_type) { … }
void RotateCursorHotpoint(display::Display::Rotation rotation,
int cursor_bitmap_width,
int cursor_bitmap_height,
gfx::Point* hotpoint_in_out) { … }
void RotateCursorBitmapAndHotpoint(display::Display::Rotation rotation,
SkBitmap* bitmap_in_out,
gfx::Point* hotpoint_in_out) { … }
void CreateBitmapsFromPixels(const gfx::ImageSkiaRep& image_rep,
float scale,
display::Display::Rotation rotation,
bool is_animated,
std::vector<SkBitmap>* bitmaps_out,
gfx::Point* hotspot_in_out) { … }
void CreateBitmapsFromStaticLottie(const gfx::ImageSkiaRep& image_rep,
const gfx::Size& scaled_size,
float scale,
const gfx::Transform& rotation_transform,
std::vector<SkBitmap>* bitmaps_out) { … }
void CreateBitmapsFromAnimatedLottie(int resource_id,
const gfx::Size& scaled_size,
float scale,
const gfx::Transform& rotation_transform,
CursorType type,
std::vector<SkBitmap>* bitmaps_out) { … }
struct CursorResourceData { … };
constexpr std::optional<CursorResourceData> kNormalCursorResourceData[] = …;
static_assert …;
constexpr std::optional<CursorResourceData> kLargeCursorResourceData[] = …;
static_assert …;
}
std::optional<ui::CursorData> GetCursorData(
CursorType type,
ui::CursorSize size,
float scale,
std::optional<int> target_cursor_size_in_px,
display::Display::Rotation rotation) { … }
void ScaleAndRotateCursorBitmapAndHotpoint(float scale,
display::Display::Rotation rotation,
SkBitmap* bitmap,
gfx::Point* hotpoint) { … }
bool GetCursorDataFor(ui::CursorSize cursor_size,
CursorType type,
float scale_factor,
int* resource_id,
gfx::Point* point,
bool* is_animated) { … }
}