LibGfx: Add ImageCursor type and Cursor variant

Besides standard cursors, we also need to support custom images. For
now, everything still uses StandardCursor.
This commit is contained in:
Sam Atkins 2025-02-17 15:49:05 +00:00 committed by Andreas Kling
commit 1990b2fc52
Notes: github-actions[bot] 2025-02-28 12:52:16 +00:00
8 changed files with 104 additions and 39 deletions

View file

@ -8,6 +8,7 @@ set(SOURCES
CMYKBitmap.cpp
Color.cpp
ColorSpace.cpp
Cursor.cpp
FontCascadeList.cpp
Font/Font.cpp
Font/FontData.cpp

View file

@ -0,0 +1,40 @@
/*
* Copyright (c) 2025, Sam Atkins <sam@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibGfx/Cursor.h>
#include <LibIPC/Decoder.h>
#include <LibIPC/Encoder.h>
namespace Gfx {
bool ImageCursor::operator==(ImageCursor const& other) const
{
return hotspot == other.hotspot
&& bitmap.bitmap() == other.bitmap.bitmap();
}
}
namespace IPC {
template<>
ErrorOr<void> encode(Encoder& encoder, Gfx::ImageCursor const& image_cursor)
{
TRY(encoder.encode(image_cursor.bitmap));
TRY(encoder.encode(image_cursor.hotspot));
return {};
}
template<>
ErrorOr<Gfx::ImageCursor> decode(Decoder& decoder)
{
Gfx::ImageCursor result;
result.bitmap = TRY(decoder.decode<Gfx::ShareableBitmap>());
result.hotspot = TRY(decoder.decode<Gfx::IntPoint>());
return result;
}
}

60
Libraries/LibGfx/Cursor.h Normal file
View file

@ -0,0 +1,60 @@
/*
* Copyright (c) 2018-2020, Andreas Kling <andreas@ladybird.org>
* Copyright (c) 2025, Sam Atkins <sam@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/Variant.h>
#include <LibGfx/Point.h>
#include <LibGfx/ShareableBitmap.h>
#include <LibIPC/Forward.h>
namespace Gfx {
enum class StandardCursor {
None = 0,
Hidden,
Arrow,
Crosshair,
IBeam,
ResizeHorizontal,
ResizeVertical,
ResizeDiagonalTLBR,
ResizeDiagonalBLTR,
ResizeColumn,
ResizeRow,
Hand,
Help,
Drag,
DragCopy,
Move,
Wait,
Disallowed,
Eyedropper,
Zoom,
__Count,
};
struct ImageCursor {
ShareableBitmap bitmap;
IntPoint hotspot;
bool operator==(ImageCursor const& other) const;
};
using Cursor = Variant<StandardCursor, ImageCursor>;
}
namespace IPC {
template<>
ErrorOr<void> encode(Encoder&, Gfx::ImageCursor const&);
template<>
ErrorOr<Gfx::ImageCursor> decode(Decoder&);
}

View file

@ -1,35 +0,0 @@
/*
* Copyright (c) 2018-2020, Andreas Kling <andreas@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
namespace Gfx {
enum class StandardCursor {
None = 0,
Hidden,
Arrow,
Crosshair,
IBeam,
ResizeHorizontal,
ResizeVertical,
ResizeDiagonalTLBR,
ResizeDiagonalBLTR,
ResizeColumn,
ResizeRow,
Hand,
Help,
Drag,
DragCopy,
Move,
Wait,
Disallowed,
Eyedropper,
Zoom,
__Count,
};
}

View file

@ -16,13 +16,13 @@
#include <AK/Weakable.h>
#include <LibGC/Heap.h>
#include <LibGC/Root.h>
#include <LibGfx/Cursor.h>
#include <LibGfx/Forward.h>
#include <LibGfx/Palette.h>
#include <LibGfx/Point.h>
#include <LibGfx/Rect.h>
#include <LibGfx/ShareableBitmap.h>
#include <LibGfx/Size.h>
#include <LibGfx/StandardCursor.h>
#include <LibIPC/Forward.h>
#include <LibURL/URL.h>
#include <LibWeb/CSS/PreferredColorScheme.h>

View file

@ -16,8 +16,8 @@
#include <AK/String.h>
#include <LibCore/Forward.h>
#include <LibCore/Promise.h>
#include <LibGfx/Cursor.h>
#include <LibGfx/Forward.h>
#include <LibGfx/StandardCursor.h>
#include <LibWeb/Forward.h>
#include <LibWeb/HTML/ActivateTab.h>
#include <LibWeb/HTML/AudioPlayState.h>

View file

@ -10,7 +10,6 @@
#include <LibGfx/Point.h>
#include <LibGfx/Rect.h>
#include <LibGfx/Size.h>
#include <LibGfx/StandardCursor.h>
#include <LibWeb/CSS/PreferredColorScheme.h>
#include <LibWeb/CSS/PreferredContrast.h>
#include <LibWeb/CSS/PreferredMotion.h>

View file

@ -10,9 +10,9 @@
#include <AK/ByteString.h>
#include <AK/Function.h>
#include <AK/OwnPtr.h>
#include <LibGfx/Cursor.h>
#include <LibGfx/Forward.h>
#include <LibGfx/Rect.h>
#include <LibGfx/StandardCursor.h>
#include <LibURL/URL.h>
#include <LibWeb/CSS/PreferredColorScheme.h>
#include <LibWeb/CSS/PreferredContrast.h>