MarkupText: Use Cairo to handle gradients
Enhancement proposal
When using gradients in MarkupText we have Pango render the text to an SVG. We then load the SVG into a SVGMobject and apply the gradient to the characters. This has two major drawbacks:
- the gradient is done on a per-character basis, i.e. every character has one solid color; the quality of the gradient therefore depends largely on the length of the text to which it is applied
- with ligatures, the number of paths does not correspond to the number of characters, so the user will have to specify an offset to compensate for this, e.g.
flcounts for two characters but might be rendered as a single glyph - similar problems arise with underline, double underline, overline and strikethrough, because those lines will also be sub-paths of the
SVGMobject
We will have to be careful w.r.t. the Write animation. Currently, even with gradients every character has its own color. If the character is itself colored with a gradient, what color is to be used for the stroke?
This will require a refactor in how we render things, see https://gitlab.gnome.org/GNOME/pango/-/issues/533#note_1044494 and corresponding docs https://developer.gnome.org/pango/stable/pango-Glyph-Storage.html#pango-glyph-string-index-to-x
where if my understanding is correct, we shouldn't PangoLayout which we currently do no, instead, we should first create a context from PangoCairo, pango-cairo-create-context, then use pango_itemize after that pango_shape or rather pango_shape_full, and then finally use pango_glyph_string_index_to_x for rendering a single single character with ligature on a cairo surface, while changing the colour in Cairo.
Before doing this I would like to do #30
This requires a major refactor so it can't be done now and is in the least priority because Manim's SVG parser still doesn't render Gradients from the SVG file.