<div dir="ltr"><div>Hi all, </div><div><br></div><div>Following my frustration with the somewhat incomprehensible (... to me) Agg backend codebase, and as recently mentioned on the gitter channel, I have hacked together a mostly complete native cairo backend for matplotlib.  See <a href="https://github.com/anntzer/mpl_cairo">https://github.com/anntzer/mpl_cairo</a> (which also lists the missing features that I can see).  It is based on pybind11 and requires a C++ compiler with C++17 support (e.g., GCC 7.1).</div><div><br></div><div>One of the original motivations was to get rid of the "inaccurate marker stamping" issue (<a href="https://github.com/matplotlib/matplotlib/issues/7262">https://github.com/matplotlib/matplotlib/issues/7262</a>, <a href="https://github.com/matplotlib/matplotlib/issues/7233">https://github.com/matplotlib/matplotlib/issues/7233</a>).  Yes, I could have tried to revert the original patch too...  The repository contains a few examples where the new cairo backend places markers much more accurately.</div><div><br></div><div>Removing that optimization means that the backend is a bit slower than Agg for drawing markers (though not more than ~1.5x); for other tasks it appears to be nearly as fast.  It is dramatically faster than the current (somewhat buggy) pycairo/cairocffi-based cairo backend (gtk3cairo, and qt5cairo with <a href="https://github.com/matplotlib/matplotlib/pull/8771">https://github.com/matplotlib/matplotlib/pull/8771</a>).</div><div><br></div><div>Being a native backend allows us to directly call libraries such as freetype (bypassing -- in part -- the longstanding suggestion that ft2font needs to be rewritten); it should likewise be possible to support complex text layout (<a href="http://matplotlib.org/devel/MEP/MEP14.html">http://matplotlib.org/devel/MEP/MEP14.html</a>) with the appropriate library (from a quick search, <a href="https://github.com/HOST-Oman/libraqm">https://github.com/HOST-Oman/libraqm</a> seems to be an interesting possibility).  Additionally, cairo itself has an OpenGL (cairo-gl) backend, which we may look into (currently, the cairo calls go into an image buffer which is then picked up by the GUI toolkit for display; the idea would be to instead use the cairo-gl backend to directly render to the display).</div><div><br></div><div>I am not making a PR out of this backend *yet* mostly due to the dependency on a very recent compiler, which I believe would not be acceptable to many, and would probably require delving into the build scripts.  Note that even if I remove the C++17-isms from the codebase (which I'd rather not do -- "auto [x, y] = ..." is quite nice), pybind11 requires C++11 and suggests using a C++14 compiler.  Additionally, the backend depends on a number of other large (current) PRs which do not seem close to get in (as listed in the README).  But I'd appreciate if you give it a try and give me some feedback.</div><div><br></div><div>Antony</div></div>