[Cuis-dev] Icons with path sequence in vector graphics

Juan Vuletich juan at cuis.st
Wed Jun 24 06:57:18 PDT 2026


Hi Luciano,

On 2026-06-24 9:12 AM, Luciano Notarfrancesco via Cuis-dev wrote:
> Got it, in a few lines of code I can fully convert path data in that 
> compact standard format to a list of PathCommands, and then I can just 
> compose with a transformation for a given height and position and draw 
> it. Works great!

Good. Glad it works ok.

> Juan, perhaps we should extend VectorEngine>>pathSequence: to support 
> all commands? Or your idea is to convert other commands to this 
> reduced subset (like converting arcs to a list of bezier curves I 
> guess, etc)?

Let me tell a bit about my thoughts when originally writing this stuff.

There's the choice between reifying the path elements vs just making 
them calls. PathCommand is a reification of the canvas API. I wasn't 
sure whether it would be the preferred way.

Then, for things like #drawHandLarge I preferred to find a more 
performant and memory efficient way to do it, even if less elegant. 
Remember we're coming from BitBlt, where everything is very compact and 
super fast. So I did #pathSequence:, packing everything in a (preferably 
literal) FloatArray. But Arcs, like in 
#arcCenterX:centerY:radiusX:radiusY:start:sweep:rotationCos:rotationSin: 
need trigonometry, that is slower than basic arithmetic, so I left it 
out. You can see in the comment at #pathSequence: that I was worried 
about performance of trigonometric functions. I guess the cost of 
trigonometry is dwarfed by the cost of the actual rendering. Maybe we 
should add them after all.

See #drawHandLarge. I found it rather easy to write the FloatArrays 
manually. It is not really different from the SVG way. Still, I 
understand that the icons font shows that we do need to support the SVG 
way, and not just manually writing the FloatArrays. But backtick compile 
time expressions may be used to turn the SVG like commands into literal 
FloatArrays for performance. We get convenience and performance. If you 
do this:

- You'd leave out the geometry transformation of the literal FloatArray, 
and apply it on each call (usually by giving each transformation its own 
morph to hold it, or we could extend the canvas api if needed). This is 
of course to build a single literal FloatArray for each widget.

- I guess this could be done with little code taking advantage of 
SVGPath>>#buildFromXml:defs: in the SVG package. But it would make this 
code dependent on SVG. This also shows there are repeated ideas between 
PathCommand and SVGPath. Some consolidation could be in order... Food 
for thought.

So, the choice is between your likely clean and nice code for turning 
the SVG like spec into PathCommands, and a more complicated but 
potentially more performance use of #pathSequence:. #pathSequence: may 
be worth it if there is a large number of icons, and many are displayed 
at once.

Still, turning them into #pathSequence: FloatArrays at compile time is 
worth doing.

In any case, your code for this will be useful in many other scenarios. 
Please consider making it a separate package, part of SVG, or part of 
the base Cuis image!

Please keep the discussion going. This could lead to better code in base 
Cuis and/or packages, not just your great app.

Thanks,

> On Wed, Jun 24, 2026 at 2:27 PM Luciano Notarfrancesco 
> <luchiano at gmail.com> wrote:
>
>     I've been making my own buttons, knobs, pulldown lists, etc... all
>     sorts of widgets. Some of them draw text, like the label on a
>     button, and I'd like to add optional monochromatic icons. For the
>     sake of simplicity, I'd like to just set the icon as path data,
>     something like this:
>         M784-120 532-372q-30 24-69 38t-83 14q-109
>     0-184.5-75.5T120-580q0-109 75.5-184.5T380-840q109 0 184.5
>     75.5T640-580q0 44-14 83t-38 69l252 252-56 56ZM380-400q75 0
>     127.5-52.5T560-580q0-75-52.5-127.5T380-760q-75 0-127.5
>     52.5T200-580q0 75 52.5 127.5T380-400Z
>
>     I got this from https://fonts.google.com/icons , there you can
>     search the icons you like and click on the image of the icon to
>     copy this path data to the clipboard.
>
>     Then, say it is the icon for a button, the button morph can draw
>     it scaled depending on the morph height, or on the line spacing of
>     the font used for the label. Seems the simplest solution to me,
>     and it would be just one or two lines of path data when creating
>     the button.
>
>     My question is, how do I represent this in Cuis? There is
>     PathCommand and subclasses, but it's not used anywhere in the base
>     image or packages, I didn't find any examples. There's also
>     VectorCanvas>>pathSequence: in a different format, more limited
>     (only supports commands M L C Q, I think).
>
>     What's the correct path for this? What do you suggest?
>
>     Thanks,
>     Luciano
>
>
-- 
Juan Vuletich
www.cuis.st
github.com/jvuletich
researchgate.net/profile/Juan-Vuletich
independent.academia.edu/JuanVuletich
patents.justia.com/inventor/juan-manuel-vuletich
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cuis.st/mailman/archives/cuis-dev/attachments/20260624/d54c4501/attachment-0001.htm>


More information about the Cuis-dev mailing list