Files

README.md

Arduino_GFX

Arduino_GFX is a Arduino graphics library supporting various displays with various data bus interfaces.

This library start rewrite from Adafruit_GFX, LovyanGFX, TFT_eSPI, Ucglib, and more...

GitHub release (latest by date) GitHub Release Date GitHub commits since latest release (by date) GitHub last commit

GitHub Sponsors Twitter Follow

Ease of use

Simple Declaration

#include <ArduinoGFXLibrary.h> ArduinoDataBus *bus = new ArduinoHWSPI(16 /* DC /, 5 / CS /); Arduino_GFX *gfx = new Arduino_ILI9341(bus, 17 / RST */);

And Simple Usage

gfx->begin(); gfx->fillScreen(BLACK); gfx->setCursor(10, 10); gfx->setTextColor(RED); gfx->println("Hello World!");

Get Started

If you are new on this library, I always recommend try Library Example PDQgraphicstest first. You can find it at Arduino IDE -> File menu -> Examples -> GFX Library for Arduino -> PDQgraphicstest.

After open the example, you can see many tabs. The first is PDQgraphicstest, the main program. Start from the second tab, it is related header files, Arduino_GFX_databus.h, ... etc.

Using supported Dev Device

If you are using below listed support dev device, simply select the Arduino_GFX_dev_device.h and uncomment the define of your dev device. E.g. if you are using LilyGo T-Deck:

... // #define JC3248W535

define LILYGOTDECK

// #define LILYGOTDISPLAY ...

Custom device and display

If you are not using supported dev device:

  • Default DataBus is using Arduino SPI. Other DataBus can modify in Arduino_GFX_databus.h.

  • Default Display is using ILI9341 LCD. Other Display can modify in Arduino_GFX_display.h.

More Details

U8g2 Font Support

U8g2 provided various font type and stored in compressed format. So U8g2 font gives more UI design possibilities and still can fit in the MCU limited storage space. Using U8g2 font in ArduinoGFX simply include U8g2lib.h before ArduinoGFX_Library.h:

```C

include

include

```

And then setfont file to use:

C gfx-&gt;setCursor(10, 20); gfx-&gt;setFont(u8g2_font_maniac_tr); gfx-&gt;println("Hello World!");

U8g2 font list can be found at:

U8g2 Unicode (UTF8) Font Support

Another U8g2 font advantage is the font support Unicode glyphs. Simply enable setUTF8Print:

C gfx-&gt;begin(); gfx-&gt;fillScreen(BLACK); gfx-&gt;setUTF8Print(true);

And then print UTF8 string as usual:

```C gfx->setCursor(0, 16);

gfx->setFont(u8g2fontunifont_tr); gfx->println("Hello World!");

gfx->setFont(u8g2fontunifonttpolish); gfx->println("Witaj świecie!");

gfx->setFont(u8g2fontunifonttvietnamese1); gfx->println("Chào thế giới!");

gfx->setFont(u8g2fontunifonttchinese2); gfx->println("世界你好!");

gfx->setFont(u8g2fontunifonttjapanese1); gfx->println("こんにちは世界!");

gfx->setFont(u8g2fontunifonttkorean1); gfx->println("안녕하세요, 세계입니다!"); ```

U8g2 Unifont list can be found at:

Extra Fonts

Besides U8g2 generated font, Arduino_GFX also generated some useful font set:

Chill-Bitmap v2.400

u8g2fontchill7hcjk
  • Glyphs: 13478/13478
  • Size: 254,960
  • Generation script:

console otf2bdf ChillBitmap7x.ttf -p 6 -o ChillBitmap7x.bdf bdfconv -v -f 1 -b 1 -m "0-4294967295" ChillBitmap7x.bdf -o u8g2_font_chill7_h_cjk.h -n u8g2_font_chill7_h_cjk

Cubic 11 v1.013

u8g2fontcubic11hcjk
  • Glyphs: 10167/10167
  • Size: 337,650
  • Generation script:

console otf2bdf Cubic_11_1.013_R.ttf -p 9 -o Cubic_11_1.013_R.bdf bdfconv -v -f 1 -b 1 -m "0-4294967295" Cubic_11_1.013_R.bdf -o u8g2_font_cubic11_h_cjk.h -n u8g2_font_cubic11_h_cjk

QuanPixel

u8g2fontquan7hcjk
  • Glyphs: 18082/18082
  • Size: 335,225
  • Generation script:

console ./bdfconv -v -f 1 -b 1 -m "0-4294967295" quan.bdf -o u8g2_font_quan7_h_cjk.h -n u8g2_font_quan7_h_cjk

unifont_jp-14.0.02

u8g2fontunifonthutf8
  • Glyphs: 57389/57389
  • Size: 2,250,360
  • Generation script:

console bdfconv -v -f 1 -b 1 -m "0-1114111" unifont_jp-14.0.02.bdf -o u8g2_font_unifont_h_utf8.h -n u8g2_font_unifont_h_utf8

u8g2fontunifonttchinese
  • Glyphs: 22145/57389
  • Size: 979,557
  • Generation script:

console bdfconv -v -f 1 -m "32-127,11904-12351,19968-40959,63744-64255,65280-65376" unifont_jp-14.0.02.bdf -o u8g2_font_unifont_t_chinese.h -n u8g2_font_unifont_t_chinese

u8g2fontunifonttchinese4
  • Glyphs: 7199/57389
  • Size: 298,564
  • Traditional Chinese common font list:
  • Simplified Chinese common font list:
  • extra font list: 32-127,11904-12351,63744-64255,65280-65376
  • Generation script:

console bdfconv -v -f 1 -M chinese4.list unifont_jp-14.0.02.bdf -o u8g2_font_unifont_t_chinese4.h -n u8g2_font_unifont_t_chinese4

u8g2fontunifonttcjk
  • Glyphs: 41364/57389
  • Size: 1,704,862
  • Generation script:

console bdfconv -v -f 1 -m "32-127,4352-4607,11904-12255,12288-19903,19968-40943,43360-43391,44032-55203,55216-55295,63744-64255,65072-65103,65280-65519" unifont_jp-14.0.02.bdf -o u8g2_font_unifont_t_cjk.h -n u8g2_font_unifont_t_cjk

Performance

This library is not putting speed at the first priority, but still paid much effort to make the display look smooth.

Figures

Below are some figures compare with other 3 Arduino common display libraries.

  • Arduino IDE: 1.8.15
  • arduino-esp32: 1.0.6
  • Dev Board: TTGO T8 v1.8
  • PSRAM: disable
  • Display: ILI9341
  • Interface: SPI
  • SPI Frequency: 40MHz
  • Test time: 2021 Jun 16

| Benchmark | AdafruitGFX | *ArduinoGFX* | LovyanGFX | TFTeSPI | | ------------------ | ------------- | ------------- | ------------- | ------------- | | Screen fill | 195,782 | 160,094 | 154,341 | 155,938 | | Text | 97,662 | 18,960 | 22,473 | 21,752 | | Pixels | 1,365,211 | 903,549 | 867,702 | 775,781 | | Lines | 1,062,311 | 412,026 | 269,060 | 264,950 | | Horiz/Vert Lines | 17,637 | 14,197 | 13,692 | 13,833 | | Rectangles-filled | 406,817 | 332,696 | 320,761 | 323,908 | | Rectangles | 11,641 | 9,254 | 8,545 | 8,714 | | Triangles-filled | 150,941 | 118,010 | 105,661 | 109,675 | | Triangles | 58,843 | 23,570 | 15,884 | 16,277 | | Circles-filled | 76,739 | 52,170 | 42,787 | 45,827 | | Circles | 118,125 | 40,955 | 25,959 | 25,269 | | Arcs-filled | N/A | 33,381 | 21,546 | N/A | | Arcs | N/A | 66,054 | 47,901 | N/A | | Rounded rects-fill | 408,534 | 338,136 | 318,882 | 323,189 | | Rounded rects | 43,185 | 21,562 | 13,089 | 15,371 |

Why Run Fast?

  • No read operation. Since not all display provide read back graphic memories API, Arduino_GFX skip all read operations. It can reduce the library size footprint and sometimes reduce the operation time.
  • Tailor-made data bus classes. Arduino_GFX decouple data bus operation from display driver, it is more easy to write individual data bus class for each platform.

Supported Interfaces

Various data bus interfaces

Arduino_GFX utilizes Arduino Built-in SPI class to support 8-bit SPI for most platforms.

Most tiny displays in hobbyist electronics world support 8-bit SPI, but some require 9-bit SPI. Arduino_GFX should be the first Arduino display library that can use ESP32 SPI to support 9-bit hardware SPI. It is important to support the displays that require 9-bit SPI interface. (e.g. HX8357B, ...)

Larger displays most likely do not support standalone SPI since it is not fast enough to refresh the full screen details. Most of them support 8-bit/16-bit Parallel interface.

Some larger display require RGB + 3-bit SPI combo interface, This interface requies at most 3(9-bit SPI) + 4(CS, CD, WR, RD) + 24(RBG888) = 31 pins. Most dev board do not have enough GPIO to support this. Arduino_GFX is stick to RGB565 color, so RGB666 and RGB888 require some connection hack. E.g. RGB666 connect R5 and R6 together, B5 and B6 together to become RGB565. Then the least GPIO requirement can become 3(9-bit SPI) + 2(CD, WR) + 16(RBG565) = 21 pins. Remember always pull down CS pin and always pull up RD pin.

Currently Supported data bus [Wiki]

  • 8-bit and 9-bit hardware SPI (ESP32SPI)
  • 8-bit hardware SPI (HWSPI, ESP8266SPI, mbedSPI, NRFXSPI, RPiPicoSPI)
  • 8-bit and 9-bit software SPI (SWSPI)
  • 8-bit parallel interface (SWPAR8, AVRPAR8, ESP32PAR8, ESP32S2PAR8, RPiPicoPAR8, RTLPAR8, STM32PAR8)
  • 16-bit parallel interface (ESP32LCD16, ESP32PAR16, ESP32S2PAR16, RPiPicoPAR16)
  • RGB565+SPI interface (ESP32RGBPanel)

Supported Dev Board

Currently Supported Dev Board

Supported Dev Device

Currently Supported Dev Device [Wiki]

Supported Display

Currently Supported Display [Wiki]

Tobe Support Display (Sponsors can make it happen)

  • Mono display supported by co-operate with Canvas
  • Multi-color e-ink display supported by co-operate with Canvas

Canvas (framebuffer)

Canvas Class [Wiki]

  • Arduino_Canvas (16-bit pixel)
  • ArduinoCanvas3bit (1/4 memory space of 16-bit pixel)
  • ArduinoCanvasIndexed (half memory space of 16-bit pixel)
  • ArduinoCanvasMono (1/16 memory space of 16-bit pixel)

LVGL Support

3 LVGL demo in Library Examples

  • LvglBenchmark [demo video]
  • LvglHelloWorld
  • LvglWidgets

Feature Wishlist

Sponsors can make it happen

  • Print color Emoji Characters
  • Load bitmap font files from flash / SD
  • Fill Gradient (Discussion #128)

Using source code come from

Sponsorship vs Support

As you may already aware there are lack of sponsorship in this project. Convert the funding in terms of man power, it is much lower than 1 man hour per month. So don't expect too much on the support. Expecially the features not realted to my planned maker projects ;>

Report a bug