2018-10-26 16:13:17 +01:00
# ifndef _ADAFRUIT_GFX_H
# define _ADAFRUIT_GFX_H
# if ARDUINO >= 100
# include "Arduino.h"
# include "Print.h"
# else
# include "WProgram.h"
# endif
# include "gfxfont.h"
/// 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!
class Adafruit_GFX : public Print {
public :
Adafruit_GFX ( int16_t w , int16_t h ) ; // Constructor
// This MUST be defined by the subclass:
2019-10-23 12:11:53 +01:00
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.
2018-10-26 16:13:17 +01:00
// TRANSACTION API / CORE DRAW API
// These MAY be overridden by the subclass to provide device-specific
// optimized code. Otherwise 'generic' versions are used.
virtual void startWrite ( void ) ;
virtual void writePixel ( int16_t x , int16_t y , uint16_t color ) ;
virtual void writeFillRect ( int16_t x , int16_t y , int16_t w , int16_t h , uint16_t color ) ;
virtual void writeFastVLine ( int16_t x , int16_t y , int16_t h , uint16_t color ) ;
virtual void writeFastHLine ( int16_t x , int16_t y , int16_t w , uint16_t color ) ;
virtual void writeLine ( int16_t x0 , int16_t y0 , int16_t x1 , int16_t y1 , uint16_t color ) ;
virtual void endWrite ( void ) ;
// CONTROL API
// These MAY be overridden by the subclass to provide device-specific
// optimized code. Otherwise 'generic' versions are used.
virtual void setRotation ( uint8_t r ) ;
virtual void invertDisplay ( boolean i ) ;
// BASIC DRAW API
// These MAY be overridden by the subclass to provide device-specific
// optimized code. Otherwise 'generic' versions are used.
virtual void
// It's good to implement those, even if using transaction API
drawFastVLine ( int16_t x , int16_t y , int16_t h , uint16_t color ) ,
drawFastHLine ( int16_t x , int16_t y , int16_t w , uint16_t color ) ,
fillRect ( int16_t x , int16_t y , int16_t w , int16_t h , uint16_t color ) ,
fillScreen ( uint16_t color ) ,
// Optional and probably not necessary to change
drawLine ( int16_t x0 , int16_t y0 , int16_t x1 , int16_t y1 , uint16_t color ) ,
drawRect ( int16_t x , int16_t y , int16_t w , int16_t h , uint16_t color ) ;
// These exist only with Adafruit_GFX (no subclass overrides)
void
drawCircleHelper ( int16_t x0 , int16_t y0 , int16_t r , uint8_t cornername ,
uint16_t color ) ,
fillCircleHelper ( int16_t x0 , int16_t y0 , int16_t r , uint8_t cornername ,
int16_t delta , uint16_t color ) ,
drawBitmap ( int16_t x , int16_t y , const uint8_t bitmap [ ] ,
int16_t w , int16_t h , uint16_t color ) ,
drawBitmap ( int16_t x , int16_t y , const uint8_t bitmap [ ] ,
int16_t w , int16_t h , uint16_t color , uint16_t bg ) ,
drawBitmap ( int16_t x , int16_t y , uint8_t * bitmap ,
int16_t w , int16_t h , uint16_t color ) ,
drawBitmap ( int16_t x , int16_t y , uint8_t * bitmap ,
int16_t w , int16_t h , uint16_t color , uint16_t bg ) ,
drawXBitmap ( int16_t x , int16_t y , const uint8_t bitmap [ ] ,
int16_t w , int16_t h , uint16_t color ) ,
drawGrayscaleBitmap ( int16_t x , int16_t y , const uint8_t bitmap [ ] ,
int16_t w , int16_t h ) ,
drawGrayscaleBitmap ( int16_t x , int16_t y , uint8_t * bitmap ,
int16_t w , int16_t h ) ,
drawGrayscaleBitmap ( int16_t x , int16_t y ,
const uint8_t bitmap [ ] , const uint8_t mask [ ] ,
int16_t w , int16_t h ) ,
drawGrayscaleBitmap ( int16_t x , int16_t y ,
uint8_t * bitmap , uint8_t * mask , int16_t w , int16_t h ) ,
drawRGBBitmap ( int16_t x , int16_t y , const uint16_t bitmap [ ] ,
int16_t w , int16_t h ) ,
drawRGBBitmap ( int16_t x , int16_t y , uint16_t * bitmap ,
int16_t w , int16_t h ) ,
drawRGBBitmap ( int16_t x , int16_t y ,
const uint16_t bitmap [ ] , const uint8_t mask [ ] ,
int16_t w , int16_t h ) ,
drawRGBBitmap ( int16_t x , int16_t y ,
uint16_t * bitmap , uint8_t * mask , int16_t w , int16_t h ) ,
drawChar ( int16_t x , int16_t y , unsigned char c , uint16_t color ,
uint16_t bg , uint8_t size ) ,
2019-10-23 12:11:53 +01:00
drawChar ( int16_t x , int16_t y , unsigned char c , uint16_t color ,
uint16_t bg , uint8_t size_x , uint8_t size_y ) ,
2018-10-26 16:13:17 +01:00
getTextBounds ( const char * string , int16_t x , int16_t y ,
int16_t * x1 , int16_t * y1 , uint16_t * w , uint16_t * h ) ,
getTextBounds ( const __FlashStringHelper * s , int16_t x , int16_t y ,
int16_t * x1 , int16_t * y1 , uint16_t * w , uint16_t * h ) ,
getTextBounds ( const String & str , int16_t x , int16_t y ,
2019-10-23 12:11:53 +01:00
int16_t * x1 , int16_t * y1 , uint16_t * w , uint16_t * h ) ,
setFont ( const GFXfont * f = NULL ) ;
virtual void
drawCircle ( int16_t x0 , int16_t y0 , int16_t r , uint16_t color ) ,
fillCircle ( int16_t x0 , int16_t y0 , int16_t r , uint16_t color ) ,
drawRoundRect ( int16_t x0 , int16_t y0 , int16_t w , int16_t h ,
int16_t radius , uint16_t color ) ,
fillRoundRect ( int16_t x0 , int16_t y0 , int16_t w , int16_t h ,
int16_t radius , uint16_t color ) ,
drawTriangle ( int16_t x0 , int16_t y0 , int16_t x1 , int16_t y1 ,
int16_t x2 , int16_t y2 , uint16_t color ) ,
fillTriangle ( int16_t x0 , int16_t y0 , int16_t x1 , int16_t y1 ,
int16_t x2 , int16_t y2 , uint16_t color ) ,
setTextSize ( uint8_t s ) ,
setTextSize ( uint8_t sx , uint8_t sy ) ;
2018-10-26 16:13:17 +01:00
2019-10-23 12:11:53 +01:00
/**********************************************************************/
/*!
@ brief Set text cursor location
@ param x X coordinate in pixels
@ param y Y coordinate in pixels
*/
/**********************************************************************/
virtual void setCursor ( int16_t x , int16_t y ) { cursor_x = x ; cursor_y = y ; }
/**********************************************************************/
/*!
@ brief Set text font color with transparant background
@ param c 16 - bit 5 - 6 - 5 Color to draw text with
@ note For ' transparent ' background , background and foreground
are set to same color rather than using a separate flag .
*/
/**********************************************************************/
void setTextColor ( uint16_t c ) { textcolor = textbgcolor = c ; }
/**********************************************************************/
/*!
@ brief Set text font color with custom background color
@ param c 16 - bit 5 - 6 - 5 Color to draw text with
@ param bg 16 - bit 5 - 6 - 5 Color to draw background / fill with
*/
/**********************************************************************/
void setTextColor ( uint16_t c , uint16_t bg ) {
textcolor = c ;
textbgcolor = bg ;
}
/**********************************************************************/
/*!
@ brief Set whether text that is too long for the screen width should
automatically wrap around to the next line ( else clip right ) .
@ param w true for wrapping , false for clipping
*/
/**********************************************************************/
void setTextWrap ( boolean w ) { wrap = w ; }
/**********************************************************************/
/*!
@ brief Enable ( or disable ) Code Page 437 - compatible charset .
There was an error in glcdfont . c for the longest time - - one
character ( # 176 , the ' light shade ' block ) was missing - - this
threw off the index of every character that followed it .
But a TON of code has been written with the erroneous
character indices . By default , the library uses the original
' wrong ' behavior and old sketches will still work . Pass
' true ' to this function to use correct CP437 character values
in your code .
@ param x true = enable ( new behavior ) , false = disable ( old behavior )
*/
/**********************************************************************/
void cp437 ( boolean x = true ) { _cp437 = x ; }
2018-10-26 16:13:17 +01:00
# if ARDUINO >= 100
virtual size_t write ( uint8_t ) ;
# else
virtual void write ( uint8_t ) ;
# endif
2019-10-23 12:11:53 +01:00
size_t iwrite ( uint8_t ) ;
/************************************************************************/
/*!
@ brief Get width of the display , accounting for current rotation
@ returns Width in pixels
*/
/************************************************************************/
int16_t width ( void ) const { return _width ; } ;
/************************************************************************/
/*!
@ brief Get height of the display , accounting for current rotation
@ returns Height in pixels
*/
/************************************************************************/
int16_t height ( void ) const { return _height ; }
2018-10-26 16:13:17 +01:00
2019-10-23 12:11:53 +01:00
/************************************************************************/
/*!
@ brief Get rotation setting for display
@ returns 0 thru 3 corresponding to 4 cardinal rotations
*/
/************************************************************************/
uint8_t getRotation ( void ) const { return rotation ; }
2018-10-26 16:13:17 +01:00
2019-10-23 12:11:53 +01:00
// get current cursor position (get rotation safe maximum values,
// using: width() for x, height() for y)
/************************************************************************/
/*!
@ brief Get text cursor X location
@ returns X coordinate in pixels
*/
/************************************************************************/
int16_t getCursorX ( void ) const { return cursor_x ; }
2018-10-26 16:13:17 +01:00
2019-10-23 12:11:53 +01:00
/************************************************************************/
/*!
@ brief Get text cursor Y location
@ returns Y coordinate in pixels
*/
/************************************************************************/
int16_t getCursorY ( void ) const { return cursor_y ; } ;
uint16_t
textcolor , ///< 16-bit background color for print()
textbgcolor ; ///< 16-bit text color for print()
2018-10-26 16:13:17 +01:00
protected :
void
charBounds ( char c , int16_t * x , int16_t * y ,
int16_t * minx , int16_t * miny , int16_t * maxx , int16_t * maxy ) ;
2019-10-23 12:11:53 +01:00
int16_t
2018-10-26 16:13:17 +01:00
WIDTH , ///< This is the 'raw' display width - never changes
HEIGHT ; ///< This is the 'raw' display height - never changes
int16_t
_width , ///< Display width as modified by current rotation
_height , ///< Display height as modified by current rotation
cursor_x , ///< x location to start print()ing text
cursor_y ; ///< y location to start print()ing text
2019-10-23 12:11:53 +01:00
//uint16_t
// textcolor, ///< 16-bit background color for print()
// textbgcolor; ///< 16-bit text color for print()
2018-10-26 16:13:17 +01:00
uint8_t
2019-10-23 12:11:53 +01:00
textsize_x , ///< Desired magnification in X-axis of text to print()
textsize_y , ///< Desired magnification in Y-axis of text to print()
2018-10-26 16:13:17 +01:00
rotation ; ///< Display rotation (0 thru 3)
boolean
wrap , ///< If set, 'wrap' text at right edge of display
_cp437 ; ///< If set, use correct CP437 charset (default is off)
GFXfont
* gfxFont ; ///< Pointer to special font
} ;
/// A simple drawn button UI element
class Adafruit_GFX_Button {
public :
Adafruit_GFX_Button ( void ) ;
// "Classic" initButton() uses center & size
void initButton ( Adafruit_GFX * gfx , int16_t x , int16_t y ,
uint16_t w , uint16_t h , uint16_t outline , uint16_t fill ,
uint16_t textcolor , char * label , uint8_t textsize ) ;
2019-10-23 12:11:53 +01:00
void initButton ( Adafruit_GFX * gfx , int16_t x , int16_t y ,
uint16_t w , uint16_t h , uint16_t outline , uint16_t fill ,
uint16_t textcolor , char * label , uint8_t textsize_x , uint8_t textsize_y ) ;
2018-10-26 16:13:17 +01:00
// New/alt initButton() uses upper-left corner & size
void initButtonUL ( Adafruit_GFX * gfx , int16_t x1 , int16_t y1 ,
uint16_t w , uint16_t h , uint16_t outline , uint16_t fill ,
uint16_t textcolor , char * label , uint8_t textsize ) ;
2019-10-23 12:11:53 +01:00
void initButtonUL ( Adafruit_GFX * gfx , int16_t x1 , int16_t y1 ,
uint16_t w , uint16_t h , uint16_t outline , uint16_t fill ,
uint16_t textcolor , char * label , uint8_t textsize_x , uint8_t textsize_y ) ;
2018-10-26 16:13:17 +01:00
void drawButton ( boolean inverted = false ) ;
boolean contains ( int16_t x , int16_t y ) ;
2019-10-23 12:11:53 +01:00
/**********************************************************************/
/*!
@ brief Sets button state , should be done by some touch function
@ param p True for pressed , false for not .
*/
/**********************************************************************/
void press ( boolean p ) { laststate = currstate ; currstate = p ; }
2018-10-26 16:13:17 +01:00
boolean justPressed ( ) ;
boolean justReleased ( ) ;
2019-10-23 12:11:53 +01:00
/**********************************************************************/
/*!
@ brief Query whether the button is currently pressed
@ returns True if pressed
*/
/**********************************************************************/
boolean isPressed ( void ) { return currstate ; } ;
2018-10-26 16:13:17 +01:00
private :
Adafruit_GFX * _gfx ;
int16_t _x1 , _y1 ; // Coordinates of top-left corner
uint16_t _w , _h ;
2019-10-23 12:11:53 +01:00
uint8_t _textsize_x ;
uint8_t _textsize_y ;
2018-10-26 16:13:17 +01:00
uint16_t _outlinecolor , _fillcolor , _textcolor ;
char _label [ 10 ] ;
boolean currstate , laststate ;
} ;
/// A GFX 1-bit canvas context for graphics
class GFXcanvas1 : public Adafruit_GFX {
public :
GFXcanvas1 ( uint16_t w , uint16_t h ) ;
~ GFXcanvas1 ( void ) ;
void drawPixel ( int16_t x , int16_t y , uint16_t color ) ,
fillScreen ( uint16_t color ) ;
2019-10-23 12:11:53 +01:00
/**********************************************************************/
/*!
@ brief Get a pointer to the internal buffer memory
@ returns A pointer to the allocated buffer
*/
/**********************************************************************/
uint8_t * getBuffer ( void ) const { return buffer ; }
2018-10-26 16:13:17 +01:00
private :
uint8_t * buffer ;
} ;
/// A GFX 8-bit canvas context for graphics
class GFXcanvas8 : public Adafruit_GFX {
public :
GFXcanvas8 ( uint16_t w , uint16_t h ) ;
~ GFXcanvas8 ( void ) ;
void drawPixel ( int16_t x , int16_t y , uint16_t color ) ,
fillScreen ( uint16_t color ) ,
writeFastHLine ( int16_t x , int16_t y , int16_t w , uint16_t color ) ;
2019-10-23 12:11:53 +01:00
/**********************************************************************/
/*!
@ brief Get a pointer to the internal buffer memory
@ returns A pointer to the allocated buffer
*/
/**********************************************************************/
uint8_t * getBuffer ( void ) const { return buffer ; }
2018-10-26 16:13:17 +01:00
private :
uint8_t * buffer ;
} ;
/// A GFX 16-bit canvas context for graphics
class GFXcanvas16 : public Adafruit_GFX {
public :
GFXcanvas16 ( uint16_t w , uint16_t h ) ;
~ GFXcanvas16 ( void ) ;
void drawPixel ( int16_t x , int16_t y , uint16_t color ) ,
2019-10-23 12:11:53 +01:00
fillScreen ( uint16_t color ) ,
byteSwap ( void ) ;
/**********************************************************************/
/*!
@ brief Get a pointer to the internal buffer memory
@ returns A pointer to the allocated buffer
*/
/**********************************************************************/
uint16_t * getBuffer ( void ) const { return buffer ; }
2018-10-26 16:13:17 +01:00
private :
uint16_t * buffer ;
} ;
# endif // _ADAFRUIT_GFX_H