23 extern const uint8_t *s_font6x8;
25 #define YADDR(y) (((y) >> 3) << m_p) 26 #define BADDR(b) ((b) << m_p) 30 if ((x>=m_w) || (y>=m_h))
return;
33 m_bytes[YADDR(y) + x] &= ((1 << (y & 0x7))^m_invertByte);
37 m_bytes[YADDR(y) + x] |= (1 << (y & 0x7));
43 if (y1 >= m_h)
return;
45 if (x1 >= m_w)
return;
46 if (x2 >= m_w) x2 = m_w - 1;
47 for(uint8_t x = x1; x<=x2; x++)
48 m_bytes[YADDR(y1) + x] |= (1 << (y1 & 0x7));
53 if (x1 >= m_w)
return;
55 if (y1 >= m_h)
return;
56 if (y2 >= m_h) y2 = m_h - 1;
57 for(uint8_t y = y1; y<=y2; y++)
58 m_bytes[YADDR(y) + x1] |= (1 << (y & 0x7));
72 templ ^= m_invertByte;
73 if ((x1 < x2) && (x1 >= m_w))
return;
74 if ((y1 < y2) && (y1 >= m_h))
return;
77 if (x2 >= m_w) x2 = m_w -1;
78 if (y2 >= m_h) y2 = m_h -1;
79 uint8_t bank1 = (y1 >> 3);
80 uint8_t bank2 = (y2 >> 3);
81 for (uint8_t bank = bank1; bank<=bank2; bank++)
86 mask = (mask >> ((y1 & 7) + 7 - (y2 & 7))) << (7 - (y2 & 7));
88 else if (bank1 == bank)
90 mask = (mask << (y1 & 7));
92 else if (bank2 == bank)
94 mask = (mask >> (7 - (y2 & 7)));
96 for (uint8_t x=x1; x<x2; x++)
98 m_bytes[BADDR(bank) + x] &= ~mask;
99 m_bytes[BADDR(bank) + x] |= (templ & mask);
107 for(uint16_t i=0; i<m_w* (m_h >> 3); i++)
109 m_bytes[i] = m_invertByte;
116 uint8_t i, j, topMask, bottomMask;
119 topMask = (0xFF >> (8 - (y & 0x7)));
120 bottomMask = (0xFF << (y & 0x7));
123 uint8_t c = ch[j] - 32;
129 if ( style == STYLE_NORMAL )
131 data = pgm_read_byte(&s_font6x8[c*6+i]);
133 else if ( style == STYLE_BOLD )
135 data = pgm_read_byte(&s_font6x8[c*6+i]);
136 uint8_t temp = data | ldata;
142 data = pgm_read_byte(&s_font6x8[c*6+i + 1]);
143 uint8_t temp = (data & 0xF0) | ldata;
144 ldata = (data & 0x0F);
147 m_bytes[YADDR(y) + x] &= topMask;
148 m_bytes[YADDR(y) + x] |= (data << (y & 0x7));
151 m_bytes[YADDR(y) + m_w + x] &= bottomMask;
152 m_bytes[YADDR(y) + m_w + x] |= (data >> (8 - (y & 0x7)));
163 uint8_t text_index = 0;
166 uint8_t topMask, bottomMask;
167 if ( y >= m_h )
return;
168 topMask = (0xFF >> (8 - (y & 0x7)));
169 bottomMask = (0xFF << (y & 0x7));
172 if( ( x > m_w - 12 ) || ( ch[j] ==
'\0' ) )
194 uint8_t c = ch[j] - 32;
199 if ( style == STYLE_NORMAL )
201 data = pgm_read_byte(&s_font6x8[c*6+i]);
203 else if ( style == STYLE_BOLD )
205 data = pgm_read_byte(&s_font6x8[c*6+i]);
206 uint8_t temp = data | ldata;
212 data = pgm_read_byte(&s_font6x8[c*6+i + 1]);
213 uint8_t temp = (data & 0xF0) | ldata;
214 ldata = (data & 0x0F);
218 data = ((data & 0x01) ? 0x03: 0x00) |
219 ((data & 0x02) ? 0x0C: 0x00) |
220 ((data & 0x04) ? 0x30: 0x00) |
221 ((data & 0x08) ? 0xC0: 0x00);
223 for (uint8_t n=2; n>0; n--)
225 m_bytes[YADDR(y) + x] &= topMask;
226 m_bytes[YADDR(y) + x] |= (data << (y & 0x7));
229 m_bytes[YADDR(y) + m_w + x] &= bottomMask;
230 m_bytes[YADDR(y) + m_w + x] |= (data >> (8 - (y & 0x7)));
245 if (x >= m_w) { x++;
continue; }
246 uint8_t d = pgm_read_byte(&sprite[i]);
248 m_bytes[YADDR(y) + x] |= (d << (y & 0x7));
249 if ((uint8_t)(y + 8) < m_h)
250 m_bytes[YADDR((uint8_t)(y + 8)) + x] |= (d >> (8 - (y & 0x7)));
261 if (x>=m_w) { x++;
continue; }
262 uint8_t d = sprite[i];
263 if (uint8_t(y) < m_h)
264 m_bytes[YADDR(y) + x] |= (d << (y & 0x7));
265 if ((uint8_t)(y+8) < m_h)
266 m_bytes[YADDR((uint8_t)(y + 8)) + x] |= (d >> (8 - (y & 0x7)));
274 for(i = 0; i < sprite->
w; i++)
276 if ((sprite->
x + i) >= m_w) {
continue; }
277 uint8_t d = pgm_read_byte(&sprite->
data[i]);
279 m_bytes[YADDR(sprite->
y) + sprite->
x + i] |= (d << (sprite->
y & 0x7));
280 if (uint8_t(sprite->
y + 8) < m_h)
281 m_bytes[YADDR(uint8_t(sprite->
y + 8)) + sprite->
x + i] |= (d >> (8 - (sprite->
y & 0x7)));
292 for(uint16_t i=0; i<m_w* (m_h >> 3); i++)
293 m_bytes[i] = ~m_bytes[i];
298 for (uint8_t y=0; y<(m_h>>3); y++)
299 for (uint8_t x=0; x<m_w>>1; x++)
301 uint8_t temp = m_bytes[YADDR(y) + x];
302 m_bytes[YADDR(y) + x] = m_bytes[YADDR(y) + m_w - x -1];
303 m_bytes[YADDR(y) + m_w - x -1] = temp;
void charF6x8(uint8_t x, uint8_t y, const char ch[], EFontStyle style=STYLE_NORMAL)
void charF12x16(uint8_t x, uint8_t y, const char ch[], EFontStyle style=STYLE_NORMAL)
void fillRect(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t templ)
const uint8_t * data
Pointer to PROGMEM data, representing sprite image.
void drawSpritePgm(uint8_t x, uint8_t y, const uint8_t sprite[])
void drawSprite(uint8_t x, uint8_t y, const uint8_t sprite[])
void drawVLine(uint8_t x1, uint8_t y1, uint8_t y2)
uint8_t y
draw position Y on the screen
void drawRect(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2)
uint8_t x
draw position X on the screen
void ssd1306_drawBuffer(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *buf)
void blt(uint8_t x, uint8_t y)
void putPixel(uint8_t x, uint8_t y)
void drawHLine(uint8_t x1, uint8_t y1, uint8_t x2)