summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibPDF/Encoding.cpp
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2022-11-19 20:23:18 +0100
committerAndreas Kling <kling@serenityos.org>2022-12-08 09:54:20 +0100
commitd6a3be1615ea5dbe2219f8da10b3233164210dcc (patch)
treedef9fc78de44ffc021fdce5c209224d0ebe495b5 /Userland/Libraries/LibPDF/Encoding.cpp
parentf4f5b045caea7f735987687cf4d1b9d630c4676a (diff)
downloadserenity-d6a3be1615ea5dbe2219f8da10b3233164210dcc.zip
LibPDF: Add missing character quirk for WinAnsiEncoding fonts
Fonts with the encoding name "WinAnsiEncoding" should render missing characters above character code 040 (octal) as a "bullet" character. This patch adds Encoding::should_map_to_bullet(char_code) which is then called by char_code_to_code_point() to check if the given char code should be displayed as a bullet instead. I didn't have a good way to test this, so I've only verified that it works by manually overriding inputs to the function during the rendering stage. This takes care of a FIXME in the Annex D part of the PDF specification.
Diffstat (limited to 'Userland/Libraries/LibPDF/Encoding.cpp')
-rw-r--r--Userland/Libraries/LibPDF/Encoding.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/Userland/Libraries/LibPDF/Encoding.cpp b/Userland/Libraries/LibPDF/Encoding.cpp
index e8cd5c7ba0..f18152dafe 100644
--- a/Userland/Libraries/LibPDF/Encoding.cpp
+++ b/Userland/Libraries/LibPDF/Encoding.cpp
@@ -115,6 +115,7 @@ NonnullRefPtr<Encoding> Encoding::windows_encoding()
encoding->m_name_mapping.set(#name, name##_code_point);
ENUMERATE_LATIN_CHARACTER_SET(ENUMERATE)
#undef ENUMERATE
+ encoding->m_windows = true;
}
return encoding;
@@ -170,4 +171,12 @@ CharDescriptor const& Encoding::get_char_code_descriptor(u16 char_code) const
return const_cast<Encoding*>(this)->m_descriptors.ensure(char_code);
}
+bool Encoding::should_map_to_bullet(u16 char_code) const
+{
+ // PDF Annex D table D.2, note 3:
+ // In WinAnsiEncoding, all unused codes greater than 40 (octal) map to the bullet character. However, only
+ // code 225 (octal) shall be specifically assigned to the bullet character; other codes are subject to future re-assignment.
+ return m_windows && char_code > 040 && !m_descriptors.contains(char_code);
+}
+
}