| 
							- /*
 - 	--------------------------------------------------
 - 	RA8875 LCD/TFT Graphic Controller Driver Library
 - 	--------------------------------------------------
 - 	Version:0.70b11p11
 - 	++++++++++++++++++++++++++++++++++++++++++++++++++
 - 	Written by: Max MC Costa for s.u.m.o.t.o.y
 - 	++++++++++++++++++++++++++++++++++++++++++++++++++
 - An attemp to create a full featured library support for RA8875 chip from RAiO.
 - Works with many SPI drived RA8875 Boards included Adafruit, Eastrising(buydisplay).
 - NOT work if you have a I2C or Parallel based display!
 - 
 - -------------------------------------------------------------------------------------
 - 					>>>>>>>>>>>> About Copyrights <<<<<<<<<<<<<<<
 - -------------------------------------------------------------------------------------
 - License:GNU General Public License v3.0
 - 
 -     RA8875 fast SPI library for RAiO SPI RA8875 drived TFT
 -     Copyright (C) 2014  egidio massimo costa sumotoy (a t) gmail.com
 - 
 -     This program is free software: you can redistribute it and/or modify
 -     it under the terms of the GNU General Public License as published by
 -     the Free Software Foundation, either version 3 of the License, or
 -     (at your option) any later version.
 - 
 -     This program is distributed in the hope that it will be useful,
 -     but WITHOUT ANY WARRANTY; without even the implied warranty of
 -     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 -     GNU General Public License for more details.
 - 
 -     You should have received a copy of the GNU General Public License
 -     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 - -------------------------------------------------------------------------------------
 - 					     >>>>>>>>>>>> Thanks to <<<<<<<<<<<<<<<
 - -------------------------------------------------------------------------------------
 - Teensy 3.1, a tiny MCU but monster of performances at tiny price, Arduino should learn...
 - Paul Stoffregen, the 'guru' behind many arduino magic, the father of Teensy
 - Bill Greyman, another 'maestro', greatly inspired many coders
 - Jnmattern & Marek Buriak for drawArc
 - Last but not less important the contributors and beta tester of this library:
 - M.Sandercrock, the experimentalist, MrTom and many others
 - -------------------------------------------------------------------------------------
 - 				>>>>>>>>>>>> Current version notes <<<<<<<<<<<<<<<
 - -------------------------------------------------------------------------------------
 - 	0.70b11p8 changes: Fixed some small error (thanks Mr TOM) that affects drawLine
 - 	and drawLineAngle. Initial support for SPARK devices (very early development)
 - 	Fixed a couple of examples.
 - 	0.70b11p9 changes: Now compile with particle spark! But spark development toolchain it's a nightmare so 
 - 	use https://github.com/sumotoy/spark_ra8875
 - 	0.70b11p10: Some changes proposed by MrTom to fix the triangle hardware bug of RA8875
 - 	0.70b11p11: Minor changes on triangles helper (MrTom)
 - -------------------------------------------------------------------------------------
 - 				>>>>>>>>>>>>>>>>>>>>> Wiring <<<<<<<<<<<<<<<<<<<<<<<<<
 - -------------------------------------------------------------------------------------
 - TFT side	Teensy/Uno
 - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 - CLK:		pin 13 UNO
 - MOSI:		pin 11 UNO
 - MISO:		pin 12 UNO
 - CS:			pin 10 (selectable but note 1*!)
 - INT:		pin 2  (selectable 2*)
 - RESET:		pin 9  (selectable and optional 0*)
 - *(0) In some modules you can leave unconnected but check if it's needed!
 - *(1) On Teensy3.x not all pin are usable for CS! Read the printed paper
 - that come with your Teensy3.x for more informations!
 - *(2) Arduino cannot use any pin for interrupts! In my examples I don't use
 - interrupts but just reading pin state so you can use any pin :)
 - -------------------------------------------------------------------------------------
 - TFT side	Stellaris (LM4F120XL) module=0 (still not checked)
 - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 - CLK:		xxx
 - MOSI:		xxx
 - MISO:		xxx
 - CS:			xxx  (selectable)
 - INT:		xxx  (selectable)
 - RESET:		xxx  (selectable and optional)
 - 
 - *if you use an [optional] SD card here's connections...
 - -------------------------------------------------------------------------------------
 - TFT side	Teensy2/Teensy3/Uno
 - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 - SD CLK:		pin 13 [shared with RA]
 - SD MOSI:	pin 11 [shared with RA]
 - SD MISO:	pin 12 [shared with RA]
 - SD CS:		pin 4  (selectable 3*)
 - SD CARD ID: pin xx (selectable and optional)
 - *(3) On Teensy3.x not all pin are usable for CS! 
 - can be used: 2,6,9,10,15,20,21,22,23
 - -------------------------------------------------------------------------------------
 - TFT side	Stellaris (LM4F120XL) module=0 (still not checked)
 - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 - SD CLK:		xxx shared
 - SD MOSI:	xxx shared
 - SD MISO:	xxx shared
 - SD CS:		xxx  (selectable)
 - SD CARD ID: pin xx (selectable and optional)
 - -------------------------------------------------------------------------------------
 - TFT side	Teensy3 alternative setup
 - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 - There are special cases on Teensy 3.x since it can be used for audio shield that remap
 - some pin. Using SPI in that situation will be impossible but you can use the alternative
 - pins definition feature of Teensy 3!
 - SD CLK:		pin 13(normal),pin 14(alt)  [shared with RA]
 - SD MOSI:	pin 11(normal),pin 7(alt) 	[shared with RA]
 - SD MISO:	pin 12(normal),pin 8(alt) 	[shared with RA]
 - SD CS:		pin 2  (selectable 3*)
 - SD CARD ID: pin xx (selectable and optional)
 - *(3) On Teensy3.x not all pin are usable for CS's! 
 - can be used: 2,6,9,10,15,20,21,22,23
 - -------------------------------------------------------------------------------------
 - TFT side	Particle Spark  (caution, never tested!)
 - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 - CLK:		 	A3
 - MOSI:			A5
 - MISO:			A4
 - CS:				A2
 - INT:		
 - SDA:			D0
 - SCL:			D1
 - 
 - Benchmark results for reference --------------------------------------
 - Screen fill              16635		16585		16561		8326
 - Test Pixel               60			77			63			53
 - Test Pixels              39780		52085		41885		35412
 - Text                     4500		4389		4634		3409
 - Lines                    96705		101951		97943		55986
 - Horiz/Vert Lines         66656		72470		67732		42703
 - Rectangles (outline)     269786		271251		269987		137691
 - Rectangles (filled)      269498		271415		270002		137858
 - Circles (filled)         110285		195011		181003		117279
 - Circles (outline)        109604		191746		177459		115584
 - Triangles (outline)      24521		26320		24886		14728
 - Triangles (filled)       64947		66801		65367		35226
 - Rounded rects (outline)  146391		167477		151142		103027
 - Rounded rects (filled)   935691		953280		940016		493179
 - 
 - 
 - PIN     UNO		MEGA       CD4050     RA8875
 - SCK      13		52           YES       SCK
 - MOSI     11		51           YES       MOSI
 - MISO     12		50            NO       MISO
 - RST      9		 5           YES       RST
 - CS       10		53           YES       CS
 - */
 - 
 - #ifndef _RA8875MC_H_
 - #define _RA8875MC_H_
 - 
 - #include <inttypes.h>
 - 
 - 
 - #if !defined(swapvals)
 - 	#if defined(ESP8266)
 - 		#define swapvals(a, b) { int16_t t = a; a = b; b = t; }
 - 		//#define swapvals(a, b) { typeid(a) t = a; a = b; b = t; }
 - 	#else
 - 		#define swapvals(a, b) { typeof(a) t = a; a = b; b = t; }
 - 	#endif
 - #endif
 - 
 - enum RA8875sizes { 			RA8875_480x272, RA8875_800x480, RA8875_800x480ALT, Adafruit_480x272, Adafruit_800x480 };
 - enum RA8875tcursor { 		NOCURSOR=0,IBEAM,UNDER,BLOCK };//0,1,2,3
 - enum RA8875tsize { 			X16=0,X24,X32 };//0,1,2
 - enum RA8875fontSource { 	INTFONT=0, EXTFONT };//0,1
 - enum RA8875fontCoding { 	ISO_IEC_8859_1, ISO_IEC_8859_2, ISO_IEC_8859_3, ISO_IEC_8859_4 };
 - enum RA8875extRomType { 	GT21L16T1W, GT21H16T1W, GT23L16U2W, GT30L16U2W, GT30H24T3Y, GT23L24T3Y, GT23L24M1Z, GT23L32S4W, GT30H32S4W, GT30L32S4W, ER3303_1, ER3304_1, ER3301_1 };
 - enum RA8875extRomCoding { 	GB2312, GB12345, BIG5, UNICODE, ASCII, UNIJIS, JIS0208, LATIN };
 - enum RA8875extRomFamily { 	STANDARD, ARIAL, ROMAN, BOLD };
 - enum RA8875boolean { 		LAYER1, LAYER2, TRANSPARENT, LIGHTEN, OR, AND, FLOATING };
 - enum RA8875writes { 		L1=0, L2, CGRAM, PATTERN, CURSOR };
 - enum RA8875scrollMode{ 		SIMULTANEOUS, LAYER1ONLY, LAYER2ONLY, BUFFERED };
 - enum RA8875pattern{ 		P8X8, P16X16 };
 - enum RA8875btedatam{ 		CONT, RECT };
 - enum RA8875btelayer{ 		SOURCE, DEST };
 - enum RA8875intlist{ 		BTE=1,TOUCH=2, DMA=3,KEY=4 };
 - 
 - /*
 - -------------- UNICODE decode (2 byte char) ---------------------
 - Latin:      \u0000 -> \u007F	/u00
 - Greek:		\u0370 -> \u03FF	/u03
 - Cyrillic:   \u0400 -> \u04FF	/u04
 - Hebrew:     \u0590 -> \u05FF	/u05
 - Arabic: 	\u0600 -> \u06FF	/u06
 - Hiragana:	\u3040 -> \u309F	/u30
 - Katakana:   \u30A0 -> \u30FF	/u30
 - CJK-Uni:	\u4E00 -> \u9FD5	/u4E ... /u9F
 - */
 - /* ----------------------------DO NOT TOUCH ANITHING FROM HERE ------------------------*/
 - 
 - 
 - // Documentation on the ILI9488_t3 font data format:
 - // https://forum.pjrc.com/threads/54316-ILI9488_t-font-structure-format
 - /*
 - typedef struct {
 - 	const unsigned char *index;
 - 	const unsigned char *unicode;
 - 	const unsigned char *data;
 - 	unsigned char version;
 - 	unsigned char reserved;
 - 	unsigned char index1_first;
 - 	unsigned char index1_last;
 - 	unsigned char index2_first;
 - 	unsigned char index2_last;
 - 	unsigned char bits_index;
 - 	unsigned char bits_width;
 - 	unsigned char bits_height;
 - 	unsigned char bits_xoffset;
 - 	unsigned char bits_yoffset;
 - 	unsigned char bits_delta;
 - 	unsigned char line_space;
 - 	unsigned char cap_height;
 - } ILI9341_t3_font_t;
 - */
 - #include "ILI9341_fonts.h"
 - 
 - 
 - // Lets see about supporting Adafruit fonts as well?
 - #if __has_include(<gfxfont.h>)
 - 	#include <gfxfont.h>
 - #endif
 - 
 - #ifndef _GFXFONT_H_
 - #define _GFXFONT_H_
 - 
 - /// Font data stored PER GLYPH
 - typedef struct {
 - 	uint16_t bitmapOffset;     ///< Pointer into GFXfont->bitmap
 - 	uint8_t  width;            ///< Bitmap dimensions in pixels
 -     uint8_t  height;           ///< Bitmap dimensions in pixels
 - 	uint8_t  xAdvance;         ///< Distance to advance cursor (x axis)
 - 	int8_t   xOffset;          ///< X dist from cursor pos to UL corner
 -     int8_t   yOffset;          ///< Y dist from cursor pos to UL corner
 - } GFXglyph;
 - 
 - /// Data stored for FONT AS A WHOLE
 - typedef struct { 
 - 	uint8_t  *bitmap;      ///< Glyph bitmaps, concatenated
 - 	GFXglyph *glyph;       ///< Glyph array
 - 	uint8_t   first;       ///< ASCII extents (first char)
 -     uint8_t   last;        ///< ASCII extents (last char)
 - 	uint8_t   yAdvance;    ///< Newline distance (y axis)
 - } GFXfont;
 - 
 - #endif // _GFXFONT_H_
 - 
 - #ifdef __cplusplus
 - #include "_includes/RA8875_CPU_commons.h"
 - 
 - #include "_includes/font.h"
 - #include "_includes/RA8875Registers.h"
 - #include "_includes/RA8875ColorPresets.h"
 - #include "_settings/RA8875UserSettings.h"
 - 
 - #if !defined(_AVOID_TOUCHSCREEN) &&  defined(USE_FT5206_TOUCH)
 - #include <Wire.h>
 - #endif
 - 
 - #if defined(_FORCE_PROGMEM__) && !defined(ESP8266)
 - template <typename T> T PROGMEM_read (const T * sce)
 -   {
 -   static T temp;
 -   memcpy_P (&temp, sce, sizeof (T));
 -   return temp;
 -   }
 - #endif
 - 
 - #if defined(ESP8266) && defined(_FASTSSPORT)
 - 	#include <eagle_soc.h>
 - #endif
 - 
 - class RA8875 : public Print
 - {
 -  public:
 - 	// void 		debugData(uint16_t data,uint8_t len=8);
 - 	// void 		showLineBuffer(uint8_t data[],int len);
 - //------------- INSTANCE -------------------------------------------------------------------
 - 	#if defined(__MK20DX128__) || defined(__MK20DX256__)
 - 		RA8875(const uint8_t CSp,const uint8_t RSTp=255,const uint8_t mosi_pin=11,const uint8_t sclk_pin=13,const uint8_t miso_pin=12);
 - 	#elif defined(__MKL26Z64__)//TeensyLC
 - 		RA8875(const uint8_t CSp,const uint8_t RSTp=255,const uint8_t mosi_pin=11,const uint8_t sclk_pin=13,const uint8_t miso_pin=12);
 - 	#elif defined(__MK64FX512__) || defined(__MK66FX1M0__)  || defined(__IMXRT1062__)	
 - 		RA8875(const uint8_t CSp,const uint8_t RSTp=255,const uint8_t mosi_pin=11,const uint8_t sclk_pin=13,const uint8_t miso_pin=12);
 - 	#elif defined(___DUESTUFF)//DUE
 - 		RA8875(const uint8_t CSp, const uint8_t RSTp=255);
 - 	#elif defined(SPARK)//SPARK
 - 		RA8875(const uint8_t CSp, const uint8_t RSTp=255);
 - 	#elif defined(NEEDS_SET_MODULE)//ENERGIA
 - 		RA8875::RA8875(const uint8_t module, const uint8_t RSTp=255);
 - 	#else//8 BIT ARDUINO's
 - 		RA8875(const uint8_t CSp, const uint8_t RSTp=255);
 - 	#endif
 - //------------- SETUP -----------------------------------------------------------------------
 - 	void 		begin(const enum RA8875sizes s,uint8_t colors=16, uint32_t SPIMaxSpeed = (uint32_t)-1, uint32_t SPIMaxReadSpeed = (uint32_t)-1 );
 - 	//(RA8875_480x272, RA8875_800x480, Adafruit_480x272, Adafruit_800x480) , (8/16 bit)
 - //------------- HARDWARE ------------------------------------------------------------
 - 	void 		backlight(boolean on);
 - 	void    	displayOn(boolean on);//turn diplay on/off
 - 	void    	sleep(boolean sleep);//put display in sleep or not
 - 	void 		brightness(uint8_t val);//ok
 - 	uint8_t 	readStatus(void);//used to verify when an operation has concluded
 - 	void 		clearMemory(bool stop=false);
 - 	void 		clearWidthColor(bool bte);
 - 	//void		clearMemory(boolean full);//clear the RA8875 internal buffer (fully or current layer)
 - 	uint8_t		errorCode(void);//0: no error,
 - 	/*
 - 	format: 1byte 0b00000000;, bit described below:
 - 	nan,nan,nan,nan,nan,CS(out-of-range),MOSI/MISO/SCLK(out-of-range),display(not-recognized)
 - 	*/
 - //------------ Low Level functions ---------------------------------------------------------
 - 	void    	writeCommand(const uint8_t d);
 - 	void  		writeData16(uint16_t data);
 - //Hack fonts
 - 	// setOrigin sets an offset in display pixels where drawing to (0,0) will appear
 - 	// for example: setOrigin(10,10); drawPixel(5,5); will cause a pixel to be drawn at hardware pixel (15,15)
 - 	void setOrigin(int16_t x = 0, int16_t y = 0) { 
 - 		_originx = x; _originy = y; 
 - 		//if (Serial) Serial.printf("Set Origin %d %d\n", x, y);
 - 		updateDisplayClip();
 - 	}
 - 	void getOrigin(int16_t* x, int16_t* y) { *x = _originx; *y = _originy; }
 - 
 - 	// setClipRect() sets a clipping rectangle (relative to any set origin) for drawing to be limited to.
 - 	// Drawing is also restricted to the bounds of the display
 - 
 - 	void setClipRect(int16_t x1, int16_t y1, int16_t w, int16_t h) 
 - 		{ _clipx1 = x1; _clipy1 = y1; _clipx2 = x1+w; _clipy2 = y1+h; 
 - 			//if (Serial) Serial.printf("Set clip Rect %d %d %d %d\n", x1, y1, w, h);
 - 			updateDisplayClip();
 - 		}
 - 	void setClipRect() {
 - 			 _clipx1 = 0; _clipy1 = 0; _clipx2 = _width; _clipy2 = _height; 
 - 			//if (Serial) Serial.printf("clear clip Rect\n");
 - 			 updateDisplayClip(); 
 - 		}
 - 		
 - 	bool _invisible = false; 
 - 	bool _standard = true; // no bounding rectangle or origin set. 
 - 
 - 	inline void updateDisplayClip() {
 - 		_displayclipx1 = max(0,min(_clipx1+_originx,width()));
 - 		_displayclipx2 = max(0,min(_clipx2+_originx,width()));
 - 
 - 		_displayclipy1 = max(0,min(_clipy1+_originy,height()));
 - 		_displayclipy2 = max(0,min(_clipy2+_originy,height()));
 - 		_invisible = (_displayclipx1 == _displayclipx2 || _displayclipy1 == _displayclipy2);
 - 		_standard =  (_displayclipx1 == 0) && (_displayclipx2 == _width) && (_displayclipy1 == 0) && (_displayclipy2 == _height);
 - 		if (Serial) {
 - 			//Serial.printf("UDC (%d %d)-(%d %d) %d %d\n", _displayclipx1, _displayclipy1, _displayclipx2, 
 - 			//	_displayclipy2, _invisible, _standard);
 - 
 - 		}
 - 	}
 - 	
 - 	inline void setFontDefault() { 
 - 		_use_default = 1; 
 - 		if(_portrait && (!_use_gfx_font || !_use_ili_font)) {
 - 			_cursorX += _cursorY;
 - 			_cursorY -= _cursorX;
 - 		}
 - 		_use_ili_font=0; 
 - 		_use_gfx_font=0;
 - 		_use_int_font=1;
 - 		_use_tfont=0;
 - 		setActiveWindow();
 - 		_textPosition(_cursorX, _cursorY, false);
 - 		};
 - 	void setFont(const ILI9341_t3_font_t &f);
 -     void setFont(const GFXfont *f = NULL);
 - 	void setFontAdafruit(void) { setFont(); }
 - 	void drawFontChar(unsigned int c);
 - 	void drawGFXFontChar(unsigned int c);
 - 	
 -     void setTextSize(uint8_t sx, uint8_t sy);
 - 	void inline setTextSize(uint8_t s) { setTextSize(s,s); }
 - 	
 - 	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 inline drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t size) 
 - 	    { drawChar(x, y, c, color, bg, size);}
 - 	void drawFontBits(bool opaque, uint32_t bits, uint32_t numbits, int32_t x, int32_t y, uint32_t repeat);
 - 	void Pixel(int16_t x, int16_t y, uint16_t color);
 - 	
 - 	void charBounds(char c, int16_t *x, int16_t *y,
 - 		int16_t *minx, int16_t *miny, int16_t *maxx, int16_t *maxy);
 -     void getTextBounds(const uint8_t *buffer, uint16_t len, int16_t x, int16_t y,
 -       int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h);
 -     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 String &str, int16_t x, int16_t y,
 -       int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h);
 - 	int16_t strPixelLen(const char * str);
 - 
 - 	void drawFontPixel( uint8_t alpha, uint32_t x, uint32_t y );
 - 
 - 	void write16BitColor(uint16_t color, bool last_pixel=false);
 - 
 - 	// Hack to see about combining outputs for speed.
 - 	int16_t _combine_x_start = 0;
 - 	int16_t _combine_y = 0;
 - 	int16_t _combine_count = 0;
 - 	uint16_t _combine_color = 0;
 - 
 - 	inline void combineAndDrawPixel(int16_t x, int16_t y, uint16_t color) {
 - 		if (_combine_count && (color == _combine_color)) _combine_count++;
 - 		else {
 - 			if (_combine_count)drawLine(_combine_x_start, _combine_y, _combine_x_start+_combine_count-1, _combine_y, _combine_color);
 - 			_combine_x_start = x;
 - 			_combine_y = y;
 - 			_combine_count = 1;
 - 			_combine_color = color;
 - 		}
 - 	}
 - 
 - 	inline void forceCombinedPixelsOut() {
 - 		if (_combine_count)fillRect(_combine_x_start, _combine_y, _combine_count, 1, _combine_color);
 - 		_combine_count = 0;
 - 	}
 - 
 - 
 - //-------------- AREA ----------------------------------------------------------------------
 - 	void		setActiveWindow(int16_t XL,int16_t XR,int16_t YT,int16_t YB);//The working area where to draw on
 - 	void		setActiveWindow(void);
 - 	void 		getActiveWindow(int16_t &XL,int16_t &XR ,int16_t &YT ,int16_t &YB);
 - 	void		clearActiveWindow(bool full=false);//it clears the active window
 - 	uint16_t 	width(bool absolute=false) const;//the phisical display width
 - 	uint16_t 	height(bool absolute=false) const;//the phisical display height
 - 	void		setRotation(uint8_t rotation); //rotate text and graphics
 - 	uint8_t		getRotation(); //return the current rotation 0-3
 - 	boolean		isPortrait(void);
 - //-------------- COLOR ----------------------------------------------------------------------
 - 	void		setForegroundColor(uint16_t color);//color of objects in 16bit
 - 	void		setForegroundColor(uint8_t R,uint8_t G,uint8_t B);//color of objects in 8+8+8bit
 - 	void		setBackgroundColor(uint16_t color);//color of objects background in 16bit
 - 	void		setBackgroundColor(uint8_t R,uint8_t G,uint8_t B);//color of objects background in 8+8+8bit
 - 	void 		setTransparentColor(uint16_t color);//the current transparent color in 16bit
 - 	void 		setTransparentColor(uint8_t R,uint8_t G,uint8_t B);//the current transparent color in 8+8+8bit
 - 	void 		setColor(uint16_t fcolor,uint16_t bcolor,bool bcolorTraspFlag=false);
 - 	void 		setColorBpp(uint8_t colors);//set the display color space 8 or 16!
 - 	uint8_t 	getColorBpp(void);//get the current display color space (return 8 or 16)
 - 	uint16_t	grandient(uint8_t val);
 - 	uint16_t 	colorInterpolation(uint16_t color1,uint16_t color2,uint16_t pos,uint16_t div=100);
 - 	uint16_t 	colorInterpolation(uint8_t r1,uint8_t g1,uint8_t b1,uint8_t r2,uint8_t g2,uint8_t b2,uint16_t pos,uint16_t div=100);
 - //-------------- COLOR CONVERSION -----------------------------------------------------------
 - 	inline uint16_t Color565(uint8_t r,uint8_t g,uint8_t b) { return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); }
 - 	inline uint16_t Color24To565(int32_t color_) { return ((((color_ >> 16) & 0xFF) / 8) << 11) | ((((color_ >> 8) & 0xFF) / 4) << 5) | (((color_) &  0xFF) / 8);}
 - 	inline uint16_t htmlTo565(int32_t color_) { return (uint16_t)(((color_ & 0xF80000) >> 8) | ((color_ & 0x00FC00) >> 5) | ((color_ & 0x0000F8) >> 3));}
 - 	inline void 	Color565ToRGB(uint16_t color, uint8_t &r, uint8_t &g, uint8_t &b){r = (((color & 0xF800) >> 11) * 527 + 23) >> 6; g = (((color & 0x07E0) >> 5) * 259 + 33) >> 6; b = ((color & 0x001F) * 527 + 23) >> 6;}
 - //-------------- CURSOR ----------------------------------------------------------------------
 - 	void 		cursorIncrement(bool on);
 - 	void 		setCursorBlinkRate(uint8_t rate);//set blink rate of the cursor 0...255 0:faster
 - 	void 		showCursor(enum RA8875tcursor c,bool blink);//show cursor(NOCURSOR,IBEAM,UNDER,BLOCK), default blinking
 - 	void    	setCursor(int16_t x, int16_t y,bool autocenter=false);//set cursor position to write text(pixels or CENTER)
 - 	void 		getCursor(int16_t &x, int16_t &y);//from the RA8875 registers
 - 	void 		getCursorFast(int16_t &x, int16_t &y);//from library (faster)
 - 	int16_t		getCursorX(void);
 - 	int16_t		getCursorY(void);
 - 	void 		setGraphicCursor(uint8_t cur);//0...7 Select a custom graphic cursor (you should upload first)
 - 	void 		showGraphicCursor(boolean cur);//show graphic cursor
 - //-------------- TEXT -----------------------------------------------------------------------
 - 	void 		uploadUserChar(const uint8_t symbol[],uint8_t address);//upload user defined char as array at the address 0..255
 - 	void		showUserChar(uint8_t symbolAddrs,uint8_t wide=0);//show user uploaded char at the adrs 0...255
 - 	void    	setTextColor(uint16_t fcolor, uint16_t bcolor);//set text color + text background color
 - 	void 		setTextColor(uint16_t fcolor);//set text color (backgroud will be transparent)
 - 	void 		setTextGrandient(uint16_t fcolor1,uint16_t fcolor2);
 - 	void    	setFontScale(uint8_t scale);//global font scale (w+h)
 - 	void    	setFontScale(uint8_t xscale,uint8_t yscale);//font scale separated by w and h
 - 	void    	setFontSize(enum RA8875tsize ts);//X16,X24,X32
 - 	void 		setFontSpacing(uint8_t spc);//0:disabled ... 63:pix max
 - 	void 		setFontInterline(uint8_t pix);//0...63 pix
 - 	void 		setFontFullAlign(boolean align);//mmmm... doesn't do nothing! Have to investigate
 - 	uint8_t 	getFontWidth(boolean inColums=false);
 - 	uint8_t 	getFontHeight(boolean inRows=false);
 - 	
 - 	//----------FONT -------------------------------------------------------------------------
 - 	void		setExternalFontRom(enum RA8875extRomType ert, enum RA8875extRomCoding erc,enum RA8875extRomFamily erf=STANDARD);
 - 	void 		setFont(enum RA8875fontSource s);//INTFONT,EXTFONT (if you have a chip installed)
 - 	//void 		setFont(const struct FONT_DEF *	fnt);
 - 	void		setFont(const tFont *font);
 - 	void 		setIntFontCoding(enum RA8875fontCoding f);
 - 	void		setExtFontFamily(enum RA8875extRomFamily erf,boolean setReg=true);
 - 	
 - //-------------- GRAPHIC POSITION --------------------------------------------------------------
 - 	void    	setXY(int16_t x, int16_t y);//graphic set location
 - 	void 		setX(int16_t x);
 - 	void 		setY(int16_t y) ;
 - 	//--------------- DRAW ---------------------------------------------------------------------
 - 	void    	drawPixel(int16_t x, int16_t y, uint16_t color);
 - 	void 		drawPixels(uint16_t p[], uint16_t count, int16_t x, int16_t y);
 - 	uint16_t 	getPixel(int16_t x, int16_t y);
 - 	//void 		getPixels(uint16_t * p, uint32_t count, int16_t x, int16_t y);
 - 	void    	drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
 - 	void    	drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
 - 	void    	fillWindow(uint16_t color=_RA8875_DEFAULTBACKLIGHT);//fill the ActiveWindow with a color(default black)
 - 	void		clearScreen(uint16_t color=_RA8875_DEFAULTBACKLIGHT);//fill the entire screen (regardless ActiveWindow) with a color(default black)
 - 	void    	drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color);
 - 	void 		drawLineAngle(int16_t x, int16_t y, int16_t angle, uint16_t length, uint16_t color,int offset = -90);
 - 	void 		drawLineAngle(int16_t x, int16_t y, int16_t angle, uint16_t start, uint16_t length, uint16_t color,int offset = -90);
 - 	void    	drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
 - 	void    	fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
 - 	void 		writeRect(int16_t x, int16_t y, int16_t w, int16_t h, const uint16_t *pcolors);
 - 	void    	drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color);
 - 	void    	fillCircle(int16_t x0, int16_t y0, int16_t r, 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    	drawEllipse(int16_t xCenter, int16_t yCenter, int16_t longAxis, int16_t shortAxis, uint16_t color);
 - 	void    	fillEllipse(int16_t xCenter, int16_t yCenter, int16_t longAxis, int16_t shortAxis, uint16_t color);
 - 	void    	drawCurve(int16_t xCenter, int16_t yCenter, int16_t longAxis, int16_t shortAxis, uint8_t curvePart, uint16_t color);
 - 	void    	fillCurve(int16_t xCenter, int16_t yCenter, int16_t longAxis, int16_t shortAxis, uint8_t curvePart, uint16_t color);
 - 	void 		drawRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r, uint16_t color);//ok
 - 	void 		fillRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r, uint16_t color);
 - 	void 		drawQuad(int16_t x0, int16_t y0,int16_t x1, int16_t y1,int16_t x2, int16_t y2,int16_t x3, int16_t y3, uint16_t color);
 - 	void 		fillQuad(int16_t x0, int16_t y0,int16_t x1, int16_t y1,int16_t x2, int16_t y2, int16_t x3, int16_t y3, uint16_t color, bool triangled=true);
 - 	void 		drawPolygon(int16_t cx, int16_t cy, uint8_t sides, int16_t diameter, float rot, uint16_t color);
 - 	void 		drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, uint8_t spacing,uint16_t color);
 - 	void 		setArcParams(float arcAngleMax, int arcAngleOffset);
 - 	void 		setAngleOffset(int16_t angleOffset);
 - 	inline __attribute__((always_inline)) void drawArc(uint16_t cx, uint16_t cy, uint16_t radius, uint16_t thickness, float start, float end, uint16_t color) {
 - 		if (start == 0 && end == _arcAngle_max) {
 - 			_drawArc_helper(cx, cy, radius, thickness, 0, _arcAngle_max, color);
 - 		} else {
 - 			_drawArc_helper(cx, cy, radius, thickness, start + (_arcAngle_offset / (float)360)*_arcAngle_max, end + (_arcAngle_offset / (float)360)*_arcAngle_max, color);
 - 		}	
 - 	}
 - //-------------- GAUGES ---------------------------------------------------------------------------
 - 	void 		ringMeter(int val, int minV, int maxV, int16_t x, int16_t y, uint16_t r, const char* units="none", uint16_t colorScheme=4,uint16_t backSegColor=RA8875_BLACK,int16_t angle=150,uint8_t inc=10);
 - 	void		roundGaugeTicker(uint16_t x, uint16_t y, uint16_t r, int from, int to, float dev,uint16_t color);
 - //-------------- LAYERS --------------------------------------------------------------------------
 - 	void 		useLayers(boolean on);//mainly used to turn of layers!
 - 	void		writeTo(enum RA8875writes d);//L1, L2, CGRAM, PATTERN, CURSOR
 - 	void 		layerEffect(enum RA8875boolean efx);//LAYER1, LAYER2, TRANSPARENT, LIGHTEN, OR, AND, FLOATING
 - 	void 		layerTransparency(uint8_t layer1,uint8_t layer2);
 - 	uint8_t		getCurrentLayer(void); //return the current drawing layer. If layers are OFF, return 255
 - //--------------- SCROLL --------------------------------------------------------------------------
 - 	void        setScrollMode(enum RA8875scrollMode mode); // The experimentalist
 - 	void 		setScrollWindow(int16_t XL,int16_t XR ,int16_t YT ,int16_t YB);
 - 	void 		scroll(int16_t x,int16_t y);
 - //-------------- DMA ------------------------------------------------------------------------------
 - 	void 		DMA_blockModeSize(int16_t BWR,int16_t BHR,int16_t SPWR);
 - 	void 		DMA_startAddress(unsigned long adrs);
 - 	void 		DMA_enable(void);
 - 	void 		drawFlashImage(int16_t x,int16_t y,int16_t w,int16_t h,uint8_t picnum);
 - //-------------- BTE -------------------------------------------------------------------------------
 - 	void 		BTE_size(int16_t w, int16_t h);
 - 	void	 	BTE_moveFrom(int16_t SX,int16_t SY);
 - 	void	 	BTE_moveTo(int16_t DX,int16_t DY);
 - 	//void 		BTE_source_destination(uint16_t SX,uint16_t DX ,uint16_t SY ,uint16_t DY);
 - 	void		BTE_ropcode(unsigned char setx);//
 - 	void 		BTE_enable(bool on);//
 - 	void 		BTE_dataMode(enum RA8875btedatam m);//CONT,RECT
 - 	void 		BTE_layer(enum RA8875btelayer sd,uint8_t l);//SOURCE,DEST - 1 or 2
 - 	void		BTE_move(int16_t SourceX, int16_t SourceY, int16_t Width, int16_t Height, int16_t DestX, int16_t DestY, uint8_t SourceLayer=0, uint8_t DestLayer=0, bool Transparent = false, uint8_t ROP=RA8875_BTEROP_SOURCE, bool Monochrome=false, bool ReverseDir = false);
 - 	//---------- PATTERN --------------------------------------------------------------------------
 - 	void 		setPattern(uint8_t num, enum RA8875pattern p=P8X8);
 - 	void 		writePattern(int16_t x,int16_t y,const uint8_t *data,uint8_t size,bool setAW=true);
 - //-------------- GPIO & PWM -------------------------
 - 	void    	GPIOX(boolean on);
 - 	void    	PWMout(uint8_t pw,uint8_t p);//1:backlight, 2:free
 - //-------------- ISR ------------------------------------------------------------------------------
 - 	void		useINT(const uint8_t INTpin=2,const uint8_t INTnum=0);
 - 	void 		enableISR(bool force = false); 
 - 	void 		setInternalInt(enum RA8875intlist b);//   BTE,TOUCH,DMA,KEY
 - 	void 		clearInternalInt(enum RA8875intlist b);// BTE,TOUCH,DMA,KEY
 - //-------------- TOUCH SCREEN ---------------------------------------------------------------------
 - #if !defined(_AVOID_TOUCHSCREEN)
 - 	bool 		touched(bool safe=false);
 - 	void 		setTouchLimit(uint8_t limit);//5 for FT5206, 1 for  RA8875
 - 	uint8_t 	getTouchLimit(void);
 - 
 - #	if defined(USE_RA8875_TOUCH)
 - 		//void		useINT(const uint8_t INTpin=2,const uint8_t INTnum=0);
 - 		//void 		enableISR(bool force = false); 
 - 		void 		touchBegin(void);//prepare Touch Screen driver
 - 		void    	touchEnable(boolean enabled);//enable/disable Touch Polling (disable INT)
 - 		void 		touchReadAdc(uint16_t *x, uint16_t *y);//returns 10bit ADC data (0...1024)
 - 		void 		touchReadPixel(uint16_t *x, uint16_t *y);//return pixels (0...width, 0...height)
 - 		boolean		touchCalibrated(void);//true if screen calibration it's present
 - 		void		setTouchCalibrationData(uint16_t minX, uint16_t maxX, uint16_t minY, uint16_t maxY);
 - 	#elif defined (USE_FT5206_TOUCH)
 - 		void		setWireObject(TwoWire *wire) {_wire = wire; }
 - 		void		useCapINT(const uint8_t INTpin=2,const uint8_t INTnum=0);
 - 		void 		enableCapISR(bool force = false); 
 - 		void	 	updateTS(void);
 - 		uint8_t 	getGesture(void);
 - 		uint8_t 	getTouches(void);
 - 		uint8_t 	getTouchState(void);
 - 		uint8_t 	getTScoordinates(uint16_t (*touch_coordinates)[2]);
 - 	#endif
 - #endif
 - 
 - //--------------Text Write -------------------------
 - //virtual size_t write(uint8_t b) {
 - //	if (_FNTgrandient) _FNTgrandient = false;//cannot use this with write
 - //	_textWrite((const char *)&b, 1);
 - //	return 1;
 - //}
 - 
 - virtual size_t write(uint8_t c) {
 - 	_fontWrite(&c, 1);
 - 	return 1;
 - }
 - 
 - virtual size_t write(const uint8_t *buffer, size_t size){
 - 	if(_use_default) {
 - 		_textWrite((const char *)buffer, size);
 - 	} else {
 - 		_fontWrite(buffer, size);
 - 	}
 - 	return size;
 - }
 - 
 - 
 - using Print::write;
 - 
 -  protected:
 -  	uint32_t textcolorPrexpanded, textbgcolorPrexpanded;
 - 	boolean wrap; // If set, 'wrap' text at right edge of display
 - 	const ILI9341_t3_font_t *font;
 - 	
 - 	int16_t  _clipx1, _clipy1, _clipx2, _clipy2;
 - 	int16_t  _originx, _originy;
 - 	int16_t  _displayclipx1, _displayclipy1, _displayclipx2, _displayclipy2;
 - 	
 -  	// GFX Font support
 - 	const GFXfont *gfxFont = nullptr;
 - 	int8_t _gfxFont_min_yOffset = 0;
 - 	
 - 	// Opaque font chracter overlap?
 - 	unsigned int _gfx_c_last;
 - 	int16_t   _gfx_last__cursorX, _gfx_last__cursorY;
 - 	int16_t	 _gfx_last_char_x_write = 0;
 - 	uint16_t _gfx_last_char_textcolor;
 - 	uint16_t _gfx_last_char_textbgcolor;
 - 	bool gfxFontLastCharPosFG(int16_t x, int16_t y);
 -  
 -  //=====================
 - 	volatile bool 				  _textMode;
 - 	volatile uint8_t 			  _MWCR0_Reg; //keep track of the register 		  [0x40]
 - 	int16_t 		 			   RA8875_WIDTH, 	   RA8875_HEIGHT;//absolute
 - 	int16_t 		 			  _width, 			  _height;
 - 	int16_t						  _cursorX, 		  _cursorY;
 - 	uint8_t						  _scaleX,			  _scaleY;
 - 	bool						  _scaling;
 - 	uint8_t						  _FNTwidth, 		  _FNTheight;
 - 	uint8_t						  _FNTbaselineLow, 	  _FNTbaselineTop;
 - 	volatile uint8_t			  _TXTparameters;
 - 	/* It contains several parameters in one byte
 - 	bit			 parameter
 - 	0	->		_extFontRom 		i's using an ext rom font
 - 	1	->		_autoAdvance		after a char the pointer move ahead
 - 	2	->		_textWrap
 - 	3	->		_fontFullAlig		
 - 	4	->		_fontRotation       (actually not used)
 - 	5	->		_alignXToCenter;
 - 	6	->		_alignYToCenter;
 - 	7	->		_renderFont active;
 - 	*/
 - 	bool						  _FNTgrandient;
 - 	uint16_t					  _FNTgrandientColor1;
 - 	uint16_t					  _FNTgrandientColor2;
 - 	bool						  _FNTcompression;
 - 	int							  _spaceCharWidth;
 - 	volatile bool				  _needISRrearm;
 - 	volatile uint8_t			  _enabledInterrups;
 - 	// Allow up to three displays to have touch?
 - 	static void 		 		  _isr(void);
 - 	static void 		 		  _isr1(void);
 - 	static void 		 		  _isr2(void);
 - 	static RA8875 				 *_active_touch_objects[3]; 
 - 	volatile uint8_t 			 _RA8875_INTS = 0b00000000;//container for INT states
 - 
 - 	#if !defined(_AVOID_TOUCHSCREEN)
 - 		volatile bool			  _touchEnabled;
 - 		volatile bool			  _clearTInt;
 - 	#endif
 - 
 - 	#if defined(USE_FT5206_TOUCH)
 - 		volatile bool			  _needCTS_ISRrearm;
 - 		static void 		 	  cts_isr(void);
 - 		#if defined(___DUESTUFF) && defined(USE_DUE_WIRE1_INTERFACE)
 - 		TwoWire 				 *_wire=&Wire1;
 - 		#else
 - 		TwoWire 				 *_wire=&Wire;
 - 		#endif
 - 	#elif defined(USE_RA8875_TOUCH)
 - 		//volatile bool			  _touchEnabled;
 - 		//volatile bool			  _clearTInt;
 - 	#endif
 - 
 - 	
 - 	#ifdef SPI_HAS_TRANSACTION
 - 	volatile uint32_t 			_SPITransactionSpeed; //holder for SPI speed
 - 	uint32_t					_SPIMaxSpeed;         // Max Speed defined in either begin or presets...
 - 	uint32_t					_SPIMaxReadSpeed;	  // Max Read speed defined in either begin or presets.
 - 	#endif
 - 	#if defined(TEENSYDUINO)//all of them (32 bit only)
 - 		uint8_t 				  _cs;
 - 		uint8_t 				  _miso, _mosi, _sclk;
 - 	  #if defined(__MK64FX512__) || defined(__MK66FX1M0__)  || defined(__IMXRT1062__) || defined(__MKL26Z64__)
 - 		SPIClass				*_pspi;	// which SPI are we using...
 -       #endif
 - 	#elif defined(ENERGIA)
 - 		uint8_t _cs;
 - 	#else
 - 		#if defined(___DUESTUFF)
 - 			#if defined(_FASTSSPORT)
 - 				uint32_t 		  _cs, cspinmask;
 - 			#else
 - 				uint8_t 		  _cs;
 - 			#endif
 - 		#elif defined(ESP8266)	
 - 			#if defined(_FASTSSPORT)
 - 				uint32_t 		  _cs;
 - 			#else
 - 				uint8_t 		  _cs;
 - 			#endif
 - 		#elif defined(SPARK)
 - 			#if defined(_FASTSSPORT)
 - 				uint32_t 		  _cs;
 - 			#else
 - 				uint8_t 		  _cs;
 - 			#endif
 - 		#else
 - 			#if defined(_FASTSSPORT)
 - 				uint8_t 		  _cs, cspinmask;
 - 			#else
 - 				uint8_t 		  _cs;
 - 			#endif
 - 		#endif
 - 	#endif
 -  private:
 -  //HACK
 - 	uint8_t  _use_ili_font = 0;
 - 	uint8_t _use_gfx_font = 0;
 - 	uint8_t _use_tfont = 0;
 - 	uint8_t  _use_int_font = 0;
 - 	uint8_t _use_default = 1;
 - 	uint8_t textsize, textsize_x, textsize_y;
 - 	uint16_t textcolor, textbgcolor; 
 - 	//anti-alias font
 - 	uint8_t fontbpp = 1;
 - 	uint8_t fontbppindex = 0;
 - 	uint8_t fontbppmask = 1;
 - 	uint8_t fontppb = 8;
 - 	uint8_t* fontalphalut;
 - 	float fontalphamx = 1;
 - 	
 - 	uint8_t							_rst;
 - 	uint8_t							_intPin;
 - 	uint8_t						 	_intNum;
 - 	bool							_useISR;
 - 	const tFont 			  	 *  _currentFont;
 - 	bool 						 	_checkInterrupt(uint8_t _bit,bool _clear=true);
 - 	void 						    _disableISR(void);
 - 	
 - 	uint32_t fetchbit(const uint8_t *p, uint32_t index);
 - 	uint32_t fetchbits_unsigned(const uint8_t *p, uint32_t index, uint32_t required);
 - 	uint32_t fetchbits_signed(const uint8_t *p, uint32_t index, uint32_t required);
 - 	void 	 _fontWrite(const uint8_t* buffer, uint16_t len);
 - 	
 - 	/**
 - 	 * Found in a pull request for the Adafruit framebuffer library. Clever!
 - 	 * https://github.com/tricorderproject/arducordermini/pull/1/files#diff-d22a481ade4dbb4e41acc4d7c77f683d
 - 	 * Converts  0000000000000000rrrrrggggggbbbbb
 - 	 *     into  00000gggggg00000rrrrr000000bbbbb
 - 	 * with mask 00000111111000001111100000011111
 - 	 * This is useful because it makes space for a parallel fixed-point multiply
 - 	 * This implements the linear interpolation formula: result = bg * (1.0 - alpha) + fg * alpha
 - 	 * This can be factorized into: result = bg + (fg - bg) * alpha
 - 	 * alpha is in Q1.5 format, so 0.0 is represented by 0, and 1.0 is represented by 32
 - 	 * @param	fg		Color to draw in RGB565 (16bit)
 - 	 * @param	bg		Color to draw over in RGB565 (16bit)
 - 	 * @param	alpha	Alpha in range 0-255
 - 	 **/
 - 	uint16_t alphaBlendRGB565( uint32_t fg, uint32_t bg, uint8_t alpha )
 - 	 __attribute__((always_inline)) {
 - 	 	alpha = ( alpha + 4 ) >> 3; // from 0-255 to 0-31
 - 		bg = (bg | (bg << 16)) & 0b00000111111000001111100000011111;
 - 		fg = (fg | (fg << 16)) & 0b00000111111000001111100000011111;
 - 		uint32_t result = ((((fg - bg) * alpha) >> 5) + bg) & 0b00000111111000001111100000011111;
 - 		return (uint16_t)((result >> 16) | result); // contract result
 - 	}
 - 	
 - 	/**
 - 	 * Same as above, but fg and bg are premultiplied, and alpah is already in range 0-31
 - 	 */
 - 	uint16_t alphaBlendRGB565Premultiplied( uint32_t fg, uint32_t bg, uint8_t alpha )
 - 	 __attribute__((always_inline)) {
 - 		uint32_t result = ((((fg - bg) * alpha) >> 5) + bg) & 0b00000111111000001111100000011111;
 - 		return (uint16_t)((result >> 16) | result); // contract result
 - 	}
 - 	
 - 	uint32_t fetchpixel(const uint8_t *p, uint32_t index, uint32_t x);
 - 
 - 	// Touch Screen vars ---------------------
 - 	#if !defined(_AVOID_TOUCHSCREEN)
 - 	uint8_t						    _maxTouch;//5 on FT5206, 1 on resistive
 - 		#if defined(USE_FT5206_TOUCH)// FT5206 specifics
 - 			uint8_t					_intCTSNum;
 - 			uint8_t					_intCTSPin;
 - 			uint8_t 				_cptRegisters[31];
 - 			uint8_t					_gesture;
 - 			uint8_t					_currentTouches;//0...5
 - 			uint8_t					_currentTouchState;//0,1,2
 - 			void 					_initializeFT5206(void);
 - 			void 					_sendRegFT5206(uint8_t reg,const uint8_t val);
 - 			void 					_disableCapISR(void);
 - 		#elif defined(USE_RA8875_TOUCH)//RA8875 internal resistive specifics
 - 			uint16_t 				_tsAdcMinX,_tsAdcMinY,_tsAdcMaxX,_tsAdcMaxY;
 - 			uint16_t 				_touchrcal_xlow,_touchrcal_ylow,_touchrcal_xhigh,_touchrcal_yhigh;
 - 			void					readTouchADC(uint16_t *x, uint16_t *y);
 - 			bool					_calibrated;
 - 			boolean					_isCalibrated(void);//true if screen calibration it's present
 - 		#endif
 - 	#endif
 - 	#if defined(USE_RA8875_KEYMATRIX)
 - 		bool						_keyMatrixEnabled;
 - 	#endif
 - 	//system vars -------------------------------------------
 - 	bool							_inited;//true when init has been ended
 - 	bool							_sleep;
 - 	enum RA8875sizes 				_displaySize;//Adafruit_480x272, etc
 - 	bool							_portrait;
 - 	uint8_t							_rotation;
 - 	uint8_t							_initIndex;
 - 	int16_t							_activeWindowXL,_activeWindowXR,_activeWindowYT,_activeWindowYB;
 - 	uint8_t							_errorCode;
 - 	//color vars ----------------------------------------------
 - 	uint16_t						_foreColor;
 - 	uint16_t						_backColor;
 - 	bool							_backTransparent;
 - 	uint8_t							_colorIndex;
 - 	#if defined(USE_RA8875_SEPARATE_TEXT_COLOR)
 - 		uint16_t					_TXTForeColor;
 - 		uint16_t					_TXTBackColor;
 - 		bool						_TXTrecoverColor;
 - 	#endif
 - 	//text vars-------------------------------------------------		
 - 	uint8_t							_FNTspacing;
 - 	uint8_t							_FNTinterline;
 - 	enum RA8875extRomFamily 		_EXTFNTfamily;
 - 	enum RA8875extRomType 			_EXTFNTrom;
 - 	enum RA8875extRomCoding 		_EXTFNTcoding;
 - 	enum RA8875tsize				_EXTFNTsize;//X16,X24,X32
 - 	enum RA8875fontSource 			_FNTsource;
 - 	enum RA8875tcursor				_FNTcursorType;
 - 	//centering -------------------------------
 - 	bool							_relativeCenter;
 - 	bool							_absoluteCenter;
 - 	//layer vars -----------------------------
 - 	uint8_t							_maxLayers;
 - 	bool							_useMultiLayers;
 - 	uint8_t							_currentLayer;
 - 	bool 							_hasLayerLimits;//helper
 - 	//scroll vars ----------------------------
 - 	int16_t							_scrollXL,_scrollXR,_scrollYT,_scrollYB;
 - 	//color space-----------------------------
 - 	uint8_t							_color_bpp;//8=256, 16=64K colors
 - 	uint8_t							_brightness;
 - 	//various
 - 	float 							_arcAngle_max;
 - 	int 							_arcAngle_offset;
 - 	int								_angle_offset;
 - 	// Register containers -----------------------------------------
 - 	// this needed to  prevent readRegister from chip that it's slow.
 - 	
 - 	uint8_t			 _DPCR_Reg;  ////Display Configuration		  	  [0x20]
 - 	uint8_t			 _FNCR0_Reg; //Font Control Register 0 		  	  [0x21]
 - 	uint8_t			 _FNCR1_Reg; //Font Control Register1 			  [0x22]
 - 	uint8_t			 _FWTSET_Reg; //Font Write Type Setting Register   [0x2E]
 - 	uint8_t			 _SFRSET_Reg; //Serial Font ROM Setting 		  	  [0x2F]
 - 	uint8_t			 _INTC1_Reg; //Interrupt Control Register1		  [0xF0]
 - 	//		functions --------------------------------------------------
 - 	void 		_initialize();
 - 	void 		_setSysClock(uint8_t pll1,uint8_t pll2,uint8_t pixclk);
 - 	//      TEXT writing stuff-------------------------------------------
 - 	void    	_textWrite(const char* buffer, uint16_t len=0);//thanks to Paul Stoffregen for the initial version of this one
 - 	void 		_charWrite(const char c,uint8_t offset);
 - 	void 		_charWriteR(const char c,uint8_t offset,uint16_t fcolor,uint16_t bcolor);
 - 	int 		_getCharCode(uint8_t ch);
 - 	#if defined(_RA8875_TXTRNDOPTIMIZER)
 - 		void 		_drawChar_unc(int16_t x,int16_t y,int charW,int index,uint16_t fcolor);
 - 	#else
 - 		void 		_drawChar_unc(int16_t x,int16_t y,int16_t w,const uint8_t *data,uint16_t fcolor,uint16_t bcolor);
 - 	#endif
 - 	
 - 	//void 		_drawChar_com(int16_t x,int16_t y,int16_t w,const uint8_t *data);
 - 	void 		_textPosition(int16_t x, int16_t y,bool update);
 - 	void 		_setFNTdimensions(uint8_t index);
 - 	int16_t 	_STRlen_helper(const char* buffer,uint16_t len=0);
 - 	void 		fontRomSpeed(uint8_t sp);
 - 	//--------------------------------------------------------------------
 - 	void 		PWMsetup(uint8_t pw,boolean on, uint8_t clock);
 - 	void 		_updateActiveWindow(bool full);
 - 	void 		_setTextMode(bool m);
 - 	void 		_scanDirection(boolean invertH,boolean invertV);
 - 	// 		helpers-----------------------------
 - 	
 - 	void 		_circle_helper(int16_t x0, int16_t y0, int16_t r, uint16_t color, bool filled);
 - 	void 		_rect_helper(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color, bool filled);
 - 	void 		_roundRect_helper(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r, uint16_t color, bool filled);
 - 	float		_check_area(int16_t Ax, int16_t Ay, int16_t Bx, int16_t By, int16_t Cx, int16_t Cy);
 - 	void 		_triangle_helper(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color, bool filled);
 - 	void 		_ellipseCurve_helper(int16_t xCenter, int16_t yCenter, int16_t longAxis, int16_t shortAxis,uint8_t curvePart, uint16_t color, bool filled);
 - 	void 		_drawArc_helper(uint16_t cx, uint16_t cy, uint16_t radius, uint16_t thickness, float startAngle, float endAngle, uint16_t color);
 - 	void 		_line_addressing(int16_t x0, int16_t y0, int16_t x1, int16_t y1);
 - 	void 		_curve_addressing(int16_t x0, int16_t y0, int16_t x1, int16_t y1);
 - 	float 		_cosDeg_helper(float angle);
 - 	float 		_sinDeg_helper(float angle);
 - 	#if defined(_RA8875_TXTRNDOPTIMIZER)
 - 	void 		_charLineRender(bool lineBuffer[],int charW,int16_t x,int16_t y,int16_t currentYposition,uint16_t fcolor);
 - 	#endif
 - 	
 - 	
 - 	//convert a 16bit color(565) into 8bit color(332) as requested by RA8875 datasheet
 - 	//inline __attribute__((always_inline))
 - 	uint8_t _color16To8bpp(uint16_t color) 
 - 		__attribute__((always_inline)) {
 -  		return ((color & 0xe000) >> 8) | ((color & 0x700) >> 6) | ((color & 0x18) >> 3);
 - //		return (map((color & 0xF800) >> 11, 0,28, 0,7)<<5 | map((color & 0x07E0) >> 5, 0,56, 0,7)<<2 | map(color & 0x001F, 0,24, 0,3));
 - 	}
 - 		
 - 	//inline __attribute__((always_inline)) 
 - 	void _checkLimits_helper(int16_t &x,int16_t &y)
 - 		__attribute__((always_inline)) {
 - 			if (x < 0) x = 0;
 - 			if (y < 0) y = 0;
 - 			if (x >= RA8875_WIDTH) x = RA8875_WIDTH - 1;
 - 			if (y >= RA8875_HEIGHT) y = RA8875_HEIGHT -1;
 - 			x = x;
 - 			y = y;
 - 	}
 - 		
 - 	//inline __attribute__((always_inline)) 	
 - 	void _center_helper(int16_t &x, int16_t &y)
 - 		__attribute__((always_inline)) {
 - 			if (x == CENTER) x = _width/2;
 - 			if (y == CENTER) y = _height/2;
 - 	}
 - 	#if defined(TEENSYDUINO)//all of them (32 bit only)
 - 		// nothing, already done
 - 	#elif defined(ENERGIA)
 - 		// TODO
 - 	#else
 - 		#if defined(___DUESTUFF) // DUE
 - 			#if defined(_FASTSSPORT)
 - 				volatile uint32_t *csport;
 - 			#endif
 - 		#elif defined(ESP8266) // ESP8266
 - 				uint32_t _pinRegister(uint8_t pin)
 - 				__attribute__((always_inline)) {
 - 					return _BV(pin);
 - 				}
 - 		#elif defined(SPARK)
 - 			// Mmmm, dunno... put nothing for now
 - 		#else// AVR,ARM (not DUE),STM,CHIPKIT
 - 	    //TODO:must check if all processor are compatible
 - 			#if defined(_FASTSSPORT)
 - 				volatile uint8_t *csport;
 - 			#endif
 - 		#endif
 - 	#endif
 -     // Low level access  commands ----------------------
 - 	
 - 	//inline __attribute__((always_inline)) 
 - 	void _startSend()
 - 		__attribute__((always_inline)) {
 - 		#if defined(SPI_HAS_TRANSACTION)
 - 			#if defined(__MK64FX512__) || defined(__MK66FX1M0__)  || defined(__IMXRT1062__) || defined(__MKL26Z64__)
 - 				_pspi->beginTransaction(SPISettings(_SPITransactionSpeed, MSBFIRST, SPI_MODE3));
 - 			#elif defined(ESP8266)	
 - 				SPI.beginTransaction(SPISettings(_SPITransactionSpeed, MSBFIRST, SPI_MODE3));//it works, anyway ESP doesn't work in MODE3!
 - 			#elif defined(SPARK)	
 - 				SPI.beginTransaction(SPISettings(_SPITransactionSpeed, MSBFIRST, SPI_MODE0));//TODO !
 - 			#else
 - 				SPI.beginTransaction(SPISettings(_SPITransactionSpeed, MSBFIRST, SPI_MODE3));
 - 			#endif
 - 		#elif !defined(ENERGIA) && !defined(_SPITransactionSpeed) && !defined(___STM32STUFF) && !defined(ESP8266) && !defined(SPARK)
 - 			cli();//protect from interrupts
 - 		#endif//end has transaction
 - 		
 - 		#if defined(TEENSYDUINO)//all of them (32 bit only)
 - 			digitalWriteFast(_cs, LOW);
 - 		#elif !defined(ENERGIA)//UNO,DUE,ETC.
 - 			#if defined(___DUESTUFF) && defined(SPI_DUE_MODE_EXTENDED)//DUE extended SPI
 - 				//nothing
 - 			#else//DUE (normal),UNO,ETC.
 - 				#if defined(ESP8266)	
 - 					#if defined(_FASTSSPORT)
 - 						GPIO_REG_WRITE(GPIO_OUT_W1TC_ADDRESS, _pinRegister(_cs));//L
 - 					#else
 - 						digitalWrite(_cs, LOW);// for now
 - 					#endif
 - 				#elif defined(SPARK)
 - 					pinResetFast(_cs);
 - 				#elif !defined(ESP8266) && defined(_FASTSSPORT)
 - 					*csport &= ~cspinmask;
 - 				#else
 - 					digitalWrite(_cs, LOW);
 - 				#endif
 - 			#endif
 - 		#else//ENERGIA
 - 			digitalWrite(_cs, LOW);
 - 		#endif
 - 	}
 - 	
 - 	//inline __attribute__((always_inline)) 
 - 	void _endSend()
 - 		__attribute__((always_inline)) {
 - 	#if defined(TEENSYDUINO)//all of them (32 bit only)
 - 		digitalWriteFast(_cs, HIGH);
 - 	#elif !defined(ENERGIA)
 - 		#if defined(___DUESTUFF) && defined(SPI_DUE_MODE_EXTENDED)//DUE extended SPI
 - 			//nothing
 - 		#else//DUE (normal),UNO,ETC.
 - 			#if defined(ESP8266)	
 - 				#if defined(_FASTSSPORT)
 - 					GPIO_REG_WRITE(GPIO_OUT_W1TS_ADDRESS, _pinRegister(_cs));//H
 - 				#else
 - 					digitalWrite(_cs, HIGH);
 - 				#endif
 - 			#elif defined(SPARK)
 - 				pinSetFast(_cs);
 - 			#elif !defined(ESP8266) && defined(_FASTSSPORT)
 - 				*csport |= cspinmask;
 - 			#else
 - 				digitalWrite(_cs, HIGH);
 - 			#endif
 - 		#endif
 - 	#else//ENERGIA
 - 		digitalWrite(_cs, HIGH);
 - 	#endif
 - 	
 - 	#if defined(SPI_HAS_TRANSACTION)
 - 		#if defined(__MK64FX512__) || defined(__MK66FX1M0__)  || defined(__IMXRT1062__) || defined(__MKL26Z64__)
 - 			_pspi->endTransaction();
 - 		#else
 - 			SPI.endTransaction();
 - 		#endif
 - 	#elif !defined(ENERGIA) && !defined(SPI_HAS_TRANSACTION) && !defined(___STM32STUFF) && !defined(ESP8266) && !defined(SPARK)
 - 		sei();//enable interrupts
 - 	#endif
 - } 
 - 	void    	_writeRegister(const uint8_t reg, uint8_t val);
 - 	uint8_t 	_readRegister(const uint8_t reg);
 - 	void    	_writeData(uint8_t data);
 - 	uint8_t 	_readData(bool stat=false);
 - 	boolean 	_waitPoll(uint8_t r, uint8_t f, uint8_t timeout=15);//from adafruit add settable timeout
 - 	void 		_waitBusy(uint8_t res=0x80);//0x80, 0x40(BTE busy), 0x01(DMA busy)
 - 
 - 	#if defined(NEEDS_SET_MODULE)//for Energia
 - 		void 		selectCS(uint8_t module);
 - 	#endif
 - 
 - #if defined(_FASTCPU)
 - //inline __attribute__((always_inline)) 
 - void _slowDownSPI(bool slow,uint32_t slowSpeed=10000000UL)
 - 	__attribute__((always_inline)) {
 - 	#if defined(SPI_HAS_TRANSACTION)
 - 		if (slow){
 - 			_SPITransactionSpeed = slowSpeed;
 - 		} else {
 - 			_SPITransactionSpeed = _SPIMaxSpeed;
 - 		}
 - 	#else
 - 		if (slow){
 - 			#if defined(___DUESTUFF) && defined(SPI_DUE_MODE_EXTENDED)
 - 				SPI.setClockDivider(_cs,SPI_SPEED_SAFE);
 - 			#else
 - 				SPI.setClockDivider(SPI_SPEED_SAFE);
 - 			#endif
 - 		} else {
 - 			#if defined(___DUESTUFF) && defined(SPI_DUE_MODE_EXTENDED)
 - 				SPI.setClockDivider(_cs,SPI_SPEED_WRITE);
 - 			#else
 - 				SPI.setClockDivider(SPI_SPEED_WRITE);
 - 			#endif
 - 		}
 - 	#endif
 - }
 - #endif
 - 
 - #if defined(__AVR__)
 - 	//inline __attribute__((always_inline))
 - 		void _spiwrite16(uint16_t d) 
 - 			__attribute__((always_inline)) {
 - 			SPDR = highByte(d);
 - 			while (!(SPSR & _BV(SPIF)));
 - 			SPDR = lowByte(d);
 - 			while (!(SPSR & _BV(SPIF)));
 - 		}
 - 
 - 	//inline __attribute__((always_inline))
 - 		void _spiwrite(uint8_t c) 
 - 			__attribute__((always_inline)) {
 - 			SPDR = c;
 - 			//asm volatile("nop");
 - 			while (!(SPSR & _BV(SPIF)));
 - 		}
 - 		
 - 	//inline __attribute__((always_inline))
 - 		uint8_t _spiread(void) 
 - 			__attribute__((always_inline)) {
 - 			uint8_t r = 0;
 - 			SPDR = 0x00;
 - 			//asm volatile("nop");
 - 			while(!(SPSR & _BV(SPIF)));
 - 			r = SPDR;
 - 			return r;
 - 		}
 - #elif defined(SPARK)
 - 		void _spiwrite16(uint16_t d) 
 - 			__attribute__((always_inline)) {
 - 			SPI.transfer(d >> 8);
 - 			SPI.transfer(d & 0xFF);
 - 		}
 - 
 - 		void _spiwrite(uint8_t c) 
 - 			__attribute__((always_inline)) {
 - 			SPI.transfer(c);
 - 		}
 - 		
 - 		uint8_t _spiread(void) 
 - 			__attribute__((always_inline)) {
 - 			uint8_t r = SPI.transfer(0x00);
 - 			return r;
 - 		}
 - 		
 - #endif
 - };
 - #endif // __cplusplus
 - 
 - #endif
 
 
  |