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-2025 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
13namespace 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 */
27struct 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.
38extern const style primary_row_sty;
39extern const style base_row_sty;
40extern const style member_row_sty;
41extern 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 */
63struct svg
64{
65
66private:
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
85public:
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.