Sfoglia il codice sorgente

LibPDF: Add name -> char code conversion in Encoding

This is an operation that was already being done (sub-optimally) in
PS1FontProgram, so we are replacing that. We will use this during CFF
parsing too.
Rodrigo Tobar 2 anni fa
parent
commit
1ec4ad5eb6

+ 8 - 0
Userland/Libraries/LibPDF/Encoding.cpp

@@ -171,6 +171,14 @@ CharDescriptor const& Encoding::get_char_code_descriptor(u16 char_code) const
     return const_cast<Encoding*>(this)->m_descriptors.ensure(char_code);
 }
 
+u16 Encoding::get_char_code(DeprecatedString const& name) const
+{
+    auto code_iterator = m_name_mapping.find(name);
+    if (code_iterator != m_name_mapping.end())
+        return code_iterator->value;
+    return 0;
+}
+
 bool Encoding::should_map_to_bullet(u16 char_code) const
 {
     // PDF Annex D table D.2, note 3:

+ 1 - 0
Userland/Libraries/LibPDF/Encoding.h

@@ -645,6 +645,7 @@ public:
     HashMap<u16, CharDescriptor> const& descriptors() const { return m_descriptors; }
     HashMap<DeprecatedString, u16> const& name_mapping() const { return m_name_mapping; }
 
+    u16 get_char_code(DeprecatedString const&) const;
     CharDescriptor const& get_char_code_descriptor(u16 char_code) const;
 
     bool should_map_to_bullet(u16 char_code) const;

+ 2 - 2
Userland/Libraries/LibPDF/Fonts/PS1FontProgram.cpp

@@ -92,8 +92,8 @@ PDFErrorOr<void> PS1FontProgram::parse_encrypted_portion(ByteBuffer const& buffe
             if (rd == "-|" || rd == "RD") {
                 auto line = TRY(decrypt(reader.bytes().slice(reader.offset(), encrypted_size), m_encryption_key, m_lenIV));
                 reader.move_by(encrypted_size);
-                auto name_mapping = encoding()->name_mapping();
-                auto char_code = name_mapping.ensure(word.substring_view(1));
+                auto glyph_name = word.substring_view(1);
+                auto char_code = encoding()->get_char_code(glyph_name);
                 GlyphParserState state;
                 TRY(add_glyph(char_code, TRY(parse_glyph(line, subroutines, state, false))));
             }