diff --git a/Userland/Libraries/LibGfx/Emoji.cpp b/Userland/Libraries/LibGfx/Emoji.cpp index 790cf6a3d1..8591b96833 100644 --- a/Userland/Libraries/LibGfx/Emoji.cpp +++ b/Userland/Libraries/LibGfx/Emoji.cpp @@ -1,31 +1,43 @@ /* * Copyright (c) 2019-2020, Sergey Bugaev + * Copyright (c) 2022, Linus Groh * * SPDX-License-Identifier: BSD-2-Clause */ #include +#include #include #include #include namespace Gfx { -static HashMap> s_emojis; +// https://unicode.org/reports/tr51/ +// https://unicode.org/emoji/charts/emoji-list.html +// https://unicode.org/emoji/charts/emoji-zwj-sequences.html -const Bitmap* Emoji::emoji_for_code_point(u32 code_point) +static HashMap, RefPtr> s_emojis; + +Bitmap const* Emoji::emoji_for_code_point(u32 code_point) { - auto it = s_emojis.find(code_point); + return emoji_for_code_points(Array { code_point }); +} + +Bitmap const* Emoji::emoji_for_code_points(Span const& code_points) +{ + auto it = s_emojis.find(code_points); if (it != s_emojis.end()) return (*it).value.ptr(); - auto bitmap_or_error = Bitmap::try_load_from_file(String::formatted("/res/emoji/U+{:X}.png", code_point)); + auto basename = String::join('_', code_points, "U+{:X}"); + auto bitmap_or_error = Bitmap::try_load_from_file(String::formatted("/res/emoji/{}.png", basename)); if (bitmap_or_error.is_error()) { - s_emojis.set(code_point, nullptr); + s_emojis.set(code_points, nullptr); return nullptr; } auto bitmap = bitmap_or_error.release_value(); - s_emojis.set(code_point, bitmap); + s_emojis.set(code_points, bitmap); return bitmap.ptr(); } diff --git a/Userland/Libraries/LibGfx/Emoji.h b/Userland/Libraries/LibGfx/Emoji.h index d9859362ae..9f706b451b 100644 --- a/Userland/Libraries/LibGfx/Emoji.h +++ b/Userland/Libraries/LibGfx/Emoji.h @@ -1,11 +1,13 @@ /* * Copyright (c) 2019-2020, Sergey Bugaev + * Copyright (c) 2022, Linus Groh * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once +#include #include namespace Gfx { @@ -14,7 +16,8 @@ class Bitmap; class Emoji { public: - static const Gfx::Bitmap* emoji_for_code_point(u32 code_point); + static Gfx::Bitmap const* emoji_for_code_point(u32 code_point); + static Gfx::Bitmap const* emoji_for_code_points(Span const&); }; }