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 "MSPUBTypes.h"
24 #include "PolygonUtils.h"
25 
26 namespace libmspub
27 {
28 
29 class Fill;
30 class MSPUBCollector;
31 
32 struct Coordinate;
33 
35 {
36  unsigned seqNum;
37 public:
38  FindBySeqNum(unsigned sn) : seqNum(sn) { }
40  {
41  return ref.seqNum == seqNum;
42  }
43 };
44 
46 {
47  unsigned seqNum;
48 public:
49  FindByParentSeqNum(unsigned sn) : seqNum(sn) { }
51  {
52  return ref.parentSeqNum == seqNum;
53  }
54 };
55 
56 struct FOPTValues
57 {
58  std::map<unsigned short, unsigned> m_scalarValues;
59  std::map<unsigned short, std::vector<unsigned char> > m_complexValues;
61  {
62  }
63 };
64 
66 {
67 public:
68  explicit MSPUBParser(librevenge::RVNGInputStream *input, MSPUBCollector *collector);
69  virtual ~MSPUBParser();
70  virtual bool parse();
71 protected:
72  virtual unsigned getColorIndexByQuillEntry(unsigned entry);
73 
75  {
76  TextSpanReference(unsigned short f, unsigned short l, const CharacterStyle &cs) : first(f), last(l), charStyle(cs) { }
77  unsigned short first;
78  unsigned short last;
80  };
81 
83  {
84  TextParagraphReference(unsigned short f, unsigned short l, const ParagraphStyle &ps) : first(f), last(l), paraStyle(ps) { }
85  unsigned short first;
86  unsigned short last;
88  };
89 
90  typedef std::vector<ContentChunkReference>::const_iterator ccr_iterator_t;
91 
92  MSPUBParser();
93  MSPUBParser(const MSPUBParser &);
95  virtual bool parseContents(librevenge::RVNGInputStream *input);
96  bool parseMetaData();
97  bool parseQuill(librevenge::RVNGInputStream *input);
98  bool parseEscher(librevenge::RVNGInputStream *input);
99  bool parseEscherDelay(librevenge::RVNGInputStream *input);
100 
101  MSPUBBlockInfo parseBlock(librevenge::RVNGInputStream *input, bool skipHierarchicalData = false);
102  EscherContainerInfo parseEscherContainer(librevenge::RVNGInputStream *input);
103 
104  bool parseContentChunkReference(librevenge::RVNGInputStream *input, MSPUBBlockInfo block);
105  QuillChunkReference parseQuillChunkReference(librevenge::RVNGInputStream *input);
106  bool parseDocumentChunk(librevenge::RVNGInputStream *input, const ContentChunkReference &chunk);
107  bool parsePageChunk(librevenge::RVNGInputStream *input, const ContentChunkReference &chunk);
108  bool parsePaletteChunk(librevenge::RVNGInputStream *input, const ContentChunkReference &chunk);
109  bool parsePageShapeList(librevenge::RVNGInputStream *input, MSPUBBlockInfo block, unsigned pageSeqNum);
110  bool parseShape(librevenge::RVNGInputStream *input, const ContentChunkReference &chunk);
111  bool parseBorderArtChunk(librevenge::RVNGInputStream *input,
112  const ContentChunkReference &chunk);
113  bool parseFontChunk(librevenge::RVNGInputStream *input,
114  const ContentChunkReference &chunk);
115  void parsePaletteEntry(librevenge::RVNGInputStream *input, MSPUBBlockInfo block);
116  void parseColors(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk);
117  void parseFonts(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk);
118  void parseDefaultStyle(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk);
119  void parseShapeGroup(librevenge::RVNGInputStream *input, const EscherContainerInfo &spgr, Coordinate parentCoordinateSystem, Coordinate parentGroupAbsoluteCoord);
120  void skipBlock(librevenge::RVNGInputStream *input, MSPUBBlockInfo block);
121  void parseEscherShape(librevenge::RVNGInputStream *input, const EscherContainerInfo &sp, Coordinate &parentCoordinateSystem, Coordinate &parentGroupAbsoluteCoord);
122  bool findEscherContainer(librevenge::RVNGInputStream *input, const EscherContainerInfo &parent, EscherContainerInfo &out, unsigned short type);
123  bool findEscherContainerWithTypeInSet(librevenge::RVNGInputStream *input, const EscherContainerInfo &parent, EscherContainerInfo &out, std::set<unsigned short> types);
124  std::map<unsigned short, unsigned> extractEscherValues(librevenge::RVNGInputStream *input, const EscherContainerInfo &record);
125  FOPTValues extractFOPTValues(librevenge::RVNGInputStream *input,
126  const libmspub::EscherContainerInfo &record);
127  std::vector<TextSpanReference> parseCharacterStyles(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk);
128  std::vector<TextParagraphReference> parseParagraphStyles(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk);
129  std::vector<Calculation> parseGuides(const std::vector<unsigned char>
130  &guideData);
131  std::vector<Vertex> parseVertices(const std::vector<unsigned char>
132  &vertexData);
133  std::vector<unsigned> parseTableCellDefinitions(librevenge::RVNGInputStream *input,
134  const QuillChunkReference &chunk);
135  std::vector<unsigned short> parseSegments(
136  const std::vector<unsigned char> &segmentData);
138  const std::vector<unsigned char> &vertexData,
139  const std::vector<unsigned char> &segmentData,
140  const std::vector<unsigned char> &guideData,
141  unsigned geoWidth, unsigned geoHeight);
142  int getColorIndex(librevenge::RVNGInputStream *input, const MSPUBBlockInfo &info);
143  unsigned getFontIndex(librevenge::RVNGInputStream *input, const MSPUBBlockInfo &info);
144  CharacterStyle getCharacterStyle(librevenge::RVNGInputStream *input);
145  ParagraphStyle getParagraphStyle(librevenge::RVNGInputStream *input);
146  std::shared_ptr<Fill> getNewFill(const std::map<unsigned short, unsigned> &foptProperties, bool &skipIfNotBg, std::map<unsigned short, std::vector<unsigned char> > &foptValues);
147 
148  librevenge::RVNGInputStream *m_input;
149  unsigned m_length;
151  std::vector<MSPUBBlockInfo> m_blockInfo;
152  std::vector<ContentChunkReference> m_contentChunks;
153  std::vector<unsigned> m_cellsChunkIndices;
154  std::vector<unsigned> m_pageChunkIndices;
155  std::vector<unsigned> m_shapeChunkIndices;
156  std::vector<unsigned> m_paletteChunkIndices;
157  std::vector<unsigned> m_borderArtChunkIndices;
158  std::vector<unsigned> m_fontChunkIndices;
159  std::vector<unsigned> m_unknownChunkIndices;
160  boost::optional<unsigned> m_documentChunkIndex;
163  std::vector<int> m_alternateShapeSeqNums;
164  std::vector<int> m_escherDelayIndices;
165 
166  static short getBlockDataLength(unsigned type);
167  static bool isBlockDataString(unsigned type);
168  static PageType getPageTypeBySeqNum(unsigned seqNum);
169  static unsigned getEscherElementTailLength(unsigned short type);
170  static unsigned getEscherElementAdditionalHeaderLength(unsigned short type);
171  static ImgType imgTypeByBlipType(unsigned short type);
172  static int getStartOffset(ImgType type, unsigned short initial);
173  static bool lineExistsByFlagPointer(unsigned *flags,
174  unsigned *geomFlags = nullptr);
175 };
176 
177 } // namespace libmspub
178 
179 #endif // INCLUDED_MSPUBRAPHICS_H
180 /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
virtual unsigned getColorIndexByQuillEntry(unsigned entry)
Definition: MSPUBParser.cpp:131
static int getStartOffset(ImgType type, unsigned short initial)
Definition: MSPUBParser.cpp:252
std::map< unsigned short, unsigned > extractEscherValues(librevenge::RVNGInputStream *input, const EscherContainerInfo &record)
Definition: MSPUBParser.cpp:2371
bool parseContentChunkReference(librevenge::RVNGInputStream *input, MSPUBBlockInfo block)
Definition: MSPUBParser.cpp:2391
bool findEscherContainerWithTypeInSet(librevenge::RVNGInputStream *input, const EscherContainerInfo &parent, EscherContainerInfo &out, std::set< unsigned short > types)
Definition: MSPUBParser.cpp:2295
bool parseQuill(librevenge::RVNGInputStream *input)
Definition: MSPUBParser.cpp:976
unsigned seqNum
Definition: MSPUBTypes.h:98
std::vector< int > m_escherDelayIndices
Definition: MSPUBParser.h:164
EscherContainerInfo parseEscherContainer(librevenge::RVNGInputStream *input)
Definition: MSPUBParser.cpp:2491
static bool isBlockDataString(unsigned type)
Definition: MSPUBParser.cpp:2482
void parseFonts(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk)
Definition: MSPUBParser.cpp:1153
std::vector< unsigned > parseTableCellDefinitions(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk)
Definition: MSPUBParser.cpp:958
static bool lineExistsByFlagPointer(unsigned *flags, unsigned *geomFlags=nullptr)
Definition: MSPUBParser.cpp:121
MSPUBBlockInfo parseBlock(librevenge::RVNGInputStream *input, bool skipHierarchicalData=false)
Definition: MSPUBParser.cpp:2502
Definition: PolygonUtils.h:92
bool operator()(const libmspub::ContentChunkReference &ref)
Definition: MSPUBParser.h:50
std::vector< unsigned > m_borderArtChunkIndices
Definition: MSPUBParser.h:157
static ImgType imgTypeByBlipType(unsigned short type)
Definition: MSPUBParser.cpp:228
Definition: MSPUBTypes.h:78
void skipBlock(librevenge::RVNGInputStream *input, MSPUBBlockInfo block)
Definition: MSPUBParser.cpp:2486
DynamicCustomShape getDynamicCustomShape(const std::vector< unsigned char > &vertexData, const std::vector< unsigned char > &segmentData, const std::vector< unsigned char > &guideData, unsigned geoWidth, unsigned geoHeight)
Definition: MSPUBParser.cpp:2171
FOPTValues extractFOPTValues(librevenge::RVNGInputStream *input, const libmspub::EscherContainerInfo &record)
Definition: MSPUBParser.cpp:2326
std::vector< TextSpanReference > parseCharacterStyles(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk)
Definition: MSPUBParser.cpp:1246
FOPTValues()
Definition: MSPUBParser.h:60
std::vector< unsigned short > parseSegments(const std::vector< unsigned char > &segmentData)
Definition: MSPUBParser.cpp:2183
void parseColors(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk)
Definition: MSPUBParser.cpp:1199
unsigned short first
Definition: MSPUBParser.h:85
MSPUBCollector * m_collector
Definition: MSPUBParser.h:150
void parsePaletteEntry(librevenge::RVNGInputStream *input, MSPUBBlockInfo block)
Definition: MSPUBParser.cpp:2594
bool parseDocumentChunk(librevenge::RVNGInputStream *input, const ContentChunkReference &chunk)
Definition: MSPUBParser.cpp:476
std::vector< unsigned > m_fontChunkIndices
Definition: MSPUBParser.h:158
std::vector< int > m_alternateShapeSeqNums
Definition: MSPUBParser.h:163
unsigned m_lastAddedImage
Definition: MSPUBParser.h:162
std::vector< Vertex > parseVertices(const std::vector< unsigned char > &vertexData)
Definition: MSPUBParser.cpp:2216
ParagraphStyle paraStyle
Definition: MSPUBParser.h:87
static PageType getPageTypeBySeqNum(unsigned seqNum)
Definition: MSPUBParser.cpp:2553
Definition: MSPUBTypes.h:90
bool parsePaletteChunk(librevenge::RVNGInputStream *input, const ContentChunkReference &chunk)
Definition: MSPUBParser.cpp:2567
std::vector< ContentChunkReference >::const_iterator ccr_iterator_t
Definition: MSPUBParser.h:90
TextParagraphReference(unsigned short f, unsigned short l, const ParagraphStyle &ps)
Definition: MSPUBParser.h:84
bool parseEscherDelay(librevenge::RVNGInputStream *input)
Definition: MSPUBParser.cpp:293
static unsigned getEscherElementAdditionalHeaderLength(unsigned short type)
Definition: MSPUBParser.cpp:2284
CharacterStyle charStyle
Definition: MSPUBParser.h:79
Definition: Coordinate.h:17
std::vector< unsigned > m_shapeChunkIndices
Definition: MSPUBParser.h:155
CharacterStyle getCharacterStyle(librevenge::RVNGInputStream *input)
Definition: MSPUBParser.cpp:1403
std::vector< Calculation > parseGuides(const std::vector< unsigned char > &guideData)
Definition: MSPUBParser.cpp:2206
bool parseFontChunk(librevenge::RVNGInputStream *input, const ContentChunkReference &chunk)
Definition: MSPUBParser.cpp:520
std::shared_ptr< Fill > getNewFill(const std::map< unsigned short, unsigned > &foptProperties, bool &skipIfNotBg, std::map< unsigned short, std::vector< unsigned char > > &foptValues)
Definition: MSPUBParser.cpp:2001
unsigned parentSeqNum
Definition: MSPUBTypes.h:99
virtual bool parse()
Definition: MSPUBParser.cpp:179
unsigned short last
Definition: MSPUBParser.h:78
PageType
Definition: MSPUBTypes.h:206
static short getBlockDataLength(unsigned type)
Definition: MSPUBParser.cpp:136
unsigned short first
Definition: MSPUBParser.h:77
ImgType
Definition: MSPUBTypes.h:213
Definition: MSPUBParser.h:34
void parseDefaultStyle(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk)
Definition: MSPUBParser.cpp:1171
FindBySeqNum(unsigned sn)
Definition: MSPUBParser.h:38
static unsigned getEscherElementTailLength(unsigned short type)
Definition: MSPUBParser.cpp:2272
unsigned short last
Definition: MSPUBParser.h:86
unsigned m_length
Definition: MSPUBParser.h:149
Definition: MSPUBTypes.h:70
void parseEscherShape(librevenge::RVNGInputStream *input, const EscherContainerInfo &sp, Coordinate &parentCoordinateSystem, Coordinate &parentGroupAbsoluteCoord)
Definition: MSPUBParser.cpp:1605
std::map< unsigned short, unsigned > m_scalarValues
Definition: MSPUBParser.h:58
std::map< unsigned short, std::vector< unsigned char > > m_complexValues
Definition: MSPUBParser.h:59
Definition: MSPUBTypes.h:163
bool findEscherContainer(librevenge::RVNGInputStream *input, const EscherContainerInfo &parent, EscherContainerInfo &out, unsigned short type)
Definition: MSPUBParser.cpp:2310
Definition: Arrow.h:13
bool parseEscher(librevenge::RVNGInputStream *input)
Definition: MSPUBParser.cpp:1536
librevenge::RVNGInputStream * m_input
Definition: MSPUBParser.h:148
virtual bool parseContents(librevenge::RVNGInputStream *input)
Definition: MSPUBParser.cpp:373
Definition: MSPUBParser.h:56
bool operator()(const libmspub::ContentChunkReference &ref)
Definition: MSPUBParser.h:39
Definition: MSPUBTypes.h:102
unsigned getFontIndex(librevenge::RVNGInputStream *input, const MSPUBBlockInfo &info)
Definition: MSPUBParser.cpp:1498
TextSpanReference(unsigned short f, unsigned short l, const CharacterStyle &cs)
Definition: MSPUBParser.h:76
int getColorIndex(librevenge::RVNGInputStream *input, const MSPUBBlockInfo &info)
Definition: MSPUBParser.cpp:1519
FindByParentSeqNum(unsigned sn)
Definition: MSPUBParser.h:49
bool parseMetaData()
Definition: MSPUBParser.cpp:2606
std::vector< unsigned > m_cellsChunkIndices
Definition: MSPUBParser.h:153
unsigned seqNum
Definition: MSPUBParser.h:47
Definition: MSPUBTypes.h:112
boost::optional< unsigned > m_documentChunkIndex
Definition: MSPUBParser.h:160
Definition: MSPUBCollector.h:44
Definition: MSPUBParser.h:65
std::vector< ContentChunkReference > m_contentChunks
Definition: MSPUBParser.h:152
std::vector< TextParagraphReference > parseParagraphStyles(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk)
Definition: MSPUBParser.cpp:1218
std::vector< unsigned > m_pageChunkIndices
Definition: MSPUBParser.h:154
void parseShapeGroup(librevenge::RVNGInputStream *input, const EscherContainerInfo &spgr, Coordinate parentCoordinateSystem, Coordinate parentGroupAbsoluteCoord)
Definition: MSPUBParser.cpp:1582
std::vector< unsigned > m_paletteChunkIndices
Definition: MSPUBParser.h:156
QuillChunkReference parseQuillChunkReference(librevenge::RVNGInputStream *input)
Definition: MSPUBParser.cpp:933
bool parseBorderArtChunk(librevenge::RVNGInputStream *input, const ContentChunkReference &chunk)
Definition: MSPUBParser.cpp:585
virtual ~MSPUBParser()
Definition: MSPUBParser.cpp:117
Definition: MSPUBParser.h:74
bool parsePageShapeList(librevenge::RVNGInputStream *input, MSPUBBlockInfo block, unsigned pageSeqNum)
Definition: MSPUBParser.cpp:691
int m_lastSeenSeqNum
Definition: MSPUBParser.h:161
MSPUBParser & operator=(const MSPUBParser &)
bool parsePageChunk(librevenge::RVNGInputStream *input, const ContentChunkReference &chunk)
Definition: MSPUBParser.cpp:649
ParagraphStyle getParagraphStyle(librevenge::RVNGInputStream *input)
Definition: MSPUBParser.cpp:1273
std::vector< MSPUBBlockInfo > m_blockInfo
Definition: MSPUBParser.h:151
std::vector< unsigned > m_unknownChunkIndices
Definition: MSPUBParser.h:159
unsigned seqNum
Definition: MSPUBParser.h:36
bool parseShape(librevenge::RVNGInputStream *input, const ContentChunkReference &chunk)
Definition: MSPUBParser.cpp:705
Definition: MSPUBParser.h:45

Generated for libmspub by doxygen 1.8.14