1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 10:18:11 +00:00
serenity/Userland/Libraries/LibPDF/Fonts/PDFFont.h
Nico Weber 3a39939995 LibPDF: Make truetype fonts marked as symbol fonts actually work
Turns out the spec didn't mean that the whole range is populated,
but that one of these ranges is populated. So take the argmax.

As fallout, explicitly mark the Liberation fonts as nonsymbolic
when we use them for the 14 standard fonts. Else, we'd regress
"PostScrõpt", since the Liberation fonts would otherwise go down
the "is symbolic or doesn't have explicit encoding" codepath,
since the standard fonts usually don't have an explicit encoding.

As a fallout from _that_, since the 14 standard fonts now go down
the regular truetype rendering path, and since we don't implement
lookup by postscript name yet, glyphs not present in Liberation
now cause text to stop rendering with a diag, instead of rendering
a "glyph not found" symbol. That isn't super common, only an
additional 4 files appear for the "'post' table not yet implemented"
diag. Since we'll implement that soon, this seems fine until then.
2024-03-07 11:29:47 -05:00

64 lines
2.2 KiB
C++

/*
* Copyright (c) 2022, Matthew Olsson <mattco@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/HashMap.h>
#include <LibGfx/Font/OpenType/Font.h>
#include <LibGfx/Forward.h>
#include <LibPDF/Document.h>
#include <LibPDF/Encoding.h>
namespace PDF {
class Renderer;
// PDF files don't need most of the data in OpenType fonts, and even contain invalid data for
// these tables in some cases. Skip reading these tables.
constexpr u32 pdf_skipped_opentype_tables = OpenType::FontOptions::SkipTables::Name | OpenType::FontOptions::SkipTables::Hmtx | OpenType::FontOptions::SkipTables::OS2;
enum class WritingMode {
Horizontal,
Vertical,
};
class PDFFont : public RefCounted<PDFFont> {
public:
static PDFErrorOr<NonnullRefPtr<PDFFont>> create(Document*, NonnullRefPtr<DictObject> const&, float font_size);
virtual ~PDFFont() = default;
virtual void set_font_size(float font_size) = 0;
virtual PDFErrorOr<Gfx::FloatPoint> draw_string(Gfx::Painter&, Gfx::FloatPoint, ByteString const&, Renderer const&) = 0;
virtual WritingMode writing_mode() const { return WritingMode::Horizontal; }
// TABLE 5.20 Font flags
bool is_fixed_pitch() const { return m_flags & (1 << (1 - 1)); }
bool is_serif() const { return m_flags & (1 << (2 - 1)); }
static constexpr unsigned Symbolic = 1 << (3 - 1);
bool is_symbolic() const { return m_flags & Symbolic; }
bool is_script() const { return m_flags & (1 << (4 - 1)); }
// Note: No bit position 5.
static constexpr unsigned NonSymbolic = 1 << (6 - 1);
bool is_nonsymbolic() const { return m_flags & NonSymbolic; }
bool is_italic() const { return m_flags & (1 << (7 - 1)); }
// Note: Big jump in bit positions.
bool is_all_cap() const { return m_flags & (1 << (17 - 1)); }
bool is_small_cap() const { return m_flags & (1 << (18 - 1)); }
bool is_force_bold() const { return m_flags & (1 << (19 - 1)); }
protected:
virtual PDFErrorOr<void> initialize(Document* document, NonnullRefPtr<DictObject> const& dict, float font_size);
static PDFErrorOr<NonnullRefPtr<Gfx::ScaledFont>> replacement_for(StringView name, float font_size);
unsigned m_flags { 0 };
};
}