1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /*
3  * This file is part of the libetonyek 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 IWORKTYPES_H_INCLUDED
11 #define IWORKTYPES_H_INCLUDED
12 
13 #include "IWORKTypes_fwd.h"
14 
15 #include <deque>
16 #include <map>
17 #include <string>
18 
19 #include <boost/optional.hpp>
20 #include <boost/variant.hpp>
21 
22 #if defined(__GNUC__) && !defined(__clang__)
23 #pragma GCC diagnostic push
24 #pragma GCC diagnostic ignored "-Weffc++"
25 #endif
26 #include <mdds/flat_segment_tree.hpp>
27 #if defined(__GNUC__) && !defined(__clang__)
28 #pragma GCC diagnostic pop
29 #endif
30 
31 #include "libetonyek_utils.h"
32 #include "IWORKEnum.h"
33 #include "IWORKPath_fwd.h"
34 #include "IWORKStyle_fwd.h"
35 #include "IWORKFormula.h"
36 
37 namespace libetonyek
38 {
39 
40 class IWORKOutputElements;
41 
42 typedef std::unordered_map<std::string, IWORKOutputElements> IWORKHeaderFooterMap_t;
43 
44 struct IWORKSize
45 {
46   double m_width;
47   double m_height;
48   IWORKSize();
49   IWORKSize(double w, double h);
50 };
51 
52 struct IWORKPosition
53 {
54   double m_x;
55   double m_y;
56 
57   IWORKPosition();
58   IWORKPosition(double x_, double y_);
59 };
60 
61 struct IWORKGeometry
62 {
63   IWORKSize m_naturalSize;
64   IWORKSize m_size;
65   IWORKPosition m_position;
66   //! final angle in radians
67   boost::optional<double> m_angle;
68   boost::optional<double> m_shearXAngle;
69   boost::optional<double> m_shearYAngle;
70   boost::optional<bool> m_horizontalFlip;
71   boost::optional<bool> m_verticalFlip;
72   boost::optional<bool> m_aspectRatioLocked;
73   boost::optional<bool> m_sizesLocked;
74 
75   IWORKGeometry();
76 };
77 
78 struct IWORKColor
79 {
80   double m_red;
81   double m_green;
82   double m_blue;
83   double m_alpha;
84 
85   IWORKColor();
86   IWORKColor(double r, double g, double b, double a);
87 };
88 
89 struct IWORKMarker
90 {
91   IWORKMarker();
92   bool m_filled;
93   double m_scale;
94   int m_pathJoin;
95   boost::optional<std::string> m_path;
96   boost::optional<IWORKPosition> m_endPoint;
97 };
98 
99 struct IWORKPadding
100 {
101   boost::optional<double> m_top;
102   boost::optional<double> m_right;
103   boost::optional<double> m_bottom;
104   boost::optional<double> m_left;
105 
106   IWORKPadding();
107 };
108 typedef std::unordered_map<ID_t, IWORKPadding> IWORKPaddingMap_t;
109 
110 struct IWORKTabStop
111 {
112   IWORKTabulationType m_align;
113   double m_pos;
114 
115   IWORKTabStop();
116   IWORKTabStop(IWORKTabulationType align, double pos_);
117 };
118 
119 typedef std::deque<IWORKTabStop> IWORKTabStops_t;
120 typedef std::unordered_map<ID_t, IWORKTabStops_t> IWORKTabStopsMap_t;
121 typedef mdds::flat_segment_tree<unsigned, IWORKStylePtr_t> IWORKGridLine_t;
122 typedef std::map<unsigned,IWORKGridLine_t> IWORKGridLineMap_t;
123 typedef std::shared_ptr<IWORKFormula> IWORKFormulaPtr_t;
124 typedef std::unordered_map<ID_t, IWORKFormulaPtr_t> IWORKFormulaMap_t;
125 
126 struct IWORKLine
127 {
128   IWORKGeometryPtr_t m_geometry;
129   IWORKStylePtr_t m_style;
130   boost::optional<int> m_order;
131   boost::optional<double> m_x1;
132   boost::optional<double> m_y1;
133   boost::optional<double> m_x2;
134   boost::optional<double> m_y2;
135 
136   IWORKLine();
137 };
138 
139 struct IWORKData
140 {
141   RVNGInputStreamPtr_t m_stream;
142   boost::optional<std::string> m_displayName;
143   std::string m_mimeType;
144 
145   IWORKData();
146 };
147 
148 struct IWORKMediaContent
149 {
150   IWORKImageType m_type;
151   boost::optional<IWORKSize> m_size;
152   IWORKDataPtr_t m_data;
153   boost::optional<IWORKColor> m_fillColor;
154 
155   IWORKMediaContent();
156 };
157 
158 struct IWORKMedia
159 {
160   IWORKGeometryPtr_t m_geometry;
161   IWORKGeometryPtr_t m_cropGeometry;
162   IWORKStylePtr_t m_style;
163   boost::optional<int> m_order;
164   bool m_locked;
165   boost::optional<bool> m_placeholder;
166   boost::optional<IWORKSize> m_placeholderSize;
167   IWORKMediaContentPtr_t m_content;
168 
169   IWORKMedia();
170 };
171 
172 struct IWORKExternalTextWrap
173 {
174   IWORKWrapStyle m_style;
175   bool m_floatingWrapEnabled;
176   bool m_inlineWrapEnabled;
177   IWORKWrapDirection m_direction;
178   bool m_aligned;
179   IWORKWrapType m_floatingType;
180   double m_margin;
181   double m_alphaThreshold;
182   IWORKExternalTextWrap();
183 };
184 typedef std::unordered_map<ID_t, IWORKExternalTextWrap> IWORKExternalTextWrapMap_t;
185 
186 struct IWORKWrap
187 {
188   IWORKPathPtr_t m_path;
189   IWORKGeometryPtr_t m_geometry;
190 
191   IWORKWrap();
192 };
193 
194 struct IWORKLineSpacing
195 {
196   IWORKLineSpacing(double amount, bool relative);
197 
198   double m_amount;
199   bool m_relative;
200   bool m_atLeast;
201 };
202 typedef std::unordered_map<ID_t, IWORKLineSpacing> IWORKLineSpacingMap_t;
203 
204 struct IWORKDateTimeData
205 {
206   IWORKDateTimeData();
207 
208   int m_year, m_month, m_day;
209   int m_hour, m_minute;
210   float m_second;
211 };
212 
213 struct IWORKColumnRowSize
214 {
215   IWORKColumnRowSize();
216   explicit IWORKColumnRowSize(double size, bool exactSize=true);
217   boost::optional<double> m_size;
218   bool m_exactSize;
219 };
220 
221 struct IWORKTableVector
222 {
223   IWORKTableVector();
224   boost::optional<unsigned> m_axis;
225   boost::optional<double> m_along;
226   boost::optional<unsigned> m_beginCell;
227   boost::optional<unsigned> m_endCell;
228   IWORKStylePtr_t m_style;
229 };
230 typedef std::unordered_map<ID_t, IWORKTableVector> IWORKTableVectorMap_t;
231 
232 struct IWORKTableCell
233 {
234   IWORKTableCell();
235   IWORKStylePtr_t m_style;
236   boost::optional<double> m_preferredHeight;
237   IWORKTableVector m_minXBorder, m_maxXBorder, m_minYBorder, m_maxYBorder;
238 };
239 typedef std::unordered_map<ID_t, IWORKTableCell> IWORKTableCellMap_t;
240 
241 struct IWORKTableData
242 {
243   IWORKTableData();
244 
245   IWORKColumnSizes_t m_columnSizes;
246   IWORKRowSizes_t m_rowSizes;
247 
248   unsigned m_column;
249   unsigned m_row;
250   unsigned m_numColumns;
251   unsigned m_numRows;
252 
253   boost::optional<unsigned> m_columnSpan;
254   boost::optional<unsigned> m_rowSpan;
255   boost::optional<unsigned> m_cellMove;
256   boost::optional<std::string> m_content;
257   boost::optional<IWORKDateTimeData> m_dateTime;
258   IWORKFormulaPtr_t m_formula;
259   boost::optional<unsigned> m_formulaHC;
260   IWORKGridLineMap_t m_horizontalLines;
261   IWORKGridLineMap_t m_verticalLines;
262   std::unordered_map<double, unsigned> m_positionToHorizontalLineMap;
263   std::unordered_map<double, unsigned> m_positionToVerticalLineMap;
264   IWORKStylePtr_t m_style;
265   IWORKCellType m_type;
266 };
267 
268 struct IWORKPattern
269 {
270   IWORKPattern();
271 
272   IWORKStrokeType m_type;
273   std::deque<double> m_values;
274 };
275 typedef std::unordered_map<ID_t, IWORKPattern> IWORKPatternMap_t;
276 
277 struct IWORKStroke
278 {
279   IWORKStroke();
280 
281   double m_width;
282   IWORKColor m_color;
283   IWORKLineJoin m_join;
284   IWORKLineCap m_cap;
285   IWORKPattern m_pattern;
286 };
287 typedef std::unordered_map<ID_t, IWORKStroke> IWORKStrokeMap_t;
288 
289 struct IWORKGradientStop
290 {
291   IWORKGradientStop();
292 
293   IWORKColor m_color;
294   double m_fraction;
295   double m_inflection;
296 };
297 typedef std::unordered_map<ID_t, IWORKGradientStop> IWORKGradientStopMap_t;
298 
299 struct IWORKGradient
300 {
301   IWORKGradient();
302 
303   IWORKGradientType m_type;
304   std::deque<IWORKGradientStop> m_stops;
305   double m_angle;
306 };
307 typedef std::unordered_map<ID_t, IWORKGradient> IWORKGradientMap_t;
308 
309 typedef boost::variant<IWORKColor, IWORKGradient, IWORKMediaContent> IWORKFill;
310 typedef std::unordered_map<ID_t, IWORKFill> IWORKFillMap_t;
311 
312 struct IWORKShadow
313 {
314   IWORKShadow();
315 
316   bool m_visible;
317   IWORKColor m_color;
318   double m_angle;
319   double m_glossiness;
320   double m_offset;
321   double m_opacity;
322   double m_radius;
323 };
324 typedef std::unordered_map<ID_t, IWORKShadow> IWORKShadowMap_t;
325 typedef std::deque<IWORKShadow> IWORKFilters_t;
326 typedef std::unordered_map<ID_t, IWORKFilters_t> IWORKFiltersMap_t;
327 
328 struct IWORKMetadata
329 {
330   IWORKMetadata();
331 
332   std::string m_title;
333   std::string m_author;
334   std::string m_keywords;
335   std::string m_comment;
336 };
337 
338 struct IWORKColumns
339 {
340   struct Column
341   {
342     Column();
343 
344     double m_width;
345     double m_spacing;
346   };
347 
348   typedef std::deque<Column> Columns_t;
349 
350   IWORKColumns();
351 
352   bool m_equal;
353   Columns_t m_columns;
354 };
355 typedef std::unordered_map<ID_t, IWORKColumns> IWORKColumnsMap_t;
356 
357 struct IWORKPageMaster
358 {
359   IWORKPageMaster();
360 
361   std::string m_header;
362   std::string m_footer;
363 };
364 
365 struct IWORKNumberFormat
366 {
367   IWORKNumberFormat();
368   std::string getRVNGValueType() const;
369   IWORKCellNumberType m_type;
370   std::string m_string;
371   int m_decimalPlaces;
372   std::string m_currencyCode;
373   int m_negativeStyle;
374   bool m_thousandsSeparator;
375   int m_fractionAccuracy;
376   bool m_accountingStyle;
377   int m_base;
378   int m_basePlaces;
379   bool m_baseUseMinusSign;
380 };
381 typedef std::unordered_map<ID_t, IWORKNumberFormat> IWORKNumberFormatMap_t;
382 
383 struct IWORKDateTimeFormat
384 {
385   IWORKDateTimeFormat();
386 
387   std::string m_format;
388 };
389 typedef std::unordered_map<ID_t, IWORKDateTimeFormat> IWORKDateTimeFormatMap_t;
390 
391 struct IWORKDurationFormat
392 {
393   IWORKDurationFormat();
394 
395   std::string m_format;
396 };
397 typedef std::unordered_map<ID_t, IWORKDurationFormat> IWORKDurationFormatMap_t;
398 
399 struct IWORKFilterDescriptor
400 {
401   IWORKFilterDescriptor();
402 
403   bool m_isShadow;
404 };
405 
406 typedef std::unordered_map<ID_t, IWORKFilterDescriptor> IWORKFilterDescriptorMap_t;
407 
408 struct IWORKPrintInfo
409 {
410   IWORKPrintInfo();
411 
412   boost::optional<double> m_height;
413   boost::optional<double> m_width;
414   boost::optional<int> m_orientation;
415   boost::optional<double> m_marginBottom;
416   boost::optional<double> m_marginLeft;
417   boost::optional<double> m_marginRight;
418   boost::optional<double> m_marginTop;
419   boost::optional<double> m_footerHeight;
420   boost::optional<double> m_headerHeight;
421 };
422 
423 struct IWORKListLabelGeometry
424 {
425   IWORKListLabelGeometry();
426 
427   IWORKAlignment m_align;
428   double m_scale;
429   double m_offset;
430   bool m_scaleWithText;
431 };
432 
433 typedef std::unordered_map<ID_t, IWORKListLabelGeometry> IWORKListLabelGeometryMap_t;
434 
435 struct IWORKTextLabelFormat
436 {
437   IWORKTextLabelFormat();
438 
439   IWORKLabelNumFormatSurrounding m_prefix;
440   IWORKLabelNumFormat m_format;
441   IWORKLabelNumFormatSurrounding m_suffix;
442 };
443 
444 struct IWORKTextLabel
445 {
446   IWORKTextLabel();
447 
448   IWORKTextLabelFormat m_format;
449   bool m_tiered;
450   unsigned m_first;
451 };
452 
453 // Type of list label. One of: none, bullet, text, image.
454 // Note: The bool type, representing 'none', is just a placeholder. The
455 // value is not important.
456 typedef boost::variant<bool, std::string, IWORKTextLabel, IWORKMediaContentPtr_t> IWORKListLabelTypeInfo_t;
457 typedef std::unordered_map<ID_t, IWORKListLabelTypeInfo_t> IWORKListLabelTypeInfoMap_t;
458 
459 typedef std::map<unsigned, IWORKStylePtr_t> IWORKListLevels_t;
460 }
461 
462 #endif //  IWORKTYPES_H_INCLUDED
463 
464 /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
465