MSPUBParser.h Source File documentation

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;
31 class FindBySeqNum
32 {
33 unsigned seqNum;
34 public:
35 FindBySeqNum(unsigned sn) : seqNum(sn) { }
36 bool operator()(const libmspub::ContentChunkReference &ref)
37 {
38 return ref.seqNum == seqNum;
39 }
40 };
41
42 class FindByParentSeqNum
43 {
44 unsigned seqNum;
45 public:
46 FindByParentSeqNum(unsigned sn) : seqNum(sn) { }
47 bool operator()(const libmspub::ContentChunkReference &ref)
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
62 class MSPUBParser
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
71 struct TextSpanReference
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;
76 CharacterStyle charStyle;
77 };
78
79 struct TextParagraphReference
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;
84 ParagraphStyle paraStyle;
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;
147 MSPUBCollector *m_collector;
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;
158 int m_lastSeenSeqNum;
159 unsigned m_lastAddedImage;
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: */
libmspub::ContentChunkReference::seqNum
unsigned seqNum
Definition: MSPUBTypes.h:98
libmspub::MSPUBParser::m_escherDelayIndices
std::vector< int > m_escherDelayIndices
Definition: MSPUBParser.h:161
Fill.h
PolygonUtils.h
libmspub::DynamicCustomShape
Definition: PolygonUtils.h:91
libmspub::FindByParentSeqNum::operator()
bool operator()(const libmspub::ContentChunkReference &ref)
Definition: MSPUBParser.h:47
libmspub::MSPUBParser::m_borderArtChunkIndices
std::vector< unsigned > m_borderArtChunkIndices
Definition: MSPUBParser.h:154
libmspub::MSPUBBlockInfo
Definition: MSPUBTypes.h:78
libmspub::FOPTValues::FOPTValues
FOPTValues()
Definition: MSPUBParser.h:57
libmspub::MSPUBParser::TextParagraphReference::first
unsigned short first
Definition: MSPUBParser.h:82
libmspub::MSPUBParser::m_collector
MSPUBCollector * m_collector
Definition: MSPUBParser.h:147
libmspub::MSPUBParser::m_fontChunkIndices
std::vector< unsigned > m_fontChunkIndices
Definition: MSPUBParser.h:155
libmspub::MSPUBParser::m_alternateShapeSeqNums
std::vector< int > m_alternateShapeSeqNums
Definition: MSPUBParser.h:160
libmspub::MSPUBParser::m_lastAddedImage
unsigned m_lastAddedImage
Definition: MSPUBParser.h:159
libmspub::MSPUBParser::TextParagraphReference::paraStyle
ParagraphStyle paraStyle
Definition: MSPUBParser.h:84
libmspub::ContentChunkReference
Definition: MSPUBTypes.h:90
libmspub::MSPUBParser::ccr_iterator_t
std::vector< ContentChunkReference >::const_iterator ccr_iterator_t
Definition: MSPUBParser.h:87
libmspub::MSPUBParser::TextParagraphReference::TextParagraphReference
TextParagraphReference(unsigned short f, unsigned short l, const ParagraphStyle &ps)
Definition: MSPUBParser.h:81
libmspub::MSPUBParser::TextSpanReference::charStyle
CharacterStyle charStyle
Definition: MSPUBParser.h:76
libmspub::Coordinate
Definition: Coordinate.h:17
libmspub::MSPUBParser::m_shapeChunkIndices
std::vector< unsigned > m_shapeChunkIndices
Definition: MSPUBParser.h:152
libmspub::ContentChunkReference::parentSeqNum
unsigned parentSeqNum
Definition: MSPUBTypes.h:99
libmspub::MSPUBParser::TextSpanReference::last
unsigned short last
Definition: MSPUBParser.h:75
libmspub::PageType
PageType
Definition: MSPUBTypes.h:206
libmspub::MSPUBParser::TextSpanReference::first
unsigned short first
Definition: MSPUBParser.h:74
libmspub::ImgType
ImgType
Definition: MSPUBTypes.h:213
libmspub::FindBySeqNum
Definition: MSPUBParser.h:31
libmspub::FindBySeqNum::FindBySeqNum
FindBySeqNum(unsigned sn)
Definition: MSPUBParser.h:35
libmspub::MSPUBParser::TextParagraphReference::last
unsigned short last
Definition: MSPUBParser.h:83
libmspub::MSPUBParser::m_length
unsigned m_length
Definition: MSPUBParser.h:146
libmspub::EscherContainerInfo
Definition: MSPUBTypes.h:70
libmspub::MSPUBParser::TextParagraphReference
Definition: MSPUBParser.h:79
libmspub::FOPTValues::m_scalarValues
std::map< unsigned short, unsigned > m_scalarValues
Definition: MSPUBParser.h:55
libmspub::FOPTValues::m_complexValues
std::map< unsigned short, std::vector< unsigned char > > m_complexValues
Definition: MSPUBParser.h:56
libmspub::ParagraphStyle
Definition: MSPUBTypes.h:163
libmspub
Definition: Arrow.h:13
libmspub::MSPUBParser::m_input
librevenge::RVNGInputStream * m_input
Definition: MSPUBParser.h:145
libmspub::FOPTValues
Definition: MSPUBParser.h:53
libmspub::FindBySeqNum::operator()
bool operator()(const libmspub::ContentChunkReference &ref)
Definition: MSPUBParser.h:36
libmspub::QuillChunkReference
Definition: MSPUBTypes.h:102
libmspub::MSPUBParser::TextSpanReference::TextSpanReference
TextSpanReference(unsigned short f, unsigned short l, const CharacterStyle &cs)
Definition: MSPUBParser.h:73
libmspub::FindByParentSeqNum::FindByParentSeqNum
FindByParentSeqNum(unsigned sn)
Definition: MSPUBParser.h:46
Coordinate.h
libmspub::MSPUBParser::m_cellsChunkIndices
std::vector< unsigned > m_cellsChunkIndices
Definition: MSPUBParser.h:150
libmspub::FindByParentSeqNum::seqNum
unsigned seqNum
Definition: MSPUBParser.h:44
libmspub::CharacterStyle
Definition: MSPUBTypes.h:112
MSPUBTypes.h
libmspub::MSPUBParser::m_documentChunkIndex
boost::optional< unsigned > m_documentChunkIndex
Definition: MSPUBParser.h:157
libmspub::MSPUBCollector
Definition: MSPUBCollector.h:43
libmspub::MSPUBParser
Definition: MSPUBParser.h:62
libmspub::MSPUBParser::m_contentChunks
std::vector< ContentChunkReference > m_contentChunks
Definition: MSPUBParser.h:149
libmspub::MSPUBParser::m_pageChunkIndices
std::vector< unsigned > m_pageChunkIndices
Definition: MSPUBParser.h:151
libmspub::MSPUBParser::m_paletteChunkIndices
std::vector< unsigned > m_paletteChunkIndices
Definition: MSPUBParser.h:153
libmspub::MSPUBParser::TextSpanReference
Definition: MSPUBParser.h:71
libmspub::MSPUBParser::m_lastSeenSeqNum
int m_lastSeenSeqNum
Definition: MSPUBParser.h:158
libmspub::MSPUBParser::m_blockInfo
std::vector< MSPUBBlockInfo > m_blockInfo
Definition: MSPUBParser.h:148
libmspub::MSPUBParser::m_unknownChunkIndices
std::vector< unsigned > m_unknownChunkIndices
Definition: MSPUBParser.h:156
libmspub::FindBySeqNum::seqNum
unsigned seqNum
Definition: MSPUBParser.h:33
libmspub::FindByParentSeqNum
Definition: MSPUBParser.h:42