I have thought long ago that if we wanted to have svg icons in NetBeans, we
would be better off “compiling” them to a binary format that encapsulates
the drawing instructions (could result in much smaller files than either
XML, or PNG/GIF) - there are not many necessary bytes of information in
“move to x,y; set the color to...; draw a line to a,b”.

I wouldn’t turn them into classes - how many icons do we have, and what’s
the footprint of one in the perm gen multiplied by that number?

FWIW, I have the classes you’d need to do this “compiling” of svg - part of
imagine, which I use for the “native” file format for vector layers.

-Tim

On Wed, Sep 23, 2020 at 6:58 AM Jaroslav Tulach <jaroslav.tul...@gmail.com>
wrote:

> XML is bad. Does it mean that SVG is bad as well?
>
>
>
> XML, as implemented in Java with Xerces parser is a massive piece of
> software.
>
> It composes of about three thousand of classes. Does our current
>
> infrastructure for rendering SVG uses Xerces? That means we need to load
> all
>
> the infrastructure when drawing first SVG icon. That obviously has to slow
>
> NetBeans startup down.
>
>
>
> Once upon time an XML parser was necessary to start NetBeans (think of
>
> `layer.xml` files, of `config/Modules/*.xml` files, etc.). However when I
> was
>
> working on the NetBeans performance team, we eliminated all of that with
>
> caches. The goal was: No XML parsing on (second and subsequent) startup.
>
>
>
> Now, when we are switching to SVGs, we are reintroducing the Xerces
> overhead
>
> again. Can we avoid it?
>
>
>
> Here is a plan which, by a chance, also addressed the IDE Icon registry
>
> problem. Let's process the SVG icons during compile time and turn them
> into
>
> Java classes. Such technologies (based on Batik) exist (for example http://
>
> ebourg.github.io/flamingo-svg-transcoder/) and it is just a matter or
>
> integrating them into our build system. Let's imagine an annotation
> processor
>
> to process @SVG annotation:
>
>
>
> ```
>
> @SVG(resource="resources/wait.svg", className="GenericIcons")
>
> @SVG(resource="resources/wait-too-long.svg", className="GenericIcons")
>
> package org.openide.util;
>
> ```
>
>
>
> That would generate a class like
>
>
>
> ```java
>
> public GenericIcons {
>
>   private GenericIcons() {}
>
>   public static ImageIcon wait() {...}
>
>   public static ImageIcon waitTooLong() { ... }
>
> ```
>
>
>
> The class would contain all the instructions `fillRect`, `arc`, `lineTo`,
> etc.
>
> in the form of Java code. The SVG files would be removed from our JARs.
> E.g. we
>
> would immediately solve the problem of comments, long meta-data and XML
>
> parsing. All the icons would be available as Java code, ready to run and
> ready
>
> to be GCed once no icon from a generated class is in use.
>
>
>
> In addition to that this class would hook into existing resource oriented
> API,
>
> so all icons could be referred via their location. Moreover we could also
>
> implement Tim's suggestion to hook into UIDefault resources with
>
>
>
> ```java
>
> @SVG(uid={"wait-icon"})
>
> ```
>
>
>
> The `GenericIcons` class could be in private packages, or it could be
> placed
>
> into public packages. Then it would form an API other modules can use[1]
> and
>
> could avoid the duplication of icons.
>
>
>
> Would that work? If so, and we can eliminate all the XML parsing on
> startup,
>
> I'd be in support of some form of SVG icon registry.
>
>
>
> Best regards.
>
> -jt
>
>
>
> PS:  There is `@StaticResource` annotation currently, so there is no need
> to
>
> copy `wait` icon 30 times at various places even now...
>
>
>
> Dne úterý 22. září 2020 8:15:28 CEST, Laszlo Kishalmi napsal(a):
>
> > Dear all,
>
> >
>
> > We have about 4200 icons/images in the repository. most probably many of
>
> > them are duplicates, triplicates, multiplicates copied to different
>
> > locations.
>
> >
>
> > Just in a recent PR, Eirik added 34 new svg icons to 192 places.
>
> > (https://github.com/apache/netbeans/pull/2387)
>
> >
>
> > We have 28 instances of wait.gif (and 4 wait.png).
>
> >
>
> > I think before jumping into the svg era, we need to stop, look around
>
> > and think. Could we do better?
>
> >
>
> > I think, yes, there is a demand for a common icon catalog. Or more icon
>
> > catalogs (per cluster?)
>
> >
>
> > I've done a very raw sketch to get the base of a discussion. It is a raw
>
> > Idea I have in my mind: https://github.com/apache/netbeans/pull/2388
>
> >
>
> > My two main goals:
>
> >
>
> >   - Move reusable icons to a centralized place catalog. I'd imagine
>
> > these catalogs as public java Enums
>
> >   - Provide backward compatibility based on icon resource names
>
> >
>
> > Feedbacks/requirements/insights are welcome!
>
> >
>
> > BTW, I'm completely Ok if we do not do anything about this. I just
>
> > wanted to draw some attention on this issue.
>
> >
>
> > --
>
> >
>
> > Laszlo Kishalmi
>
> >
>
> >
>
> >
>
> > ---------------------------------------------------------------------
>
> > To unsubscribe, e-mail: dev-unsubscr...@netbeans.apache.org
>
> > For additional commands, e-mail: dev-h...@netbeans.apache.org
>
> >
>
> > For further information about the NetBeans mailing lists, visit:
>
> > https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists
>
>
>
>
>
>
>
>
>
>
>
> ---------------------------------------------------------------------
>
> To unsubscribe, e-mail: dev-unsubscr...@netbeans.apache.org
>
> For additional commands, e-mail: dev-h...@netbeans.apache.org
>
>
>
> For further information about the NetBeans mailing lists, visit:
>
> https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists
>
>
>
>
>
>
>
> --
http://timboudreau.com

Reply via email to