35 #include <avr/pgmspace.h> 36 #elif defined(ESP8266) 47 #define pgm_read_byte(addr) (*(const unsigned char *)(addr)) 50 #define pgm_read_word(addr) (*(const unsigned short *)(addr)) 52 #ifndef pgm_read_dword 53 #define pgm_read_dword(addr) (*(const unsigned long *)(addr)) 59 #if !defined(__INT_MAX__) || (__INT_MAX__ > 0xFFFF) 60 #define pgm_read_pointer(addr) ((void *)pgm_read_dword(addr)) 62 #define pgm_read_pointer(addr) ((void *)pgm_read_word(addr)) 66 #define min(a,b) (((a) < (b)) ? (a) : (b)) 70 #define _swap_int16_t(a, b) { int16_t t = a; a = b; b = t; } 93 int16_t ddF_y = -2 * r;
126 int16_t r, uint8_t cornername, uint16_t color)
130 int16_t ddF_y = -2 * r;
145 if (cornername & 0x4)
150 if (cornername & 0x2)
155 if (cornername & 0x8)
160 if (cornername & 0x1)
177 uint8_t cornername, int16_t delta, uint16_t color)
182 int16_t ddF_y = -2 * r;
198 if (cornername & 0x1)
203 if (cornername & 0x2)
215 int16_t steep = abs(y1 - y0) > abs(x1 - x0);
232 int16_t err = dx / 2;
274 int16_t h, uint16_t color)
281 int16_t w, uint16_t color)
291 for (int16_t
i=x;
i<x+w;
i++)
304 int16_t h, int16_t r, uint16_t color)
320 int16_t h, int16_t r, uint16_t color)
332 int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color)
341 int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color)
344 int16_t a, b, y, last;
367 else if (x1 > b) b = x1;
369 else if (x2 > b) b = x2;
391 if (y1 == y2) last = y1;
394 for (y=y0; y<=last; y++)
410 sa = dx12 * (y - y1);
411 sb = dx02 * (y - y0);
431 const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color)
434 int16_t
i, j, byteWidth = (w + 7) / 8;
441 if (i & 7) byte <<= 1;
443 if (byte & 0x80)
drawPixel(x+i, y+j, color);
452 const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color, uint16_t bg)
455 int16_t
i, j, byteWidth = (w + 7) / 8;
462 if (i & 7) byte <<= 1;
464 if (byte & 0x80)
drawPixel(x+i, y+j, color);
472 uint8_t *bitmap, int16_t w, int16_t h, uint16_t color)
475 int16_t
i, j, byteWidth = (w + 7) / 8;
482 if (i & 7) byte <<= 1;
483 else byte = bitmap[j * byteWidth + i / 8];
484 if (byte & 0x80)
drawPixel(x+i, y+j, color);
491 uint8_t *bitmap, int16_t w, int16_t h, uint16_t color, uint16_t bg)
494 int16_t
i, j, byteWidth = (w + 7) / 8;
501 if (i & 7) byte <<= 1;
502 else byte = bitmap[j * byteWidth + i / 8];
503 if (byte & 0x80)
drawPixel(x+i, y+j, color);
513 const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color)
516 int16_t
i, j, byteWidth = (w + 7) / 8;
523 if (i & 7) byte >>= 1;
525 if (byte & 0x01)
drawPixel(x+i, y+j, color);
580 if ((w > 0) && (h > 0))
604 uint16_t color, uint16_t bg, uint8_t size)
612 ((x + 6 * size - 1) < 0) ||
613 ((y + 8 * size - 1) < 0))
616 if (!
_cp437 && (c >= 176)) c++;
618 for (int8_t
i=0;
i<6;
i++ )
623 for (int8_t j=0; j<8; j++, line >>= 1)
628 else fillRect(x+(
i*size), y+(j*size), size, size, color);
630 else if (bg != color)
633 else fillRect(x+
i*size, y+j*size, size, size, bg);
656 uint8_t xx, yy, bits, bit = 0;
683 for (yy=0; yy<h; yy++)
685 for (xx=0; xx<w; xx++)
699 fillRect(x+(xo16+xx)*size, y+(yo16+yy)*size, size, size, color);
805 int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h)
831 if ((c >= first) && (c <= last))
840 if (
wrap && ((x + (((int16_t)xo + gw) * ts)) >=
_width))
848 gx2 = gx1 + gw * ts - 1;
849 gy2 = gy1 + gh * ts - 1;
850 if (gx1 < minx) minx = gx1;
851 if (gy1 < miny) miny = gy1;
852 if (gx2 > maxx) maxx = gx2;
853 if (gy2 > maxy) maxy = gy2;
867 if (maxx >= minx) *w = maxx - minx + 1;
868 if (maxy >= miny) *h = maxy - miny + 1;
874 uint16_t lineWidth = 0, maxWidth = 0;
886 if (lineWidth > maxWidth) maxWidth = lineWidth;
899 if (lineWidth > maxWidth) maxWidth = lineWidth;
913 int16_t
x, int16_t y, int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h)
915 uint8_t *s = (uint8_t *)str, c;
939 if ((c >= first) && (c <= last))
948 if (
wrap && ((x + (((int16_t)xo + gw) * ts)) >=
_width))
956 gx2 = gx1 + gw * ts - 1;
957 gy2 = gy1 + gh * ts - 1;
958 if (gx1 < minx) minx = gx1;
959 if (gy1 < miny) miny = gy1;
960 if (gx2 > maxx) maxx = gx2;
961 if (gy2 > maxy) maxy = gy2;
975 if (maxx >= minx) *w = maxx - minx + 1;
976 if (maxy >= miny) *h = maxy - miny + 1;
982 uint16_t lineWidth = 0, maxWidth = 0;
994 if (lineWidth > maxWidth) maxWidth = lineWidth;
1007 if (lineWidth > maxWidth) maxWidth = lineWidth;
1044 Adafruit_GFX *gfx, int16_t
x, int16_t y, uint8_t w, uint8_t h,
1045 uint16_t outline, uint16_t fill, uint16_t
textcolor,
1052 _outlinecolor = outline;
1057 strncpy(_label, label, 9);
1063 uint16_t fill, outline, text;
1068 outline = _outlinecolor;
1074 outline = _outlinecolor;
1078 _gfx->fillRoundRect(_x - (_w/2), _y - (_h/2), _w, _h,
min(_w,_h)/4, fill);
1079 _gfx->drawRoundRect(_x - (_w/2), _y - (_h/2), _w, _h,
min(_w,_h)/4, outline);
1081 _gfx->setCursor(_x - strlen(_label)*3*_textsize, _y-4*_textsize);
1082 _gfx->setTextColor(text);
1083 _gfx->setTextSize(_textsize);
1084 _gfx->print(_label);
1089 if ((x < (_x - _w/2)) || (x > (_x + _w/2)))
return false;
1090 if ((y < (_y - _h/2)) || (y > (_y + _h/2)))
return false;
1096 laststate = currstate;
1106 return (currstate && !laststate);
1110 return (!currstate && laststate);
1132 uint16_t bytes = ((w + 7) / 8) * h;
1133 if ((buffer = (uint8_t *)malloc(bytes)))
1135 memset(buffer, 0, bytes);
1141 if (buffer) free(buffer);
1153 GFXsetBit[] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 },
1154 GFXclrBit[] = { 0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE };
1158 if ((x < 0) || (y < 0) || (x >=
_width) || (y >=
_height))
return;
1179 uint8_t *ptr = &buffer[(x / 8) + y * ((
WIDTH + 7) / 8)];
1190 memset(buffer, color ? 0xFF : 0x00, bytes);
1194 GFXcanvas16::GFXcanvas16(uint16_t w, uint16_t h) :
Adafruit_GFX(w, h)
1196 uint16_t bytes = w * h * 2;
1197 if ((buffer = (uint16_t *)malloc(bytes)))
1199 memset(buffer, 0, bytes);
1203 GFXcanvas16::~GFXcanvas16(
void)
1205 if (buffer) free(buffer);
1208 uint16_t *GFXcanvas16::getBuffer(
void)
1213 void GFXcanvas16::drawPixel(int16_t
x, int16_t y, uint16_t color)
1217 if ((x < 0) || (y < 0) || (x >=
_width) || (y >=
_height))
return;
1238 buffer[x + y *
WIDTH] = color;
1242 void GFXcanvas16::fillScreen(uint16_t color)
1246 uint8_t hi = color >> 8, lo = color & 0xFF;
1254 for (i=0; i<pixels; i++) buffer[i] = color;
void drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color)
virtual void drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color)
virtual void invertDisplay(boolean i)
int16_t height(void) const
#define pgm_read_pointer(addr)
void setFont(const GFXfont *f=NULL)
void fillRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, int16_t radius, uint16_t color)
int16_t getCursorY(void) const
void drawRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, int16_t radius, uint16_t color)
void drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color)
void setCursor(int16_t x, int16_t y)
void fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color)
int16_t width(void) const
int16_t getCursorX(void) const
GFXcanvas1(uint16_t w, uint16_t h)
virtual void drawPixel(int16_t x, int16_t y, uint16_t color)=0
void drawXBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color)
void drawCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, uint16_t color)
void fillScreen(uint16_t color)
virtual void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color)
void fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, int16_t delta, uint16_t color)
void getTextBounds(char *string, int16_t x, int16_t y, int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h)
#define pgm_read_word(addr)
void setTextColor(uint16_t c)
virtual void fillScreen(uint16_t color)
virtual void write(uint8_t)
void drawPixel(int16_t x, int16_t y, uint16_t color)
void cp437(boolean x=true)
uint8_t getRotation(void) const
virtual void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color)
void drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t size)
void drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color)
virtual void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color)
void fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color)
void setTextWrap(boolean w)
void setTextSize(uint8_t s)
Adafruit_GFX(int16_t w, int16_t h)
void setRotation(uint8_t r)
uint8_t * getBuffer(void)
virtual void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color)
#define pgm_read_byte(addr)
#define _swap_int16_t(a, b)