mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 17:37:34 +00:00
LibPDF: Add new Type1FontProgram base class
We are planning to add support for CFF fonts to read Type1 fonts, and therefore much of the logic already found in PS1FontProgram will be useful for representing the Type1 fonts read from CFF. This commit moves the PS1-independent bits of PS1FontProgram into a new Type1FontProgram base class that can be used as the base for CFF-based Type1 fonts in the future. The Type1Font class uses this new type now instead of storing a PS1FontProgram pointer. While doing this refactoring I also took care of making some minor adjustments to the PS1FontProgram API, namely: * Its create() method is static and returns a NonnullRefPtr<Type1FontProgram>. * Many (all?) of the parse_* methods are now static. * Added const where possible. Notably, the Type1FontProgram also contains at the moment the code that parses the CharString data from the PS1 program. This logic is very similar in CFF files, so after some minor adjustments later on it should be possible to reuse most of it.
This commit is contained in:
parent
e751ec2089
commit
416585f75a
7 changed files with 535 additions and 476 deletions
|
@ -11,72 +11,31 @@
|
|||
#include <LibGfx/Font/Font.h>
|
||||
#include <LibGfx/Path.h>
|
||||
#include <LibPDF/Error.h>
|
||||
#include <LibPDF/Fonts/Type1FontProgram.h>
|
||||
|
||||
namespace PDF {
|
||||
|
||||
class Reader;
|
||||
class Encoding;
|
||||
|
||||
class PS1FontProgram : public RefCounted<PS1FontProgram> {
|
||||
class PS1FontProgram : public Type1FontProgram {
|
||||
public:
|
||||
PDFErrorOr<void> create(ReadonlyBytes const&, RefPtr<Encoding>, size_t cleartext_length, size_t encrypted_length);
|
||||
|
||||
RefPtr<Gfx::Bitmap> rasterize_glyph(u32 char_code, float width, Gfx::GlyphSubpixelOffset);
|
||||
Gfx::Path build_char(u32 char_code, float width, Gfx::GlyphSubpixelOffset);
|
||||
|
||||
RefPtr<Encoding> encoding() const { return m_encoding; }
|
||||
Gfx::FloatPoint glyph_translation(u32 char_code, float width) const;
|
||||
static PDFErrorOr<NonnullRefPtr<Type1FontProgram>> create(ReadonlyBytes const&, RefPtr<Encoding>, size_t cleartext_length, size_t encrypted_length);
|
||||
|
||||
private:
|
||||
struct Glyph {
|
||||
Gfx::Path path;
|
||||
float width;
|
||||
};
|
||||
|
||||
struct GlyphParserState {
|
||||
Glyph glyph;
|
||||
|
||||
Gfx::FloatPoint point;
|
||||
|
||||
bool flex_feature { false };
|
||||
size_t flex_index;
|
||||
Array<float, 14> flex_sequence;
|
||||
|
||||
size_t sp { 0 };
|
||||
Array<float, 24> stack;
|
||||
|
||||
size_t postscript_sp { 0 };
|
||||
Array<float, 24> postscript_stack;
|
||||
};
|
||||
|
||||
Gfx::AffineTransform glyph_transform_to_device_space(Glyph const&, float width) const;
|
||||
|
||||
PDFErrorOr<Glyph> parse_glyph(ReadonlyBytes const&, GlyphParserState&);
|
||||
PDFErrorOr<void> parse_encrypted_portion(ByteBuffer const&);
|
||||
PDFErrorOr<Vector<ByteBuffer>> parse_subroutines(Reader&);
|
||||
PDFErrorOr<Vector<float>> parse_number_array(Reader&, size_t length);
|
||||
PDFErrorOr<DeprecatedString> parse_word(Reader&);
|
||||
PDFErrorOr<float> parse_float(Reader&);
|
||||
PDFErrorOr<int> parse_int(Reader&);
|
||||
PDFErrorOr<Vector<ByteBuffer>> parse_subroutines(Reader&) const;
|
||||
static PDFErrorOr<Vector<float>> parse_number_array(Reader&, size_t length);
|
||||
static PDFErrorOr<DeprecatedString> parse_word(Reader&);
|
||||
static PDFErrorOr<float> parse_float(Reader&);
|
||||
static PDFErrorOr<int> parse_int(Reader&);
|
||||
|
||||
PDFErrorOr<ByteBuffer> decrypt(ReadonlyBytes const&, u16 key, size_t skip);
|
||||
bool seek_name(Reader&, DeprecatedString const&);
|
||||
static PDFErrorOr<ByteBuffer> decrypt(ReadonlyBytes const&, u16 key, size_t skip);
|
||||
static bool seek_name(Reader&, DeprecatedString const&);
|
||||
|
||||
static Error error(
|
||||
DeprecatedString const& message
|
||||
#ifdef PDF_DEBUG
|
||||
,
|
||||
SourceLocation loc = SourceLocation::current()
|
||||
#endif
|
||||
);
|
||||
|
||||
Vector<ByteBuffer> m_subroutines;
|
||||
Vector<ByteBuffer> m_character_names;
|
||||
HashMap<u16, Glyph> m_glyph_map;
|
||||
|
||||
Gfx::AffineTransform m_font_matrix;
|
||||
|
||||
RefPtr<Encoding> m_encoding;
|
||||
|
||||
u16 m_encryption_key { 4330 };
|
||||
int m_lenIV { 4 };
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue