CFF.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /*
  2. * Copyright (c) 2023, Rodrigo Tobar <rtobarc@gmail.com>.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Tuple.h>
  8. #include <AK/Types.h>
  9. #include <LibPDF/Error.h>
  10. #include <LibPDF/Fonts/Type1FontProgram.h>
  11. namespace PDF {
  12. class Reader;
  13. class CFF : public Type1FontProgram {
  14. private:
  15. // Table 9: Top DICT Operator Entries
  16. enum class TopDictOperator {
  17. Version = 0,
  18. Notice,
  19. FullName,
  20. FamilyName,
  21. Weight,
  22. FontBBox,
  23. // UniqueID = 13,
  24. // XUID,
  25. Charset = 15,
  26. Encoding,
  27. CharStrings,
  28. Private,
  29. // IsFixedPitch = (12 << 8 | 1),
  30. // ItalicAngle,
  31. // UnderlinePosition,
  32. // UnderlineThickness,
  33. // PaintType,
  34. };
  35. enum class PrivDictOperator {
  36. Subrs = 19,
  37. DefaultWidthX,
  38. NominalWidthX,
  39. };
  40. public:
  41. static PDFErrorOr<NonnullRefPtr<CFF>> create(ReadonlyBytes const&, RefPtr<Encoding> encoding);
  42. // to private
  43. using Card8 = u8;
  44. using Card16 = u16;
  45. using Offset = i32;
  46. using OffSize = u8;
  47. using SID = u16;
  48. using DictOperand = Variant<int, float>;
  49. static int load_int_dict_operand(u8 b0, Reader&);
  50. static float load_float_dict_operand(Reader&);
  51. static PDFErrorOr<DictOperand> load_dict_operand(u8, Reader&);
  52. using IndexDataHandler = Function<PDFErrorOr<void>(ReadonlyBytes const&)>;
  53. static PDFErrorOr<void> parse_index(Reader& reader, IndexDataHandler&&);
  54. template<typename OffsetType>
  55. static PDFErrorOr<void> parse_index_data(Card16 count, Reader& reader, IndexDataHandler&);
  56. template<typename OperatorT>
  57. using DictEntryHandler = Function<PDFErrorOr<void>(OperatorT, Vector<DictOperand> const&)>;
  58. template<typename OperatorT>
  59. static PDFErrorOr<void> parse_dict(Reader& reader, DictEntryHandler<OperatorT>&& handler);
  60. template<typename OperatorT>
  61. static PDFErrorOr<OperatorT> parse_dict_operator(u8, Reader&);
  62. static PDFErrorOr<Vector<CFF::Glyph>> parse_charstrings(Reader&&, Vector<ByteBuffer> const& subroutines);
  63. static PDFErrorOr<Vector<DeprecatedFlyString>> parse_charset(Reader&&, size_t);
  64. static PDFErrorOr<Vector<u8>> parse_encoding(Reader&&);
  65. };
  66. }