Jelajahi Sumber

LibGfx: Make OTF prefer Cmap tables of the Windows platform again

As the different Cmap encoding records are guaranteed to be sorted by
their platform ID, we would previously prefer the Macintosh platform
because of its lower ID value. However, this platform is split up into
a lot of encoding formats for different languages, and usually only
English is included. This meant that we could not handle most unicode
characters anymore.

The Windows platform now takes precedence again, as it can handle
arbitrary code points in its supported encodings.

This solution is still far from perfect, but it makes this regression
disappear for now.
Julian Offenhäuser 2 tahun lalu
induk
melakukan
22b1e1076a
1 mengubah file dengan 3 tambahan dan 1 penghapusan
  1. 3 1
      Userland/Libraries/LibGfx/Font/OpenType/Font.cpp

+ 3 - 1
Userland/Libraries/LibGfx/Font/OpenType/Font.cpp

@@ -517,6 +517,9 @@ ErrorOr<NonnullRefPtr<Font>> Font::try_load_from_offset(ReadonlyBytes buffer, u3
         if (!platform.has_value())
         if (!platform.has_value())
             return Error::from_string_literal("Invalid Platform ID");
             return Error::from_string_literal("Invalid Platform ID");
 
 
+        /* NOTE: The encoding records are sorted first by platform ID, then by encoding ID.
+           This means that the Windows platform will take precedence over Macintosh, which is
+           usually what we want here. */
         if (platform.value() == Cmap::Subtable::Platform::Windows) {
         if (platform.value() == Cmap::Subtable::Platform::Windows) {
             if (subtable.encoding_id() == (u16)Cmap::Subtable::WindowsEncoding::UnicodeFullRepertoire) {
             if (subtable.encoding_id() == (u16)Cmap::Subtable::WindowsEncoding::UnicodeFullRepertoire) {
                 cmap.set_active_index(i);
                 cmap.set_active_index(i);
@@ -528,7 +531,6 @@ ErrorOr<NonnullRefPtr<Font>> Font::try_load_from_offset(ReadonlyBytes buffer, u3
             }
             }
         } else if (platform.value() == Cmap::Subtable::Platform::Macintosh) {
         } else if (platform.value() == Cmap::Subtable::Platform::Macintosh) {
             cmap.set_active_index(i);
             cmap.set_active_index(i);
-            break;
         }
         }
     }
     }