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_SHAPEINFO_H
11 #define INCLUDED_SHAPEINFO_H
12 
13 #include <functional>
14 #include <map>
15 #include <memory>
16 #include <vector>
17 
18 #include <boost/optional.hpp>
19 
20 #include "Arrow.h"
21 #include "ColorReference.h"
22 #include "Coordinate.h"
23 #include "Dash.h"
24 #include "Fill.h"
25 #include "Line.h"
26 #include "MSPUBTypes.h"
27 #include "Margins.h"
28 #include "PolygonUtils.h"
29 #include "Shadow.h"
30 #include "ShapeType.h"
31 #include "TableInfo.h"
32 #include "VerticalAlign.h"
33 
34 namespace libmspub
35 {
36 void noop(const CustomShape *);
37 struct ShapeInfo
38 {
39   boost::optional<ShapeType> m_type;
40   boost::optional<ShapeType> m_cropType;
41   boost::optional<unsigned> m_imgIndex;
42   boost::optional<unsigned> m_borderImgIndex;
43   boost::optional<Coordinate> m_coordinates;
44   std::vector<Line> m_lines;
45   boost::optional<unsigned> m_pageSeqNum;
46   boost::optional<unsigned> m_textId;
47   std::map<unsigned, int> m_adjustValuesByIndex;
48   std::vector<int> m_adjustValues;
49   boost::optional<double> m_rotation;
50   boost::optional<std::pair<bool, bool> > m_flips;
51   boost::optional<Margins> m_margins;
52   boost::optional<BorderPosition> m_borderPosition; // Irrelevant except for rectangular shapes
53   std::shared_ptr<const Fill> m_fill;
54   boost::optional<DynamicCustomShape> m_customShape;
55   bool m_stretchBorderArt;
56   boost::optional<ColorReference> m_lineBackColor;
57   boost::optional<Dash> m_dash;
58   boost::optional<TableInfo> m_tableInfo;
59   boost::optional<unsigned> m_numColumns;
60   unsigned m_columnSpacing;
61   boost::optional<Arrow> m_beginArrow;
62   boost::optional<Arrow> m_endArrow;
63   boost::optional<VerticalAlign> m_verticalAlign;
64   boost::optional<ColorReference> m_pictureRecolor;
65   boost::optional<Shadow> m_shadow;
66   boost::optional<int> m_innerRotation;
67   std::vector<libmspub::Vertex> m_clipPath;
68   boost::optional<int> m_pictureBrightness;
69   boost::optional<int> m_pictureContrast;
ShapeInfoShapeInfo70   ShapeInfo() : m_type(), m_cropType(), m_imgIndex(), m_borderImgIndex(),
71     m_coordinates(), m_lines(), m_pageSeqNum(),
72     m_textId(), m_adjustValuesByIndex(), m_adjustValues(),
73     m_rotation(), m_flips(), m_margins(), m_borderPosition(),
74     m_fill(), m_customShape(), m_stretchBorderArt(false),
75     m_lineBackColor(), m_dash(), m_tableInfo(),
76     m_numColumns(),
77     m_columnSpacing(0), m_beginArrow(), m_endArrow(),
78     m_verticalAlign(), m_pictureRecolor(), m_shadow(), m_innerRotation(), m_clipPath(), m_pictureBrightness(), m_pictureContrast()
79   {
80   }
getCustomShapeShapeInfo81   std::shared_ptr<const CustomShape> getCustomShape() const
82   {
83     if (bool(m_customShape))
84     {
85       return getFromDynamicCustomShape(m_customShape.get());
86     }
87     if (bool(m_cropType))
88     {
89       return std::shared_ptr<const CustomShape>(
90                libmspub::getCustomShape(m_cropType.get()),
91                std::function<void (const CustomShape *)>(noop));
92     }
93     return std::shared_ptr<const CustomShape>(
94              libmspub::getCustomShape(m_type.get_value_or(RECTANGLE)),
95              std::function<void (const CustomShape *)>(noop));
96   }
97 };
98 }
99 #endif
100 /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
101