libabigail
abg-viz-svg.h
Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
2 // -*- mode: C++ -*-
3 //
4 // Copyright (C) 2013-2023 Red Hat, Inc.
5 
6 /// @file
7 
8 #ifndef __ABG_VIZ_SVG_H__
9 #define __ABG_VIZ_SVG_H__
10 
11 #include <abg-viz-common.h>
12 
13 namespace abigail
14 {
15 
16 /**
17  Row displaying one element of member data.
18 
19  Wide open background spaces, what do they look like, what do the
20  things in the foreground look like? Rectangle, for one.
21 
22  Some characteristics:
23  - horizontal label (text anchor = start ie left).
24  - background box
25  - text data (text anchor = middle ie centered).
26  */
27 struct row
28 {
29  std::string _M_id;
30  const style& _M_style;
31 
32  units_type _M_offset;
33  units_type _M_size;
34  units_type _M_align;
35 };
36 
37 /// Useful row constants. Maybe just do enum->value map.
38 extern const style primary_row_sty;
39 extern const style base_row_sty;
40 extern const style member_row_sty;
41 extern const style implementation_row_sty;
42 
43 
44 /**
45  SVG "array" style notation for size/layout/alignment.
46 
47  This is a compact SVG representation of class layout.
48 
49  It is composed of a minimum of three data points for each member or
50  base of a class:
51 
52  - offset index
53  - size
54  - align
55 
56  Including annotations for holes, padding, and
57  implementation-specified and otherwise invisible objects.
58 
59  It's constructed by creating vertical columns for each of the data
60  points specified above, and filling in horizontal rows for each of
61  the class components.
62  */
63 struct svg
64 {
65 
66 private:
67 
68  const std::string _M_title;
69  const canvas& _M_canvas;
70  const typography& _M_typo;
71 
72  const units_type _M_x_size = 3; // Number of columns
73  units_type _M_x_space; // Column spacing.
74  units_type _M_x_origin; // X origin
75 
76  units_type _M_y_size; // Number of rows
77  units_type _M_y_space; // Row spacing.
78  units_type _M_y_origin; // Y origin
79 
80  std::ostringstream _M_sstream;
81 
82  // static const units_type _M_stroke_width = 1;
83  // static const units_type _M_text_padding = 10;
84 
85 public:
86 
87  svg(const std::string &__title,
88  const canvas& __cv = ansi_letter_canvas,
89  const typography& __typo = arial_typo)
90  : _M_title(__title), _M_canvas(__cv), _M_typo(__typo), _M_y_size(0)
91  {
92  // Offsets require: typo, canvas units, size.
93  _M_x_space = 40;
94  _M_y_space = 40;
95  _M_x_origin = _M_x_space * 1;
96  _M_y_origin = _M_y_space * 2;
97  }
98 
99  // Empty when the output buffer is.
100  bool
101  empty() { return _M_sstream.str().empty(); }
102 
103  void
104  start_element();
105 
106  void
107  finish_element();
108 
109  void
110  add_title();
111 
112  void
113  add_y_row(const row&);
114 
115  void
116  add_y_lines();
117 
118  void
119  add_y_label();
120 
121  void
122  write();
123 
124  void
125  start()
126  {
127  this->start_element();
128  this->add_title();
129  }
130 
131  void
132  finish()
133  {
134  this->add_y_label();
135  this->add_y_lines();
136  this->finish_element();
137  this->write();
138  }
139 };
140 
141 // XXX connect external xml file to input.
142 // parse input, pick apart elements, attributes.
143 
144 }// end namespace abigail
145 
146 #endif //__ABG_VIZ_SVG_H__
Toplevel namespace for libabigail.
const style primary_row_sty
Useful row constants. Maybe just do enum->value map.
const canvas ansi_letter_canvas
Useful canvas constants.
const typography arial_typo
Useful typography constants.
Datum consolidating style preferences.