NetBurner 3.5.6
PDF Version
qwiic_grbuffer.h
1
2// qwiic_grbuffer.h
3//
4// This is a library written for SparkFun Qwiic OLED boards that use the SSD1306.
5//
6// SparkFun sells these at its website: www.sparkfun.com
7//
8// Do you like this library? Help support SparkFun. Buy a board!
9//
10// Micro OLED https://www.sparkfun.com/products/14532
11// Transparent OLED https://www.sparkfun.com/products/15173
12// "Narrow" OLED https://www.sparkfun.com/products/17153
13//
14//
15// Written by Kirk Benell @ SparkFun Electronics, March 2022
16//
17// This library configures and draws graphics to OLED boards that use the
18// SSD1306 display hardware. The library only supports I2C.
19//
20// Repository:
21// https://github.com/sparkfun/SparkFun_Qwiic_OLED_Arduino_Library
22//
23// Documentation:
24// https://sparkfun.github.io/SparkFun_Qwiic_OLED_Arduino_Library/
25//
26//
27// SparkFun code, firmware, and software is released under the MIT License(http://opensource.org/licenses/MIT).
28//
29// SPDX-License-Identifier: MIT
30//
31// The MIT License (MIT)
32//
33// Copyright (c) 2022 SparkFun Electronics
34// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
35// associated documentation files (the "Software"), to deal in the Software without restriction,
36// including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
37// and/or sell copies of the Software, and to permit persons to whom the Software is furnished to
38// do so, subject to the following conditions:
39// The above copyright notice and this permission notice shall be included in all copies or substantial
40// portions of the Software.
41// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
42// NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
43// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
44// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
45// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
46//
47
48// A Graphics System base class for qwiic display devices - simple bmp based devices.
49
50#pragma once
51
52// required on some platforms
53#include <stdint.h>
54
55// Include resource definitions
56#include "res/qwiic_resdef.h"
57
58// RECT!
59struct QwRect
60{
61 uint16_t x;
62 uint16_t y;
63 uint16_t width;
64 uint16_t height;
65};
66
68// Utils
69//
70// Bit level tools/helpers
71//
72// Handy const = save some compute used bit shifting
73extern const uint8_t byte_bits[8];
74
75// something more readable
76#define kByteNBits 8
77
78// Mod 8 is really just the lower 3 bits of a value. This might be faster than
79// standard mod operator - maybe
80#define mod_byte(_value_) (_value_ & 0x07)
81
82// Some rouintes need a int swap function. Many ways to do this- all the cool kids
83// use bitwise ops - namely the xor.
84//
85#define swap_int(_a_, _b_) (((_a_) ^= (_b_)), ((_b_) ^= (_a_)), ((_a_) ^= (_b_)))
86
88// _QwIDraw
89//
90// IDraw interface for the graphics system. Defines methods used to draw 2D primatives.
91//
92// Seperated out to enable easy vtable access and method dispatch short circuiting
93
94class _QwIDraw
95{
96
97 // Pixel Methods
98 virtual void drawPixel(uint8_t x, uint8_t y, uint8_t clr)
99 {
100 } // A subclass must implement this
101
102 // Line Methods
103 virtual void drawLine(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t clr)
104 {
105 }
106 virtual void drawLineHorz(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t clr)
107 {
108 }
109 virtual void drawLineVert(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t clr)
110 {
111 }
112
113 // Rectangles
114 virtual void drawRect(uint8_t x0, uint8_t y0, uint8_t width, uint8_t height, uint8_t clr)
115 {
116 }
117 virtual void drawRectFilled(uint8_t x0, uint8_t y0, uint8_t width, uint8_t height, uint8_t clr)
118 {
119 }
120
121 // Circles
122 virtual void drawCircle(uint8_t x0, uint8_t y0, uint8_t radius, uint8_t clr)
123 {
124 }
125 virtual void drawCircleFilled(uint8_t x0, uint8_t y0, uint8_t radius, uint8_t clr)
126 {
127 }
128
129 // Bitmaps
130 virtual void drawBitmap(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t *pBitmap, uint8_t bmp_width,
131 uint8_t bmp_height)
132 {
133 }
134
135 virtual void drawText(uint8_t x0, uint8_t y0, const char *text, uint8_t clr)
136 {
137 }
138};
139
140// Drawing fuction typedefs
141typedef void (*QwDrawPntFn)(void *, uint8_t, uint8_t, uint8_t);
142typedef void (*QwDrawTwoPntFn)(void *, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t);
143typedef void (*QwDrawCircleFn)(void *, uint8_t, uint8_t, uint8_t, uint8_t);
144typedef void (*QwDrawBitmapFn)(void *, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t *, uint8_t, uint8_t);
145typedef void (*QwDrawTextFn)(void *, uint8_t, uint8_t, const char *, uint8_t);
146
147// Define the vtable struct for IDraw
148struct _QwIDraw_vtable
149{
150 QwDrawPntFn drawPixel;
151 QwDrawTwoPntFn drawLine;
152 QwDrawTwoPntFn drawLineHorz;
153 QwDrawTwoPntFn drawLineVert;
154 QwDrawTwoPntFn drawRect;
155 QwDrawTwoPntFn drawRectFilled;
156 QwDrawCircleFn drawCircle;
157 QwDrawCircleFn drawCircleFilled;
158 QwDrawBitmapFn drawBitmap;
159 QwDrawTextFn drawText;
160};
161
163// QwGrBufferDevice
164//
165// Buffer class - defines basics for a memory buffer drawing class. Note it subclasses
166// from QwIDraw
167
168class QwGrBufferDevice : protected _QwIDraw
169{
170
171 public:
172 // Constructors
173 QwGrBufferDevice() : m_currentFont{nullptr} {};
174 QwGrBufferDevice(uint8_t width, uint8_t height) : QwGrBufferDevice(0, 0, width, height){};
175 QwGrBufferDevice(uint8_t x0, uint8_t y0, uint8_t width, uint8_t height) : QwGrBufferDevice()
176 {
177 setViewport(x0, y0, width, height);
178 };
179
180 // Buffer location on the device
181 void setViewport(uint8_t x0, uint8_t y0, uint8_t width, uint8_t height)
182 {
183 m_viewport.x = x0;
184 m_viewport.y = y0;
185 m_viewport.width = width;
186 m_viewport.height = height;
187 };
188
189 QwRect viewport(void)
190 {
191 return m_viewport;
192 };
193 uint16_t originX(void)
194 {
195 return m_viewport.x;
196 };
197 uint16_t originY(void)
198 {
199 return m_viewport.y;
200 };
201 uint16_t width(void)
202 {
203 return m_viewport.width;
204 };
205 uint16_t height(void)
206 {
207 return m_viewport.height;
208 };
209
210 // Lifecycle
211 virtual bool init(void);
212
213 // Font methods
214 void initFont(void);
215 void setFont(QwFont &font);
216 void setFont(const QwFont *font);
217 QwFont *font(void);
218
219 // Returns the size of a string - in pixels - using current font
220 bool getStringSize(const char *text, uint16_t &width, uint16_t &height);
221
222 // Public Interface - Graphics interface
223 void line(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t clr = 1);
224
225 void circle(uint8_t x0, uint8_t y0, uint8_t radius, uint8_t clr = 1);
226 void circleFill(uint8_t x0, uint8_t y0, uint8_t radius, uint8_t clr = 1);
227
228 void pixel(uint8_t x, uint8_t y, uint8_t clr = 1);
229
230 void rectangle(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t clr = 1);
231 void rectangleFill(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t clr = 1);
232
233 void bitmap(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t *pBitmap, uint8_t bmp_width,
234 uint8_t bmp_height);
235
236 // draw full bitmap
237 void bitmap(uint8_t x0, uint8_t y0, uint8_t *pBitmap, uint8_t bmp_width, uint8_t bmp_height);
238
239 // Bitmap draw - using a bitmap object
240 void bitmap(uint8_t x0, uint8_t y0, QwBitmap &bitmap);
241
242 void text(uint8_t x0, uint8_t y0, const char *text, uint8_t clr = 1);
243
244 // subclass interface
245 virtual void display(void) = 0;
246 virtual void erase(void) = 0;
247
248 protected:
249 QwRect m_viewport;
250
251 // Internal, fast draw routines - These implement QwIDraw
252
253 // Pixels
254 // At a minimum, a sub-class must implement a pixel set function
255 virtual void drawPixel(uint8_t x, uint8_t y, uint8_t clr) = 0; // A subclass must implement this
256
257 // Lines
258 // Sub-class implementation is optional
259 virtual void drawLine(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t clr);
260
261 // Rects
262 virtual void drawRect(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t clr);
263 virtual void drawRectFilled(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t clr);
264
265 // Circle
266 virtual void drawCircle(uint8_t x0, uint8_t y0, uint8_t radius, uint8_t clr);
267 virtual void drawCircleFilled(uint8_t x0, uint8_t y0, uint8_t radius, uint8_t clr);
268
269 // Text
270 virtual void drawText(uint8_t x0, uint8_t y0, const char *text, uint8_t clr);
271
272 // Our drawing interface - open to sub-classes ...
273 _QwIDraw_vtable m_idraw;
274
275 // Current Font
276 QwFont *m_currentFont;
277
278 private:
279 bool initDrawFunctions(void);
280};