Adapting Adafruit GFX Library to ESP_8_BIT Composite Video Output
I looked at a few candidate graphics libraries to make working with ESP_8_BIT video output frame buffer easier. LVGL offered a huge feature set for building user interfaces, but I don't that is a good match for my goal. I could always go back to that later if I felt it would be worthwhile. FabGL was excluded because I couldn't find documentation on how to adapt it to the code I have on hand, but it might be worth another look if I wanted to use its VGA output ability.
Examining those options made me more confident in my initial choice of Adafruit GFX Library. I think it is the best fit for what I want right now: Something easy to use by Arduino developers, with a gentle on-ramp thanks to the always-excellent documentation Adafruit posts for their stuff including the GFX Library. It also means there are a lot of existing code floating around out there for people to use and play with the ESP_8_BIT video generation code.
I started modifying my ESP_8_BIT wrapper class directly, removing the frame buffer interface, but then I changed my mind. I decided to leave the frame buffer option in place for people who are not afraid of byte manipulation. Instead, I created another class ESP_8_BIT_GFX
that derives from Adafruit_GFX
. This new class will be the developer-friendly class wrapper, and it will internally hold an instance of my frame buffer wrapper class.
When I started looking at what it would take to adapt Adafruit_GFX, I was surprised to see the list is super short. The most fundamental requirement is that I must implement a single pure virtual method: drawPixel()
. I was up and running after calling the base constructor with width (256) and height (240) and implementing a single method. The rest of Adafruit_GFX base class has fallback implementations of every API that eventually boils down to a series of calls into drawPixel()
.
Everything beyond drawPixel()
are icing on the cake, giving us plenty of options for performance improvements. I started small by overriding just the fillScreen()
class, because I intend to use that to erase the screen between every frame and I wanted that to be fast. Due to how ESP_8_BIT organized the frame buffer into an array of pointers into horizontal lines, I can see drawFastHLine()
as the next most promising thing to override. But I'll resist that temptation for now, I need to make sure I can walk before I run.
[Code for this project is publicly available on GitHub]