MSPUBCollector.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 __MSPUBCOLLECTOR_H__
11#define __MSPUBCOLLECTOR_H__
12
13#include <list>
14#include <vector>
15#include <map>
16#include <set>
17#include <string>
18#include <algorithm>
19
20#include <boost/ptr_container/ptr_vector.hpp>
21#include <boost/bind.hpp>
22#include <boost/function.hpp>
23
24#include <librevenge/librevenge.h>
25#include <librevenge/librevenge.h>
26
27#include "MSPUBTypes.h"
28#include "libmspub_utils.h"
30#include "ShapeType.h"
31#include "Coordinate.h"
32#include "ShapeGroupElement.h"
33#include "Fill.h"
34#include "ColorReference.h"
35#include "PolygonUtils.h"
36#include "ShapeInfo.h"
37#include "BorderArtInfo.h"
38#include "Dash.h"
39#include "Arrow.h"
40#include "VerticalAlign.h"
41#include "EmbeddedFontInfo.h"
42#include "Shadow.h"
43
44namespace libmspub
45{
47{
48 friend class Fill;
49 friend class ImgFill;
50 friend class SolidFill;
51 friend class GradientFill;
52 friend class PatternFill;
53public:
54 typedef std::list<ContentChunkReference>::const_iterator ccr_iterator_t;
55
56 MSPUBCollector(::librevenge::RVNGDrawingInterface *painter);
57 virtual ~MSPUBCollector();
58
59 // collector functions
60 void collectMetaData(const librevenge::RVNGPropertyList &metaData);
61
62 bool addPage(unsigned seqNum);
63 bool addTextString(const std::vector<TextParagraph> &str, unsigned id);
64 void addTextShape(unsigned stringId, unsigned seqNum);
65 bool addImage(unsigned index, ImgType type, librevenge::RVNGBinaryData img);
66 void setBorderImageOffset(unsigned index, unsigned offset);
67 librevenge::RVNGBinaryData *addBorderImage(ImgType type, unsigned borderArtIndex);
68 void setShapePage(unsigned seqNum, unsigned pageSeqNum);
69
70 void setNextPage(unsigned seqNum);
71
72 void setShapeType(unsigned seqNum, ShapeType type);
73 void setShapeCropType(unsigned seqNum, ShapeType cropType);
74 void setShapePictureRecolor(unsigned seqNum, const ColorReference &recolor);
75 void setShapePictureBrightness(unsigned seqNum, int brightness);
76 void setShapePictureContrast(unsigned seqNum, int contrast);
77 void setShapeTableInfo(unsigned seqNum, const TableInfo &ti);
78 void setShapeBorderImageId(unsigned seqNum, unsigned borderImageId);
79 void setShapeCoordinatesInEmu(unsigned seqNum, int xs, int ys, int xe, int ye);
80 void setShapeImgIndex(unsigned seqNum, unsigned index);
81 void setShapeFill(unsigned seqNum, boost::shared_ptr<Fill> fill, bool skipIfNotBg);
82 void setShapeDash(unsigned seqNum, const Dash &dash);
83 void setAdjustValue(unsigned seqNum, unsigned index, int adjust);
84 void setShapeRotation(unsigned seqNum, double rotation);
85 void setShapeFlip(unsigned, bool, bool);
86 void setShapeMargins(unsigned seqNum, unsigned left, unsigned top, unsigned right, unsigned bottom);
87 void setShapeBorderPosition(unsigned seqNum, BorderPosition pos);
88 void setShapeCoordinatesRotated90(unsigned seqNum);
89 void setShapeCustomPath(unsigned seqNum,
90 const DynamicCustomShape &shape);
91 void setShapeClipPath(unsigned seqNum, const std::vector<libmspub::Vertex> &clip);
92 void setShapeVerticalTextAlign(unsigned seqNum, VerticalAlign va);
93 void designateMasterPage(unsigned seqNum);
94 void setMasterPage(unsigned pageSeqNum, unsigned masterSeqNum);
95 void setShapeStretchBorderArt(unsigned seqNum);
96 void setShapeShadow(unsigned seqNum, const Shadow &shadow);
97
98 // Microsoft "Embedded OpenType" ... need to figure out how to convert
99 // this to a sane format and how to get LibreOffice to understand embedded fonts.
100 void addEOTFont(const librevenge::RVNGString &name, const librevenge::RVNGBinaryData &data);
101
102 void beginGroup();
103 bool endGroup();
104
105 void setShapeLineBackColor(unsigned seqNum, ColorReference backColor);
106 void addShapeLine(unsigned seqNum, Line line);
107 void setShapeOrder(unsigned seqNum);
108 void setPageBgShape(unsigned pageSeqNum, unsigned seqNum);
109 void setWidthInEmu(unsigned long);
110 void setHeightInEmu(unsigned long);
111 void setShapeNumColumns(unsigned seqNum, unsigned numColumns);
112 void setShapeColumnSpacing(unsigned seqNum, unsigned spacing);
113 void setShapeBeginArrow(unsigned seqNum, const Arrow &arrow);
114 void setShapeEndArrow(unsigned seqNum, const Arrow &arrow);
115
117 void addFont(std::vector<unsigned char> name);
118
119 void addDefaultCharacterStyle(const CharacterStyle &style);
120 void addDefaultParagraphStyle(const ParagraphStyle &style);
122 bool setCurrentGroupSeqNum(unsigned seqNum);
123
125
126 void setTableCellTextEnds(unsigned textId, const std::vector<unsigned> &ends);
127 void setTextStringOffset(unsigned textId, unsigned offset);
128
129 bool go();
130
131 bool hasPage(unsigned seqNum) const;
132private:
133
134 struct PageInfo
135 {
136 std::vector<ShapeGroupElement *> m_shapeGroupsOrdered;
138 };
139
142
143 librevenge::RVNGDrawingInterface *m_painter;
144 std::list<ContentChunkReference> m_contentChunkReferences;
147 unsigned short m_numPages;
148 std::map<unsigned, std::vector<TextParagraph> > m_textStringsById;
149 std::map<unsigned, PageInfo> m_pagesBySeqNum;
150 std::vector<std::pair<ImgType, librevenge::RVNGBinaryData> > m_images;
151 std::vector<BorderArtInfo> m_borderImages;
152 std::vector<ColorReference> m_textColors;
153 std::vector<std::vector<unsigned char> > m_fonts;
154 std::vector<CharacterStyle> m_defaultCharStyles;
155 std::vector<ParagraphStyle> m_defaultParaStyles;
156 std::map<unsigned, ShapeType> m_shapeTypesBySeqNum;
157 std::vector<Color> m_paletteColors;
158 std::vector<unsigned> m_shapeSeqNumsOrdered;
159 std::map<unsigned, unsigned> m_pageSeqNumsByShapeSeqNum;
160 std::map<unsigned, unsigned> m_bgShapeSeqNumsByPageSeqNum;
161 std::set<unsigned> m_skipIfNotBgSeqNums;
163 boost::ptr_vector<ShapeGroupElement> m_topLevelShapes;
164 std::map<unsigned, ShapeGroupElement *> m_groupsBySeqNum;
165 std::list<EmbeddedFontInfo> m_embeddedFonts;
166 std::map<unsigned, ShapeInfo> m_shapeInfosBySeqNum;
167 std::set<unsigned> m_masterPages;
169 std::map<unsigned, unsigned> m_masterPagesByPageSeqNum;
170 std::map<unsigned, std::vector<unsigned> > m_tableCellTextEndsByTextId;
171 std::map<unsigned, unsigned> m_stringOffsetsByTextId;
172 mutable std::vector<bool> m_calculationValuesSeen;
173 std::vector<unsigned> m_pageSeqNumsOrdered;
175 std::vector<unsigned char> m_allText;
176 mutable boost::optional<const char *> m_calculatedEncoding;
177 librevenge::RVNGPropertyList m_metaData;
178
179 // helper functions
180 std::vector<int> getShapeAdjustValues(const ShapeInfo &info) const;
181 boost::optional<unsigned> getMasterPageSeqNum(unsigned pageSeqNum) const;
182 void setRectCoordProps(Coordinate, librevenge::RVNGPropertyList *) const;
183 boost::optional<std::vector<libmspub::TextParagraph> > getShapeText(const ShapeInfo &info) const;
186 void assignShapesToPages();
187 void writePage(unsigned pageSeqNum) const;
188 void writePageShapes(unsigned pageSeqNum) const;
189 void writePageBackground(unsigned pageSeqNum) const;
190 void writeImage(double x, double y, double height, double width,
191 ImgType type, const librevenge::RVNGBinaryData &blob,
192 boost::optional<Color> oneBitColor) const;
193 bool pageIsMaster(unsigned pageSeqNum) const;
194
195 boost::function<void(void)> paintShape(const ShapeInfo &info, const Coordinate &relativeTo, const VectorTransformation2D &foldedTransform, bool isGroup, const VectorTransformation2D &thisTransform) const;
196 double getCalculationValue(const ShapeInfo &info, unsigned index, bool recursiveEntry, const std::vector<int> &adjustValues) const;
197
198 librevenge::RVNGPropertyList getCharStyleProps(const CharacterStyle &, boost::optional<unsigned> defaultCharStyleIndex) const;
199 librevenge::RVNGPropertyList getParaStyleProps(const ParagraphStyle &, boost::optional<unsigned> defaultParaStyleIndex) const;
200 double getSpecialValue(const ShapeInfo &info, const CustomShape &shape, int arg, const std::vector<int> &adjustValues) const;
201 void ponderStringEncoding(const std::vector<TextParagraph> &str);
202 const char *getCalculatedEncoding() const;
203public:
204 static librevenge::RVNGString getColorString(const Color &);
205};
206} // namespace libmspub
207
208#endif /* __MSPUBCOLLECTOR_H__ */
209/* vim:set shiftwidth=2 softtabstop=2 expandtab: */
Definition: ColorReference.h:18
Definition: Fill.h:25
Definition: Fill.h:78
Definition: Fill.h:38
Definition: MSPUBCollector.h:47
std::map< unsigned, std::vector< TextParagraph > > m_textStringsById
Definition: MSPUBCollector.h:148
void setHeightInEmu(unsigned long)
Definition: MSPUBCollector.cpp:1778
void writePage(unsigned pageSeqNum) const
Definition: MSPUBCollector.cpp:1631
std::map< unsigned, ShapeInfo > m_shapeInfosBySeqNum
Definition: MSPUBCollector.h:166
librevenge::RVNGPropertyList getParaStyleProps(const ParagraphStyle &, boost::optional< unsigned > defaultParaStyleIndex) const
Definition: MSPUBCollector.cpp:1425
std::set< unsigned > m_masterPages
Definition: MSPUBCollector.h:167
std::map< unsigned, PageInfo > m_pagesBySeqNum
Definition: MSPUBCollector.h:149
void addShapeLine(unsigned seqNum, Line line)
Definition: MSPUBCollector.cpp:461
bool addTextString(const std::vector< TextParagraph > &str, unsigned id)
Definition: MSPUBCollector.cpp:1747
std::set< unsigned > m_skipIfNotBgSeqNums
Definition: MSPUBCollector.h:161
void setMasterPage(unsigned pageSeqNum, unsigned masterSeqNum)
Definition: MSPUBCollector.cpp:1855
void setShapeStretchBorderArt(unsigned seqNum)
Definition: MSPUBCollector.cpp:304
void setShapeOrder(unsigned seqNum)
Definition: MSPUBCollector.cpp:497
void setNextPage(unsigned seqNum)
Definition: MSPUBCollector.cpp:362
void setTableCellTextEnds(unsigned textId, const std::vector< unsigned > &ends)
Definition: MSPUBCollector.cpp:400
std::vector< std::vector< unsigned char > > m_fonts
Definition: MSPUBCollector.h:153
bool addPage(unsigned seqNum)
Definition: MSPUBCollector.cpp:1379
void setShapeColumnSpacing(unsigned seqNum, unsigned spacing)
Definition: MSPUBCollector.cpp:298
boost::optional< unsigned > getMasterPageSeqNum(unsigned pageSeqNum) const
Definition: MSPUBCollector.cpp:1620
void setShapeFlip(unsigned, bool, bool)
Definition: MSPUBCollector.cpp:1354
void setShapeVerticalTextAlign(unsigned seqNum, VerticalAlign va)
Definition: MSPUBCollector.cpp:274
boost::function< void(void)> paintShape(const ShapeInfo &info, const Coordinate &relativeTo, const VectorTransformation2D &foldedTransform, bool isGroup, const VectorTransformation2D &thisTransform) const
Definition: MSPUBCollector.cpp:587
std::map< unsigned, unsigned > m_masterPagesByPageSeqNum
Definition: MSPUBCollector.h:169
bool go()
Definition: MSPUBCollector.cpp:1703
std::vector< BorderArtInfo > m_borderImages
Definition: MSPUBCollector.h:151
void setShapeCoordinatesRotated90(unsigned seqNum)
Definition: MSPUBCollector.cpp:420
void addDefaultParagraphStyle(const ParagraphStyle &style)
Definition: MSPUBCollector.cpp:1374
std::list< ContentChunkReference > m_contentChunkReferences
Definition: MSPUBCollector.h:144
void setWidthInEmu(unsigned long)
Definition: MSPUBCollector.cpp:1771
std::map< unsigned, unsigned > m_pageSeqNumsByShapeSeqNum
Definition: MSPUBCollector.h:159
void setShapeBeginArrow(unsigned seqNum, const Arrow &arrow)
Definition: MSPUBCollector.cpp:268
std::vector< unsigned > m_pageSeqNumsOrdered
Definition: MSPUBCollector.h:173
std::vector< unsigned char > m_allText
Definition: MSPUBCollector.h:175
void setupShapeStructures(ShapeGroupElement &elt)
Definition: MSPUBCollector.cpp:559
void setShapePictureContrast(unsigned seqNum, int contrast)
Definition: MSPUBCollector.cpp:262
void setShapeCoordinatesInEmu(unsigned seqNum, int xs, int ys, int xe, int ye)
Definition: MSPUBCollector.cpp:1415
std::list< ContentChunkReference >::const_iterator ccr_iterator_t
Definition: MSPUBCollector.h:54
void setShapeLineBackColor(unsigned seqNum, ColorReference backColor)
Definition: MSPUBCollector.cpp:1196
bool setCurrentGroupSeqNum(unsigned seqNum)
Definition: MSPUBCollector.cpp:486
std::vector< unsigned > m_shapeSeqNumsOrdered
Definition: MSPUBCollector.h:158
void setShapePictureRecolor(unsigned seqNum, const ColorReference &recolor)
Definition: MSPUBCollector.cpp:250
std::list< EmbeddedFontInfo > m_embeddedFonts
Definition: MSPUBCollector.h:165
bool m_widthSet
Definition: MSPUBCollector.h:146
MSPUBCollector(const MSPUBCollector &)
boost::ptr_vector< ShapeGroupElement > m_topLevelShapes
Definition: MSPUBCollector.h:163
void designateMasterPage(unsigned seqNum)
Definition: MSPUBCollector.cpp:1850
void setShapeShadow(unsigned seqNum, const Shadow &shadow)
Definition: MSPUBCollector.cpp:411
void addEOTFont(const librevenge::RVNGString &name, const librevenge::RVNGBinaryData &data)
Definition: MSPUBCollector.cpp:245
void setShapeBorderImageId(unsigned seqNum, unsigned borderImageId)
Definition: MSPUBCollector.cpp:425
double m_height
Definition: MSPUBCollector.h:145
void setShapeNumColumns(unsigned seqNum, unsigned numColumns)
Definition: MSPUBCollector.cpp:292
void setBorderImageOffset(unsigned index, unsigned offset)
Definition: MSPUBCollector.cpp:1814
bool pageIsMaster(unsigned pageSeqNum) const
Definition: MSPUBCollector.cpp:1698
void addFont(std::vector< unsigned char > name)
Definition: MSPUBCollector.cpp:1420
void setPageBgShape(unsigned pageSeqNum, unsigned seqNum)
Definition: MSPUBCollector.cpp:481
void writeImage(double x, double y, double height, double width, ImgType type, const librevenge::RVNGBinaryData &blob, boost::optional< Color > oneBitColor) const
Definition: MSPUBCollector.cpp:1202
void setShapeRotation(unsigned seqNum, double rotation)
Definition: MSPUBCollector.cpp:1348
void setShapeType(unsigned seqNum, ShapeType type)
Definition: MSPUBCollector.cpp:1359
double getSpecialValue(const ShapeInfo &info, const CustomShape &shape, int arg, const std::vector< int > &adjustValues) const
Definition: MSPUBCollector.cpp:1224
void setShapePage(unsigned seqNum, unsigned pageSeqNum)
Definition: MSPUBCollector.cpp:1839
void writePageShapes(unsigned pageSeqNum) const
Definition: MSPUBCollector.cpp:1663
void setShapeImgIndex(unsigned seqNum, unsigned index)
Definition: MSPUBCollector.cpp:1395
void setShapeCropType(unsigned seqNum, ShapeType cropType)
Definition: MSPUBCollector.cpp:1860
void setShapeClipPath(unsigned seqNum, const std::vector< libmspub::Vertex > &clip)
Definition: MSPUBCollector.cpp:436
void setRectCoordProps(Coordinate, librevenge::RVNGPropertyList *) const
Definition: MSPUBCollector.cpp:309
std::vector< bool > m_calculationValuesSeen
Definition: MSPUBCollector.h:172
std::set< unsigned > m_shapesWithCoordinatesRotated90
Definition: MSPUBCollector.h:168
void addDefaultCharacterStyle(const CharacterStyle &style)
Definition: MSPUBCollector.cpp:1369
librevenge::RVNGBinaryData * addBorderImage(ImgType type, unsigned borderArtIndex)
Definition: MSPUBCollector.cpp:1803
void writePageBackground(unsigned pageSeqNum) const
Definition: MSPUBCollector.cpp:1674
void setShapePictureBrightness(unsigned seqNum, int brightness)
Definition: MSPUBCollector.cpp:256
void collectMetaData(const librevenge::RVNGPropertyList &metaData)
Definition: MSPUBCollector.cpp:240
void setShapeDash(unsigned seqNum, const Dash &dash)
Definition: MSPUBCollector.cpp:1401
ShapeGroupElement * m_currentShapeGroup
Definition: MSPUBCollector.h:162
void addTextColor(ColorReference c)
Definition: MSPUBCollector.cpp:1845
librevenge::RVNGPropertyList m_metaData
Definition: MSPUBCollector.h:177
std::vector< ColorReference > m_textColors
Definition: MSPUBCollector.h:152
bool m_heightSet
Definition: MSPUBCollector.h:146
const char * getCalculatedEncoding() const
Definition: MSPUBCollector.cpp:1134
void addTextShape(unsigned stringId, unsigned seqNum)
Definition: MSPUBCollector.cpp:1390
void setShapeFill(unsigned seqNum, boost::shared_ptr< Fill > fill, bool skipIfNotBg)
Definition: MSPUBCollector.cpp:1406
bool endGroup()
Definition: MSPUBCollector.cpp:451
virtual ~MSPUBCollector()
Definition: MSPUBCollector.cpp:1344
void setTextStringOffset(unsigned textId, unsigned offset)
Definition: MSPUBCollector.cpp:394
librevenge::RVNGDrawingInterface * m_painter
Definition: MSPUBCollector.h:143
bool hasPage(unsigned seqNum) const
Definition: MSPUBCollector.cpp:471
std::vector< CharacterStyle > m_defaultCharStyles
Definition: MSPUBCollector.h:154
double m_width
Definition: MSPUBCollector.h:145
void setAdjustValue(unsigned seqNum, unsigned index, int adjust)
Definition: MSPUBCollector.cpp:1364
void assignShapesToPages()
Definition: MSPUBCollector.cpp:1603
std::vector< std::pair< ImgType, librevenge::RVNGBinaryData > > m_images
Definition: MSPUBCollector.h:150
std::vector< Color > m_paletteColors
Definition: MSPUBCollector.h:157
std::map< unsigned, std::vector< unsigned > > m_tableCellTextEndsByTextId
Definition: MSPUBCollector.h:170
void setShapeBorderPosition(unsigned seqNum, BorderPosition pos)
Definition: MSPUBCollector.cpp:466
void useEncodingHeuristic()
Definition: MSPUBCollector.cpp:406
librevenge::RVNGPropertyList getCharStyleProps(const CharacterStyle &, boost::optional< unsigned > defaultCharStyleIndex) const
Definition: MSPUBCollector.cpp:1508
unsigned short m_numPages
Definition: MSPUBCollector.h:147
std::vector< ParagraphStyle > m_defaultParaStyles
Definition: MSPUBCollector.h:155
void setShapeMargins(unsigned seqNum, unsigned left, unsigned top, unsigned right, unsigned bottom)
Definition: MSPUBCollector.cpp:476
boost::optional< std::vector< libmspub::TextParagraph > > getShapeText(const ShapeInfo &info) const
Definition: MSPUBCollector.cpp:545
void beginGroup()
Definition: MSPUBCollector.cpp:441
std::map< unsigned, unsigned > m_bgShapeSeqNumsByPageSeqNum
Definition: MSPUBCollector.h:160
void ponderStringEncoding(const std::vector< TextParagraph > &str)
Definition: MSPUBCollector.cpp:1758
MSPUBCollector(::librevenge::RVNGDrawingInterface *painter)
static librevenge::RVNGString getColorString(const Color &)
Definition: MSPUBCollector.cpp:1587
std::vector< int > getShapeAdjustValues(const ShapeInfo &info) const
Definition: MSPUBCollector.cpp:520
std::map< unsigned, ShapeType > m_shapeTypesBySeqNum
Definition: MSPUBCollector.h:156
void addBlackToPaletteIfNecessary()
Definition: MSPUBCollector.cpp:1595
bool m_encodingHeuristic
Definition: MSPUBCollector.h:174
MSPUBCollector & operator=(const MSPUBCollector &)
void setShapeTableInfo(unsigned seqNum, const TableInfo &ti)
Definition: MSPUBCollector.cpp:286
boost::optional< const char * > m_calculatedEncoding
Definition: MSPUBCollector.h:176
std::map< unsigned, unsigned > m_stringOffsetsByTextId
Definition: MSPUBCollector.h:171
double getCalculationValue(const ShapeInfo &info, unsigned index, bool recursiveEntry, const std::vector< int > &adjustValues) const
Definition: MSPUBCollector.cpp:1264
void addPaletteColor(Color)
Definition: MSPUBCollector.cpp:506
void setShapeCustomPath(unsigned seqNum, const DynamicCustomShape &shape)
Definition: MSPUBCollector.cpp:430
void setShapeEndArrow(unsigned seqNum, const Arrow &arrow)
Definition: MSPUBCollector.cpp:280
bool addImage(unsigned index, ImgType type, librevenge::RVNGBinaryData img)
Definition: MSPUBCollector.cpp:1785
std::map< unsigned, ShapeGroupElement * > m_groupsBySeqNum
Definition: MSPUBCollector.h:164
Definition: Fill.h:54
Definition: ShapeGroupElement.h:22
Definition: Fill.h:66
Definition: VectorTransformation2D.h:26
Definition: Arrow.h:14
ShapeType
Definition: ShapeType.h:16
VerticalAlign
Definition: VerticalAlign.h:16
BorderPosition
Definition: MSPUBTypes.h:25
ImgType
Definition: MSPUBTypes.h:180
Definition: Arrow.h:31
Definition: MSPUBTypes.h:89
Definition: MSPUBTypes.h:166
Definition: Coordinate.h:16
Definition: PolygonUtils.h:59
Definition: Dash.h:49
Definition: PolygonUtils.h:92
Definition: Line.h:19
Definition: MSPUBCollector.h:135
PageInfo()
Definition: MSPUBCollector.h:137
std::vector< ShapeGroupElement * > m_shapeGroupsOrdered
Definition: MSPUBCollector.h:136
Definition: MSPUBTypes.h:130
Definition: Shadow.h:27
Definition: ShapeInfo.h:35
Definition: TableInfo.h:35

Generated for libmspub by doxygen 1.9.3