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