|
5 | 5 | #include "common/hole.hpp" |
6 | 6 | #include "common/polygon.hpp" |
7 | 7 | #include "common/text.hpp" |
| 8 | +#include "common/table.hpp" |
8 | 9 | #include "layer_display.hpp" |
9 | 10 | #include "package/pad.hpp" |
10 | 11 | #include "poly2tri/poly2tri.h" |
@@ -800,6 +801,84 @@ void Canvas::render(const Text &text, bool interactive, ColorP co) |
800 | 801 | } |
801 | 802 | } |
802 | 803 |
|
| 804 | +void Canvas::render(const Table &table, bool interactive, ColorP co) |
| 805 | +{ |
| 806 | + const bool rev = layer_provider.get_layers().at(table.layer).reverse; |
| 807 | + |
| 808 | + transform_save(); |
| 809 | + transform.accumulate(table.placement); |
| 810 | + |
| 811 | + object_ref_push(ObjectType::TABLE, table.uuid); |
| 812 | + |
| 813 | + auto &layout = table.get_layout(); |
| 814 | + |
| 815 | + img_auto_line = img_mode; |
| 816 | + |
| 817 | + uint64_t line_width = table.get_line_width(); |
| 818 | + float total_width = rev ? -layout.total_width : layout.total_width; |
| 819 | + float total_height = -layout.total_height; |
| 820 | + |
| 821 | + // draw outer border |
| 822 | + { |
| 823 | + draw_line({0, 0}, {total_width, 0}, co, table.layer, true, line_width); |
| 824 | + draw_line({total_width, 0}, {total_width, total_height}, co, table.layer, true, line_width); |
| 825 | + draw_line({total_width, total_height}, {0, total_height}, co, table.layer, true, line_width); |
| 826 | + draw_line({0, total_height}, {0, 0}, co, table.layer, true, line_width); |
| 827 | + } |
| 828 | + |
| 829 | + // draw horizontal grid lines |
| 830 | + { |
| 831 | + float y = -layout.row_heights[0]; |
| 832 | + for (size_t r = 1; r < table.get_n_rows(); r++) { |
| 833 | + draw_line({0, y}, {total_width, y}, co, table.layer, true, line_width); |
| 834 | + y -= layout.row_heights[r]; |
| 835 | + } |
| 836 | + } |
| 837 | + |
| 838 | + // draw vertical grid lines |
| 839 | + { |
| 840 | + float x = rev ? -layout.col_widths[0] : layout.col_widths[0]; |
| 841 | + for (size_t c = 1; c < table.get_n_columns(); c++) { |
| 842 | + draw_line({x, 0}, {x, total_height}, co, table.layer, true, line_width); |
| 843 | + if (rev) |
| 844 | + x -= layout.col_widths[c]; |
| 845 | + else |
| 846 | + x += layout.col_widths[c]; |
| 847 | + } |
| 848 | + } |
| 849 | + |
| 850 | + img_auto_line = false; |
| 851 | + |
| 852 | + // draw cell contents |
| 853 | + { |
| 854 | + TextRenderer::Options opts; |
| 855 | + opts.width = line_width; |
| 856 | + opts.font = table.get_font(); |
| 857 | + opts.allow_upside_down = true; |
| 858 | + opts.flip = rev; |
| 859 | + |
| 860 | + auto &cells = table.get_cells(); |
| 861 | + for (size_t idx = 0; idx < cells.size(); idx++) { |
| 862 | + auto textpos = layout.text_positions[idx]; |
| 863 | + if (rev) |
| 864 | + textpos.x *= -1; |
| 865 | + auto pos = transform.transform(textpos); |
| 866 | + auto size = static_cast<float>(table.get_text_size()); |
| 867 | + int angle = rev ? -transform.get_angle() : transform.get_angle(); |
| 868 | + draw_text(pos, size, cells[idx], angle, TextOrigin::BASELINE, co, table.layer, opts); |
| 869 | + } |
| 870 | + } |
| 871 | + |
| 872 | + object_ref_pop(); |
| 873 | + |
| 874 | + if (interactive) { |
| 875 | + selectables.append(table.uuid, ObjectType::TABLE, {0, 0}, {0, 0}, {total_width, total_height}, 0, table.layer); |
| 876 | + targets.emplace_back(table.uuid, ObjectType::TABLE, transform.transform(Coordi(0, 0)), 0, table.layer); |
| 877 | + } |
| 878 | + |
| 879 | + transform_restore(); |
| 880 | +} |
| 881 | + |
803 | 882 | template <typename T> static std::string join(const T &v, const std::string &delim) |
804 | 883 | { |
805 | 884 | std::ostringstream s; |
@@ -1214,6 +1293,9 @@ void Canvas::render(const Sheet &sheet) |
1214 | 1293 | if (!it.second.from_smash) |
1215 | 1294 | render(it.second); |
1216 | 1295 | } |
| 1296 | + for (const auto &it : sheet.tables) { |
| 1297 | + render(it.second); |
| 1298 | + } |
1217 | 1299 | for (const auto &it : sheet.net_labels) { |
1218 | 1300 | render(it.second); |
1219 | 1301 | } |
@@ -1684,6 +1766,9 @@ void Canvas::render(const Board &brd, bool interactive, PanelMode mode, OutlineM |
1684 | 1766 | for (const auto &it : brd.texts) { |
1685 | 1767 | render(it.second, interactive); |
1686 | 1768 | } |
| 1769 | + for (const auto &it : brd.tables) { |
| 1770 | + render(it.second, interactive); |
| 1771 | + } |
1687 | 1772 | for (const auto &it : brd.tracks) { |
1688 | 1773 | render(it.second, interactive); |
1689 | 1774 | } |
|
0 commit comments