neoGFX Cross-Platform C++ GPU-based GUI/Game Library -- Coming Soon


neoGFX is a cross-platform C++ GPU-based GUI/game library.


Initial design goals will be:

  1. to be as fast as possible (after all this is C++);

  2. for the API to be as easy to use and as clean as possible;

  3. to embrace modern C++ paradigms (which includes templates and exceptions and C++11);

  4. for compiled binaries to be as small as possible with no huge redistributables.

3rd party libraries used include: Boost, SDL, FreeType, HarfBuzz.

The plan is for v1.0 supported platforms to be Windows (desktop) and Linux (desktop) followed later with OS X, iOS and Android support.

Test executable demonstrating latest implemented features: , source code.

neoGFX is open source currently licensed as GPLv3 with a commercial licence available when v1.0 is released.

The full library source code is available from:

The library is also dependent on the neolib C++ utility library available from

You can e-mail the author with any questions or comments.


Version ETA Features
v0.99 Summer 2017 Windows OpenGL; widget library feature complete; GUI designer tool
v1.00 Winter 2017 Linux OpenGL; Vulkan; scripting engine
v1.10 Spring 2018 Android support; physics engine
v1.20 Summer 2018 macOS support

Implementation Progress Log

21st April 2017

Progress made on the generic dynamic lexer which will be used by CSS3 parser and scripting language; invoking it is pretty simple:

9th April 2017 (Scotland Interval)

Support for fully CSS3 compliant gradients added.  Started work on a CSS3 parser; a simple visitor pattern will be used to set widget properties based on CSS3 style sheet contents.

23rd March 2017

Fixed a bug in the layout manager code: nested group box widgets now render perfectly:

22nd March 2017

Implemented group box widget. Started work on GUI designer tool:

16th March 2017

Support for mipmapped textures added. Colour emoji support implemented:

9th March 2017

Tab stops implemented in text_edit widget along with multi-line RTL text input:

7th February 2017

RTL text (e.g. Arabic) input implemented:


18th August 2016

Tired of signals and slots offered by more traditional GUI libraries some of which even use code generation in their implementation? You should be as signals and slots are an old solution to an old problem.  In neoGFX the alternative is modern simplicity at its finest:


As you can see C++ lambdas have made traditional signals and slots redundant.

If you want automatic event deregistration (traditional role of the "slot"):

neogfx::sink s;
s += button1.clicked([](){...});

When 's' is destroyed any associated event registrations are deregistered automatically.  Sink objects can be on the stack, member variables or the more traditional base class sub-object.

28th July 2016

Just cracked FAST sub-pixel text rendering (no longer does any FBO blitting):

18th July 2016

Finished implementing sub-pixel text rendering:

29th June 2016

Finished implementing the colour gradient selection widget:

17th June 2016

Finished implementing the colour selection tool, colour_dialog:

14th June 2016

Progress on the first neoGFX standard (modal) dialog the colour selection tool, colour_dialog, continues:

13th June 2016

A new website has been opened that will eventually host the neoGFX project: it is currently empty except for the new neoGFX forum!

12th June 2016

Line edits, spin boxes and sliders implemented. Support for modal dialogs added:

29th May 2016

Progress on text edit widget continues; support for outlined text effect added; word wrap implemented; cursor implemented:

25th May 2016

Progress on text edit widget continues (day three):

20th May 2016

Menus fully implemented along with keyboard mnemonic accelerators:

17th May 2016

Support for rendering underline text added:

16th May 2016

Support for font kerning added:


Improved non-sub-pixel text rendering by aligning characters on pixel boundaries:

Implementation of menus virtually complete (just mnemonic keyboard accelerators to do):

18th April 2016

Progress on menu widgets continues; as part of this support for multiple windows has been added:

12th April 2016

Menu bars almost implemented (which utilize new "flow" layout manager):

30th March 2016

Fixed various problems including problems with layout managers.

Toolbars implemented; used GLSL to render greyscale icons for disabled actions:

13th March 2016

Published several YouTube videos demoing 2D sprite physics:

5th March 2016

Fixed several issues. Logical coordinate system added with two automatic systems "GUI" and "Game"; GUI logical coordinate system has origin in top left corner whilst Game logical coordinate system has origin in bottom left corner and both modes update the coordinates automatically as a widget is resized; screenshot demoing this:

1st March 2016

I have decided to change neoGFX's scope: now instead of just being a GUI library neoGFX will be a combined GUI/game library.

Progress on implementing sprites continues; here is my version of "Hello, World!": Goldenrod Spaceship!:

Obviously one wouldn't normally create sprite images in-code like this and indeed neogfx::image will support loading standard image files such as .PNG directly from a file or from asset archives or from a file embedded in the executable (method used to load textures as seen in the previous three progress updates).  This in-code method might be useful to easily create simple widget elements.

20th February 2016

Buttons can now have a image:

19th February 2016

Progress on texture drawing continues, neogfx::image_widget implemented:

18th February 2016

Implementation of images and textures proceeding well:

9th February 2016

Tabs more or less implemented:

4th February 2016

Implemented changing focus by tabbing.

Just implemented radio buttons (after adding circle drawing primitives):

31st January 2016

Just implemented check boxes:

Improved text font glyph hinting and improved the handling of styles and added new "Slate" style:

29th January 2016

Keyboard and mouse navigation in the table view widget complete just selection left to do. Made some improvements to the style code and how widgets render their backgrounds. Improved test program so you can click the keypad buttons to change the style colour:

17th January 2016

Made some speed improvements related to widget layout and table view column size determination.

Change licence of source code to GPLv3 with a view to dual licensing it upon release of v1.0.

Migrated the source repository from svn to git; library source code is now publicly available.

24th November 2015

Event framework is taking shape; you can now register for push button pressed events.  Clicking on list view header view buttons now sorts list view items by column (with history):

23rd October 2015

Progress on the list view widget continues:

I've arrived at my final design for the item (list/tree) view widget model classes which uses type erased "generic iterators" as part of the interface.  You can choose different containers for the default item view model and a variable or fixed number of columns (fixed number of columns allows for in-place allocation/construction of item view cell data).  Custom models are also supported which can be used if a standard container is not desirable.

11th October 2015

It's only taken me just over six hours to switch from SFML to SDL. Test .exe is 35% bigger now... meh.

Tweaked how text is positioned in text widgets, should now be on a pixel boundary:

Sub-pixel text rendering is still on the to-do list; resuming implementation of list view widget.

7th October 2015

Just implemented middle button press/hold scrolling.

6th October 2015

Work has begun on list and tree view widget item models. 

It looks like I am going to have to switch from SFML to SDL as SFML does not provide everything I need.  Switching should be almost painless due to the layered design of the neoGFX.

4th October 2015

Scrollbars fully implemented:

3rd October 2015

With the aid of a few vodka red bulls progress on scrollbars continues:

30th September 2015

Now that I have widget clipping sorted (the OpenGL function glScissor() is ideal for this) work can begin in earnest on scrollbars:

13th September 2015

Took me most of the weekend to get basic (non-sub-pixel) text rendering using GLSL (Open GL shader language) working mainly because GLSL is so hard to debug and documentation (complete example) is hard to come by for specific use-cases. Here is the result (link above for executable):

10th September 2015

Just got a massive performance boost which should result in a great FPS: I fixed a silly bug whereby I was calling app().instance() instead of app::instance() in a couple of places .. doh! Bloody singletons! :) I was also not using my text glyph cache properly so HarfBuzz was getting invoked every widget layout and frame render.

4th September 2015

Not had much chance to work on the project during the past few weeks. Sub-pixel text rendering with Open GL shaders is still to do (hopefully this weekend); just implemented horizontal and vertical spacers for the layout managers:

10th August 2015

Text rendering almost sorted (just needs sub-pixel rendering):

1st August 2015

First ever neogfx screenshot:

20th June 2015

First code commit.