    //#New(backend):                                                 //- [Y]  if new (backend) to add
    //#Init_Base:                                                    //- parameter to add at launch of library in case of backend
    //#Init_Include:                                                 //- function added at initialization (it can be Loop_Base)
    //#Loop_Base:                                                    //- function launched at loop start and activation callback function on event
    //#Loop1_Event:                                                  //- event to monitor in a loop
    //#Loop1_Config: SubVoid_Void  0 DataAvailableSub                //- parameters of callback created: CallbackType EndPar callbacksub
    //#Loop2_Event:                                                  //- event to monitor in a loop
    //#Loop2_Config: SubVoid_Void  0 DataAvailableSub                //- parameters of callback created: CallbackType EndPar callbacksub
    //#Loop3_Event:                                                  //- event to monitor in a loop
    //#Loop3_Config: SubVoid_Void  0 DataAvailableSub                //- parameters of callback created: CallbackType EndPar callbacksub
    //#CallBack1_Base:                                               //- callback on arduino side
    //#CallBack1_Config: SubVoid_BArray 0 MessageArrivedSub          //- CallbackType Par1 EndPar callbacksub
    //#CallBack2_Base:                                               //- callback on arduino side
    //#CallBack2_Config: SubVoid_StringBArray 0 2 NewMessageSub      //- CallbackType Par1 Par2 EndPar callbacksub
    //#CallBack3_Base:                                               //- callback on arduino side
    //#CallBack3_Config: SubVoid_StringBArray 0 2 NewMessageSub      //- CallbackType Par1 Par2 EndPar callbacksub
    //#

class Adafruit_GFX : public Print 
{
public:
  Adafruit_GFX(int16_t w, int16_t h); 
  
  virtual void drawPixel(int16_t x, int16_t y, uint16_t color) = 0;
  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);
  virtual void setRotation(uint8_t r);
  virtual void invertDisplay(bool i);
  virtual void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
  virtual void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
  virtual void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
  virtual void fillScreen(uint16_t color);
  virtual void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color);
  virtual void drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
  void drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color);
  void drawCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, uint16_t color);
  void fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color);
  void fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, int16_t delta, 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 fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color);
  void drawRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, int16_t radius, uint16_t color);
  void fillRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, int16_t radius, uint16_t color);
  void drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w, int16_t h, uint16_t color);
  void drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w, int16_t h, uint16_t color, uint16_t bg);
  void drawBitmap(int16_t x, int16_t y, uint8_t * bitmap, int16_t w, int16_t h, uint16_t color);
  void drawBitmap(int16_t x, int16_t y, uint8_t * bitmap, int16_t w, int16_t h, uint16_t color, uint16_t bg);
  void drawXBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w, int16_t h, uint16_t color);
  void drawGrayscaleBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w, int16_t h);
  void drawGrayscaleBitmap(int16_t x, int16_t y, uint8_t * bitmap, int16_t w, int16_t h);
  void drawGrayscaleBitmap(int16_t x, int16_t y, const uint8_t bitmap[], const uint8_t mask[], int16_t w, int16_t h);
  void drawGrayscaleBitmap(int16_t x, int16_t y, uint8_t * bitmap, uint8_t * mask, int16_t w, int16_t h);
  void drawRGBBitmap(int16_t x, int16_t y, const uint16_t bitmap[], int16_t w, int16_t h);
  void drawRGBBitmap(int16_t x, int16_t y, uint16_t * bitmap, int16_t w, int16_t h);
  void drawRGBBitmap(int16_t x, int16_t y, const uint16_t bitmap[], const uint8_t mask[], int16_t w, int16_t h);
  void drawRGBBitmap(int16_t x, int16_t y, uint16_t * bitmap, uint8_t * mask, int16_t w, int16_t h);
  void drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t size);
  void drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t size_x, uint8_t size_y);
  void getTextBounds(const char * string, int16_t x, int16_t y, int16_t * x1, int16_t * y1, uint16_t * w, uint16_t * h);
  void getTextBounds(const __FlashStringHelper * s, int16_t x, int16_t y, int16_t * x1, int16_t * y1, uint16_t * w, uint16_t * h);
  void getTextBounds(const String &str, int16_t x, int16_t y, int16_t * x1, int16_t * y1, uint16_t * w, uint16_t * h);
  void setTextSize(uint8_t s);
  void setTextSize(uint8_t sx, uint8_t sy);
  void setFont(const GFXfont * f = NULL);
  void setCursor(int16_t x, int16_t y); 

  void setTextColor(uint16_t c);
  void setTextColor(uint16_t c, uint16_t bg);
  void setTextWrap(bool w);
  void cp437(bool x = true);
  using Print::write;

  virtual size_t write(uint8_t);

  int16_t width(void);
  int16_t height(void);
  uint8_t getRotation(void);
  int16_t getCursorX(void);
  int16_t getCursorY(void);
