1 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
2 // -*- mode: C++ -*-
3 //
4 // Copyright (C) 2013-2020 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>
11 ABG_BEGIN_EXPORT_DECLARATIONS
12
13 #include "abg-viz-svg.h"
14
15 ABG_END_EXPORT_DECLARATIONS
16 // </headers defining libabigail's API>
17
18 namespace abigail
19 {
20
21 using std::ostream;
22 using 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 };
31 const canvas ansi_letter_canvas = { units::pixel, 765, 990 };
32 const canvas iso_a4_canvas = { units::pixel, 765, 990 };
33
34 const typography arial_typo = \
35 { "'ArialMT'", 12, color::black, R"(text-anchor="middle")"};
36
37 const typography source_code_pro_typo = \
38 { "Source Code Pro Light", 12, color::black, R"(text-anchor="middle")"};
39
40 const typography roboto_typo = \
41 { "Roboto Light", 12, color::black, R"(text-anchor="middle")"};
42
43 const style primary_row_sty = { color::white, color::black, "" };
44 const style base_row_sty = { color::white, color::gray75, "" };
45 const style member_row_sty = { color::black, color::gray25, "" };
46 const style implementation_row_sty = { color::black, color::white, "" };
47
48
49 // XXX Do not export.
50 void
string_replace(std::string & target,const std::string & match,const std::string & replace)51 string_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
62 std::string
units_to_string(units __val)63 units_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
81 std::string
color_to_string(color __val)82 color_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
106 std::string
anchor_to_string(anchor __val) const107 typography::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
126 std::string
to_attribute(anchor __a) const127 typography::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
142