Horizon
Loading...
Searching...
No Matches
canvas.hpp
1#pragma once
2#include "common/common.hpp"
3#include "common/text.hpp"
4#include "layer_display.hpp"
5#include "selectables.hpp"
6#include "target.hpp"
7#include "triangle.hpp"
8#include "object_ref.hpp"
9#include "fragment_cache.hpp"
10#include "util/placement.hpp"
11#include "util/text_data.hpp"
12#include "color_palette.hpp"
13#include <array>
14#include <set>
15#include <unordered_map>
16#include <deque>
17#include <list>
18#include "picture.hpp"
19#include "pool/unit.hpp"
20#include "util/vector_pair.hpp"
21#include "text_renderer.hpp"
22#include "show_via_span.hpp"
23
24namespace horizon {
25class Canvas {
26 friend Selectables;
27 friend class SelectionFilter;
28 friend class CanvasAnnotation;
29 friend CanvasTextRenderer;
30
31public:
32 Canvas();
33 virtual ~Canvas()
34 {
35 }
36 virtual void clear();
37 enum class SymbolMode { SHEET, EDIT, EDIT_PREVIEW };
38 void update(const class Symbol &sym, const Placement &transform = Placement(), SymbolMode mode = SymbolMode::EDIT);
39 void update(const class Sheet &sheet);
40 void update(const class Padstack &padstack, bool edit = true);
41 void update(const class Package &pkg, bool edit = true);
42 enum class PanelMode { INCLUDE, SKIP };
43 void update(const class Board &brd, PanelMode mode = PanelMode::INCLUDE);
44 void update(const class Frame &fr, bool edit = true);
45 void update(const class Decal &dec, bool edit = true);
46 void update(const class BlockSymbol &sym, bool edit = true);
47
48 ObjectRef add_line(const std::deque<Coordi> &pts, int64_t width, ColorP color, int layer);
49 ObjectRef add_arc(const Coordi &from, const Coordi &to, const Coordi &center, int64_t width, ColorP color,
50 int layer);
51 void remove_obj(const ObjectRef &r);
52 void hide_obj(const ObjectRef &r);
53 void show_obj(const ObjectRef &r);
54 void set_flags(const ObjectRef &r, uint8_t mask_set, uint8_t mask_clear);
55 void set_flags_all(uint8_t mask_set, uint8_t mask_clear);
56
57 void reset_color2();
58 void set_color2(const ObjectRef &r, uint8_t color);
59
60 void show_all_obj();
61
62 virtual void update_markers()
63 {
64 }
65
66 const LayerDisplay &get_layer_display(int index) const;
67 void set_layer_display(int index, const LayerDisplay &ld);
68 void set_layer_color(int layer, const Color &color);
69
70 bool layer_is_visible(int layer) const;
71 bool layer_is_visible(LayerRange layer) const;
72
73 bool show_all_junctions_in_schematic = false;
74 bool show_text_in_tracks = false;
75 bool show_text_in_vias = false;
76 ShowViaSpan show_via_span = ShowViaSpan::BLIND_BURIED;
77
78 bool add_pad_bbox_targets = false;
79
80 virtual bool get_flip_view() const
81 {
82 return false;
83 };
84
85 virtual float get_view_angle() const
86 {
87 return 0;
88 }
89
90 std::pair<Coordf, Coordf> get_bbox(bool visible_only = true) const;
91
92 static const int first_overlay_layer = 30000;
93
94protected:
95 std::map<int, vector_pair<Triangle, TriangleInfo>> triangles;
96 std::list<CanvasPicture> pictures;
97 void add_triangle(int layer, const Coordf &p0, const Coordf &p1, const Coordf &p2, ColorP co, uint8_t flg = 0,
98 uint8_t color2 = 0);
99
100 using ObjectRefIdx = std::map<int, std::pair<size_t, size_t>>;
101 std::unordered_map<ObjectRef, ObjectRefIdx> object_refs;
102 void begin_group(int layer);
103 void end_group();
104 std::vector<ObjectRef> object_refs_current;
105 std::vector<ObjectRefIdx *> object_ref_idx;
106 void object_ref_push(const ObjectRef &ref);
107 template <typename... Args> void object_ref_push(Args... args)
108 {
109 object_ref_push(ObjectRef(args...));
110 }
111 void object_ref_pop();
112
113 void render(const class Symbol &sym, SymbolMode mode = SymbolMode::SHEET, bool smashed = false,
114 ColorP co = ColorP::FROM_LAYER);
115 void render(const class Junction &junc, bool interactive = true, ObjectType mode = ObjectType::INVALID);
116 void render(const class SchematicJunction &junc);
117 void render(const class Line &line, bool interactive = true, ColorP co = ColorP::FROM_LAYER);
118 void render(const class SymbolPin &pin, SymbolMode mode = SymbolMode::EDIT, ColorP co = ColorP::FROM_LAYER);
119 void render(const class Arc &arc, bool interactive = true, ColorP co = ColorP::FROM_LAYER);
120 void render(const class Sheet &sheet);
121 void render(const class SchematicSymbol &sym);
122 void render(const class LineNet &line);
123 void render(const class NetLabel &label);
124 void render(const class BusLabel &label);
125 void render(const class Warning &warn);
126 void render(const class PowerSymbol &sym);
127 void render(const class BusRipper &ripper);
128 void render(const class Text &text, bool interactive = true, ColorP co = ColorP::FROM_LAYER);
129 void render(const class Padstack &padstack, bool interactive = true);
130 void render(const class Polygon &polygon, bool interactive = true, ColorP co = ColorP::FROM_LAYER);
131 void render(const class Shape &shape, bool interactive = true);
132 void render(const class Hole &hole, bool interactive = true);
133 void render(const class Package &package, bool interactive = true, bool smashed = false,
134 bool omit_silkscreen = false, bool omit_outline = false, bool on_panel = false);
135 void render_pad_overlay(const class Pad &pad, bool interactive);
136 void render(const class Pad &pad);
137 enum class OutlineMode { INCLUDE, OMIT };
138 void render(const class Board &brd, bool interactive = true, PanelMode mode = PanelMode::INCLUDE,
139 OutlineMode outline_mode = OutlineMode::INCLUDE);
140 void render(const class BoardPackage &pkg, bool interactive = true);
141 void render(const class BoardHole &hole, bool interactive = true);
142 void render(const class Track &track, bool interactive = true);
143 void render(const class Via &via, bool interactive = true);
144 void render(const class Dimension &dim);
145 void render(const class Frame &frame, bool on_sheet = false);
146 void render(const class ConnectionLine &line);
147 void render(const class BoardPanel &panel);
148 void render(const class Picture &pic, bool interactive = true);
149 void render(const class Decal &decal, bool interactive = true);
150 void render(const class BoardDecal &decal, bool interactive = true);
151 void render(const class BlockSymbol &sym, bool on_sheet = false);
152 void render(const class BlockSymbolPort &port, bool interactive = true);
153 void render(const class SchematicBlockSymbol &sym);
154 void render(const class SchematicNetTie &tie);
155 void render(const class BoardNetTie &tie, bool interactive = true);
156
157 bool needs_push = true;
158 virtual void request_push() = 0;
159 virtual void push() = 0;
160
161 void set_lod_size(float size);
162
163 void draw_line(const Coord<float> &a, const Coord<float> &b, ColorP color = ColorP::FROM_LAYER, int layer = 10000,
164 bool tr = true, uint64_t width = 0);
165 void draw_cross(const Coord<float> &o, float size, ColorP color = ColorP::FROM_LAYER, int layer = 10000,
166 bool tr = true, uint64_t width = 0);
167 void draw_plus(const Coord<float> &o, float size, ColorP color = ColorP::FROM_LAYER, int layer = 10000,
168 bool tr = true, uint64_t width = 0);
169 void draw_box(const Coord<float> &o, float size, ColorP color = ColorP::FROM_LAYER, int layer = 10000,
170 bool tr = true, uint64_t width = 0);
171 void draw_circle(const Coord<float> &center, float radius, ColorP color = ColorP::FROM_LAYER, int layer = 10000);
172 void draw_arc0(const Coord<float> &center, float radius0, float a0, float a1, ColorP color, int layer,
173 uint64_t width);
174 void draw_arc(const Coordf &from, const Coordf &to, const Coordf &center, ColorP color, int layer, uint64_t width);
175
176
177 std::pair<Coordf, Coordf> draw_text(const Coordf &p, float size, const std::string &rtext, int angle,
178 TextOrigin origin, ColorP color, int layer, const TextRenderer::Options &opts);
179
180 virtual void draw_bitmap_text(const Coordf &p, float scale, const std::string &rtext, int angle, ColorP color,
181 int layer)
182 {
183 }
184
185 virtual std::pair<Coordf, Coordf> measure_bitmap_text(const std::string &text) const
186 {
187 return {{0, 0}, {0, 0}};
188 }
189
190 enum class TextBoxMode { FULL, LOWER, UPPER };
191
192 virtual void draw_bitmap_text_box(const Placement &q, float width, float height, const std::string &s, ColorP color,
193 int layer, TextBoxMode mode)
194 {
195 }
196
197 void draw_error(const Coordf &center, float scale, const std::string &text, bool tr = true);
198 std::tuple<Coordf, Coordf, Coordi> draw_flag(const Coordf &position, const std::string &txt, int64_t size,
199 Orientation orientation, ColorP color = ColorP::FROM_LAYER);
200 void draw_lock(const Coordf &center, float size, ColorP color = ColorP::FROM_LAYER, int layer = 10000,
201 bool tr = true);
202
203 virtual bool img_layer_is_visible(const LayerRange &layer) const
204 {
205 return true;
206 }
207 virtual void img_net(const class Net *net)
208 {
209 }
210 virtual void img_polygon(const Polygon &poly, bool tr = true)
211 {
212 }
213 virtual void img_padstack(const Padstack &ps)
214 {
215 }
216 virtual void img_set_padstack(bool v)
217 {
218 }
219 virtual void img_line(const Coordi &p0, const Coordi &p1, const uint64_t width, int layer = 10000, bool tr = true);
220 virtual void img_arc(const Coordi &from, const Coordi &to, const Coordi &center, const uint64_t width, int layer);
221 virtual void img_hole(const Hole &hole)
222 {
223 }
224 virtual void img_text(const Text *text)
225 {
226 }
227 virtual void img_patch_type(PatchType type)
228 {
229 }
230 virtual void img_draw_text(const Coordf &p, float size, const std::string &rtext, int angle, bool flip,
231 TextOrigin origin, int layer = 10000, uint64_t width = 0,
232 TextData::Font font = TextData::Font::SIMPLEX, bool center = false, bool mirror = false)
233 {
234 }
235 bool img_mode = false;
236 bool img_auto_line = false;
237
238 Placement transform;
239 void transform_save();
240 void transform_restore();
241 std::vector<Placement> transforms;
242
243 Selectables selectables;
244 std::vector<Target> targets;
245 Target target_current;
246
247 const class LayerProvider *layer_provider = nullptr;
248 std::map<int, Color> layer_colors;
249 Color get_layer_color(int layer) const;
250 int work_layer = 0;
251 std::map<int, LayerDisplay> layer_display;
252
253 TriangleInfo::Type triangle_type_current = TriangleInfo::Type::NONE;
254
255 std::map<std::pair<LayerRange, bool>, int> overlay_layers; // layer, ignore_flip -> overlay layer
256 int overlay_layer_current = first_overlay_layer;
257 int get_overlay_layer(const LayerRange &layer, bool ignore_flip = false);
258 bool is_overlay_layer(int overlay_layer, int layer) const;
259
260 FragmentCache fragment_cache;
261
262private:
263 uint8_t lod_current = 0;
264
265 int group_layer = 0;
266 vector_pair<Triangle, TriangleInfo> *group_tris = nullptr;
267 size_t group_size = 0;
268
269 void draw_direction(Pin::Direction dir, ColorP color);
270
271 CanvasTextRenderer text_renderer;
272};
273} // namespace horizon
Graphical arc.
Definition arc.hpp:17
Definition block_symbol.hpp:20
Definition block_symbol.hpp:51
Definition board_decal.hpp:11
Definition board_hole.hpp:12
Definition board_net_tie.hpp:9
Definition board_package.hpp:13
Definition board_panel.hpp:7
Definition board.hpp:47
Makes a Bus available on the schematic.
Definition bus_label.hpp:16
Make a Bus member's Net available on the schematic.
Definition bus_ripper.hpp:15
Definition annotation.hpp:7
Definition text_renderer.hpp:5
Definition canvas.hpp:25
Definition common.hpp:278
Definition connection_line.hpp:12
Definition decal.hpp:16
Definition dimension.hpp:9
Definition fragment_cache.hpp:7
Definition frame.hpp:18
A hole with diameter and position, that's it.
Definition hole.hpp:15
A Junction is a point in 2D-Space.
Definition junction.hpp:20
Definition layer_display.hpp:5
Definition layer_provider.hpp:8
Definition layer_range.hpp:11
LineNet is similar to Line, except it denotes electrical connection.
Definition line_net.hpp:17
Graphical line.
Definition line.hpp:16
Displays the junction's Net name it is attached to.
Definition net_label.hpp:16
Definition net.hpp:11
Definition object_ref.hpp:7
Definition package.hpp:29
Definition pad.hpp:12
Definition padstack.hpp:19
Definition picture.hpp:10
Definition placement.hpp:8
Polygon used in Padstack, Package and Board for specifying filled Regions.
Definition polygon.hpp:25
GND symbols and the like.
Definition power_symbol.hpp:16
Definition schematic_block_symbol.hpp:12
Definition schematic_junction.hpp:6
Definition schematic_net_tie.hpp:10
Definition schematic_symbol.hpp:15
Definition selectables.hpp:67
Definition selection_filter.hpp:6
For commonly used Pad shapes.
Definition shape.hpp:15
Definition sheet.hpp:42
Definition symbol.hpp:20
Definition symbol.hpp:72
Definition target.hpp:7
Used wherever a user-editable text is needed.
Definition text.hpp:15
Definition track.hpp:14
Definition via.hpp:12
Definition warning.hpp:6
Definition vector_pair.hpp:8
Definition text_renderer.hpp:10