GSoC 2026 : Text Node improvement and other typography supports #4186
Annonnymmousss
started this conversation in
Student Project Reports
Replies: 4 comments
ProgressCommunity Bonding - Week 1
591363954-06d1beab-4944-4243-96d3-cd74b343bf05.mov
597370070-3f094071-8d3e-4c8d-8afb-3f4e8cc01adf.mov |
0 replies
Week 2 - Week 4
Screen.Recording.2026-06-26.at.6.52.28.AM.mov
|
0 replies
Week 5 - Week 7
Screen.Recording.2026-07-08.at.6.13.07.AM.mov |
0 replies
Week 8 - Week 10
Screen.Recording.2026-04-09.at.1.49.49.AM.mov575607859-4b4aa206-9b40-4ec7-a83c-f0d82280b42d.mov |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment


Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
About
My name is Jatin (aka Bunny) (@Annonnymmousss ) and I will be working on the "Improvement of text node and adding new text attributes to improve typography" as my GSoC 2026 project.
Synopsis
The goal of the project is to improve the existing implementation of the text node in Graphite and add new text attributes to improve typography.
Deliverables
list<string>directly as raw paths.List<String>that applies the given text and typographic/styling attributes) and Text to Vector which vectorizes it(list<vector>).Final Report
My project aimed to improve the performance of existing text node and add new text attributes. It separate the existing text node which use to take string as input and returns
list<vector>as result into two different nodes. It aimed to migrate the existing browser based text editing to graphite's own rust backend. It aimed to introduce style spans and other text attributes.Contributions
Code Changes:
+2144-500Rendering of raw paths as
list<strings>Added rendering support for
list<string>into the Vello and SVG renderer which would read the attributes for the font information and other font properties and directly render it as raw paths instead of ever becoming vector (list<vector>)as rendering directly is raw path is much faster than rendering as vectors. This tremendously improves performance while rendering large text and avoid the lag behaviour which occurs while rendering vectors.Screen.Recording.2026-08-24.at.3.36.08.PM.mov
Splitting of text node
Split the previous text node which use to take raw strings as input and return it after vectorising it in the form of
list<vector>into two new nodes:list<string>which drastically improves the performance for rendering large text.list<string>as an input and vectorizes it and return it in the form of graphical typelist<vector>so that rendering of rendering oflist<string>to improve performance don't bottleneck the vector art.After splitting the node migrate all the text parameters of old text node to the two newly created text nodes.
600660063-9c4c4396-81c1-4063-9c4a-33c320d5b7bc.mov
Style Spans
Researched on triviality of adding style spans with the help of Parley. I tested it on different examples like doubling the font size alternatively and alternatively changing colour of words within the same text box to demonstrate the style spans. Parley provide API for adding style spans to the texts. This will be implemented after the introduction of the new data model.
618527705-1b57891b-4164-4bff-b685-15a4d14b5782.mov
Migrating browser based text editing entirely to rust backend.
Replace Graphite's old text-editing approach, which relied on an HTML
<textarea>overlaid on the canvas via SVGforeignObject, with a fully native text-editing system implemented in the Rust backend. Cursor movement, text selection, double/triple-click word and line selection, and undo/redo history and other editing behaviour are now handled directly by the editor core instead of the browser's DOM, using the Parley for rendering. There are few bottlenecks currently like IEM related features such as grammatical underlining, use of characters likeà, etc.Screen.Recording.2026-07-14.at.3.00.47.PM.mov
Text Hyphenation
Researched on implementation of hyphenation which is currently a limitation of parley that they doesn't provide API for its addition so we planned to use hyphenation crate for the breaking points(basically the dictionary for different languages) and then inserting the
-at breaks. Similarly researched on breaking of URLs likehttps://github.com/GraphiteEditor/Graphite/......and numerical value which consists of units with them like1000mor10px, all these has a particular style of line breaking.[Not implemented as of now just the mvp is raised]
Screen.Recording.2026-04-09.at.1.49.49.AM.mov
575607790-9c709dd5-a188-491a-a0ba-de790a47905e.mov
What's left to do
Migration of text editing to rust backend is yet to merge. It is yet to decide the approach to show the blink of cursor. Style spans triviality have been explored but yet to implement fully and will be implemented only finalising the data model. The research and mvp of text attributes, hyphenation which is not implemented yet due to unavailability of API in parley have been done and landed but the final merge is in hault. Other attribute research has been performed and discussed.
Acknowledgement
I would like to thank @Keavon for his guidance, thoughtful feedback, and extensive help throughout the project. I am also grateful to the Graphite community and Google Summer of Code for providing the opportunity and support that made this work possible.
All reactions