MSPUBParser.h
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /*
3  * This file is part of the libmspub 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 INCLUDED_MSPUBPARSER_H
11 #define INCLUDED_MSPUBPARSER_H
12 
13 #include <map>
14 #include <memory>
15 #include <memory>
16 #include <set>
17 #include <vector>
18 
19 #include <boost/optional.hpp>
20 
21 #include <librevenge/librevenge.h>
22 
23 #include "Coordinate.h"
24 #include "Fill.h"
25 #include "MSPUBTypes.h"
26 #include "PolygonUtils.h"
27 
28 namespace libmspub
29 {
30 class MSPUBCollector;
32 {
33  unsigned seqNum;
34 public:
35  FindBySeqNum(unsigned sn) : seqNum(sn) { }
37  {
38  return ref.seqNum == seqNum;
39  }
40 };
41 
43 {
44  unsigned seqNum;
45 public:
46  FindByParentSeqNum(unsigned sn) : seqNum(sn) { }
48  {
49  return ref.parentSeqNum == seqNum;
50  }
51 };
52 
53 struct FOPTValues
54 {
55  std::map<unsigned short, unsigned> m_scalarValues;
56  std::map<unsigned short, std::vector<unsigned char> > m_complexValues;
57  FOPTValues() : m_scalarValues(), m_complexValues()
58  {
59  }
60 };
61 
63 {
64 public:
65  explicit MSPUBParser(librevenge::RVNGInputStream *input, MSPUBCollector *collector);
66  virtual ~MSPUBParser();
67  virtual bool parse();
68 protected:
69  virtual unsigned getColorIndexByQuillEntry(unsigned entry);
70 
72  {
73  TextSpanReference(unsigned short f, unsigned short l, const CharacterStyle &cs) : first(f), last(l), charStyle(cs) { }
74  unsigned short first;
75  unsigned short last;
77  };
78 
80  {
81  TextParagraphReference(unsigned short f, unsigned short l, const ParagraphStyle &ps) : first(f), last(l), paraStyle(ps) { }
82  unsigned short first;
83  unsigned short last;
85  };
86 
87  typedef std::vector<ContentChunkReference>::const_iterator ccr_iterator_t;
88 
89  MSPUBParser();
90  MSPUBParser(const MSPUBParser &);
91  MSPUBParser &operator=(const MSPUBParser &);
92  virtual bool parseContents(librevenge::RVNGInputStream *input);
93  bool parseMetaData();
94  bool parseQuill(librevenge::RVNGInputStream *input);
95  bool parseEscher(librevenge::RVNGInputStream *input);
96  bool parseEscherDelay(librevenge::RVNGInputStream *input);
97 
98  MSPUBBlockInfo parseBlock(librevenge::RVNGInputStream *input, bool skipHierarchicalData = false);
99  EscherContainerInfo parseEscherContainer(librevenge::RVNGInputStream *input);
100 
101  bool parseContentChunkReference(librevenge::RVNGInputStream *input, MSPUBBlockInfo block);
102  QuillChunkReference parseQuillChunkReference(librevenge::RVNGInputStream *input);
103  bool parseDocumentChunk(librevenge::RVNGInputStream *input, const ContentChunkReference &chunk);
104  bool parsePageChunk(librevenge::RVNGInputStream *input, const ContentChunkReference &chunk);
105  bool parsePaletteChunk(librevenge::RVNGInputStream *input, const ContentChunkReference &chunk);
106  bool parsePageShapeList(librevenge::RVNGInputStream *input, MSPUBBlockInfo block, unsigned pageSeqNum);
107  bool parseShape(librevenge::RVNGInputStream *input, const ContentChunkReference &chunk);
108  bool parseBorderArtChunk(librevenge::RVNGInputStream *input,
109  const ContentChunkReference &chunk);
110  bool parseFontChunk(librevenge::RVNGInputStream *input,
111  const ContentChunkReference &chunk);
112  void parsePaletteEntry(librevenge::RVNGInputStream *input, MSPUBBlockInfo block);
113  void parseColors(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk);
114  void parseFonts(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk);
115  void parseDefaultStyle(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk);
116  void parseShapeGroup(librevenge::RVNGInputStream *input, const EscherContainerInfo &spgr, Coordinate parentCoordinateSystem, Coordinate parentGroupAbsoluteCoord);
117  void skipBlock(librevenge::RVNGInputStream *input, MSPUBBlockInfo block);
118  void parseEscherShape(librevenge::RVNGInputStream *input, const EscherContainerInfo &sp, Coordinate &parentCoordinateSystem, Coordinate &parentGroupAbsoluteCoord);
119  bool findEscherContainer(librevenge::RVNGInputStream *input, const EscherContainerInfo &parent, EscherContainerInfo &out, unsigned short type);
120  bool findEscherContainerWithTypeInSet(librevenge::RVNGInputStream *input, const EscherContainerInfo &parent, EscherContainerInfo &out, std::set<unsigned short> types);
121  std::map<unsigned short, unsigned> extractEscherValues(librevenge::RVNGInputStream *input, const EscherContainerInfo &record);
122  FOPTValues extractFOPTValues(librevenge::RVNGInputStream *input,
123  const libmspub::EscherContainerInfo &record);
124  std::vector<TextSpanReference> parseCharacterStyles(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk);
125  std::vector<TextParagraphReference> parseParagraphStyles(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk);
126  std::vector<Calculation> parseGuides(const std::vector<unsigned char>
127  &guideData);
128  std::vector<Vertex> parseVertices(const std::vector<unsigned char>
129  &vertexData);
130  std::vector<unsigned> parseTableCellDefinitions(librevenge::RVNGInputStream *input,
131  const QuillChunkReference &chunk);
132  std::vector<unsigned short> parseSegments(
133  const std::vector<unsigned char> &segmentData);
134  DynamicCustomShape getDynamicCustomShape(
135  const std::vector<unsigned char> &vertexData,
136  const std::vector<unsigned char> &segmentData,
137  const std::vector<unsigned char> &guideData,
138  unsigned geoWidth, unsigned geoHeight);
139  int getColorIndex(librevenge::RVNGInputStream *input, const MSPUBBlockInfo &info);
140  unsigned getFontIndex(librevenge::RVNGInputStream *input, const MSPUBBlockInfo &info);
141  CharacterStyle getCharacterStyle(librevenge::RVNGInputStream *input);
142  ParagraphStyle getParagraphStyle(librevenge::RVNGInputStream *input);
143  std::shared_ptr<Fill> getNewFill(const std::map<unsigned short, unsigned> &foptProperties, bool &skipIfNotBg, std::map<unsigned short, std::vector<unsigned char> > &foptValues);
144 
145  librevenge::RVNGInputStream *m_input;
146  unsigned m_length;
148  std::vector<MSPUBBlockInfo> m_blockInfo;
149  std::vector<ContentChunkReference> m_contentChunks;
150  std::vector<unsigned> m_cellsChunkIndices;
151  std::vector<unsigned> m_pageChunkIndices;
152  std::vector<unsigned> m_shapeChunkIndices;
153  std::vector<unsigned> m_paletteChunkIndices;
154  std::vector<unsigned> m_borderArtChunkIndices;
155  std::vector<unsigned> m_fontChunkIndices;
156  std::vector<unsigned> m_unknownChunkIndices;
157  boost::optional<unsigned> m_documentChunkIndex;
160  std::vector<int> m_alternateShapeSeqNums;
161  std::vector<int> m_escherDelayIndices;
162 
163  static short getBlockDataLength(unsigned type);
164  static bool isBlockDataString(unsigned type);
165  static PageType getPageTypeBySeqNum(unsigned seqNum);
166  static unsigned getEscherElementTailLength(unsigned short type);
167  static unsigned getEscherElementAdditionalHeaderLength(unsigned short type);
168  static ImgType imgTypeByBlipType(unsigned short type);
169  static int getStartOffset(ImgType type, unsigned short initial);
170  static bool lineExistsByFlagPointer(unsigned *flags,
171  unsigned *geomFlags = nullptr);
172 };
173 
174 } // namespace libmspub
175 
176 #endif // INCLUDED_MSPUBRAPHICS_H
177 /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
unsigned seqNum
Definition: MSPUBTypes.h:98
std::vector< int > m_escherDelayIndices
Definition: MSPUBParser.h:161
Definition: PolygonUtils.h:91
bool operator()(const libmspub::ContentChunkReference &ref)
Definition: MSPUBParser.h:47
std::vector< unsigned > m_borderArtChunkIndices
Definition: MSPUBParser.h:154
Definition: MSPUBTypes.h:78
FOPTValues()
Definition: MSPUBParser.h:57
unsigned short first
Definition: MSPUBParser.h:82
MSPUBCollector * m_collector
Definition: MSPUBParser.h:147
std::vector< unsigned > m_fontChunkIndices
Definition: MSPUBParser.h:155
std::vector< int > m_alternateShapeSeqNums
Definition: MSPUBParser.h:160
unsigned m_lastAddedImage
Definition: MSPUBParser.h:159
ParagraphStyle paraStyle
Definition: MSPUBParser.h:84
Definition: MSPUBTypes.h:90
std::vector< ContentChunkReference >::const_iterator ccr_iterator_t
Definition: MSPUBParser.h:87
TextParagraphReference(unsigned short f, unsigned short l, const ParagraphStyle &ps)
Definition: MSPUBParser.h:81
CharacterStyle charStyle
Definition: MSPUBParser.h:76
Definition: Coordinate.h:17
std::vector< unsigned > m_shapeChunkIndices
Definition: MSPUBParser.h:152
unsigned parentSeqNum
Definition: MSPUBTypes.h:99
unsigned short last
Definition: MSPUBParser.h:75
PageType
Definition: MSPUBTypes.h:206
unsigned short first
Definition: MSPUBParser.h:74
ImgType
Definition: MSPUBTypes.h:213
Definition: MSPUBParser.h:31
FindBySeqNum(unsigned sn)
Definition: MSPUBParser.h:35
unsigned short last
Definition: MSPUBParser.h:83
unsigned m_length
Definition: MSPUBParser.h:146
Definition: MSPUBTypes.h:70
std::map< unsigned short, unsigned > m_scalarValues
Definition: MSPUBParser.h:55
std::map< unsigned short, std::vector< unsigned char > > m_complexValues
Definition: MSPUBParser.h:56
Definition: MSPUBTypes.h:163
Definition: Arrow.h:13
librevenge::RVNGInputStream * m_input
Definition: MSPUBParser.h:145
Definition: MSPUBParser.h:53
bool operator()(const libmspub::ContentChunkReference &ref)
Definition: MSPUBParser.h:36
Definition: MSPUBTypes.h:102
TextSpanReference(unsigned short f, unsigned short l, const CharacterStyle &cs)
Definition: MSPUBParser.h:73
FindByParentSeqNum(unsigned sn)
Definition: MSPUBParser.h:46
std::vector< unsigned > m_cellsChunkIndices
Definition: MSPUBParser.h:150
unsigned seqNum
Definition: MSPUBParser.h:44
Definition: MSPUBTypes.h:112
boost::optional< unsigned > m_documentChunkIndex
Definition: MSPUBParser.h:157
Definition: MSPUBCollector.h:43
Definition: MSPUBParser.h:62
std::vector< ContentChunkReference > m_contentChunks
Definition: MSPUBParser.h:149
std::vector< unsigned > m_pageChunkIndices
Definition: MSPUBParser.h:151
std::vector< unsigned > m_paletteChunkIndices
Definition: MSPUBParser.h:153
Definition: MSPUBParser.h:71
int m_lastSeenSeqNum
Definition: MSPUBParser.h:158
std::vector< MSPUBBlockInfo > m_blockInfo
Definition: MSPUBParser.h:148
std::vector< unsigned > m_unknownChunkIndices
Definition: MSPUBParser.h:156
unsigned seqNum
Definition: MSPUBParser.h:33
Definition: MSPUBParser.h:42

Generated for libmspub by doxygen 1.8.13