diff --git a/Userland/Libraries/LibPDF/Command.h b/Userland/Libraries/LibPDF/Operator.h similarity index 82% rename from Userland/Libraries/LibPDF/Command.h rename to Userland/Libraries/LibPDF/Operator.h index 3f9572c742..88ee18991c 100644 --- a/Userland/Libraries/LibPDF/Command.h +++ b/Userland/Libraries/LibPDF/Operator.h @@ -12,7 +12,7 @@ #include #include -#define ENUMERATE_COMMANDS(V) \ +#define ENUMERATE_OPERATORS(V) \ V(SaveState, save_state, q) \ V(RestoreState, restore_state, Q) \ V(ConcatenateMatrix, concatenate_matrix, cm) \ @@ -87,76 +87,76 @@ namespace PDF { -enum class CommandType { +enum class OperatorType { #define V(name, snake_name, symbol) name, - ENUMERATE_COMMANDS(V) + ENUMERATE_OPERATORS(V) #undef V TextNextLineShowString, TextNextLineShowStringSetSpacing, }; -class Command { +class Operator { public: - static CommandType command_type_from_symbol(StringView symbol_string) + static OperatorType operator_type_from_symbol(StringView symbol_string) { #define V(name, snake_name, symbol) \ if (symbol_string == #symbol) \ - return CommandType::name; - ENUMERATE_COMMANDS(V) + return OperatorType::name; + ENUMERATE_OPERATORS(V) #undef V if (symbol_string == "'") - return CommandType::TextNextLineShowString; + return OperatorType::TextNextLineShowString; if (symbol_string == "''") - return CommandType::TextNextLineShowStringSetSpacing; + return OperatorType::TextNextLineShowStringSetSpacing; dbgln("unsupported graphics symbol {}", symbol_string); VERIFY_NOT_REACHED(); } - static const char* command_name(CommandType command_name) + static const char* operator_name(OperatorType operator_type) { -#define V(name, snake_name, symbol) \ - if (command_name == CommandType::name) \ +#define V(name, snake_name, symbol) \ + if (operator_type == OperatorType::name) \ return #name; - ENUMERATE_COMMANDS(V) + ENUMERATE_OPERATORS(V) #undef V - if (command_name == CommandType::TextNextLineShowString) + if (operator_type == OperatorType::TextNextLineShowString) return "TextNextLineShowString"; - if (command_name == CommandType::TextNextLineShowStringSetSpacing) + if (operator_type == OperatorType::TextNextLineShowStringSetSpacing) return "TextNextLineShowStringSetSpacing"; VERIFY_NOT_REACHED(); } - static const char* command_symbol(CommandType command_name) + static const char* operator_symbol(OperatorType operator_type) { -#define V(name, snake_name, symbol) \ - if (command_name == CommandType::name) \ +#define V(name, snake_name, symbol) \ + if (operator_type == OperatorType::name) \ return #symbol; - ENUMERATE_COMMANDS(V) + ENUMERATE_OPERATORS(V) #undef V - if (command_name == CommandType::TextNextLineShowString) + if (operator_type == OperatorType::TextNextLineShowString) return "'"; - if (command_name == CommandType::TextNextLineShowStringSetSpacing) + if (operator_type == OperatorType::TextNextLineShowStringSetSpacing) return "''"; VERIFY_NOT_REACHED(); } - Command(CommandType command_type, Vector arguments) - : m_command_type(command_type) + Operator(OperatorType operator_type, Vector arguments) + : m_operator_type(operator_type) , m_arguments(move(arguments)) { } - [[nodiscard]] ALWAYS_INLINE CommandType command_type() const { return m_command_type; } + [[nodiscard]] ALWAYS_INLINE OperatorType type() const { return m_operator_type; } [[nodiscard]] ALWAYS_INLINE Vector const& arguments() const { return m_arguments; } private: - CommandType m_command_type; + OperatorType m_operator_type; Vector m_arguments; }; @@ -165,17 +165,17 @@ private: namespace AK { template<> -struct Formatter : Formatter { - ErrorOr format(FormatBuilder& format_builder, PDF::Command const& command) +struct Formatter : Formatter { + ErrorOr format(FormatBuilder& format_builder, PDF::Operator const& op) { StringBuilder builder; builder.appendff("{} ({})", - PDF::Command::command_name(command.command_type()), - PDF::Command::command_symbol(command.command_type())); + PDF::Operator::operator_name(op.type()), + PDF::Operator::operator_symbol(op.type())); - if (!command.arguments().is_empty()) { + if (!op.arguments().is_empty()) { builder.append(" ["); - for (auto& argument : command.arguments()) + for (auto& argument : op.arguments()) builder.appendff(" {}", argument); builder.append(" ]"); } diff --git a/Userland/Libraries/LibPDF/Parser.cpp b/Userland/Libraries/LibPDF/Parser.cpp index 33b087d46f..00be30bb34 100644 --- a/Userland/Libraries/LibPDF/Parser.cpp +++ b/Userland/Libraries/LibPDF/Parser.cpp @@ -22,11 +22,11 @@ static NonnullRefPtr make_object(Args... args) requires(IsBaseOf) return adopt_ref(*new T(forward(args)...)); } -PDFErrorOr> Parser::parse_graphics_commands(Document* document, ReadonlyBytes bytes) +PDFErrorOr> Parser::parse_operators(Document* document, ReadonlyBytes bytes) { auto parser = adopt_ref(*new Parser(document, bytes)); parser->m_disable_encryption = true; - return parser->parse_graphics_commands(); + return parser->parse_operators(); } Parser::Parser(Document* document, ReadonlyBytes bytes) @@ -1029,39 +1029,39 @@ PDFErrorOr> Parser::parse_stream(NonnullRefPtr> Parser::parse_graphics_commands() +PDFErrorOr> Parser::parse_operators() { - Vector commands; - Vector command_args; + Vector operators; + Vector operator_args; - constexpr static auto is_command_char = [](char ch) { + constexpr static auto is_operator_char = [](char ch) { return isalpha(ch) || ch == '*' || ch == '\''; }; while (!m_reader.done()) { auto ch = m_reader.peek(); - if (is_command_char(ch)) { - auto command_start = m_reader.offset(); - while (is_command_char(ch)) { + if (is_operator_char(ch)) { + auto operator_start = m_reader.offset(); + while (is_operator_char(ch)) { consume(); if (m_reader.done()) break; ch = m_reader.peek(); } - auto command_string = StringView(m_reader.bytes().slice(command_start, m_reader.offset() - command_start)); - auto command_type = Command::command_type_from_symbol(command_string); - commands.append(Command(command_type, move(command_args))); - command_args = Vector(); + auto operator_string = StringView(m_reader.bytes().slice(operator_start, m_reader.offset() - operator_start)); + auto operator_type = Operator::operator_type_from_symbol(operator_string); + operators.append(Operator(operator_type, move(operator_args))); + operator_args = Vector(); consume_whitespace(); continue; } - command_args.append(TRY(parse_value())); + operator_args.append(TRY(parse_value())); } - return commands; + return operators; } bool Parser::matches_eol() const diff --git a/Userland/Libraries/LibPDF/Parser.h b/Userland/Libraries/LibPDF/Parser.h index 3a36b86007..f2d48e80b0 100644 --- a/Userland/Libraries/LibPDF/Parser.h +++ b/Userland/Libraries/LibPDF/Parser.h @@ -9,8 +9,8 @@ #include #include #include -#include #include +#include #include #include @@ -25,7 +25,7 @@ public: Linearized, }; - static PDFErrorOr> parse_graphics_commands(Document*, ReadonlyBytes); + static PDFErrorOr> parse_operators(Document*, ReadonlyBytes); Parser(Document*, ReadonlyBytes); @@ -115,7 +115,7 @@ private: PDFErrorOr> parse_dict(); PDFErrorOr> parse_stream(NonnullRefPtr dict); - PDFErrorOr> parse_graphics_commands(); + PDFErrorOr> parse_operators(); void push_reference(Reference const& ref) { m_current_reference_stack.append(ref); } void pop_reference() { m_current_reference_stack.take_last(); } diff --git a/Userland/Libraries/LibPDF/Renderer.cpp b/Userland/Libraries/LibPDF/Renderer.cpp index 20264ab475..04f4fe5989 100644 --- a/Userland/Libraries/LibPDF/Renderer.cpp +++ b/Userland/Libraries/LibPDF/Renderer.cpp @@ -78,28 +78,28 @@ PDFErrorOr Renderer::render() byte_buffer.append(bytes.data(), bytes.size()); } - auto commands = TRY(Parser::parse_graphics_commands(m_document, byte_buffer)); + auto operators = TRY(Parser::parse_operators(m_document, byte_buffer)); - for (auto& command : commands) - TRY(handle_command(command)); + for (auto& op : operators) + TRY(handle_operator(op)); return {}; } -PDFErrorOr Renderer::handle_command(Command const& command) +PDFErrorOr Renderer::handle_operator(Operator const& op) { - switch (command.command_type()) { -#define V(name, snake_name, symbol) \ - case CommandType::name: \ - TRY(handle_##snake_name(command.arguments())); \ + switch (op.type()) { +#define V(name, snake_name, symbol) \ + case OperatorType::name: \ + TRY(handle_##snake_name(op.arguments())); \ break; - ENUMERATE_COMMANDS(V) + ENUMERATE_OPERATORS(V) #undef V - case CommandType::TextNextLineShowString: - TRY(handle_text_next_line_show_string(command.arguments())); + case OperatorType::TextNextLineShowString: + TRY(handle_text_next_line_show_string(op.arguments())); break; - case CommandType::TextNextLineShowStringSetSpacing: - TRY(handle_text_next_line_show_string_set_spacing(command.arguments())); + case OperatorType::TextNextLineShowStringSetSpacing: + TRY(handle_text_next_line_show_string_set_spacing(op.arguments())); break; } diff --git a/Userland/Libraries/LibPDF/Renderer.h b/Userland/Libraries/LibPDF/Renderer.h index 60af100dde..90a23139f6 100644 --- a/Userland/Libraries/LibPDF/Renderer.h +++ b/Userland/Libraries/LibPDF/Renderer.h @@ -89,16 +89,16 @@ private: PDFErrorOr render(); - PDFErrorOr handle_command(Command const&); + PDFErrorOr handle_operator(Operator const&); #define V(name, snake_name, symbol) \ PDFErrorOr handle_##snake_name(Vector const& args); - ENUMERATE_COMMANDS(V) + ENUMERATE_OPERATORS(V) #undef V PDFErrorOr handle_text_next_line_show_string(Vector const& args); PDFErrorOr handle_text_next_line_show_string_set_spacing(Vector const& args); PDFErrorOr set_graphics_state_from_dict(NonnullRefPtr); - // shift is the manual advance given in the TJ command array + // shift is the manual advance given in the TJ operator array void show_text(String const&, float shift = 0.0f); PDFErrorOr> get_color_space(Value const&);