1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* 3 * This file is part of the libqxp project. 4 * 5 * This Source Code Form is subject to the terms of the Mozilla Public 6 * License, v. 2.0. If a copy of the MPL was not distributed with this 7 * file, You can obtain one at http://mozilla.org/MPL/2.0/. 8 */ 9 10 #ifndef QXP4PARSER_H_INCLUDED 11 #define QXP4PARSER_H_INCLUDED 12 13 #include "QXPParser.h" 14 #include <vector> 15 16 namespace libqxp 17 { 18 19 class QXP4Deobfuscator; 20 class QXP4Header; 21 22 class QXP4Parser : public QXPParser 23 { 24 public: 25 QXP4Parser(const std::shared_ptr<librevenge::RVNGInputStream> &input, librevenge::RVNGDrawingInterface *painter, const std::shared_ptr<QXP4Header> &header); 26 27 enum class ShapeType 28 { 29 UNKNOWN, 30 LINE, 31 ORTHOGONAL_LINE, 32 BEZIER_LINE, 33 RECTANGLE, 34 ROUNDED_RECTANGLE, 35 CONCAVE_RECTANGLE, 36 BEVELED_RECTANGLE, 37 OVAL, 38 BEZIER_BOX 39 }; 40 41 struct ObjectHeader 42 { 43 boost::optional<Color> fillColor; 44 Color color; 45 46 unsigned contentIndex; 47 unsigned linkId; 48 unsigned oleId; 49 unsigned gradientId; 50 51 double rotation; 52 double skew; 53 54 bool hflip; 55 bool vflip; 56 57 ContentType contentType; 58 ShapeType shapeType; 59 60 BoxType boxType; 61 CornerType cornerType; 62 ObjectHeaderObjectHeader63 ObjectHeader() 64 : fillColor(), color(), contentIndex(0), linkId(0), oleId(0), gradientId(0), 65 rotation(0), skew(0), hflip(false), vflip(false), 66 contentType(ContentType::UNKNOWN), shapeType(ShapeType::UNKNOWN), 67 boxType(BoxType::UNKNOWN), cornerType(CornerType::DEFAULT) 68 { } 69 }; 70 71 private: 72 struct ColorBlockSpec 73 { 74 unsigned offset; 75 unsigned padding; 76 ColorBlockSpecColorBlockSpec77 ColorBlockSpec() 78 : offset(0), padding(0) 79 { } 80 }; 81 82 const std::shared_ptr<QXP4Header> m_header; 83 84 std::vector<std::vector<TabStop>> m_paragraphTabStops; 85 86 bool parseDocument(const std::shared_ptr<librevenge::RVNGInputStream> &docStream, QXPCollector &collector) override; 87 bool parsePages(const std::shared_ptr<librevenge::RVNGInputStream> &stream, QXPCollector &collector) override; 88 89 void parseColors(const std::shared_ptr<librevenge::RVNGInputStream> &docStream); 90 ColorBlockSpec parseColorBlockSpec(const std::shared_ptr<librevenge::RVNGInputStream> &stream); 91 void parseColor(const std::shared_ptr<librevenge::RVNGInputStream> &stream, const std::vector<ColorBlockSpec> &blocks); 92 void skipParagraphStylesheets(const std::shared_ptr<librevenge::RVNGInputStream> &stream); 93 CharFormat parseCharFormat(const std::shared_ptr<librevenge::RVNGInputStream> &stream) override; 94 void parseLineStyles(const std::shared_ptr<librevenge::RVNGInputStream> &docStream); 95 void skipTemplates(const std::shared_ptr<librevenge::RVNGInputStream> &stream); 96 void parseTabStops(const std::shared_ptr<librevenge::RVNGInputStream> &stream); 97 ParagraphFormat parseParagraphFormat(const std::shared_ptr<librevenge::RVNGInputStream> &stream) override; 98 std::shared_ptr<HJ> parseHJ(const std::shared_ptr<librevenge::RVNGInputStream> &stream) override; 99 100 Page parsePage(const std::shared_ptr<librevenge::RVNGInputStream> &stream, QXP4Deobfuscator &deobfuscate); 101 102 void parseObject(const std::shared_ptr<librevenge::RVNGInputStream> &stream, QXP4Deobfuscator &deobfuscate, QXPCollector &collector, const Page &page); 103 ObjectHeader parseObjectHeader(const std::shared_ptr<librevenge::RVNGInputStream> &stream, QXP4Deobfuscator &deobfuscate); 104 void parseLine(const std::shared_ptr<librevenge::RVNGInputStream> &stream, const ObjectHeader &header, QXPCollector &collector); 105 void parseBezierLine(const std::shared_ptr<librevenge::RVNGInputStream> &stream, const ObjectHeader &header, QXPCollector &collector); 106 void parseBezierEmptyBox(const std::shared_ptr<librevenge::RVNGInputStream> &stream, const ObjectHeader &header, QXPCollector &collector); 107 void parseEmptyBox(const std::shared_ptr<librevenge::RVNGInputStream> &stream, const ObjectHeader &header, QXPCollector &collector); 108 void parseBezierPictureBox(const std::shared_ptr<librevenge::RVNGInputStream> &stream, const ObjectHeader &header, QXPCollector &collector); 109 void parsePictureBox(const std::shared_ptr<librevenge::RVNGInputStream> &stream, const ObjectHeader &header, QXPCollector &collector); 110 void parseLineText(const std::shared_ptr<librevenge::RVNGInputStream> &stream, const ObjectHeader &header, QXPCollector &collector); 111 void parseBezierText(const std::shared_ptr<librevenge::RVNGInputStream> &stream, const ObjectHeader &header, QXPCollector &collector); 112 void parseBezierTextBox(const std::shared_ptr<librevenge::RVNGInputStream> &stream, const ObjectHeader &header, QXPCollector &collector); 113 void parseTextBox(const std::shared_ptr<librevenge::RVNGInputStream> &stream, const ObjectHeader &header, QXPCollector &collector); 114 void parseGroup(const std::shared_ptr<librevenge::RVNGInputStream> &stream, const ObjectHeader &header, QXPCollector &collector, const Page &page); 115 116 Frame readFrame(const std::shared_ptr<librevenge::RVNGInputStream> &stream); 117 bool readRunaround(const std::shared_ptr<librevenge::RVNGInputStream> &stream); 118 void readLinkedTextSettings(const std::shared_ptr<librevenge::RVNGInputStream> &stream, LinkedTextSettings &settings); 119 void readTextSettings(const std::shared_ptr<librevenge::RVNGInputStream> &stream, TextSettings &settings); 120 void readTextPathSettings(const std::shared_ptr<librevenge::RVNGInputStream> &stream, TextPathSettings &settings); 121 void readOleObject(const std::shared_ptr<librevenge::RVNGInputStream> &stream); 122 void readPictureSettings(const std::shared_ptr<librevenge::RVNGInputStream> &stream, std::shared_ptr<PictureBox> &picturebox); 123 void readImageData(const std::shared_ptr<librevenge::RVNGInputStream> &stream); 124 void readBezierData(const std::shared_ptr<librevenge::RVNGInputStream> &stream, std::vector<CurveComponent> &curveComponents, Rect &bbox); 125 void skipTextObjectEnd(const std::shared_ptr<librevenge::RVNGInputStream> &stream, const ObjectHeader &header, const LinkedTextSettings &linkedTextSettings); 126 }; 127 128 } 129 130 #endif // QXP4PARSER_H_INCLUDED 131 132 /* vim:set shiftwidth=2 softtabstop=2 expandtab: */ 133