added advanced scrolling options.

Fork of Adafruit_GFX by Neal Horman

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Adafruit_GFX.h Source File

Adafruit_GFX.h

00001 /***********************************
00002 This is a our graphics core library, for all our displays. 
00003 We'll be adapting all the
00004 existing libaries to use this core to make updating, support 
00005 and upgrading easier!
00006 
00007 Adafruit invests time and resources providing this open source code, 
00008 please support Adafruit and open-source hardware by purchasing 
00009 products from Adafruit!
00010 
00011 Written by Limor Fried/Ladyada  for Adafruit Industries.  
00012 BSD license, check license.txt for more information
00013 All text above must be included in any redistribution
00014 ****************************************/
00015 
00016 /*
00017  *  Modified by Neal Horman 7/14/2012 for use in mbed
00018  */
00019 
00020 #ifndef _ADAFRUIT_GFX_H_
00021 #define _ADAFRUIT_GFX_H_
00022 
00023 #include "Adafruit_GFX_Config.h"
00024 
00025 static inline void swap(int16_t &a, int16_t &b)
00026 {
00027     int16_t t = a;
00028     
00029     a = b;
00030     b = t;
00031 }
00032 
00033 #ifndef _BV
00034 #define _BV(bit) (1<<(bit))
00035 #endif
00036 
00037 #define BLACK 0
00038 #define WHITE 1
00039 
00040 /**
00041  * This is a Text and Graphics element drawing class.
00042  * These functions draw to the display buffer.
00043  *
00044  * Display drivers should be derived from here.
00045  * The Display drivers push the display buffer to the
00046  * hardware based on application control.
00047  *
00048  */
00049 class Adafruit_GFX : public Stream
00050 {
00051  public:
00052     Adafruit_GFX(int16_t w, int16_t h)
00053         : _rawWidth(w)
00054         , _rawHeight(h)
00055         , _width(w)
00056         , _height(h)
00057         , cursor_x(0)
00058         , cursor_y(0)
00059         , textcolor(WHITE)
00060         , textbgcolor(BLACK)
00061         , textsize(1)
00062         , rotation(0)
00063         , line_wrap(H_NO_WRAP)
00064         {};
00065 
00066     virtual void scroll(void) =0; 
00067     /// Paint one BLACK or WHITE pixel in the display buffer
00068     // this must be defined by the subclass
00069     virtual void drawPixel(int16_t x, int16_t y, uint16_t color) = 0;
00070     // this is optional
00071     virtual void invertDisplay(bool i) {};
00072     
00073     // Stream implementation - provides printf() interface
00074     // You would otherwise be forced to use writeChar()
00075     virtual int _putc(int value) { return writeChar(value); };
00076     virtual int _getc() { return -1; };
00077 
00078 #ifdef GFX_WANT_ABSTRACTS
00079     // these are 'generic' drawing functions, so we can share them!
00080     
00081     /** Draw a Horizontal Line
00082      * @note GFX_WANT_ABSTRACTS must be defined in Adafruit_GFX_config.h
00083      */
00084     virtual void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
00085     /** Draw a rectangle
00086      * @note GFX_WANT_ABSTRACTS must be defined in Adafruit_GFX_config.h
00087      */
00088     virtual void drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
00089     /** Fill the entire display
00090      * @note GFX_WANT_ABSTRACTS must be defined in Adafruit_GFX_config.h
00091      */
00092     virtual void fillScreen(uint16_t color);
00093 
00094     /** Draw a circle
00095      * @note GFX_WANT_ABSTRACTS must be defined in Adafruit_GFX_config.h
00096      */
00097     void drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color);
00098     void drawCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, uint16_t color);
00099     
00100     /** Draw and fill a circle
00101      * @note GFX_WANT_ABSTRACTS must be defined in Adafruit_GFX_config.h
00102      */
00103     void fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color);
00104     void fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, int16_t delta, uint16_t color);
00105 
00106     /** Draw a triangle
00107      * @note GFX_WANT_ABSTRACTS must be defined in Adafruit_GFX_config.h
00108      */
00109     void drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color);
00110     /** Draw and fill a triangle
00111      * @note GFX_WANT_ABSTRACTS must be defined in Adafruit_GFX_config.h
00112      */
00113     void fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color);
00114     
00115     /** Draw a rounded rectangle
00116      * @note GFX_WANT_ABSTRACTS must be defined in Adafruit_GFX_config.h
00117      */
00118     void drawRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, int16_t radius, uint16_t color);
00119     /** Draw and fill a rounded rectangle
00120      * @note GFX_WANT_ABSTRACTS must be defined in Adafruit_GFX_config.h
00121      */
00122     void fillRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, int16_t radius, uint16_t color);
00123     /** Draw a bitmap
00124      * @note GFX_WANT_ABSTRACTS must be defined in Adafruit_GFX_config.h
00125      */
00126     void drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color);
00127 #endif
00128 
00129 #if defined(GFX_WANT_ABSTRACTS) || defined(GFX_SIZEABLE_TEXT)
00130     /** Draw a line
00131      * @note GFX_WANT_ABSTRACTS or GFX_SIZEABLE_TEXT must be defined in Adafruit_GFX_config.h
00132      */
00133     virtual void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color);
00134     /** Draw a vertical line
00135      * @note GFX_WANT_ABSTRACTS or GFX_SIZEABLE_TEXT must be defined in Adafruit_GFX_config.h
00136      */
00137     virtual void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
00138     /** Draw and fill a rectangle
00139      * @note GFX_WANT_ABSTRACTS or GFX_SIZEABLE_TEXT must be defined in Adafruit_GFX_config.h
00140      */
00141     virtual void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
00142 #endif
00143 
00144     /// Draw a text character at a specified pixel location
00145     void drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t size);
00146     /// Draw a text character at the text cursor location
00147     size_t writeChar(uint8_t);
00148 
00149     /// Get the width of the display in pixels
00150     inline int16_t width(void) { return _width; };
00151     /// Get the height of the display in pixels
00152     inline int16_t height(void) { return _height; };
00153 
00154     /// Set the text cursor location, based on the size of the text
00155     inline void setTextCursor(int16_t x, int16_t y) { cursor_x = x; cursor_y = y; };
00156 #if defined(GFX_WANT_ABSTRACTS) || defined(GFX_SIZEABLE_TEXT)
00157     /** Set the size of the text to be drawn
00158      * @note Make sure to enable either GFX_SIZEABLE_TEXT or GFX_WANT_ABSTRACTS
00159      */
00160     inline void setTextSize(uint8_t s) { textsize = (s > 0) ? s : 1; };
00161 #endif
00162     /// Set the text foreground and background colors to be the same
00163     inline void setTextColor(uint16_t c) { textcolor = c; textbgcolor = c; }
00164     /// Set the text foreground and background colors independantly
00165     inline void setTextColor(uint16_t c, uint16_t b) { textcolor = c; textbgcolor = b; };
00166     enum hwrap_mode {
00167         H_NO_WRAP,
00168         H_WRAP,
00169         H_WRAP_N_CLEAR
00170     };
00171     enum vwrap_mode {
00172         V_NO_WRAP,
00173         V_SCROLL,
00174         V_WRAP
00175     };
00176     /// Set text wraping mode true or false
00177     inline void setTextWrap(bool w)
00178     {
00179         if (w) line_wrap = H_WRAP; 
00180         else line_wrap = H_NO_WRAP;
00181     }
00182     inline void setTextWrapMode(enum hwrap_mode w) { line_wrap = w; };
00183     inline void setScreenWrapMode(enum vwrap_mode w) {screen_wrap = w;};
00184  
00185     inline void getDimentions(uint16_t *width, uint16_t *height)
00186     {
00187         *width = _width;
00188         *height = _height;
00189     }
00190 
00191     /// Set the display rotation, 1, 2, 3, or 4
00192     void setRotation(uint8_t r);
00193     /// Get the current rotation
00194     inline uint8_t getRotation(void) { rotation %= 4; return rotation; };
00195 
00196 protected:
00197     int16_t  _rawWidth, _rawHeight;   // this is the 'raw' display w/h - never changes
00198     int16_t  _width, _height; // dependent on rotation
00199     int16_t  cursor_x, cursor_y;
00200     uint16_t textcolor, textbgcolor;
00201     uint8_t  textsize;
00202     uint8_t  rotation;
00203     enum hwrap_mode line_wrap; // If set, 'wrap' text at right edge of display
00204     enum vwrap_mode screen_wrap;
00205 };
00206 
00207 #endif