CINXE.COM
FabGL: FabGL Library
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=11"/> <meta name="generator" content="Doxygen 1.9.3"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>FabGL: FabGL Library</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="dynsections.js"></script> <link href="navtree.css" rel="stylesheet" type="text/css"/> <script type="text/javascript" src="resize.js"></script> <script type="text/javascript" src="navtreedata.js"></script> <script type="text/javascript" src="navtree.js"></script> <link href="search/search.css" rel="stylesheet" type="text/css"/> <script type="text/javascript" src="search/searchdata.js"></script> <script type="text/javascript" src="search/search.js"></script> <link href="doxygen.css" rel="stylesheet" type="text/css" /> <link href="doxygen-awesome.css" rel="stylesheet" type="text/css"/> </head> <body> <div id="top"><!-- do not remove this div, it is closed by doxygen! --> <div id="titlearea"> <table cellspacing="0" cellpadding="0"> <tbody> <tr id="projectrow"> <td id="projectalign"> <div id="projectname">FabGL </div> <div id="projectbrief">ESP32 Display Controller and Graphics Library</div> </td> </tr> </tbody> </table> </div> <!-- end header part --> <!-- Generated by Doxygen 1.9.3 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */ var searchBox = new SearchBox("searchBox", "search",'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menu.js"></script> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */ $(function() { initMenu('',true,false,'search.php','Search'); $(document).ready(function() { init_search(); }); }); /* @license-end */ </script> <div id="main-nav"></div> </div><!-- top --> <div id="side-nav" class="ui-resizable side-nav-resizable"> <div id="nav-tree"> <div id="nav-tree-contents"> <div id="nav-sync" class="sync"></div> </div> </div> <div id="splitbar" style="-moz-user-select:none;" class="ui-resizable-handle"> </div> </div> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */ $(document).ready(function(){initNavTree('index.html',''); initResizable(); }); /* @license-end */ </script> <div id="doc-content"> <!-- window showing the filter options --> <div id="MSearchSelectWindow" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> </div> <!-- iframe showing the search results (closed by default) --> <div id="MSearchResultsWindow"> <iframe src="javascript:void(0)" frameborder="0" name="MSearchResults" id="MSearchResults"> </iframe> </div> <div><div class="header"> <div class="headertitle"><div class="title">FabGL Library </div></div> </div><!--header--> <div class="contents"> <div class="textblock"><p > <a href="https://www.github.com/fdivitto/fabgl"> <img src="github.png" style="width:230px;height:80px;border:0;"> </a> </p> <p ><a href="http://www.fabgl.com">www.FabGL.com</a> - 2019-2022 by Fabrizio Di Vittorio (<a href="#" onclick="location.href='mai'+'lto:'+'fdi'+'vi'+'tto'+'20'+'13@'+'gm'+'ail'+'.c'+'om'; return false;">fdivi<span class="obfuscator">.nosp@m.</span>tto2<span class="obfuscator">.nosp@m.</span>013@g<span class="obfuscator">.nosp@m.</span>mail<span class="obfuscator">.nosp@m.</span>.com</a>)</p> <p ><a href="https://www.youtube.com/user/fdivitto/videos">Demos and Tutorials</a></p> <hr /> <p >FabGL is mainly a Graphics Library for ESP32. It implements several display drivers (for direct VGA output and for I2C and SPI LCD drivers).<br /> FabGL can also get input from a PS/2 Keyboard and a Mouse. ULP core handles PS/2 ports communications, leaving main CPU cores free to perform other tasks.<br /> FabGL also implements: an Audio Engine, a Graphical User Interface (GUI), a Game Engine and an ANSI/VT Terminal.<br /> </p> <p >This library works with ESP32 revision 1 and upper.<br /> </p> <p >VGA output requires a digital to analog converter (DAC): it can be done by three 270 Ohm resistors to have 8 colors, or by 6 resistors to have 64 colors.<br /> </p> <p >There are several fixed and variable width fonts embedded.</p> <p >Unlimited number of sprites are supported. However big sprites and a large amount of them reduces the frame rate and could generate flickering.<br /> </p> <p >When there is enough memory (on low resolutions like 320x200), it is possible to allocate two screen buffers, so to implement double buffering.<br /> In this case primitives are always drawn on the back buffer.<br /> </p> <p >Except for double buffering or when explicitly disabled, all drawings are performed on vertical retracing (using VGA driver), so no flickering is visible.<br /> If the queue of primitives to draw is not processed before the vertical retracing ends, then it is interrupted and continued at next retracing.<br /> </p> <p >There is a graphical user interface (GUI) with overlapping windows and mouse handling and a lot of widgets (buttons, editboxes, checkboxes, comboboxes, listboxes, etc..).<br /> </p> <p >Finally, there is a sound engine, with multiple channels mixed to a mono output. Each channel can generate sine waveforms, square, etc... or custom sampled data.<br /> Audio output, like VGA output, is generated using DMA. CPU just mixes audio channels and prepares waveforms.<br /> </p> <hr /> <p >Main classes of FabGL library:</p><ul> <li><a class="el" href="classfabgl_1_1_v_g_a_controller.html" title="Represents the VGA bitmapped controller.">fabgl::VGAController</a>, device driver for VGA bitmapped output</li> <li><a class="el" href="classfabgl_1_1_v_g_a2_controller.html" title="Represents the VGA 2 colors bitmapped controller.">fabgl::VGA2Controller</a>, device driver for VGA 2 colors bitmapped output (low RAM requirements, CPU intensive)</li> <li><a class="el" href="classfabgl_1_1_v_g_a4_controller.html" title="Represents the VGA 4 colors bitmapped controller.">fabgl::VGA4Controller</a>, device driver for VGA 4 colors bitmapped output (low RAM requirements, CPU intensive)</li> <li><a class="el" href="classfabgl_1_1_v_g_a8_controller.html" title="Represents the VGA 8 colors bitmapped controller.">fabgl::VGA8Controller</a>, device driver for VGA 8 colors bitmapped output (low RAM requirements, CPU intensive)</li> <li><a class="el" href="classfabgl_1_1_v_g_a16_controller.html" title="Represents the VGA 16 colors bitmapped controller.">fabgl::VGA16Controller</a>, device driver for VGA 16 colors bitmapped output (low RAM requirements, CPU intensive)</li> <li><a class="el" href="classfabgl_1_1_v_g_a_text_controller.html" title="Represents the VGA text-only controller.">fabgl::VGATextController</a>, device driver for VGA textual output (low RAM requirements, CPU intensive)</li> <li><a class="el" href="classfabgl_1_1_s_s_d1306_controller.html" title="Display driver for SSD1306 based OLED display, with I2C connection.">fabgl::SSD1306Controller</a>, device driver for SSD1306 based OLED displays</li> <li><a class="el" href="classfabgl_1_1_s_t7789_controller.html" title="Implements ST7789 display driver controller.">fabgl::ST7789Controller</a>, device driver for ST7789 based TFT displays</li> <li><a class="el" href="classfabgl_1_1_i_l_i9341_controller.html" title="Implements ILI9341 display driver controller.">fabgl::ILI9341Controller</a>, device driver for ILI9341 based TFT displays</li> <li><a class="el" href="classfabgl_1_1_canvas.html" title="A class with a set of drawing methods.">fabgl::Canvas</a>, that provides a set of drawing primitives (lines, rectangles, text...)</li> <li><a class="el" href="classfabgl_1_1_terminal.html" title="An ANSI-VT100 compatible display terminal.">fabgl::Terminal</a>, that emulates an ANSI/VT100/VT102/etc and up terminal (look at <a class="el" href="vttest.html">vttest score</a>)</li> <li><a class="el" href="classfabgl_1_1_keyboard.html" title="The PS2 Keyboard controller class.">fabgl::Keyboard</a>, that controls a PS2 keyboard and translates scancodes to virtual keys or ASCII/ANSI codes</li> <li><a class="el" href="classfabgl_1_1_mouse.html" title="The PS2 Mouse controller class.">fabgl::Mouse</a>, that controls a PS2 mouse</li> <li><a class="el" href="classfabgl_1_1_scene.html" title="Scene is an abstract class useful to encapsulate functionalities of a scene (sprites,...">fabgl::Scene</a> abstract class that handles sprites, timings and collision detection</li> <li><a class="el" href="classfabgl_1_1ui_app.html" title="Represents the whole application base class.">fabgl::uiApp</a> base class to build Graphical User Interface applications</li> <li><a class="el" href="classfabgl_1_1_sound_generator.html" title="SoundGenerator handles audio output.">fabgl::SoundGenerator</a> to generate sound and music</li> <li><a class="el" href="classfabgl_1_1_input_box.html" title="InputBox is an helper class which allows to create simple UI interfaces, like wizards or simple input...">fabgl::InputBox</a> to generate simple UI wizards</li> </ul> <p >Devices emulation classes:</p><ul> <li><a class="el" href="classfabgl_1_1_z80.html" title="Zilog Z80 CPU emulator.">fabgl::Z80</a>, Zilog Z80 CPU emulator</li> <li><a class="el" href="classfabgl_1_1i8080.html" title="Intel 8080 CPU emulator.">fabgl::i8080</a>, Intel 8080 CPU emulator</li> <li><a class="el" href="classfabgl_1_1_m_o_s6502.html" title="MOS 6502 CPU emulator.">fabgl::MOS6502</a>, MOS 6502 CPU emulator</li> <li><a class="el" href="classfabgl_1_1_v_i_a6522.html" title="VIA 6522 emulator.">fabgl::VIA6522</a>, VIA 6522 emulator</li> </ul> <p >Other classes:</p><ul> <li><a class="el" href="classfabgl_1_1_i2_c.html" title="I2C class allows multiple tasks to communicate with I2C devices, serializing read/write jobs.">fabgl::I2C</a>, thread safe I2C (Wire) class</li> <li><a class="el" href="classfabgl_1_1_d_s3231.html" title="DS3231 Real Time Clock driver.">fabgl::DS3231</a>, Real Time Clock driver which uses the thread safe <a class="el" href="classfabgl_1_1_i2_c.html" title="I2C class allows multiple tasks to communicate with I2C devices, serializing read/write jobs.">fabgl::I2C</a> library</li> <li><a class="el" href="classfabgl_1_1_m_c_p23_s17.html" title="MCP23S17 driver.">fabgl::MCP23S17</a>, 16 bit SPI port expander</li> </ul> <p >See <a class="el" href="conf_v_g_a.html">VGA output</a> for VGA connection sample schema.</p> <p >See <a class="el" href="conf_p_s2.html">PS/2 ports</a> for PS/2 connections sample schema.</p> <p >See <a class="el" href="conf_audio.html">Configuring Audio port</a> for audio connection sample schema.</p> <hr /> <center> Installation Tutorial </center><p> <div align="center"> <iframe width="560" height="349" src="http://www.youtube.com/embed/8OTaPQlSTas?rel=0&loop=1&autoplay=0&modestbranding=1" frameborder="0" allowfullscreen align="middle"> </iframe> </div> </p><hr /> <center> <a class="el" href="_v_g_a_2_p_c_emulator_2_p_c_emulator_8ino-example.html">IBM PC Emulator Example </a> </center><p> <div align="center"> <iframe width="560" height="349" src="http://www.youtube.com/embed/3I1U2nEoxIQ?rel=0&loop=1&autoplay=0&modestbranding=1" frameborder="0" allowfullscreen align="middle"> </iframe> </div> </p><hr /> <center> <a class="el" href="_v_g_a_2_space_invaders_2_space_invaders_8ino-example.html">Space Invaders Example </a> </center><p> <div align="center"> <iframe width="560" height="349" src="http://www.youtube.com/embed/LL8J7tjxeXA?rel=0&loop=1&autoplay=0&modestbranding=1" frameborder="0" allowfullscreen align="middle"> </iframe> </div> </p><hr /> <center> <a class="el" href="_v_g_a_2_graphical_user_interface_2_graphical_user_interface_8ino-example.html">Graphical User Interface - GUI Example </a> </center><p> <div align="center"> <iframe width="560" height="349" src="http://www.youtube.com/embed/84ytGdiOih0?rel=0&loop=1&autoplay=0&modestbranding=1" frameborder="0" allowfullscreen align="middle"> </iframe> </div> </p><hr /> <center> <a class="el" href="_v_g_a_2_audio_2_audio_8ino-example.html">Audio output demo </a> </center><p> <div align="center"> <iframe width="560" height="349" src="http://www.youtube.com/embed/RQtKFgU7OYI?rel=0&loop=1&autoplay=0&modestbranding=1" frameborder="0" allowfullscreen align="middle"> </iframe> </div> </p><hr /> <center> <a class="el" href="_v_g_a_2_ansi_terminal_2_ansi_terminal_8ino-example.html">Serial terminal connected to MBC2 Z80 board </a> </center><p> <div align="center"> <iframe width="560" height="349" src="http://www.youtube.com/embed/Ww_pH_ZOLqU?rel=0&loop=1&autoplay=0&modestbranding=1" frameborder="0" allowfullscreen align="middle"> </iframe> </div> </p><hr /> <center> <a class="el" href="_v_g_a_2_simple_terminal_out_2_simple_terminal_out_8ino-example.html">Simple Terminal Out Example </a> </center><p> <div align="center"> <iframe width="560" height="349" src="http://www.youtube.com/embed/AmXN0SIRqqU?rel=0&loop=1&autoplay=0&modestbranding=1" frameborder="0" allowfullscreen align="middle"> </iframe> </div> </p><hr /> <center> <a class="el" href="_v_g_a_2_altair8800_2_altair8800_8ino-example.html">Altair 8800 Emulator </a> </center><p> <div align="center"> <iframe width="560" height="349" src="http://www.youtube.com/embed/y0opVifEyS8?rel=0&loop=1&autoplay=0&modestbranding=1" frameborder="0" allowfullscreen align="middle"> </iframe> </div> </p><hr /> <center> <a class="el" href="_v_g_a_2_v_i_c20_2_v_i_c20_8ino-example.html">Commodore VIC20 Emulator </a> </center><p> <div align="center"> <iframe width="560" height="349" src="http://www.youtube.com/embed/ZW427HVWYys?rel=0&loop=1&autoplay=0&modestbranding=1" frameborder="0" allowfullscreen align="middle"> </iframe> </div> </p><hr /> <center> <a class="el" href="_v_g_a_2_network_terminal_2_network_terminal_8ino-example.html">Network Terminal Example </a> </center><p> <div align="center"> <iframe width="560" height="349" src="http://www.youtube.com/embed/n5c27-y5tm4?rel=0&loop=1&autoplay=0&modestbranding=1" frameborder="0" allowfullscreen align="middle"> </iframe> </div> </p><hr /> <center> <a class="el" href="_v_g_a_2_modeline_studio_2_modeline_studio_8ino-example.html">Modeline Studio Example </a> </center><p> <div align="center"> <iframe width="560" height="349" src="http://www.youtube.com/embed/Urp0rPukjzE?rel=0&loop=1&autoplay=0&modestbranding=1" frameborder="0" allowfullscreen align="middle"> </iframe> </div> </p><hr /> <center> <a class="el" href="_v_g_a_2_loopback_terminal_2_loopback_terminal_8ino-example.html">Loopback Terminal Example </a> </center><p> <div align="center"> <iframe width="560" height="349" src="http://www.youtube.com/embed/hQhU5hgWdcU?rel=0&loop=1&autoplay=0&modestbranding=1" frameborder="0" allowfullscreen align="middle"> </iframe> </div> </p><hr /> <center> <a class="el" href="_v_g_a_2_double_buffer_2_double_buffer_8ino-example.html">Double Buffering Example </a> </center><p> <div align="center"> <iframe width="560" height="349" src="http://www.youtube.com/embed/TRQcIiWQCJw?rel=0&loop=1&autoplay=0&modestbranding=1" frameborder="0" allowfullscreen align="middle"> </iframe> </div> </p><hr /> <center> <a class="el" href="_v_g_a_2_collision_detection_2_collision_detection_8ino-example.html">Collision Detection Example </a> </center><p> <div align="center"> <iframe width="560" height="349" src="http://www.youtube.com/embed/q3OPSq4HhDE?rel=0&loop=1&autoplay=0&modestbranding=1" frameborder="0" allowfullscreen align="middle"> </iframe> </div> </p><hr /> <center> <a class="el" href="_v_g_a_2_multitasking_c_p_m_2_multitasking_c_p_m_8ino-example.html">Multitasking CP/M Plus Example </a> </center><p> <div align="center"> <iframe width="560" height="349" src="http://www.youtube.com/embed/3UevsxMQZ5w?rel=0&loop=1&autoplay=0&modestbranding=1" frameborder="0" allowfullscreen align="middle"> </iframe> </div> </p><hr /> <p >Created by Fabrizio Di Vittorio (<a href="#" onclick="location.href='mai'+'lto:'+'fdi'+'vi'+'tto'+'20'+'13@'+'gm'+'ail'+'.c'+'om'; return false;">fdivi<span class="obfuscator">.nosp@m.</span>tto2<span class="obfuscator">.nosp@m.</span>013@g<span class="obfuscator">.nosp@m.</span>mail<span class="obfuscator">.nosp@m.</span>.com</a>) - <a href="http://www.fabgl.com">http://www.fabgl.com</a> Copyright (c) 2019-2022 Fabrizio Di Vittorio. All rights reserved.</p> <ul> <li>Please contact <a href="#" onclick="location.href='mai'+'lto:'+'fdi'+'vi'+'tto'+'20'+'13@'+'gm'+'ail'+'.c'+'om'; return false;">fdivi<span class="obfuscator">.nosp@m.</span>tto2<span class="obfuscator">.nosp@m.</span>013@g<span class="obfuscator">.nosp@m.</span>mail<span class="obfuscator">.nosp@m.</span>.com</a> if you need a commercial license.</li> <li>This library and related software is available under GPL v3.</li> </ul> <p >FabGL 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.</p> <p >FabGL 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.</p> <p >You should have received a copy of the GNU General Public License along with FabGL. If not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>. </p> </div></div><!-- PageDoc --> </div><!-- contents --> </div><!-- doc-content --> <!-- start footer part --> <div id="nav-path" class="navpath"><!-- id is needed for treeview function! --> <ul> <li class="footer">Generated on Sun May 22 2022 11:19:47 for FabGL by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3 </li> </ul> </div> </body> </html>