// SPDX-License-Identifier: LGPL-3.0-or-later // -*- mode: C++ -*- // // Copyright (C) 2013-2020 Red Hat, Inc. /// @file #ifndef __ABG_VIZ_SVG_H__ #define __ABG_VIZ_SVG_H__ #include namespace abigail { /** Row displaying one element of member data. Wide open background spaces, what do they look like, what do the things in the foreground look like? Rectangle, for one. Some characteristics: - horizontal label (text anchor = start ie left). - background box - text data (text anchor = middle ie centered). */ struct row { std::string _M_id; const style& _M_style; units_type _M_offset; units_type _M_size; units_type _M_align; }; /// Useful row constants. Maybe just do enum->value map. extern const style primary_row_sty; extern const style base_row_sty; extern const style member_row_sty; extern const style implementation_row_sty; /** SVG "array" style notation for size/layout/alignment. This is a compact SVG representation of class layout. It is composed of a minimum of three data points for each member or base of a class: - offset index - size - align Including annotations for holes, padding, and implementation-specified and otherwise invisible objects. It's constructed by creating vertical columns for each of the data points specified above, and filling in horizontal rows for each of the class components. */ struct svg { private: const std::string _M_title; const canvas& _M_canvas; const typography& _M_typo; const units_type _M_x_size = 3; // Number of columns units_type _M_x_space; // Column spacing. units_type _M_x_origin; // X origin units_type _M_y_size; // Number of rows units_type _M_y_space; // Row spacing. units_type _M_y_origin; // Y origin std::ostringstream _M_sstream; // static const units_type _M_stroke_width = 1; // static const units_type _M_text_padding = 10; public: svg(const std::string &__title, const canvas& __cv = ansi_letter_canvas, const typography& __typo = arial_typo) : _M_title(__title), _M_canvas(__cv), _M_typo(__typo), _M_y_size(0) { // Offsets require: typo, canvas units, size. _M_x_space = 40; _M_y_space = 40; _M_x_origin = _M_x_space * 1; _M_y_origin = _M_y_space * 2; } // Empty when the output buffer is. bool empty() { return _M_sstream.str().empty(); } void start_element(); void finish_element(); void add_title(); void add_y_row(const row&); void add_y_lines(); void add_y_label(); void write(); void start() { this->start_element(); this->add_title(); } void finish() { this->add_y_label(); this->add_y_lines(); this->finish_element(); this->write(); } }; // XXX connect external xml file to input. // parse input, pick apart elements, attributes. }// end namespace abigail #endif //__ABG_VIZ_SVG_H__