blob: d91b6d1a1eaa7c27d246dedfe2906dfac78b3f1e [file] [log] [blame]
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
// -*- mode: C++ -*-
//
// Copyright (C) 2013-2020 Red Hat, Inc.
#include <stdexcept>
#include <fstream>
#include "abg-internal.h"
// <headers defining libabigail's API go under here>
ABG_BEGIN_EXPORT_DECLARATIONS
#include "abg-viz-svg.h"
ABG_END_EXPORT_DECLARATIONS
// </headers defining libabigail's API>
namespace abigail
{
using std::ostream;
using std::ostringstream;
// Constants.
// Using pixels, units vs. representation
// const canvas ansi_letter_mm = { units::millimeter, 215.9, 279.4 };
// const canvas iso_a4_mm = { units::millimeter, 210, 297 };
// const canvas ansi_letter_px = { units::pixel, 765, 990 };
// const canvas iso_a4_px = { units::pixel, 765, 990 };
const canvas ansi_letter_canvas = { units::pixel, 765, 990 };
const canvas iso_a4_canvas = { units::pixel, 765, 990 };
const typography arial_typo = \
{ "'ArialMT'", 12, color::black, R"(text-anchor="middle")"};
const typography source_code_pro_typo = \
{ "Source Code Pro Light", 12, color::black, R"(text-anchor="middle")"};
const typography roboto_typo = \
{ "Roboto Light", 12, color::black, R"(text-anchor="middle")"};
const style primary_row_sty = { color::white, color::black, "" };
const style base_row_sty = { color::white, color::gray75, "" };
const style member_row_sty = { color::black, color::gray25, "" };
const style implementation_row_sty = { color::black, color::white, "" };
// XXX Do not export.
void
string_replace(std::string& target, const std::string& match,
const std::string& replace)
{
size_t pos = 0;
while((pos = target.find(match, pos)) != std::string::npos)
{
target.replace(pos, match.length(), replace);
pos += replace.length();
}
}
std::string
units_to_string(units __val)
{
std::string ret;
switch (__val)
{
case units::millimeter:
ret = "mm";
break;
case units::pixel:
ret = "px";
break;
default:
throw std::logic_error("abigail::units_to_string units not recognized");
break;
}
return ret;
}
std::string
color_to_string(color __val)
{
std::string ret;
switch (__val)
{
case color::white:
ret = "white";
break;
case color::gray25:
ret = "gainsboro";
break;
case color::gray75:
ret = "slategray";
break;
case color::black:
ret = "black";
break;
default:
throw std::logic_error("abigail::color_to_string color not recognized");
break;
}
return ret;
}
std::string
typography::anchor_to_string(anchor __val) const
{
std::string ret;
switch (__val)
{
case start:
ret = "start";
break;
case middle:
ret = "middle";
break;
default:
throw std::logic_error("abigail::anchor_to_string anchor not recognized");
break;
}
return ret;
}
std::string
typography::to_attribute(anchor __a) const
{
const std::string name("__name");
const std::string size("__size");
const std::string anchor("__anchor");
std::string strip = R"(font-family="__name" font-size="__size" text-anchor="__anchor")";
string_replace(strip, name, _M_face);
string_replace(strip, size, std::to_string(_M_size));
string_replace(strip, anchor, anchor_to_string(__a));
// NB: Add in extra _M_attributes if necessary.
return strip;
}
}//end namespace abigail