From 73f14f30d691b02cb202765b7a6cdb9e0645d473 Mon Sep 17 00:00:00 2001 From: R-Goc Date: Fri, 5 Dec 2025 01:12:13 +0100 Subject: [PATCH 1/2] LibGfx: Enable explicit symbol export This commit enables explicit symbol export for LibGfx. This decreases the number of exported symbols from around ~1500 to ~400. --- Libraries/LibGfx/AffineTransform.cpp | 7 ++++--- Libraries/LibGfx/AffineTransform.h | 3 ++- Libraries/LibGfx/Bitmap.h | 5 +++-- Libraries/LibGfx/BitmapSequence.h | 5 +++-- Libraries/LibGfx/CMakeLists.txt | 2 +- Libraries/LibGfx/Color.h | 9 +++++---- Libraries/LibGfx/ColorSpace.h | 7 ++++--- Libraries/LibGfx/Cursor.h | 7 ++++--- Libraries/LibGfx/Filter.h | 3 ++- Libraries/LibGfx/Font/Font.h | 3 ++- Libraries/LibGfx/Font/FontDatabase.h | 5 +++-- Libraries/LibGfx/Font/FontSupport.h | 5 +++-- Libraries/LibGfx/Font/GlobalFontConfig.h | 3 ++- Libraries/LibGfx/Font/PathFontProvider.h | 3 ++- Libraries/LibGfx/Font/Typeface.h | 3 ++- Libraries/LibGfx/Font/WOFF/Loader.h | 3 ++- Libraries/LibGfx/Font/WOFF2/Loader.h | 3 ++- Libraries/LibGfx/FontCascadeList.h | 3 ++- Libraries/LibGfx/Gradients.h | 3 ++- Libraries/LibGfx/ImageFormats/AVIFLoader.h | 3 ++- Libraries/LibGfx/ImageFormats/BMPLoader.h | 3 ++- Libraries/LibGfx/ImageFormats/BMPWriter.h | 3 ++- Libraries/LibGfx/ImageFormats/GIFLoader.h | 3 ++- Libraries/LibGfx/ImageFormats/ICOLoader.h | 3 ++- Libraries/LibGfx/ImageFormats/ImageDecoder.h | 3 ++- Libraries/LibGfx/ImageFormats/JPEGLoader.h | 3 ++- Libraries/LibGfx/ImageFormats/JPEGWriter.h | 3 ++- Libraries/LibGfx/ImageFormats/JPEGXLLoader.h | 3 ++- Libraries/LibGfx/ImageFormats/PNGLoader.h | 3 ++- Libraries/LibGfx/ImageFormats/PNGWriter.h | 3 ++- Libraries/LibGfx/ImageFormats/TIFFLoader.h | 3 ++- Libraries/LibGfx/ImageFormats/TinyVGLoader.h | 12 +++--------- Libraries/LibGfx/ImageFormats/WebPLoader.h | 3 ++- Libraries/LibGfx/ImageFormats/WebPWriter.h | 3 ++- Libraries/LibGfx/ImmutableBitmap.h | 5 +++-- Libraries/LibGfx/MetalContext.h | 3 ++- Libraries/LibGfx/PaintStyle.h | 3 ++- Libraries/LibGfx/Painter.h | 3 ++- Libraries/LibGfx/PainterSkia.h | 3 ++- Libraries/LibGfx/PaintingSurface.h | 3 ++- Libraries/LibGfx/Palette.h | 5 +++-- Libraries/LibGfx/Path.h | 3 ++- Libraries/LibGfx/Point.h | 9 +++++---- Libraries/LibGfx/Rect.h | 5 +++-- Libraries/LibGfx/ShareableBitmap.h | 7 ++++--- Libraries/LibGfx/Size.h | 5 +++-- Libraries/LibGfx/SkiaBackendContext.h | 3 ++- Libraries/LibGfx/SkiaUtils.h | 7 ++++--- Libraries/LibGfx/SystemTheme.h | 5 +++-- Libraries/LibGfx/TextLayout.h | 7 ++++--- Libraries/LibGfx/VectorGraphic.h | 3 ++- Libraries/LibGfx/VulkanContext.h | 7 ++++--- 52 files changed, 133 insertions(+), 89 deletions(-) diff --git a/Libraries/LibGfx/AffineTransform.cpp b/Libraries/LibGfx/AffineTransform.cpp index c7b0fc4693b2..633fbb56e282 100644 --- a/Libraries/LibGfx/AffineTransform.cpp +++ b/Libraries/LibGfx/AffineTransform.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -158,7 +159,7 @@ void AffineTransform::map(float unmapped_x, float unmapped_y, float& mapped_x, f } template<> -IntPoint AffineTransform::map(IntPoint point) const +GFX_API IntPoint AffineTransform::map(IntPoint point) const { float mapped_x; float mapped_y; @@ -167,7 +168,7 @@ IntPoint AffineTransform::map(IntPoint point) const } template<> -FloatPoint AffineTransform::map(FloatPoint point) const +GFX_API FloatPoint AffineTransform::map(FloatPoint point) const { float mapped_x; float mapped_y; @@ -203,7 +204,7 @@ static T largest_of(T p1, T p2, T p3, T p4) } template<> -FloatRect AffineTransform::map(FloatRect const& rect) const +GFX_API FloatRect AffineTransform::map(FloatRect const& rect) const { if (is_identity()) { return rect; diff --git a/Libraries/LibGfx/AffineTransform.h b/Libraries/LibGfx/AffineTransform.h index e3b1668edb46..2d4f9a34f801 100644 --- a/Libraries/LibGfx/AffineTransform.h +++ b/Libraries/LibGfx/AffineTransform.h @@ -9,12 +9,13 @@ #include #include #include +#include #include #include namespace Gfx { -class AffineTransform { +class GFX_API AffineTransform { public: AffineTransform() : m_values { 1, 0, 0, 1, 0, 0 } diff --git a/Libraries/LibGfx/Bitmap.h b/Libraries/LibGfx/Bitmap.h index 0a2f3d257259..5b46714327b6 100644 --- a/Libraries/LibGfx/Bitmap.h +++ b/Libraries/LibGfx/Bitmap.h @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -33,7 +34,7 @@ enum class BitmapFormat { #undef ENUMERATE_BITMAP_FORMAT }; -[[nodiscard]] StringView bitmap_format_name(BitmapFormat); +[[nodiscard]] GFX_API StringView bitmap_format_name(BitmapFormat); inline bool is_valid_bitmap_format(u32 const format) { @@ -56,7 +57,7 @@ enum class MaskKind { struct BackingStore; -class Bitmap : public AtomicRefCounted { +class GFX_API Bitmap : public AtomicRefCounted { public: [[nodiscard]] static ErrorOr> create(BitmapFormat, IntSize); [[nodiscard]] static ErrorOr> create(BitmapFormat, AlphaType, IntSize); diff --git a/Libraries/LibGfx/BitmapSequence.h b/Libraries/LibGfx/BitmapSequence.h index 8f4f8f6580a9..0b85efc4d76e 100644 --- a/Libraries/LibGfx/BitmapSequence.h +++ b/Libraries/LibGfx/BitmapSequence.h @@ -8,6 +8,7 @@ #include #include +#include #include #include @@ -36,9 +37,9 @@ template<> ErrorOr decode(Decoder&); template<> -ErrorOr encode(Encoder&, Gfx::BitmapSequence const&); +GFX_API ErrorOr encode(Encoder&, Gfx::BitmapSequence const&); template<> -ErrorOr decode(Decoder&); +GFX_API ErrorOr decode(Decoder&); } diff --git a/Libraries/LibGfx/CMakeLists.txt b/Libraries/LibGfx/CMakeLists.txt index 453cf03aed1b..61dc2ddc85a5 100644 --- a/Libraries/LibGfx/CMakeLists.txt +++ b/Libraries/LibGfx/CMakeLists.txt @@ -80,7 +80,7 @@ if (HAS_FONTCONFIG) list(APPEND SOURCES Font/GlobalFontConfig.cpp) endif() -ladybird_lib(LibGfx gfx) +ladybird_lib(LibGfx gfx EXPLICIT_SYMBOL_EXPORT) target_link_libraries(LibGfx PRIVATE LibCompress LibCore LibCrypto LibFileSystem LibTextCodec LibIPC LibUnicode) diff --git a/Libraries/LibGfx/Color.h b/Libraries/LibGfx/Color.h index 94a4edb662e2..b71297585f50 100644 --- a/Libraries/LibGfx/Color.h +++ b/Libraries/LibGfx/Color.h @@ -13,6 +13,7 @@ #include #include #include +#include #include namespace Gfx { @@ -54,7 +55,7 @@ struct Oklab { float b { 0 }; }; -class Color { +class GFX_API Color { public: enum class NamedColor { Transparent, @@ -754,7 +755,7 @@ class Traits : public DefaultTraits { }; template<> -struct Formatter : public Formatter { +struct GFX_API Formatter : public Formatter { ErrorOr format(FormatBuilder&, Gfx::Color); }; @@ -778,9 +779,9 @@ struct Formatter : public Formatter { namespace IPC { template<> -ErrorOr encode(Encoder&, Gfx::Color const&); +GFX_API ErrorOr encode(Encoder&, Gfx::Color const&); template<> -ErrorOr decode(Decoder&); +GFX_API ErrorOr decode(Decoder&); } diff --git a/Libraries/LibGfx/ColorSpace.h b/Libraries/LibGfx/ColorSpace.h index d4fe25526845..c30a024a1243 100644 --- a/Libraries/LibGfx/ColorSpace.h +++ b/Libraries/LibGfx/ColorSpace.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -20,7 +21,7 @@ struct ColorSpaceImpl; } -class ColorSpace { +class GFX_API ColorSpace { public: ColorSpace(); ColorSpace(ColorSpace const&); @@ -54,9 +55,9 @@ class ColorSpace { namespace IPC { template<> -ErrorOr encode(Encoder&, Gfx::ColorSpace const&); +GFX_API ErrorOr encode(Encoder&, Gfx::ColorSpace const&); template<> -ErrorOr decode(Decoder&); +GFX_API ErrorOr decode(Decoder&); } diff --git a/Libraries/LibGfx/Cursor.h b/Libraries/LibGfx/Cursor.h index 41110eca7ec7..bd3458f7ae51 100644 --- a/Libraries/LibGfx/Cursor.h +++ b/Libraries/LibGfx/Cursor.h @@ -8,6 +8,7 @@ #pragma once #include +#include #include #include #include @@ -38,7 +39,7 @@ enum class StandardCursor { Zoom, }; -struct ImageCursor { +struct GFX_API ImageCursor { ShareableBitmap bitmap; IntPoint hotspot; @@ -101,9 +102,9 @@ constexpr StringView standard_cursor_to_string(StandardCursor cursor) namespace IPC { template<> -ErrorOr encode(Encoder&, Gfx::ImageCursor const&); +GFX_API ErrorOr encode(Encoder&, Gfx::ImageCursor const&); template<> -ErrorOr decode(Decoder&); +GFX_API ErrorOr decode(Decoder&); } diff --git a/Libraries/LibGfx/Filter.h b/Libraries/LibGfx/Filter.h index 2281a73a1f10..dd6a0ed2560e 100644 --- a/Libraries/LibGfx/Filter.h +++ b/Libraries/LibGfx/Filter.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -27,7 +28,7 @@ enum class ColorFilterType { struct FilterImpl; -class Filter { +class GFX_API Filter { public: Filter(Filter const&); Filter& operator=(Filter const&); diff --git a/Libraries/LibGfx/Font/Font.h b/Libraries/LibGfx/Font/Font.h index 8435d172f29a..c75f8708017d 100644 --- a/Libraries/LibGfx/Font/Font.h +++ b/Libraries/LibGfx/Font/Font.h @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -53,7 +54,7 @@ enum FontWidth { constexpr float text_shaping_resolution = 64; -class Font : public RefCounted { +class GFX_API Font : public RefCounted { public: Font(NonnullRefPtr, float point_width, float point_height, unsigned dpi_x = DEFAULT_DPI, unsigned dpi_y = DEFAULT_DPI, FontVariationSettings const variations = {}); ScaledFontMetrics metrics() const; diff --git a/Libraries/LibGfx/Font/FontDatabase.h b/Libraries/LibGfx/Font/FontDatabase.h index a4bd84964097..e078d748613c 100644 --- a/Libraries/LibGfx/Font/FontDatabase.h +++ b/Libraries/LibGfx/Font/FontDatabase.h @@ -9,12 +9,13 @@ #include #include #include +#include #include #include namespace Gfx { -class SystemFontProvider { +class GFX_API SystemFontProvider { public: virtual ~SystemFontProvider(); @@ -23,7 +24,7 @@ class SystemFontProvider { virtual void for_each_typeface_with_family_name(FlyString const& family_name, Function) = 0; }; -class FontDatabase { +class GFX_API FontDatabase { public: static FontDatabase& the(); SystemFontProvider& install_system_font_provider(NonnullOwnPtr); diff --git a/Libraries/LibGfx/Font/FontSupport.h b/Libraries/LibGfx/Font/FontSupport.h index e9b08b134da0..8e10c9849f18 100644 --- a/Libraries/LibGfx/Font/FontSupport.h +++ b/Libraries/LibGfx/Font/FontSupport.h @@ -7,6 +7,7 @@ #pragma once #include +#include namespace Gfx { @@ -35,7 +36,7 @@ enum class FontTech : u8 { Variations, }; -bool font_format_is_supported(FontFormat); -bool font_tech_is_supported(FontTech); +GFX_API bool font_format_is_supported(FontFormat); +GFX_API bool font_tech_is_supported(FontTech); } diff --git a/Libraries/LibGfx/Font/GlobalFontConfig.h b/Libraries/LibGfx/Font/GlobalFontConfig.h index 4b6920715656..0c79dcbf7742 100644 --- a/Libraries/LibGfx/Font/GlobalFontConfig.h +++ b/Libraries/LibGfx/Font/GlobalFontConfig.h @@ -6,11 +6,12 @@ #pragma once +#include #include namespace Gfx { -class GlobalFontConfig { +class GFX_API GlobalFontConfig { public: static GlobalFontConfig& the(); FcConfig* get(); diff --git a/Libraries/LibGfx/Font/PathFontProvider.h b/Libraries/LibGfx/Font/PathFontProvider.h index 9be1abbbb18f..1e496eed24c2 100644 --- a/Libraries/LibGfx/Font/PathFontProvider.h +++ b/Libraries/LibGfx/Font/PathFontProvider.h @@ -9,12 +9,13 @@ #include #include #include +#include #include #include namespace Gfx { -class PathFontProvider final : public SystemFontProvider { +class GFX_API PathFontProvider final : public SystemFontProvider { AK_MAKE_NONCOPYABLE(PathFontProvider); AK_MAKE_NONMOVABLE(PathFontProvider); diff --git a/Libraries/LibGfx/Font/Typeface.h b/Libraries/LibGfx/Font/Typeface.h index 76ad5d931140..2631568700e9 100644 --- a/Libraries/LibGfx/Font/Typeface.h +++ b/Libraries/LibGfx/Font/Typeface.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -54,7 +55,7 @@ struct FontCacheKey { } }; -class Typeface : public RefCounted { +class GFX_API Typeface : public RefCounted { public: static ErrorOr> try_load_from_resource(Core::Resource const&, int ttc_index = 0); static ErrorOr> try_load_from_font_data(NonnullOwnPtr, int ttc_index = 0); diff --git a/Libraries/LibGfx/Font/WOFF/Loader.h b/Libraries/LibGfx/Font/WOFF/Loader.h index 4a16a23b90dd..0345e3279f8e 100644 --- a/Libraries/LibGfx/Font/WOFF/Loader.h +++ b/Libraries/LibGfx/Font/WOFF/Loader.h @@ -9,11 +9,12 @@ #include #include +#include #include namespace WOFF { ErrorOr> try_load_from_resource(Core::Resource const&, unsigned index = 0); -ErrorOr> try_load_from_bytes(ReadonlyBytes bytes, unsigned index = 0); +GFX_API ErrorOr> try_load_from_bytes(ReadonlyBytes bytes, unsigned index = 0); } diff --git a/Libraries/LibGfx/Font/WOFF2/Loader.h b/Libraries/LibGfx/Font/WOFF2/Loader.h index 4b880ea81021..8caf42a980b6 100644 --- a/Libraries/LibGfx/Font/WOFF2/Loader.h +++ b/Libraries/LibGfx/Font/WOFF2/Loader.h @@ -9,10 +9,11 @@ #include #include +#include #include namespace WOFF2 { -ErrorOr> try_load_from_bytes(ReadonlyBytes); +GFX_API ErrorOr> try_load_from_bytes(ReadonlyBytes); } diff --git a/Libraries/LibGfx/FontCascadeList.h b/Libraries/LibGfx/FontCascadeList.h index c31bddba8c7c..b20cccf3efde 100644 --- a/Libraries/LibGfx/FontCascadeList.h +++ b/Libraries/LibGfx/FontCascadeList.h @@ -6,12 +6,13 @@ #pragma once +#include #include #include namespace Gfx { -class FontCascadeList : public RefCounted { +class GFX_API FontCascadeList : public RefCounted { public: static NonnullRefPtr create() { diff --git a/Libraries/LibGfx/Gradients.h b/Libraries/LibGfx/Gradients.h index e647cce6484d..36355f1d63b5 100644 --- a/Libraries/LibGfx/Gradients.h +++ b/Libraries/LibGfx/Gradients.h @@ -8,6 +8,7 @@ #include #include +#include #include namespace Gfx { @@ -20,7 +21,7 @@ struct ColorStop { bool operator==(ColorStop const&) const = default; }; -float color_stop_step(ColorStop const& previous_stop, ColorStop const& next_stop, float position); +GFX_API float color_stop_step(ColorStop const& previous_stop, ColorStop const& next_stop, float position); inline float normalized_gradient_angle_radians(float gradient_angle) { diff --git a/Libraries/LibGfx/ImageFormats/AVIFLoader.h b/Libraries/LibGfx/ImageFormats/AVIFLoader.h index 5b03f449abb7..2bf832836d8a 100644 --- a/Libraries/LibGfx/ImageFormats/AVIFLoader.h +++ b/Libraries/LibGfx/ImageFormats/AVIFLoader.h @@ -7,13 +7,14 @@ #pragma once +#include #include namespace Gfx { class AVIFLoadingContext; -class AVIFImageDecoderPlugin final : public ImageDecoderPlugin { +class GFX_API AVIFImageDecoderPlugin final : public ImageDecoderPlugin { public: static bool sniff(ReadonlyBytes); static ErrorOr> create(ReadonlyBytes); diff --git a/Libraries/LibGfx/ImageFormats/BMPLoader.h b/Libraries/LibGfx/ImageFormats/BMPLoader.h index e5b3e3366d7e..1a4d211af37b 100644 --- a/Libraries/LibGfx/ImageFormats/BMPLoader.h +++ b/Libraries/LibGfx/ImageFormats/BMPLoader.h @@ -6,6 +6,7 @@ #pragma once +#include #include #include @@ -14,7 +15,7 @@ namespace Gfx { struct BMPLoadingContext; class ICOImageDecoderPlugin; -class BMPImageDecoderPlugin final : public ImageDecoderPlugin { +class GFX_API BMPImageDecoderPlugin final : public ImageDecoderPlugin { public: static bool sniff(ReadonlyBytes); static ErrorOr> create(ReadonlyBytes); diff --git a/Libraries/LibGfx/ImageFormats/BMPWriter.h b/Libraries/LibGfx/ImageFormats/BMPWriter.h index 8cb9fb111a7c..35543e06112f 100644 --- a/Libraries/LibGfx/ImageFormats/BMPWriter.h +++ b/Libraries/LibGfx/ImageFormats/BMPWriter.h @@ -7,6 +7,7 @@ #pragma once #include +#include namespace Gfx { @@ -25,7 +26,7 @@ struct BMPWriterOptions { Optional icc_data; }; -class BMPWriter { +class GFX_API BMPWriter { public: using Options = BMPWriterOptions; static ErrorOr encode(Bitmap const&, Options options = Options {}); diff --git a/Libraries/LibGfx/ImageFormats/GIFLoader.h b/Libraries/LibGfx/ImageFormats/GIFLoader.h index 7809d69285de..20a2c937ad40 100644 --- a/Libraries/LibGfx/ImageFormats/GIFLoader.h +++ b/Libraries/LibGfx/ImageFormats/GIFLoader.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include namespace Gfx { @@ -15,7 +16,7 @@ struct GIFLoadingContext; // Specified at: https://www.w3.org/Graphics/GIF/spec-gif89a.txt -class GIFImageDecoderPlugin final : public ImageDecoderPlugin { +class GFX_API GIFImageDecoderPlugin final : public ImageDecoderPlugin { public: static bool sniff(ReadonlyBytes); static ErrorOr> create(ReadonlyBytes); diff --git a/Libraries/LibGfx/ImageFormats/ICOLoader.h b/Libraries/LibGfx/ImageFormats/ICOLoader.h index d13487b97c84..7be441c68f5c 100644 --- a/Libraries/LibGfx/ImageFormats/ICOLoader.h +++ b/Libraries/LibGfx/ImageFormats/ICOLoader.h @@ -6,13 +6,14 @@ #pragma once +#include #include namespace Gfx { struct ICOLoadingContext; -class ICOImageDecoderPlugin final : public ImageDecoderPlugin { +class GFX_API ICOImageDecoderPlugin final : public ImageDecoderPlugin { public: static bool sniff(ReadonlyBytes); static ErrorOr> create(ReadonlyBytes); diff --git a/Libraries/LibGfx/ImageFormats/ImageDecoder.h b/Libraries/LibGfx/ImageFormats/ImageDecoder.h index 4ede6f66152d..247dfaf0ac7c 100644 --- a/Libraries/LibGfx/ImageFormats/ImageDecoder.h +++ b/Libraries/LibGfx/ImageFormats/ImageDecoder.h @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -96,7 +97,7 @@ class ImageDecoderPlugin { ImageDecoderPlugin() = default; }; -class ImageDecoder : public RefCounted { +class GFX_API ImageDecoder : public RefCounted { public: static ErrorOr> try_create_for_raw_bytes(ReadonlyBytes, Optional mime_type = {}); ~ImageDecoder() = default; diff --git a/Libraries/LibGfx/ImageFormats/JPEGLoader.h b/Libraries/LibGfx/ImageFormats/JPEGLoader.h index b5d51420b583..39b159415417 100644 --- a/Libraries/LibGfx/ImageFormats/JPEGLoader.h +++ b/Libraries/LibGfx/ImageFormats/JPEGLoader.h @@ -6,13 +6,14 @@ #pragma once +#include #include namespace Gfx { struct JPEGLoadingContext; -class JPEGImageDecoderPlugin : public ImageDecoderPlugin { +class GFX_API JPEGImageDecoderPlugin : public ImageDecoderPlugin { public: static bool sniff(ReadonlyBytes); static ErrorOr> create(ReadonlyBytes); diff --git a/Libraries/LibGfx/ImageFormats/JPEGWriter.h b/Libraries/LibGfx/ImageFormats/JPEGWriter.h index f89d8fcf7e1b..44f2891ee756 100644 --- a/Libraries/LibGfx/ImageFormats/JPEGWriter.h +++ b/Libraries/LibGfx/ImageFormats/JPEGWriter.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include namespace Gfx { @@ -16,7 +17,7 @@ struct JPEGEncoderOptions { u8 quality { 75 }; }; -class JPEGWriter { +class GFX_API JPEGWriter { public: using Options = JPEGEncoderOptions; diff --git a/Libraries/LibGfx/ImageFormats/JPEGXLLoader.h b/Libraries/LibGfx/ImageFormats/JPEGXLLoader.h index 1f4fbb4865c8..ca07f33607f2 100644 --- a/Libraries/LibGfx/ImageFormats/JPEGXLLoader.h +++ b/Libraries/LibGfx/ImageFormats/JPEGXLLoader.h @@ -6,13 +6,14 @@ #pragma once +#include #include namespace Gfx { class JPEGXLLoadingContext; -class JPEGXLImageDecoderPlugin : public ImageDecoderPlugin { +class GFX_API JPEGXLImageDecoderPlugin : public ImageDecoderPlugin { public: static bool sniff(ReadonlyBytes); static ErrorOr> create(ReadonlyBytes); diff --git a/Libraries/LibGfx/ImageFormats/PNGLoader.h b/Libraries/LibGfx/ImageFormats/PNGLoader.h index 37782d8a97d4..4cabd9a22ded 100644 --- a/Libraries/LibGfx/ImageFormats/PNGLoader.h +++ b/Libraries/LibGfx/ImageFormats/PNGLoader.h @@ -6,13 +6,14 @@ #pragma once +#include #include namespace Gfx { struct PNGLoadingContext; -class PNGImageDecoderPlugin final : public ImageDecoderPlugin { +class GFX_API PNGImageDecoderPlugin final : public ImageDecoderPlugin { public: static bool sniff(ReadonlyBytes); static ErrorOr> create(ReadonlyBytes); diff --git a/Libraries/LibGfx/ImageFormats/PNGWriter.h b/Libraries/LibGfx/ImageFormats/PNGWriter.h index 054425fbe638..1114b45518f1 100644 --- a/Libraries/LibGfx/ImageFormats/PNGWriter.h +++ b/Libraries/LibGfx/ImageFormats/PNGWriter.h @@ -9,6 +9,7 @@ #include #include #include +#include #include namespace Gfx { @@ -20,7 +21,7 @@ struct PNGWriterOptions { Optional icc_data; }; -class PNGWriter { +class GFX_API PNGWriter { public: using Options = PNGWriterOptions; diff --git a/Libraries/LibGfx/ImageFormats/TIFFLoader.h b/Libraries/LibGfx/ImageFormats/TIFFLoader.h index b530d394b3ab..774d1b7e0344 100644 --- a/Libraries/LibGfx/ImageFormats/TIFFLoader.h +++ b/Libraries/LibGfx/ImageFormats/TIFFLoader.h @@ -8,6 +8,7 @@ #include #include +#include #include namespace Gfx { @@ -34,7 +35,7 @@ class TIFFLoadingContext; } -class TIFFImageDecoderPlugin : public ImageDecoderPlugin { +class GFX_API TIFFImageDecoderPlugin : public ImageDecoderPlugin { public: static bool sniff(ReadonlyBytes); static ErrorOr> create(ReadonlyBytes); diff --git a/Libraries/LibGfx/ImageFormats/TinyVGLoader.h b/Libraries/LibGfx/ImageFormats/TinyVGLoader.h index 6f7864b7710b..5d294dff7fc3 100644 --- a/Libraries/LibGfx/ImageFormats/TinyVGLoader.h +++ b/Libraries/LibGfx/ImageFormats/TinyVGLoader.h @@ -7,15 +7,9 @@ #pragma once #include -#include -#include -#include +#include #include #include -#include -#include -#include -#include namespace Gfx { @@ -37,7 +31,7 @@ namespace Gfx { struct TinyVGHeader; -class TinyVGDecodedImageData final : public VectorGraphic { +class GFX_API TinyVGDecodedImageData final : public VectorGraphic { public: using Style = Variant>; @@ -76,7 +70,7 @@ class TinyVGDecodedImageData final : public VectorGraphic { struct TinyVGLoadingContext; -class TinyVGImageDecoderPlugin final : public ImageDecoderPlugin { +class GFX_API TinyVGImageDecoderPlugin final : public ImageDecoderPlugin { public: static bool sniff(ReadonlyBytes); static ErrorOr> create(ReadonlyBytes); diff --git a/Libraries/LibGfx/ImageFormats/WebPLoader.h b/Libraries/LibGfx/ImageFormats/WebPLoader.h index cc9ae2716f17..1194a9081942 100644 --- a/Libraries/LibGfx/ImageFormats/WebPLoader.h +++ b/Libraries/LibGfx/ImageFormats/WebPLoader.h @@ -6,13 +6,14 @@ #pragma once +#include #include namespace Gfx { struct WebPLoadingContext; -class WebPImageDecoderPlugin final : public ImageDecoderPlugin { +class GFX_API WebPImageDecoderPlugin final : public ImageDecoderPlugin { public: static bool sniff(ReadonlyBytes); static ErrorOr> create(ReadonlyBytes); diff --git a/Libraries/LibGfx/ImageFormats/WebPWriter.h b/Libraries/LibGfx/ImageFormats/WebPWriter.h index a984f30165b6..ae7aab491244 100644 --- a/Libraries/LibGfx/ImageFormats/WebPWriter.h +++ b/Libraries/LibGfx/ImageFormats/WebPWriter.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include #include @@ -17,7 +18,7 @@ struct WebPEncoderOptions { Optional icc_data; }; -class WebPWriter { +class GFX_API WebPWriter { public: using Options = WebPEncoderOptions; diff --git a/Libraries/LibGfx/ImmutableBitmap.h b/Libraries/LibGfx/ImmutableBitmap.h index 09f99e3226fd..c88158b9bcb5 100644 --- a/Libraries/LibGfx/ImmutableBitmap.h +++ b/Libraries/LibGfx/ImmutableBitmap.h @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -36,7 +37,7 @@ enum class ExportFormat : u8 { #undef ENUMERATE_EXPORT_FORMAT }; -[[nodiscard]] StringView export_format_name(ExportFormat); +[[nodiscard]] GFX_API StringView export_format_name(ExportFormat); struct ExportFlags { enum : u8 { @@ -45,7 +46,7 @@ struct ExportFlags { }; }; -class ImmutableBitmap final : public AtomicRefCounted { +class GFX_API ImmutableBitmap final : public AtomicRefCounted { public: static NonnullRefPtr create(NonnullRefPtr bitmap, ColorSpace color_space = {}); static NonnullRefPtr create(NonnullRefPtr bitmap, AlphaType, ColorSpace color_space = {}); diff --git a/Libraries/LibGfx/MetalContext.h b/Libraries/LibGfx/MetalContext.h index aefaae6d5e4a..d322f6f91391 100644 --- a/Libraries/LibGfx/MetalContext.h +++ b/Libraries/LibGfx/MetalContext.h @@ -14,6 +14,7 @@ static_assert(false, "This file must only be used for macOS"); #include #include #include +#include namespace Gfx { @@ -36,6 +37,6 @@ class MetalContext : public RefCounted { virtual ~MetalContext() { } }; -RefPtr get_metal_context(); +GFX_API RefPtr get_metal_context(); } diff --git a/Libraries/LibGfx/PaintStyle.h b/Libraries/LibGfx/PaintStyle.h index d39bbc40aa7a..e3c628f61b04 100644 --- a/Libraries/LibGfx/PaintStyle.h +++ b/Libraries/LibGfx/PaintStyle.h @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -80,7 +81,7 @@ class GradientPaintStyle : public PaintStyle { Optional m_repeat_length; }; -class CanvasPatternPaintStyle : public PaintStyle { +class GFX_API CanvasPatternPaintStyle : public PaintStyle { public: enum class Repetition : u8 { Repeat, diff --git a/Libraries/LibGfx/Painter.h b/Libraries/LibGfx/Painter.h index 293363bc47bc..c0bb7295b786 100644 --- a/Libraries/LibGfx/Painter.h +++ b/Libraries/LibGfx/Painter.h @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -17,7 +18,7 @@ namespace Gfx { -class Painter { +class GFX_API Painter { public: static NonnullOwnPtr create(NonnullRefPtr); diff --git a/Libraries/LibGfx/PainterSkia.h b/Libraries/LibGfx/PainterSkia.h index 4cc197620053..1a1934eefaa6 100644 --- a/Libraries/LibGfx/PainterSkia.h +++ b/Libraries/LibGfx/PainterSkia.h @@ -8,12 +8,13 @@ #include #include +#include #include #include namespace Gfx { -class PainterSkia final : public Painter { +class GFX_API PainterSkia final : public Painter { public: explicit PainterSkia(NonnullRefPtr); virtual ~PainterSkia() override; diff --git a/Libraries/LibGfx/PaintingSurface.h b/Libraries/LibGfx/PaintingSurface.h index 66b919e07466..b26e08e239ca 100644 --- a/Libraries/LibGfx/PaintingSurface.h +++ b/Libraries/LibGfx/PaintingSurface.h @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -23,7 +24,7 @@ class SkSurface; namespace Gfx { -class PaintingSurface : public AtomicRefCounted { +class GFX_API PaintingSurface : public AtomicRefCounted { public: enum class Origin { TopLeft, diff --git a/Libraries/LibGfx/Palette.h b/Libraries/LibGfx/Palette.h index 5c80b9e9933b..3ff1ff03e3f5 100644 --- a/Libraries/LibGfx/Palette.h +++ b/Libraries/LibGfx/Palette.h @@ -12,11 +12,12 @@ #include #include #include +#include #include namespace Gfx { -class PaletteImpl : public RefCounted { +class GFX_API PaletteImpl : public RefCounted { AK_MAKE_NONCOPYABLE(PaletteImpl); AK_MAKE_NONMOVABLE(PaletteImpl); @@ -55,7 +56,7 @@ class PaletteImpl : public RefCounted { Core::AnonymousBuffer m_theme_buffer; }; -class Palette { +class GFX_API Palette { public: explicit Palette(NonnullRefPtr); diff --git a/Libraries/LibGfx/Path.h b/Libraries/LibGfx/Path.h index d924a4792dc1..7db55eed40e7 100644 --- a/Libraries/LibGfx/Path.h +++ b/Libraries/LibGfx/Path.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -16,7 +17,7 @@ namespace Gfx { -class PathImpl { +class GFX_API PathImpl { public: static NonnullOwnPtr create(); diff --git a/Libraries/LibGfx/Point.h b/Libraries/LibGfx/Point.h index 90000a10be6e..08e690036705 100644 --- a/Libraries/LibGfx/Point.h +++ b/Libraries/LibGfx/Point.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -305,14 +306,14 @@ struct Formatter> : Formatter { namespace IPC { template<> -ErrorOr encode(Encoder&, Gfx::IntPoint const&); +GFX_API ErrorOr encode(Encoder&, Gfx::IntPoint const&); template<> -ErrorOr encode(Encoder&, Gfx::FloatPoint const&); +GFX_API ErrorOr encode(Encoder&, Gfx::FloatPoint const&); template<> -ErrorOr decode(Decoder&); +GFX_API ErrorOr decode(Decoder&); template<> -ErrorOr decode(Decoder&); +GFX_API ErrorOr decode(Decoder&); } diff --git a/Libraries/LibGfx/Rect.h b/Libraries/LibGfx/Rect.h index 628362c0b1ee..fc08bf0633d2 100644 --- a/Libraries/LibGfx/Rect.h +++ b/Libraries/LibGfx/Rect.h @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -683,9 +684,9 @@ struct Formatter> : Formatter { namespace IPC { template<> -ErrorOr encode(Encoder&, Gfx::IntRect const&); +GFX_API ErrorOr encode(Encoder&, Gfx::IntRect const&); template<> -ErrorOr decode(Decoder&); +GFX_API ErrorOr decode(Decoder&); } diff --git a/Libraries/LibGfx/ShareableBitmap.h b/Libraries/LibGfx/ShareableBitmap.h index e71a5f381dac..fdba8046a737 100644 --- a/Libraries/LibGfx/ShareableBitmap.h +++ b/Libraries/LibGfx/ShareableBitmap.h @@ -7,12 +7,13 @@ #pragma once #include +#include #include #include namespace Gfx { -class ShareableBitmap { +class GFX_API ShareableBitmap { public: ShareableBitmap(); @@ -43,9 +44,9 @@ class ShareableBitmap { namespace IPC { template<> -ErrorOr encode(Encoder&, Gfx::ShareableBitmap const&); +GFX_API ErrorOr encode(Encoder&, Gfx::ShareableBitmap const&); template<> -ErrorOr decode(Decoder&); +GFX_API ErrorOr decode(Decoder&); } diff --git a/Libraries/LibGfx/Size.h b/Libraries/LibGfx/Size.h index b6ef30b821ff..852d379046c8 100644 --- a/Libraries/LibGfx/Size.h +++ b/Libraries/LibGfx/Size.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include #include #include @@ -214,10 +215,10 @@ struct Formatter> : Formatter { namespace IPC { template<> -ErrorOr encode(Encoder&, Gfx::IntSize const&); +GFX_API ErrorOr encode(Encoder&, Gfx::IntSize const&); template<> -ErrorOr decode(Decoder&); +GFX_API ErrorOr decode(Decoder&); } diff --git a/Libraries/LibGfx/SkiaBackendContext.h b/Libraries/LibGfx/SkiaBackendContext.h index 9b1fc0eb35d3..278f54d78863 100644 --- a/Libraries/LibGfx/SkiaBackendContext.h +++ b/Libraries/LibGfx/SkiaBackendContext.h @@ -8,6 +8,7 @@ #include #include +#include #include #ifdef USE_VULKAN @@ -26,7 +27,7 @@ namespace Gfx { struct VulkanContext; class MetalContext; -class SkiaBackendContext : public AtomicRefCounted { +class GFX_API SkiaBackendContext : public AtomicRefCounted { AK_MAKE_NONCOPYABLE(SkiaBackendContext); AK_MAKE_NONMOVABLE(SkiaBackendContext); diff --git a/Libraries/LibGfx/SkiaUtils.h b/Libraries/LibGfx/SkiaUtils.h index 32d1e4343501..128586572825 100644 --- a/Libraries/LibGfx/SkiaUtils.h +++ b/Libraries/LibGfx/SkiaUtils.h @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -136,8 +137,8 @@ constexpr SkSamplingOptions to_skia_sampling_options(ScalingMode scaling_mode) VERIFY_NOT_REACHED(); } -SkPath to_skia_path(Path const& path); -sk_sp to_skia_image_filter(Gfx::Filter const& filter); -sk_sp to_skia_blender(Gfx::CompositingAndBlendingOperator compositing_and_blending_operator); +GFX_API SkPath to_skia_path(Path const& path); +GFX_API sk_sp to_skia_image_filter(Gfx::Filter const& filter); +GFX_API sk_sp to_skia_blender(Gfx::CompositingAndBlendingOperator compositing_and_blending_operator); } diff --git a/Libraries/LibGfx/SystemTheme.h b/Libraries/LibGfx/SystemTheme.h index 11f1f6199013..91e34679abf2 100644 --- a/Libraries/LibGfx/SystemTheme.h +++ b/Libraries/LibGfx/SystemTheme.h @@ -14,6 +14,7 @@ #include #include #include +#include #include namespace Gfx { @@ -289,9 +290,9 @@ struct SystemTheme { }; Core::AnonymousBuffer& current_system_theme_buffer(); -void set_system_theme(Core::AnonymousBuffer); +GFX_API void set_system_theme(Core::AnonymousBuffer); ErrorOr load_system_theme(Core::ConfigFile const&, Optional const& color_scheme = OptionalNone()); -ErrorOr load_system_theme(ByteString const& path, Optional const& color_scheme = OptionalNone()); +GFX_API ErrorOr load_system_theme(ByteString const& path, Optional const& color_scheme = OptionalNone()); struct SystemThemeMetaData { ByteString name; diff --git a/Libraries/LibGfx/TextLayout.h b/Libraries/LibGfx/TextLayout.h index 29aec4f12ae8..9845d5bcd92a 100644 --- a/Libraries/LibGfx/TextLayout.h +++ b/Libraries/LibGfx/TextLayout.h @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -27,7 +28,7 @@ struct DrawGlyph { u32 glyph_id { 0 }; }; -class GlyphRun : public AtomicRefCounted { +class GFX_API GlyphRun : public AtomicRefCounted { public: enum class TextType { Common, @@ -62,8 +63,8 @@ class GlyphRun : public AtomicRefCounted { float m_line_height { 0 }; }; -NonnullRefPtr shape_text(FloatPoint baseline_start, float letter_spacing, Utf16View const&, Gfx::Font const& font, GlyphRun::TextType, ShapeFeatures const& features); -Vector> shape_text(FloatPoint baseline_start, Utf16View const&, FontCascadeList const&); +GFX_API NonnullRefPtr shape_text(FloatPoint baseline_start, float letter_spacing, Utf16View const&, Gfx::Font const& font, GlyphRun::TextType, ShapeFeatures const& features); +GFX_API Vector> shape_text(FloatPoint baseline_start, Utf16View const&, FontCascadeList const&); float measure_text_width(Utf16View const&, Gfx::Font const& font, ShapeFeatures const& features); } diff --git a/Libraries/LibGfx/VectorGraphic.h b/Libraries/LibGfx/VectorGraphic.h index b13c59e4957d..2ac386b11b74 100644 --- a/Libraries/LibGfx/VectorGraphic.h +++ b/Libraries/LibGfx/VectorGraphic.h @@ -7,13 +7,14 @@ #pragma once #include +#include #include #include #include namespace Gfx { -class VectorGraphic : public RefCounted { +class GFX_API VectorGraphic : public RefCounted { public: virtual IntSize intrinsic_size() const = 0; virtual void draw(Painter&) const = 0; diff --git a/Libraries/LibGfx/VulkanContext.h b/Libraries/LibGfx/VulkanContext.h index f4c58c1b4755..36c184a1396d 100644 --- a/Libraries/LibGfx/VulkanContext.h +++ b/Libraries/LibGfx/VulkanContext.h @@ -11,6 +11,7 @@ # include # include # include +# include # include # if defined(AK_OS_LINUX) || defined(AK_OS_FREEBSD) # include @@ -38,10 +39,10 @@ struct VulkanContext { # endif }; -ErrorOr create_vulkan_context(); +GFX_API ErrorOr create_vulkan_context(); # ifdef USE_VULKAN_IMAGES -struct VulkanImage : public RefCounted { +struct GFX_API VulkanImage : public RefCounted { VkImage image { VK_NULL_HANDLE }; VkDeviceMemory memory { VK_NULL_HANDLE }; struct { @@ -77,7 +78,7 @@ static inline uint32_t vk_format_to_drm_format(VkFormat format) } } -ErrorOr> create_shared_vulkan_image(VulkanContext const& context, uint32_t width, uint32_t height, VkFormat format, uint32_t num_modifiers, uint64_t const* modifiers); +GFX_API ErrorOr> create_shared_vulkan_image(VulkanContext const& context, uint32_t width, uint32_t height, VkFormat format, uint32_t num_modifiers, uint64_t const* modifiers); # endif } From 4c64d31d6a6e4a74b6abbc4515329843b49ea69f Mon Sep 17 00:00:00 2001 From: R-Goc Date: Fri, 5 Dec 2025 22:08:18 +0100 Subject: [PATCH 2/2] LibGfx: Workaround LSAN false positive --- AK/LsanSuppressions.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/AK/LsanSuppressions.h b/AK/LsanSuppressions.h index 4049f7d45424..eaf779f4d2ea 100644 --- a/AK/LsanSuppressions.h +++ b/AK/LsanSuppressions.h @@ -8,9 +8,15 @@ #include +#ifndef AK_OS_WINDOWS +# define EXPORT __attribute__((visibility("default"))) +#else +# define EXPORT __declspec(dllexport) +#endif + #ifdef HAS_ADDRESS_SANITIZER extern "C" { -char const* __lsan_default_suppressions(); +EXPORT char const* __lsan_default_suppressions(); char const* __lsan_default_suppressions() { // Both Skia and Chromium suppress false positive FontConfig leaks