libabigail
abg-viz-common.cc
1// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
2// -*- mode: C++ -*-
3//
4// Copyright (C) 2013-2025 Red Hat, Inc.
5
6#include <stdexcept>
7#include <fstream>
8
9#include "abg-internal.h"
10// <headers defining libabigail's API go under here>
11ABG_BEGIN_EXPORT_DECLARATIONS
12
13#include "abg-viz-svg.h"
14
15ABG_END_EXPORT_DECLARATIONS
16// </headers defining libabigail's API>
17
18namespace abigail
19{
20
21using std::ostream;
22using std::ostringstream;
23
24// Constants.
25
26// Using pixels, units vs. representation
27// const canvas ansi_letter_mm = { units::millimeter, 215.9, 279.4 };
28// const canvas iso_a4_mm = { units::millimeter, 210, 297 };
29// const canvas ansi_letter_px = { units::pixel, 765, 990 };
30// const canvas iso_a4_px = { units::pixel, 765, 990 };
31const canvas ansi_letter_canvas = { units::pixel, 765, 990 };
32const canvas iso_a4_canvas = { units::pixel, 765, 990 };
33
35 { "'ArialMT'", 12, color::black, R"(text-anchor="middle")"};
36
37const typography source_code_pro_typo = \
38 { "Source Code Pro Light", 12, color::black, R"(text-anchor="middle")"};
39
40const typography roboto_typo = \
41 { "Roboto Light", 12, color::black, R"(text-anchor="middle")"};
42
43const style primary_row_sty = { color::white, color::black, "" };
44const style base_row_sty = { color::white, color::gray75, "" };
45const style member_row_sty = { color::black, color::gray25, "" };
46const style implementation_row_sty = { color::black, color::white, "" };
47
48
49// XXX Do not export.
50void
51string_replace(std::string& target, const std::string& match,
52 const std::string& replace)
53{
54 size_t pos = 0;
55 while((pos = target.find(match, pos)) != std::string::npos)
56 {
57 target.replace(pos, match.length(), replace);
58 pos += replace.length();
59 }
60}
61
62std::string
63units_to_string(units __val)
64{
65 std::string ret;
66 switch (__val)
67 {
68 case units::millimeter:
69 ret = "mm";
70 break;
71 case units::pixel:
72 ret = "px";
73 break;
74 default:
75 throw std::logic_error("abigail::units_to_string units not recognized");
76 break;
77 }
78 return ret;
79}
80
81std::string
82color_to_string(color __val)
83{
84 std::string ret;
85 switch (__val)
86 {
87 case color::white:
88 ret = "white";
89 break;
90 case color::gray25:
91 ret = "gainsboro";
92 break;
93 case color::gray75:
94 ret = "slategray";
95 break;
96 case color::black:
97 ret = "black";
98 break;
99 default:
100 throw std::logic_error("abigail::color_to_string color not recognized");
101 break;
102 }
103 return ret;
104}
105
106std::string
107typography::anchor_to_string(anchor __val) const
108{
109 std::string ret;
110 switch (__val)
111 {
112 case start:
113 ret = "start";
114 break;
115 case middle:
116 ret = "middle";
117 break;
118 default:
119 throw std::logic_error("abigail::anchor_to_string anchor not recognized");
120 break;
121 }
122 return ret;
123}
124
125
126std::string
127typography::to_attribute(anchor __a) const
128{
129 const std::string name("__name");
130 const std::string size("__size");
131 const std::string anchor("__anchor");
132 std::string strip = R"(font-family="__name" font-size="__size" text-anchor="__anchor")";
133 string_replace(strip, name, _M_face);
134 string_replace(strip, size, std::to_string(_M_size));
135 string_replace(strip, anchor, anchor_to_string(__a));
136
137 // NB: Add in extra _M_attributes if necessary.
138 return strip;
139}
140
141}//end namespace abigail
bool match(const regex_t_sptr &r, const std::string &str)
See if a string matches a regex.
Definition: abg-regex.cc:127
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.
units
Measurement abstraction type, conversion function.
const typography arial_typo
Useful typography constants.
color
Color, conversion function.
void string_replace(std::string &target, const std::string &match, const std::string &replace)
Utility function, like regex_replace.
Datum consolidating style preferences.