diff --git a/Userland/Libraries/LibTTF/CMakeLists.txt b/Userland/Libraries/LibTTF/CMakeLists.txt index 2fe3d94647..fa9daa9d5f 100644 --- a/Userland/Libraries/LibTTF/CMakeLists.txt +++ b/Userland/Libraries/LibTTF/CMakeLists.txt @@ -5,4 +5,4 @@ set(SOURCES ) serenity_lib(LibTTF ttf) -target_link_libraries(LibTTF LibM LibCore) +target_link_libraries(LibTTF LibM LibCore LibTextCodec) diff --git a/Userland/Libraries/LibTTF/Font.cpp b/Userland/Libraries/LibTTF/Font.cpp index 2cdfec272b..be649dc171 100644 --- a/Userland/Libraries/LibTTF/Font.cpp +++ b/Userland/Libraries/LibTTF/Font.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include namespace TTF { @@ -189,8 +190,15 @@ String Name::string_for_id(NameId id) const if (this_id != (u16)id) continue; + auto platform = be_u16(m_slice.offset_pointer(6 + i * 12 + 0)); auto length = be_u16(m_slice.offset_pointer(6 + i * 12 + 8)); auto offset = be_u16(m_slice.offset_pointer(6 + i * 12 + 10)); + + if (platform == (u16)Platform::Windows) { + static auto& decoder = *TextCodec::decoder_for("utf-16be"); + return decoder.to_utf8(StringView { (const char*)m_slice.offset_pointer(string_offset + offset), length }); + } + return String((const char*)m_slice.offset_pointer(string_offset + offset), length); } diff --git a/Userland/Libraries/LibTTF/Tables.h b/Userland/Libraries/LibTTF/Tables.h index d5f5014bd4..a0aff9f230 100644 --- a/Userland/Libraries/LibTTF/Tables.h +++ b/Userland/Libraries/LibTTF/Tables.h @@ -148,6 +148,11 @@ private: class Name { public: + enum class Platform { + Unicode = 0, + Macintosh = 1, + Windows = 3, + }; static Optional from_slice(const ReadonlyBytes&); String family_name() const { return string_for_id(NameId::FamilyName); }