Writer.h
Go to the documentation of this file.
1 /****
2  * Drawing.h
3  *
4  * Copyright 2021 mikee47 <mike@sillyhouse.net>
5  *
6  * This file is part of the Sming-Graphics Library
7  *
8  * This library is free software: you can redistribute it and/or modify it under the terms of the
9  * GNU General Public License as published by the Free Software Foundation, version 3 or later.
10  *
11  * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
12  * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13  * See the GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along with this library.
16  * If not, see <https://www.gnu.org/licenses/>.
17  *
18  * @author: May 2021 - mikee47 <mike@sillyhouse.net>
19  *
20  ****/
21 
22 #pragma once
23 
24 #include "../Asset.h"
25 #include "../Stream.h"
26 #include "Command.h"
27 #include "Registers.h"
28 
29 namespace Graphics
30 {
31 namespace Drawing
32 {
33 class Writer
34 {
35 public:
36  Writer(Print& stream) : buffer(stream)
37  {
38  reset();
39  }
40 
41  void reset()
42  {
43  active = Registers{};
44  write(Command::reset);
45  }
46 
47  void setPenColor(Color color)
48  {
49  setRegister(active.penColor, color);
50  }
51 
52  void setPenWidth(uint16_t width)
53  {
54  setRegister(active.penWidth, width);
55  }
56 
57  void setPen(const Pen& pen)
58  {
59  setPenColor(pen.getColor());
60  setPenWidth(pen.width);
61  }
62 
63  void setBrushColor(Color color)
64  {
65  setRegister(active.brushColor, color);
66  }
67 
68  void setBrush(const Brush& brush)
69  {
70  setBrushColor(brush.getColor());
71  }
72 
73  void moveto(Point pt)
74  {
75  setRegister(active.x2, pt.x);
76  setRegister(active.y2, pt.y);
77  write(Command::move);
78  }
79 
80  void moveto(int16_t x, int16_t y)
81  {
82  moveto({x, y});
83  }
84 
85  void setPixel(Point pt)
86  {
87  setpos(pt);
88  write(Command::setPixel);
89  }
90 
91  void line(Point pt)
92  {
93  setpos(pt);
94  write(Command::line);
95  }
96 
97  void lineto(Point pt)
98  {
99  setpos(pt);
100  write(Command::lineto);
101  active.x1 = active.x2;
102  active.y1 = active.y2;
103  }
104 
105  void drawArc(Point pt, uint16_t startAngle, uint16_t endAngle, bool filled = false)
106  {
107  setpos(pt);
108  setRegister(active.startAngle, startAngle);
109  setRegister(active.angle, endAngle - startAngle);
110  write(filled ? Command::fillArc : Command::drawArc);
111  }
112 
113  void fillArc(Point pt, uint16_t startAngle, uint16_t endAngle)
114  {
115  drawArc(pt, startAngle, endAngle, true);
116  }
117 
118  void drawRect(Point pt, uint16_t radius = 0)
119  {
120  setpos(pt);
121  setRegister(active.radius, radius);
122  write(Command::drawRect);
123  }
124 
125  void fillRect(Point pt, uint16_t radius = 0)
126  {
127  setpos(pt);
128  setRegister(active.radius, radius);
129  write(Command::fillRect);
130  }
131 
132  void drawCircle(Point pt, uint16_t radius)
133  {
134  setpos(pt);
135  setRegister(active.radius, radius);
136  write(Command::drawCircle);
137  }
138 
139  void fillCircle(Point pt, uint16_t radius)
140  {
141  setpos(pt);
142  setRegister(active.radius, radius);
143  write(Command::fillCircle);
144  }
145 
146  void drawEllipse(Point pt)
147  {
148  setpos(pt);
149  write(Command::drawEllipse);
150  }
151 
152  void fillEllipse(Point pt)
153  {
154  setpos(pt);
155  write(Command::fillEllipse);
156  }
157 
158  void beginSub(uint16_t id)
159  {
160  setRegister(active.id, id);
161  write(Command::beginSub);
162  ++subIndex;
163  }
164 
165  void endSub()
166  {
167  assert(subIndex != 0);
168  write(Command::endSub);
169  --subIndex;
170  }
171 
172  void flush()
173  {
174  buffer.flush();
175  }
176 
177 private:
178  template <typename T> uint8_t getRegisterOffset(T& reg)
179  {
180  return reinterpret_cast<uint8_t*>(&reg) - reinterpret_cast<uint8_t*>(&active);
181  }
182 
183  void setRegister(Color& reg, Color color);
184  void setRegister(uint16_t& reg, uint16_t value);
185 
186  void setRegister(int16_t& reg, int16_t value)
187  {
188  setRegister(reinterpret_cast<uint16_t&>(reg), value);
189  }
190 
191  void setpos(Point pt);
192  void write(OpCode op, uint8_t off, uint32_t value);
193  void write(Command cmd);
194 
195  void write(const void* data, size_t length)
196  {
197  buffer.write(data, length);
198  }
199 
200  WriteStream buffer;
201  Registers active;
202  Point pt1{};
203  Point pt2{};
204  int16_t angle{};
205  uint16_t subIndex{0};
206 };
207 
208 } // namespace Drawing
209 } // namespace Graphics
void drawCircle(Point pt, uint16_t radius)
Definition: Writer.h:189
T x
Definition: Libraries/Graphics/src/include/Graphics/Types.h:153
void flush()
Definition: Writer.h:229
Command
Definition: Libraries/Graphics/src/include/Graphics/Drawing/Command.h:122
T y
Definition: Libraries/Graphics/src/include/Graphics/Types.h:154
void fillCircle(Point pt, uint16_t radius)
Definition: Writer.h:196
Definition: Libraries/Graphics/src/include/Graphics/Stream.h:47
void drawRect(Point pt, uint16_t radius=0)
Definition: Writer.h:175
void setBrush(const Brush &brush)
Definition: Writer.h:125
void lineto(Point pt)
Definition: Writer.h:154
void setBrushColor(Color color)
Definition: Writer.h:120
void fillArc(Point pt, uint16_t startAngle, uint16_t endAngle)
Definition: Writer.h:170
void beginSub(uint16_t id)
Definition: Writer.h:215
OpCode
Definition: Registers.h:89
void endSub()
Definition: Writer.h:222
void setPenWidth(uint16_t width)
Definition: Writer.h:109
Definition: Virtual.h:30
TPoint< int16_t > Point
Definition: Libraries/Graphics/src/include/Graphics/Types.h:299
void setPenColor(Color color)
Definition: Writer.h:104
void setPixel(Point pt)
Definition: Writer.h:142
void setPen(const Pen &pen)
Definition: Writer.h:114
Definition: Registers.h:98
void drawEllipse(Point pt)
Definition: Writer.h:203
Provides formatted output to stream.
Definition: Print.h:36
void moveto(Point pt)
Definition: Writer.h:130
void fillEllipse(Point pt)
Definition: Writer.h:209
void line(Point pt)
Definition: Writer.h:148
void write(const void *buffer, size_t count)
Writer(Print &stream)
Definition: Writer.h:93
void drawArc(Point pt, uint16_t startAngle, uint16_t endAngle, bool filled=false)
Definition: Writer.h:162
void fillRect(Point pt, uint16_t radius=0)
Definition: Writer.h:182
void reset()
Definition: Writer.h:98
Color
Standard colour definitions.
Definition: Colors.h:227