Adafruit_GFX.h 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. #ifndef _ADAFRUIT_GFX_H
  2. #define _ADAFRUIT_GFX_H
  3. #if ARDUINO >= 100
  4. #include "Arduino.h"
  5. #include "Print.h"
  6. #else
  7. #include "WProgram.h"
  8. #endif
  9. #include "gfxfont.h"
  10. /// A generic graphics superclass that can handle all sorts of drawing. At a minimum you can subclass and provide drawPixel(). At a maximum you can do a ton of overriding to optimize. Used for any/all Adafruit displays!
  11. class Adafruit_GFX : public Print {
  12. public:
  13. Adafruit_GFX(int16_t w, int16_t h); // Constructor
  14. // This MUST be defined by the subclass:
  15. virtual void drawPixel(int16_t x, int16_t y, uint16_t color) = 0; ///< Virtual drawPixel() function to draw to the screen/framebuffer/etc, must be overridden in subclass. @param x X coordinate. @param y Y coordinate. @param color 16-bit pixel color.
  16. // TRANSACTION API / CORE DRAW API
  17. // These MAY be overridden by the subclass to provide device-specific
  18. // optimized code. Otherwise 'generic' versions are used.
  19. virtual void startWrite(void);
  20. virtual void writePixel(int16_t x, int16_t y, uint16_t color);
  21. virtual void writeFillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
  22. virtual void writeFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
  23. virtual void writeFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
  24. virtual void writeLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color);
  25. virtual void endWrite(void);
  26. // CONTROL API
  27. // These MAY be overridden by the subclass to provide device-specific
  28. // optimized code. Otherwise 'generic' versions are used.
  29. virtual void setRotation(uint8_t r);
  30. virtual void invertDisplay(boolean i);
  31. // BASIC DRAW API
  32. // These MAY be overridden by the subclass to provide device-specific
  33. // optimized code. Otherwise 'generic' versions are used.
  34. virtual void
  35. // It's good to implement those, even if using transaction API
  36. drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color),
  37. drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color),
  38. fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color),
  39. fillScreen(uint16_t color),
  40. // Optional and probably not necessary to change
  41. drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color),
  42. drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
  43. // These exist only with Adafruit_GFX (no subclass overrides)
  44. void
  45. drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color),
  46. drawCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername,
  47. uint16_t color),
  48. fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color),
  49. fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername,
  50. int16_t delta, uint16_t color),
  51. drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
  52. int16_t x2, int16_t y2, uint16_t color),
  53. fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
  54. int16_t x2, int16_t y2, uint16_t color),
  55. drawRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h,
  56. int16_t radius, uint16_t color),
  57. fillRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h,
  58. int16_t radius, uint16_t color),
  59. drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[],
  60. int16_t w, int16_t h, uint16_t color),
  61. drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[],
  62. int16_t w, int16_t h, uint16_t color, uint16_t bg),
  63. drawBitmap(int16_t x, int16_t y, uint8_t *bitmap,
  64. int16_t w, int16_t h, uint16_t color),
  65. drawBitmap(int16_t x, int16_t y, uint8_t *bitmap,
  66. int16_t w, int16_t h, uint16_t color, uint16_t bg),
  67. drawXBitmap(int16_t x, int16_t y, const uint8_t bitmap[],
  68. int16_t w, int16_t h, uint16_t color),
  69. drawGrayscaleBitmap(int16_t x, int16_t y, const uint8_t bitmap[],
  70. int16_t w, int16_t h),
  71. drawGrayscaleBitmap(int16_t x, int16_t y, uint8_t *bitmap,
  72. int16_t w, int16_t h),
  73. drawGrayscaleBitmap(int16_t x, int16_t y,
  74. const uint8_t bitmap[], const uint8_t mask[],
  75. int16_t w, int16_t h),
  76. drawGrayscaleBitmap(int16_t x, int16_t y,
  77. uint8_t *bitmap, uint8_t *mask, int16_t w, int16_t h),
  78. drawRGBBitmap(int16_t x, int16_t y, const uint16_t bitmap[],
  79. int16_t w, int16_t h),
  80. drawRGBBitmap(int16_t x, int16_t y, uint16_t *bitmap,
  81. int16_t w, int16_t h),
  82. drawRGBBitmap(int16_t x, int16_t y,
  83. const uint16_t bitmap[], const uint8_t mask[],
  84. int16_t w, int16_t h),
  85. drawRGBBitmap(int16_t x, int16_t y,
  86. uint16_t *bitmap, uint8_t *mask, int16_t w, int16_t h),
  87. drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color,
  88. uint16_t bg, uint8_t size),
  89. setCursor(int16_t x, int16_t y),
  90. setTextColor(uint16_t c),
  91. setTextColor(uint16_t c, uint16_t bg),
  92. setTextSize(uint8_t s),
  93. setTextWrap(boolean w),
  94. cp437(boolean x=true),
  95. setFont(const GFXfont *f = NULL),
  96. getTextBounds(const char *string, int16_t x, int16_t y,
  97. int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h),
  98. getTextBounds(const __FlashStringHelper *s, int16_t x, int16_t y,
  99. int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h),
  100. getTextBounds(const String &str, int16_t x, int16_t y,
  101. int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h);
  102. #if ARDUINO >= 100
  103. virtual size_t write(uint8_t);
  104. #else
  105. virtual void write(uint8_t);
  106. #endif
  107. int16_t height(void) const;
  108. int16_t width(void) const;
  109. uint8_t getRotation(void) const;
  110. // get current cursor position (get rotation safe maximum values, using: width() for x, height() for y)
  111. int16_t getCursorX(void) const;
  112. int16_t getCursorY(void) const;
  113. protected:
  114. void
  115. charBounds(char c, int16_t *x, int16_t *y,
  116. int16_t *minx, int16_t *miny, int16_t *maxx, int16_t *maxy);
  117. const int16_t
  118. WIDTH, ///< This is the 'raw' display width - never changes
  119. HEIGHT; ///< This is the 'raw' display height - never changes
  120. int16_t
  121. _width, ///< Display width as modified by current rotation
  122. _height, ///< Display height as modified by current rotation
  123. cursor_x, ///< x location to start print()ing text
  124. cursor_y; ///< y location to start print()ing text
  125. uint16_t
  126. textcolor, ///< 16-bit background color for print()
  127. textbgcolor; ///< 16-bit text color for print()
  128. uint8_t
  129. textsize, ///< Desired magnification of text to print()
  130. rotation; ///< Display rotation (0 thru 3)
  131. boolean
  132. wrap, ///< If set, 'wrap' text at right edge of display
  133. _cp437; ///< If set, use correct CP437 charset (default is off)
  134. GFXfont
  135. *gfxFont; ///< Pointer to special font
  136. };
  137. /// A simple drawn button UI element
  138. class Adafruit_GFX_Button {
  139. public:
  140. Adafruit_GFX_Button(void);
  141. // "Classic" initButton() uses center & size
  142. void initButton(Adafruit_GFX *gfx, int16_t x, int16_t y,
  143. uint16_t w, uint16_t h, uint16_t outline, uint16_t fill,
  144. uint16_t textcolor, char *label, uint8_t textsize);
  145. // New/alt initButton() uses upper-left corner & size
  146. void initButtonUL(Adafruit_GFX *gfx, int16_t x1, int16_t y1,
  147. uint16_t w, uint16_t h, uint16_t outline, uint16_t fill,
  148. uint16_t textcolor, char *label, uint8_t textsize);
  149. void drawButton(boolean inverted = false);
  150. boolean contains(int16_t x, int16_t y);
  151. void press(boolean p);
  152. boolean isPressed();
  153. boolean justPressed();
  154. boolean justReleased();
  155. private:
  156. Adafruit_GFX *_gfx;
  157. int16_t _x1, _y1; // Coordinates of top-left corner
  158. uint16_t _w, _h;
  159. uint8_t _textsize;
  160. uint16_t _outlinecolor, _fillcolor, _textcolor;
  161. char _label[10];
  162. boolean currstate, laststate;
  163. };
  164. /// A GFX 1-bit canvas context for graphics
  165. class GFXcanvas1 : public Adafruit_GFX {
  166. public:
  167. GFXcanvas1(uint16_t w, uint16_t h);
  168. ~GFXcanvas1(void);
  169. void drawPixel(int16_t x, int16_t y, uint16_t color),
  170. fillScreen(uint16_t color);
  171. uint8_t *getBuffer(void);
  172. private:
  173. uint8_t *buffer;
  174. };
  175. /// A GFX 8-bit canvas context for graphics
  176. class GFXcanvas8 : public Adafruit_GFX {
  177. public:
  178. GFXcanvas8(uint16_t w, uint16_t h);
  179. ~GFXcanvas8(void);
  180. void drawPixel(int16_t x, int16_t y, uint16_t color),
  181. fillScreen(uint16_t color),
  182. writeFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
  183. uint8_t *getBuffer(void);
  184. private:
  185. uint8_t *buffer;
  186. };
  187. /// A GFX 16-bit canvas context for graphics
  188. class GFXcanvas16 : public Adafruit_GFX {
  189. public:
  190. GFXcanvas16(uint16_t w, uint16_t h);
  191. ~GFXcanvas16(void);
  192. void drawPixel(int16_t x, int16_t y, uint16_t color),
  193. fillScreen(uint16_t color);
  194. uint16_t *getBuffer(void);
  195. private:
  196. uint16_t *buffer;
  197. };
  198. #endif // _ADAFRUIT_GFX_H